@lyxa.ai/core 1.0.101 → 1.0.103

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (235) hide show
  1. package/dist/index.js.map +1 -1
  2. package/dist/libraries/auth/index.js.map +1 -1
  3. package/dist/libraries/auth/refreshtoken.js.map +1 -1
  4. package/dist/libraries/auth/repository.js.map +1 -1
  5. package/dist/libraries/cache/settings/index.js.map +1 -1
  6. package/dist/libraries/configuration/index.js.map +1 -1
  7. package/dist/libraries/configuration/types/EnvironmentConfigurationType.js.map +1 -1
  8. package/dist/libraries/dispatcher/index.js.map +1 -1
  9. package/dist/libraries/event/BaseEvent.js.map +1 -1
  10. package/dist/libraries/event/decorators/metadata.js.map +1 -1
  11. package/dist/libraries/event/decorators/subscribe.js.map +1 -1
  12. package/dist/libraries/event/index.js.map +1 -1
  13. package/dist/libraries/event/registry/SubscriptionRegistry.js.map +1 -1
  14. package/dist/libraries/event/test/OrderCreationEvent.js.map +1 -1
  15. package/dist/libraries/firebase/fcmService.js.map +1 -1
  16. package/dist/libraries/firebase/index.js.map +1 -1
  17. package/dist/libraries/index.js.map +1 -1
  18. package/dist/libraries/logger/index.js.map +1 -1
  19. package/dist/libraries/map/index.js.map +1 -1
  20. package/dist/libraries/map/interfaces/IMapService.js.map +1 -1
  21. package/dist/libraries/map/mapService.js.map +1 -1
  22. package/dist/libraries/map/providers/google-maps.js.map +1 -1
  23. package/dist/libraries/map/providers/index.js.map +1 -1
  24. package/dist/libraries/mongo/index.js.map +1 -1
  25. package/dist/libraries/mongo/models/activity-log.model.js.map +1 -1
  26. package/dist/libraries/mongo/models/admin-access-control.model.js.map +1 -1
  27. package/dist/libraries/mongo/models/admin.model.js.map +1 -1
  28. package/dist/libraries/mongo/models/agent-performance.model.d.ts +13 -0
  29. package/dist/libraries/mongo/models/agent-performance.model.js +68 -0
  30. package/dist/libraries/mongo/models/agent-performance.model.js.map +1 -0
  31. package/dist/libraries/mongo/models/app-screen-setting.model.d.ts +9 -0
  32. package/dist/libraries/mongo/models/app-screen-setting.model.js +47 -0
  33. package/dist/libraries/mongo/models/app-screen-setting.model.js.map +1 -0
  34. package/dist/libraries/mongo/models/attribute.model.js.map +1 -1
  35. package/dist/libraries/mongo/models/banner.model.js.map +1 -1
  36. package/dist/libraries/mongo/models/base/base-coupon.model.js.map +1 -1
  37. package/dist/libraries/mongo/models/base/base-review.model.js.map +1 -1
  38. package/dist/libraries/mongo/models/bob-finance.model.js.map +1 -1
  39. package/dist/libraries/mongo/models/brand.model.js.map +1 -1
  40. package/dist/libraries/mongo/models/cancellation-reason.model.js.map +1 -1
  41. package/dist/libraries/mongo/models/card.model.js.map +1 -1
  42. package/dist/libraries/mongo/models/cart-participant.model.js.map +1 -1
  43. package/dist/libraries/mongo/models/cart.model.js.map +1 -1
  44. package/dist/libraries/mongo/models/category.model.js.map +1 -1
  45. package/dist/libraries/mongo/models/chat-room.model.d.ts +16 -0
  46. package/dist/libraries/mongo/models/chat-room.model.js +79 -0
  47. package/dist/libraries/mongo/models/chat-room.model.js.map +1 -0
  48. package/dist/libraries/mongo/models/core-auth-identity.model.js.map +1 -1
  49. package/dist/libraries/mongo/models/core-user.model.js.map +1 -1
  50. package/dist/libraries/mongo/models/counter.model.js.map +1 -1
  51. package/dist/libraries/mongo/models/coupon.model.js.map +1 -1
  52. package/dist/libraries/mongo/models/deal-setting.model.js.map +1 -1
  53. package/dist/libraries/mongo/models/default-chat.model.js.map +1 -1
  54. package/dist/libraries/mongo/models/dish.model.js.map +1 -1
  55. package/dist/libraries/mongo/models/embedded/attribute-item.model.js.map +1 -1
  56. package/dist/libraries/mongo/models/embedded/attribute-map.model.js.map +1 -1
  57. package/dist/libraries/mongo/models/embedded/business-development-setting.model.js.map +1 -1
  58. package/dist/libraries/mongo/models/embedded/cash-settlement.model.js.map +1 -1
  59. package/dist/libraries/mongo/models/embedded/charge-setting.model.d.ts +14 -0
  60. package/dist/libraries/mongo/models/embedded/charge-setting.model.js +60 -0
  61. package/dist/libraries/mongo/models/embedded/charge-setting.model.js.map +1 -0
  62. package/dist/libraries/mongo/models/embedded/charge-settings.model.js.map +1 -1
  63. package/dist/libraries/mongo/models/embedded/charge.model.js.map +1 -1
  64. package/dist/libraries/mongo/models/embedded/chat-participant.model.d.ts +13 -0
  65. package/dist/libraries/mongo/models/embedded/chat-participant.model.js +47 -0
  66. package/dist/libraries/mongo/models/embedded/chat-participant.model.js.map +1 -0
  67. package/dist/libraries/mongo/models/embedded/courier-order-finance.model.js.map +1 -1
  68. package/dist/libraries/mongo/models/embedded/courier-setting.model.js.map +1 -1
  69. package/dist/libraries/mongo/models/embedded/currency-setting.model.js.map +1 -1
  70. package/dist/libraries/mongo/models/embedded/currency.model.js.map +1 -1
  71. package/dist/libraries/mongo/models/embedded/customer-support-batches.model.js.map +1 -1
  72. package/dist/libraries/mongo/models/embedded/customer-support-numbers.model.js.map +1 -1
  73. package/dist/libraries/mongo/models/embedded/delivery-charge-setting.model.js.map +1 -1
  74. package/dist/libraries/mongo/models/embedded/delivery-info.model.js.map +1 -1
  75. package/dist/libraries/mongo/models/embedded/featured-item.mode.js.map +1 -1
  76. package/dist/libraries/mongo/models/embedded/line-item-attribute.model.js.map +1 -1
  77. package/dist/libraries/mongo/models/embedded/marketing-cut.model.js.map +1 -1
  78. package/dist/libraries/mongo/models/embedded/order-cancel.model.js.map +1 -1
  79. package/dist/libraries/mongo/models/embedded/order-finance.model.js.map +1 -1
  80. package/dist/libraries/mongo/models/embedded/order-pricing.model.js.map +1 -1
  81. package/dist/libraries/mongo/models/embedded/order-refund.model.js.map +1 -1
  82. package/dist/libraries/mongo/models/embedded/otp-fields.model.js.map +1 -1
  83. package/dist/libraries/mongo/models/embedded/package.model.js.map +1 -1
  84. package/dist/libraries/mongo/models/embedded/parent-document.model.js.map +1 -1
  85. package/dist/libraries/mongo/models/embedded/payment-attempt.model.js.map +1 -1
  86. package/dist/libraries/mongo/models/embedded/payment-infromation.model.js.map +1 -1
  87. package/dist/libraries/mongo/models/embedded/payout-setting.model.js.map +1 -1
  88. package/dist/libraries/mongo/models/embedded/plus-settings.model.js.map +1 -1
  89. package/dist/libraries/mongo/models/embedded/price-breakdown.model.js.map +1 -1
  90. package/dist/libraries/mongo/models/embedded/product-nutrition.model.js.map +1 -1
  91. package/dist/libraries/mongo/models/embedded/profit.model.js.map +1 -1
  92. package/dist/libraries/mongo/models/embedded/referral-discount-config.model.js.map +1 -1
  93. package/dist/libraries/mongo/models/embedded/regular-order-finance.model.js.map +1 -1
  94. package/dist/libraries/mongo/models/embedded/rider-assignment-model.js.map +1 -1
  95. package/dist/libraries/mongo/models/embedded/rider-batches.model.js.map +1 -1
  96. package/dist/libraries/mongo/models/embedded/rider-equipment.model.js.map +1 -1
  97. package/dist/libraries/mongo/models/embedded/rider-setting.model.js.map +1 -1
  98. package/dist/libraries/mongo/models/embedded/service-fee-setting.model.js.map +1 -1
  99. package/dist/libraries/mongo/models/embedded/shop-document.model.js.map +1 -1
  100. package/dist/libraries/mongo/models/embedded/status-timeline.model.js.map +1 -1
  101. package/dist/libraries/mongo/models/embedded/subscription-summary.model.js.map +1 -1
  102. package/dist/libraries/mongo/models/embedded/support-reason-info.model.js.map +1 -1
  103. package/dist/libraries/mongo/models/embedded/ticket-message.model.d.ts +11 -0
  104. package/dist/libraries/mongo/models/{providers/courier-order-finance.model.js → embedded/ticket-message.model.js} +23 -11
  105. package/dist/libraries/mongo/models/embedded/ticket-message.model.js.map +1 -0
  106. package/dist/libraries/mongo/models/embedded/trip-leg.mode.js.map +1 -1
  107. package/dist/libraries/mongo/models/embedded/vat.model.js.map +1 -1
  108. package/dist/libraries/mongo/models/embedded/zone-geometry.mode.js.map +1 -1
  109. package/dist/libraries/mongo/models/faq.model.js.map +1 -1
  110. package/dist/libraries/mongo/models/favourite.model.js.map +1 -1
  111. package/dist/libraries/mongo/models/featured-setting.model.js.map +1 -1
  112. package/dist/libraries/mongo/models/filter-container.model.js.map +1 -1
  113. package/dist/libraries/mongo/models/finance-settlement.model.js.map +1 -1
  114. package/dist/libraries/mongo/models/gallery.model.js.map +1 -1
  115. package/dist/libraries/mongo/models/index.d.ts +13 -0
  116. package/dist/libraries/mongo/models/index.js +14 -1
  117. package/dist/libraries/mongo/models/index.js.map +1 -1
  118. package/dist/libraries/mongo/models/line-item.model.js.map +1 -1
  119. package/dist/libraries/mongo/models/list-container.model.js.map +1 -1
  120. package/dist/libraries/mongo/models/loyalty-point-category.model.js.map +1 -1
  121. package/dist/libraries/mongo/models/loyalty-point-setting.model.js.map +1 -1
  122. package/dist/libraries/mongo/models/loyalty-point.model.js.map +1 -1
  123. package/dist/libraries/mongo/models/marketing.model.js.map +1 -1
  124. package/dist/libraries/mongo/models/meal-plan.model.js.map +1 -1
  125. package/dist/libraries/mongo/models/message.model.d.ts +18 -0
  126. package/dist/libraries/mongo/models/message.model.js +70 -0
  127. package/dist/libraries/mongo/models/message.model.js.map +1 -0
  128. package/dist/libraries/mongo/models/notification.model.js.map +1 -1
  129. package/dist/libraries/mongo/models/nutrition.model.js.map +1 -1
  130. package/dist/libraries/mongo/models/order-delivery.model.js.map +1 -1
  131. package/dist/libraries/mongo/models/order-payment.model.d.ts +21 -0
  132. package/dist/libraries/mongo/models/order-payment.model.js +96 -0
  133. package/dist/libraries/mongo/models/order-payment.model.js.map +1 -0
  134. package/dist/libraries/mongo/models/order.model.js.map +1 -1
  135. package/dist/libraries/mongo/models/parent.model.js.map +1 -1
  136. package/dist/libraries/mongo/models/payout.model.js.map +1 -1
  137. package/dist/libraries/mongo/models/product-marketing.model.js.map +1 -1
  138. package/dist/libraries/mongo/models/product.model.js.map +1 -1
  139. package/dist/libraries/mongo/models/providers/areeba-card.model.js.map +1 -1
  140. package/dist/libraries/mongo/models/providers/buy1-get1-marketing.model.js.map +1 -1
  141. package/dist/libraries/mongo/models/providers/core-apple-auth-identity.model.js.map +1 -1
  142. package/dist/libraries/mongo/models/providers/core-email-auth-identity.model.js.map +1 -1
  143. package/dist/libraries/mongo/models/providers/core-google-auth-identity.model.js.map +1 -1
  144. package/dist/libraries/mongo/models/providers/core-phone-auth-identity.model.js.map +1 -1
  145. package/dist/libraries/mongo/models/providers/courier-order.model.js.map +1 -1
  146. package/dist/libraries/mongo/models/providers/custom-coupon.model.js.map +1 -1
  147. package/dist/libraries/mongo/models/providers/discount-marketing.model.js.map +1 -1
  148. package/dist/libraries/mongo/models/providers/featured-marketing.model.js.map +1 -1
  149. package/dist/libraries/mongo/models/providers/free-delivery-marketing.model.js.map +1 -1
  150. package/dist/libraries/mongo/models/providers/global-coupon.model.js.map +1 -1
  151. package/dist/libraries/mongo/models/providers/individual-store-coupon.model.js.map +1 -1
  152. package/dist/libraries/mongo/models/providers/individual-user-coupon.model.js.map +1 -1
  153. package/dist/libraries/mongo/models/providers/loyalty-point-marketing.model.js.map +1 -1
  154. package/dist/libraries/mongo/models/providers/punch-marketing.model.js.map +1 -1
  155. package/dist/libraries/mongo/models/providers/referral-code-coupon.model.js.map +1 -1
  156. package/dist/libraries/mongo/models/providers/referral-reward-coupon.model.js.map +1 -1
  157. package/dist/libraries/mongo/models/providers/regular-order.model.js.map +1 -1
  158. package/dist/libraries/mongo/models/providers/rider-payout.model.js.map +1 -1
  159. package/dist/libraries/mongo/models/providers/shop-payout.model.js.map +1 -1
  160. package/dist/libraries/mongo/models/punch-marketing-history.model.js.map +1 -1
  161. package/dist/libraries/mongo/models/rating-setting.model.js.map +1 -1
  162. package/dist/libraries/mongo/models/referral-setting.model.js.map +1 -1
  163. package/dist/libraries/mongo/models/request-area.model.js.map +1 -1
  164. package/dist/libraries/mongo/models/reward.model.js.map +1 -1
  165. package/dist/libraries/mongo/models/rider-review.model.js.map +1 -1
  166. package/dist/libraries/mongo/models/rider-timeout.model.js.map +1 -1
  167. package/dist/libraries/mongo/models/rider-tracking.model.js.map +1 -1
  168. package/dist/libraries/mongo/models/rider.model.js.map +1 -1
  169. package/dist/libraries/mongo/models/role.model.js.map +1 -1
  170. package/dist/libraries/mongo/models/setting.model.js.map +1 -1
  171. package/dist/libraries/mongo/models/shared/address.model.js.map +1 -1
  172. package/dist/libraries/mongo/models/shared/duration.model.js.map +1 -1
  173. package/dist/libraries/mongo/models/shared/geo-location.model.js.map +1 -1
  174. package/dist/libraries/mongo/models/shared/work-hour.model.js.map +1 -1
  175. package/dist/libraries/mongo/models/shop-access-control.model.js.map +1 -1
  176. package/dist/libraries/mongo/models/shop-category.model.js.map +1 -1
  177. package/dist/libraries/mongo/models/shop-meal-plan.model.js.map +1 -1
  178. package/dist/libraries/mongo/models/shop-review.model.js.map +1 -1
  179. package/dist/libraries/mongo/models/shop.model.js.map +1 -1
  180. package/dist/libraries/mongo/models/subscription-setting.model.js.map +1 -1
  181. package/dist/libraries/mongo/models/subscription.model.js.map +1 -1
  182. package/dist/libraries/mongo/models/support-reason.model.js.map +1 -1
  183. package/dist/libraries/mongo/models/tag.model.js.map +1 -1
  184. package/dist/libraries/mongo/models/terms-and-conditions.model.js.map +1 -1
  185. package/dist/libraries/mongo/models/ticket.model.d.ts +29 -0
  186. package/dist/libraries/mongo/models/ticket.model.js +178 -0
  187. package/dist/libraries/mongo/models/ticket.model.js.map +1 -0
  188. package/dist/libraries/mongo/models/transaction.model.js.map +1 -1
  189. package/dist/libraries/mongo/models/user-app-section-setting.model.js.map +1 -1
  190. package/dist/libraries/mongo/models/user.model.js.map +1 -1
  191. package/dist/libraries/mongo/models/zone.model.js.map +1 -1
  192. package/dist/libraries/mongo/plugins/soft-delete-plugin.js.map +1 -1
  193. package/dist/libraries/redis/index.js.map +1 -1
  194. package/dist/libraries/secrets/index.js.map +1 -1
  195. package/dist/libraries/trpc/context.js.map +1 -1
  196. package/dist/libraries/trpc/index.js.map +1 -1
  197. package/dist/libraries/trpc/middlewares/auth.d.ts +3 -3
  198. package/dist/libraries/trpc/middlewares/auth.js.map +1 -1
  199. package/dist/libraries/trpc/middlewares/cors.js.map +1 -1
  200. package/dist/libraries/trpc/middlewares/phone-verified.d.ts +3 -3
  201. package/dist/libraries/trpc/middlewares/phone-verified.js.map +1 -1
  202. package/dist/libraries/trpc/middlewares/publicUserDecoder.d.ts +3 -3
  203. package/dist/libraries/trpc/middlewares/publicUserDecoder.js.map +1 -1
  204. package/dist/libraries/twilio/index.js.map +1 -1
  205. package/dist/libraries/upload/index.js.map +1 -1
  206. package/dist/utilities/common/password.js.map +1 -1
  207. package/dist/utilities/common/week.js.map +1 -1
  208. package/dist/utilities/currency.js.map +1 -1
  209. package/dist/utilities/enum.d.ts +22 -1
  210. package/dist/utilities/enum.js +26 -1
  211. package/dist/utilities/enum.js.map +1 -1
  212. package/dist/utilities/error-handler.js.map +1 -1
  213. package/dist/utilities/error-middleware.js.map +1 -1
  214. package/dist/utilities/pagination.d.ts +5 -5
  215. package/dist/utilities/pagination.js.map +1 -1
  216. package/dist/utilities/response.js.map +1 -1
  217. package/dist/utilities/search.js.map +1 -1
  218. package/dist/utilities/sorting.js.map +1 -1
  219. package/dist/utilities/transformers.js.map +1 -1
  220. package/dist/utilities/validation/common-validation.d.ts +118 -118
  221. package/dist/utilities/validation/common-validation.js.map +1 -1
  222. package/dist/utilities/validation/global-validation.js.map +1 -1
  223. package/dist/utilities/validation/index.js.map +1 -1
  224. package/package.json +54 -54
  225. package/dist/libraries/mongo/models/embedded/loyaltyPoint.model.d.ts +0 -16
  226. package/dist/libraries/mongo/models/embedded/loyaltyPoint.model.js +0 -61
  227. package/dist/libraries/mongo/models/embedded/loyaltyPoint.model.js.map +0 -1
  228. package/dist/libraries/mongo/models/order-finance.model.d.ts +0 -22
  229. package/dist/libraries/mongo/models/order-finance.model.js +0 -83
  230. package/dist/libraries/mongo/models/order-finance.model.js.map +0 -1
  231. package/dist/libraries/mongo/models/providers/courier-order-finance.model.d.ts +0 -7
  232. package/dist/libraries/mongo/models/providers/courier-order-finance.model.js.map +0 -1
  233. package/dist/libraries/mongo/models/providers/regular-order-finance.model.d.ts +0 -25
  234. package/dist/libraries/mongo/models/providers/regular-order-finance.model.js +0 -95
  235. package/dist/libraries/mongo/models/providers/regular-order-finance.model.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"/","sources":["libraries/redis/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,sDAA4B;AAC5B,mCAAiC;AAG1B,IAAM,YAAY,GAAlB,MAAM,YAAY;IAChB,YAAY,CAAS;IAE7B,YAAY,QAAgB;QAC3B,IAAI,CAAC,YAAY,GAAG,IAAI,iBAAK,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC;IAED,IAAI,WAAW;QACd,OAAO,IAAI,CAAC,YAAY,CAAC;IAC1B,CAAC;IAEM,KAAK,CAAC,eAAe,CAAI,GAAW;QAC1C,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEvD,IAAI,aAAa,IAAI,SAAS,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAM,CAAC;QACvC,CAAC;QAED,OAAO,SAAS,CAAC;IAClB,CAAC;IAEM,KAAK,CAAC,WAAW,CAAI,GAAW,EAAE,MAAS,EAAE,MAAe;QAClE,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAEjD,IAAI,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,iBAAiB,CAAC,CAAC;QAC/D,CAAC;aAAM,CAAC;YACP,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;QACrD,CAAC;QAED,OAAO,IAAI,CAAC;IACb,CAAC;IAEM,KAAK,CAAC,kBAAkB,CAAC,GAAW;QAC1C,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC;IACb,CAAC;IAEM,KAAK,CAAC,sBAAsB,CAAI,KAAa,EAAE,GAAW;QAChE,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAE/D,IAAI,aAAa,IAAI,SAAS,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAM,CAAC;QACvC,CAAC;QAED,OAAO,SAAS,CAAC;IAClB,CAAC;IAEM,KAAK,CAAC,sBAAsB,CAAI,KAAa,EAAE,GAAW,EAAE,MAAS;QAC3E,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACjD,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,iBAAiB,CAAC,CAAC;QAE5D,OAAO,IAAI,CAAC;IACb,CAAC;IAEM,KAAK,CAAC,yBAAyB,CAAI,KAAa,EAAE,GAAW;QACnE,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC;IACb,CAAC;IAEM,WAAW,CAAC,GAAW;QAC7B,OAAO,GAAG;aACR,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;aACxB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;aACpB,WAAW,EAAE,CAAC;IACjB,CAAC;CACD,CAAA;AAlEY,oCAAY;uBAAZ,YAAY;IADxB,IAAA,gBAAO,GAAE;;GACG,YAAY,CAkExB","sourcesContent":["import Redis from 'ioredis';\nimport { Service } from 'typedi';\n\n@Service()\nexport class RedisService {\n\tprivate _redisClient!: Redis;\n\n\tconstructor(redisURL: string) {\n\t\tthis._redisClient = new Redis(redisURL);\n\t}\n\n\tget redisClient(): Redis {\n\t\treturn this._redisClient;\n\t}\n\n\tpublic async getCachedObject<T>(key: string): Promise<T | undefined> {\n\t\tconst usageResponse = await this._redisClient.get(key);\n\n\t\tif (usageResponse != undefined) {\n\t\t\treturn JSON.parse(usageResponse) as T;\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\tpublic async cacheObject<T>(key: string, object: T, expiry?: number): Promise<boolean> {\n\t\tconst stringifiedObject = JSON.stringify(object);\n\n\t\tif (expiry) {\n\t\t\tawait this._redisClient.setex(key, expiry, stringifiedObject);\n\t\t} else {\n\t\t\tawait this._redisClient.set(key, stringifiedObject);\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tpublic async deleteCachedObject(key: string): Promise<boolean> {\n\t\tawait this._redisClient.del(key);\n\t\treturn true;\n\t}\n\n\tpublic async getCachedObjectByGroup<T>(group: string, key: string): Promise<T | undefined> {\n\t\tconst usageResponse = await this._redisClient.hget(group, key);\n\n\t\tif (usageResponse != undefined) {\n\t\t\treturn JSON.parse(usageResponse) as T;\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\tpublic async setCachedObjectByGroup<T>(group: string, key: string, object: T): Promise<boolean> {\n\t\tconst stringifiedObject = JSON.stringify(object);\n\t\tawait this._redisClient.hset(group, key, stringifiedObject);\n\n\t\treturn true;\n\t}\n\n\tpublic async deleteCachedObjectByGroup<T>(group: string, key: string): Promise<boolean> {\n\t\tawait this._redisClient.hdel(group, key);\n\t\treturn true;\n\t}\n\n\tpublic sanitizeKey(key: string) {\n\t\treturn key\n\t\t\t.replace(/[^\\w\\s]/gi, '')\n\t\t\t.replace(/\\s+/g, '-')\n\t\t\t.toLowerCase();\n\t}\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"/","sources":["libraries/redis/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,sDAA4B;AAC5B,mCAAiC;AAG1B,IAAM,YAAY,GAAlB,MAAM,YAAY;IAChB,YAAY,CAAS;IAE7B,YAAY,QAAgB;QAC3B,IAAI,CAAC,YAAY,GAAG,IAAI,iBAAK,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC;IAED,IAAI,WAAW;QACd,OAAO,IAAI,CAAC,YAAY,CAAC;IAC1B,CAAC;IAEM,KAAK,CAAC,eAAe,CAAI,GAAW;QAC1C,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEvD,IAAI,aAAa,IAAI,SAAS,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAM,CAAC;QACvC,CAAC;QAED,OAAO,SAAS,CAAC;IAClB,CAAC;IAEM,KAAK,CAAC,WAAW,CAAI,GAAW,EAAE,MAAS,EAAE,MAAe;QAClE,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAEjD,IAAI,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,iBAAiB,CAAC,CAAC;QAC/D,CAAC;aAAM,CAAC;YACP,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;QACrD,CAAC;QAED,OAAO,IAAI,CAAC;IACb,CAAC;IAEM,KAAK,CAAC,kBAAkB,CAAC,GAAW;QAC1C,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC;IACb,CAAC;IAEM,KAAK,CAAC,sBAAsB,CAAI,KAAa,EAAE,GAAW;QAChE,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAE/D,IAAI,aAAa,IAAI,SAAS,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAM,CAAC;QACvC,CAAC;QAED,OAAO,SAAS,CAAC;IAClB,CAAC;IAEM,KAAK,CAAC,sBAAsB,CAAI,KAAa,EAAE,GAAW,EAAE,MAAS;QAC3E,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACjD,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,iBAAiB,CAAC,CAAC;QAE5D,OAAO,IAAI,CAAC;IACb,CAAC;IAEM,KAAK,CAAC,yBAAyB,CAAI,KAAa,EAAE,GAAW;QACnE,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC;IACb,CAAC;IAEM,WAAW,CAAC,GAAW;QAC7B,OAAO,GAAG;aACR,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;aACxB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;aACpB,WAAW,EAAE,CAAC;IACjB,CAAC;CACD,CAAA;AAlEY,oCAAY;uBAAZ,YAAY;IADxB,IAAA,gBAAO,GAAE;;GACG,YAAY,CAkExB","sourcesContent":["import Redis from 'ioredis';\r\nimport { Service } from 'typedi';\r\n\r\n@Service()\r\nexport class RedisService {\r\n\tprivate _redisClient!: Redis;\r\n\r\n\tconstructor(redisURL: string) {\r\n\t\tthis._redisClient = new Redis(redisURL);\r\n\t}\r\n\r\n\tget redisClient(): Redis {\r\n\t\treturn this._redisClient;\r\n\t}\r\n\r\n\tpublic async getCachedObject<T>(key: string): Promise<T | undefined> {\r\n\t\tconst usageResponse = await this._redisClient.get(key);\r\n\r\n\t\tif (usageResponse != undefined) {\r\n\t\t\treturn JSON.parse(usageResponse) as T;\r\n\t\t}\r\n\r\n\t\treturn undefined;\r\n\t}\r\n\r\n\tpublic async cacheObject<T>(key: string, object: T, expiry?: number): Promise<boolean> {\r\n\t\tconst stringifiedObject = JSON.stringify(object);\r\n\r\n\t\tif (expiry) {\r\n\t\t\tawait this._redisClient.setex(key, expiry, stringifiedObject);\r\n\t\t} else {\r\n\t\t\tawait this._redisClient.set(key, stringifiedObject);\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n\r\n\tpublic async deleteCachedObject(key: string): Promise<boolean> {\r\n\t\tawait this._redisClient.del(key);\r\n\t\treturn true;\r\n\t}\r\n\r\n\tpublic async getCachedObjectByGroup<T>(group: string, key: string): Promise<T | undefined> {\r\n\t\tconst usageResponse = await this._redisClient.hget(group, key);\r\n\r\n\t\tif (usageResponse != undefined) {\r\n\t\t\treturn JSON.parse(usageResponse) as T;\r\n\t\t}\r\n\r\n\t\treturn undefined;\r\n\t}\r\n\r\n\tpublic async setCachedObjectByGroup<T>(group: string, key: string, object: T): Promise<boolean> {\r\n\t\tconst stringifiedObject = JSON.stringify(object);\r\n\t\tawait this._redisClient.hset(group, key, stringifiedObject);\r\n\r\n\t\treturn true;\r\n\t}\r\n\r\n\tpublic async deleteCachedObjectByGroup<T>(group: string, key: string): Promise<boolean> {\r\n\t\tawait this._redisClient.hdel(group, key);\r\n\t\treturn true;\r\n\t}\r\n\r\n\tpublic sanitizeKey(key: string) {\r\n\t\treturn key\r\n\t\t\t.replace(/[^\\w\\s]/gi, '')\r\n\t\t\t.replace(/\\s+/g, '-')\r\n\t\t\t.toLowerCase();\r\n\t}\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"/","sources":["libraries/secrets/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,iEAA0E;AAC1E,mCAAiC;AACjC,oCAAwC;AACxC,oDAAwD;AAGjD,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;IACxB,qBAAqB,CAAwB;IAC7C,aAAa,CAAgB;IAC7B,OAAO,CAA8B;IAE7C,YAAY,oBAA0C,EAAE,YAA0B;QACjF,IAAI,CAAC,qBAAqB,GAAG,oBAAoB,CAAC;QAClD,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;QAClC,IAAI,CAAC,OAAO,GAAG,IAAI,2CAA0B,CAAC;YAC7C,WAAW,EAAE;gBACZ,SAAS,EAAE,uBAAuB;gBAClC,cAAc,EAAE,0CAA0C;gBAC1D,IAAI,EAAE,iBAAiB;gBACvB,eAAe,EAAE,gBAAgB;gBACjC,SAAS,EAAE,gBAAgB;gBAC3B,WAAW,EACV,ssDAAssD;gBACvsD,YAAY,EAAE,kDAAkD;aAChE;SACD,CAAC,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,GAAW;QAC9B,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC3B,MAAM,yBAAyB,GAAG,IAAI,CAAC,qBAAqB,EAAE,OAAO,EAAE,WAAW,GAAG,GAAG,GAAG,GAAG,CAAC;QAE/F,OAAO,CAAC,GAAG,CAAC,gDAAgD,GAAG,yBAAyB,CAAC,CAAC;QAE1F,IAAI,CAAC;YACJ,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC;YACnG,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,sBAAsB,CAC3D,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,EAC3D,GAAG,CACH,CAAC;YAEF,IAAI,IAAI,IAAI,SAAS,EAAE,CAAC;gBACvB,OAAO,IAAI,CAAC;YACb,CAAC;YAED,MAAM,CAAC,cAAc,CAAC,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC;gBAC/D,IAAI,EAAE,gCAAgC,GAAG,yBAAyB,GAAG,kBAAkB;aACvF,CAAC,CAAC;YAEH,MAAM,GAAG,GAAG,cAAc,CAAC,OAAQ,CAAC,IAAK,CAAC,QAAQ,EAAE,CAAC;YAErD,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAE5B,OAAO,GAAG,CAAC;QACZ,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACF,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,GAAW,EAAE,KAAa;QAC7C,MAAM,IAAI,CAAC,aAAa,CAAC,sBAAsB,CAC9C,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,WAAW,GAAG,OAAO,EACxD,GAAG,EACH,KAAK,CACL,CAAC;QACF,OAAO,KAAK,CAAC;IACd,CAAC;CACD,CAAA;AA7DY,oDAAoB;+BAApB,oBAAoB;IADhC,IAAA,gBAAO,GAAE;qCAMyB,oCAAoB,EAAgB,oBAAY;GALtE,oBAAoB,CA6DhC","sourcesContent":["import { SecretManagerServiceClient } from '@google-cloud/secret-manager';\nimport { Service } from 'typedi';\nimport { RedisService } from '../redis';\nimport { ConfigurationService } from '../configuration';\n\n@Service()\nexport class SecretManagerService {\n\tprivate _configurationService!: ConfigurationService;\n\tprivate _redisManager!: RedisService;\n\tprivate _client!: SecretManagerServiceClient;\n\n\tconstructor(configurationService: ConfigurationService, redisManager: RedisService) {\n\t\tthis._configurationService = configurationService;\n\t\tthis._redisManager = redisManager;\n\t\tthis._client = new SecretManagerServiceClient({\n\t\t\tcredentials: {\n\t\t\t\tclient_id: '107840895824406590900',\n\t\t\t\tprivate_key_id: 'ece1ebdfde57414700f23f1f4014f5e83d4f7644',\n\t\t\t\ttype: 'service_account',\n\t\t\t\tuniverse_domain: 'googleapis.com',\n\t\t\t\tprojectId: 'for-poc-325210',\n\t\t\t\tprivate_key:\n\t\t\t\t\t'-----BEGIN PRIVATE KEY-----\\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDPTk9M5nCDYJhC\\nLuyP+gqBXIHPrXegygco5tB50Y7Q9s/f4hm+xp/usYy5UCYyFVNjZ2mdjWQcr3Ta\\nT3GZV9OiHej8ejveY0iyFBi0IlfGNm9blYlOIyQT4i6MoevNul7u4EQL8bid/sp/\\nJ/XPNC+Jnk8Ke2G9FdfDYs+1O6Nf37HuPUmMwLAzcyl+k1v9UzInrgNPj+nactY7\\nEPCVSM6XcZI3UL86n574iQBvUXsMpUt3csYVOxPap1Vd1TBEo1k85jZepMvaXHoK\\nJUwQT7p1F1D0weVKJ1BjwQgmADZWfUKdwRyS8zFPbUGeptlA2XlxyVMasGzCCMi4\\n6jzJGC81AgMBAAECggEAXoaLnDn7Fbym0I7K6T+PKLtAqaykPpnAOAM/DjzijR/t\\nW12idZ3l8RXeX+VO9UlKE6pkuyVsf7P1aVIOL2ifpG1U/kLSJ65HyINnXEPImCXc\\nEvuVdx6I5dQde5ydg9o2TV/PR0756njyZpaW+9sEzhB0ZAgsYeai0oGsyiuebCkm\\nqlOnf5DO/kWlNvf8yZ7GMEa0WBYyan4O7YcVF13c7oM19XZfvw+lliU/geOwVNW5\\nEfSn91UWIEMB60Q5XKHg11LAvbq8mvcHD+6ujeoPMfoZJrHZj5ucBP5auyRNFCUM\\nWE2IILLpgdhDfE5I323xHIyMblMSc1OOkZzjhuNYRQKBgQDuEa/jMqEDu7ZpDo/g\\nf+M4Qmmyh1WIjnORwqbf8INi5oN1NoIv6tcJ++COAWcBpyerW9aknLRMX9FXrNH5\\nAPyRvHQt2IpRCqjdcEr2b3VwZmcjRVbpsISwqE0RBvXSXOnvbDzZ53bC70anL5OY\\n7UYwOotbQXpcEGC57wy8G+VVlwKBgQDe63bcubV1W2+WPbdtzb7tzIS5PPz19U5i\\n5PjVQ4E34FH0ZBnk2v1fjtVxR72mrzCg2xz72rWgdsHJ/1QZAfw+4troJV9LI9SG\\nYRMeh86NSfNObdkY+LmCSH4eiFe83kFLUUzhnYE6DU/17i6T4V+ofawToasu3wag\\nf7LzT2BzEwKBgQDlVD5lktDOQtWtj+yC607bVAZzhrCbUfX8FFEh6ZL3A2zgzXhN\\nZmBtaqfew3URf47UICy894MrCyYi2gSOZCfoz2vu+egLt0QBw/lCOQ4dD1gM/u+B\\nP5wifI14eIb2dLCZBV/83F5n24zo4gjBSNfS/6Jcbs/KvbAfjCptTkX10wKBgDxb\\nwy5WtlRVcqxaf50ilWzr8I/7fH7YceYDG4EbKxTHD0m+BOjbhrlmAlMO2sIUM3WK\\nfpmPCZiuLyCTmuC+kd8xK5ap79h3libgh/2/ReUpvdBhm+PQDOLC4CtCPYdtIn7T\\nP57jN8dRLXJokIIIBw+nH32dS62AQ9oXWYvZ1UKzAoGBAOWOSphZMnPlLeLN54/4\\nwKPI+D6G1JhzqQrUf8Z99J7m3r3ya+0ug5gRGQCoSRfqz9o87+fLCdSdc38L+j4T\\nBnuwIcY6n4LF+3yAPIF1rnrIBFRqzPta7epYPXHtUTvWOkEkKzNmsFVCZKF7nQjS\\ns/ucyyfUssPsTznYW3gXf3To\\n-----END PRIVATE KEY-----\\n',\n\t\t\t\tclient_email: 'lyxa-core@for-poc-325210.iam.gserviceaccount.com',\n\t\t\t},\n\t\t});\n\t}\n\n\tpublic async getKey(key: string): Promise<string | undefined> {\n\t\tconsole.log(key, 'key---');\n\t\tconst environmentTransformedKey = this._configurationService?.options?.environment + '_' + key;\n\n\t\tconsole.log('Attempting to fetch the following secret key: ' + environmentTransformedKey);\n\n\t\ttry {\n\t\t\tconsole.log('Fetching from Redis...', this?._configurationService?.options?.environment + '_KEYS');\n\t\t\tconst data = await this._redisManager.getCachedObjectByGroup<string>(\n\t\t\t\tthis?._configurationService?.options?.environment + '_KEYS',\n\t\t\t\tkey\n\t\t\t);\n\n\t\t\tif (data != undefined) {\n\t\t\t\treturn data;\n\t\t\t}\n\n\t\t\tconst [accessResponse] = await this._client.accessSecretVersion({\n\t\t\t\tname: 'projects/899369746265/secrets/' + environmentTransformedKey + '/versions/latest',\n\t\t\t});\n\n\t\t\tconst val = accessResponse.payload!.data!.toString();\n\n\t\t\tawait this.setKey(key, val);\n\n\t\t\treturn val;\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t}\n\n\tpublic async setKey(key: string, value: string): Promise<string> {\n\t\tawait this._redisManager.setCachedObjectByGroup<string>(\n\t\t\tthis._configurationService.options.environment + '_KEYS',\n\t\t\tkey,\n\t\t\tvalue\n\t\t);\n\t\treturn value;\n\t}\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"/","sources":["libraries/secrets/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,iEAA0E;AAC1E,mCAAiC;AACjC,oCAAwC;AACxC,oDAAwD;AAGjD,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;IACxB,qBAAqB,CAAwB;IAC7C,aAAa,CAAgB;IAC7B,OAAO,CAA8B;IAE7C,YAAY,oBAA0C,EAAE,YAA0B;QACjF,IAAI,CAAC,qBAAqB,GAAG,oBAAoB,CAAC;QAClD,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;QAClC,IAAI,CAAC,OAAO,GAAG,IAAI,2CAA0B,CAAC;YAC7C,WAAW,EAAE;gBACZ,SAAS,EAAE,uBAAuB;gBAClC,cAAc,EAAE,0CAA0C;gBAC1D,IAAI,EAAE,iBAAiB;gBACvB,eAAe,EAAE,gBAAgB;gBACjC,SAAS,EAAE,gBAAgB;gBAC3B,WAAW,EACV,ssDAAssD;gBACvsD,YAAY,EAAE,kDAAkD;aAChE;SACD,CAAC,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,GAAW;QAC9B,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC3B,MAAM,yBAAyB,GAAG,IAAI,CAAC,qBAAqB,EAAE,OAAO,EAAE,WAAW,GAAG,GAAG,GAAG,GAAG,CAAC;QAE/F,OAAO,CAAC,GAAG,CAAC,gDAAgD,GAAG,yBAAyB,CAAC,CAAC;QAE1F,IAAI,CAAC;YACJ,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC;YACnG,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,sBAAsB,CAC3D,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,EAC3D,GAAG,CACH,CAAC;YAEF,IAAI,IAAI,IAAI,SAAS,EAAE,CAAC;gBACvB,OAAO,IAAI,CAAC;YACb,CAAC;YAED,MAAM,CAAC,cAAc,CAAC,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC;gBAC/D,IAAI,EAAE,gCAAgC,GAAG,yBAAyB,GAAG,kBAAkB;aACvF,CAAC,CAAC;YAEH,MAAM,GAAG,GAAG,cAAc,CAAC,OAAQ,CAAC,IAAK,CAAC,QAAQ,EAAE,CAAC;YAErD,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAE5B,OAAO,GAAG,CAAC;QACZ,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACF,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,GAAW,EAAE,KAAa;QAC7C,MAAM,IAAI,CAAC,aAAa,CAAC,sBAAsB,CAC9C,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,WAAW,GAAG,OAAO,EACxD,GAAG,EACH,KAAK,CACL,CAAC;QACF,OAAO,KAAK,CAAC;IACd,CAAC;CACD,CAAA;AA7DY,oDAAoB;+BAApB,oBAAoB;IADhC,IAAA,gBAAO,GAAE;qCAMyB,oCAAoB,EAAgB,oBAAY;GALtE,oBAAoB,CA6DhC","sourcesContent":["import { SecretManagerServiceClient } from '@google-cloud/secret-manager';\r\nimport { Service } from 'typedi';\r\nimport { RedisService } from '../redis';\r\nimport { ConfigurationService } from '../configuration';\r\n\r\n@Service()\r\nexport class SecretManagerService {\r\n\tprivate _configurationService!: ConfigurationService;\r\n\tprivate _redisManager!: RedisService;\r\n\tprivate _client!: SecretManagerServiceClient;\r\n\r\n\tconstructor(configurationService: ConfigurationService, redisManager: RedisService) {\r\n\t\tthis._configurationService = configurationService;\r\n\t\tthis._redisManager = redisManager;\r\n\t\tthis._client = new SecretManagerServiceClient({\r\n\t\t\tcredentials: {\r\n\t\t\t\tclient_id: '107840895824406590900',\r\n\t\t\t\tprivate_key_id: 'ece1ebdfde57414700f23f1f4014f5e83d4f7644',\r\n\t\t\t\ttype: 'service_account',\r\n\t\t\t\tuniverse_domain: 'googleapis.com',\r\n\t\t\t\tprojectId: 'for-poc-325210',\r\n\t\t\t\tprivate_key:\r\n\t\t\t\t\t'-----BEGIN PRIVATE KEY-----\\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDPTk9M5nCDYJhC\\nLuyP+gqBXIHPrXegygco5tB50Y7Q9s/f4hm+xp/usYy5UCYyFVNjZ2mdjWQcr3Ta\\nT3GZV9OiHej8ejveY0iyFBi0IlfGNm9blYlOIyQT4i6MoevNul7u4EQL8bid/sp/\\nJ/XPNC+Jnk8Ke2G9FdfDYs+1O6Nf37HuPUmMwLAzcyl+k1v9UzInrgNPj+nactY7\\nEPCVSM6XcZI3UL86n574iQBvUXsMpUt3csYVOxPap1Vd1TBEo1k85jZepMvaXHoK\\nJUwQT7p1F1D0weVKJ1BjwQgmADZWfUKdwRyS8zFPbUGeptlA2XlxyVMasGzCCMi4\\n6jzJGC81AgMBAAECggEAXoaLnDn7Fbym0I7K6T+PKLtAqaykPpnAOAM/DjzijR/t\\nW12idZ3l8RXeX+VO9UlKE6pkuyVsf7P1aVIOL2ifpG1U/kLSJ65HyINnXEPImCXc\\nEvuVdx6I5dQde5ydg9o2TV/PR0756njyZpaW+9sEzhB0ZAgsYeai0oGsyiuebCkm\\nqlOnf5DO/kWlNvf8yZ7GMEa0WBYyan4O7YcVF13c7oM19XZfvw+lliU/geOwVNW5\\nEfSn91UWIEMB60Q5XKHg11LAvbq8mvcHD+6ujeoPMfoZJrHZj5ucBP5auyRNFCUM\\nWE2IILLpgdhDfE5I323xHIyMblMSc1OOkZzjhuNYRQKBgQDuEa/jMqEDu7ZpDo/g\\nf+M4Qmmyh1WIjnORwqbf8INi5oN1NoIv6tcJ++COAWcBpyerW9aknLRMX9FXrNH5\\nAPyRvHQt2IpRCqjdcEr2b3VwZmcjRVbpsISwqE0RBvXSXOnvbDzZ53bC70anL5OY\\n7UYwOotbQXpcEGC57wy8G+VVlwKBgQDe63bcubV1W2+WPbdtzb7tzIS5PPz19U5i\\n5PjVQ4E34FH0ZBnk2v1fjtVxR72mrzCg2xz72rWgdsHJ/1QZAfw+4troJV9LI9SG\\nYRMeh86NSfNObdkY+LmCSH4eiFe83kFLUUzhnYE6DU/17i6T4V+ofawToasu3wag\\nf7LzT2BzEwKBgQDlVD5lktDOQtWtj+yC607bVAZzhrCbUfX8FFEh6ZL3A2zgzXhN\\nZmBtaqfew3URf47UICy894MrCyYi2gSOZCfoz2vu+egLt0QBw/lCOQ4dD1gM/u+B\\nP5wifI14eIb2dLCZBV/83F5n24zo4gjBSNfS/6Jcbs/KvbAfjCptTkX10wKBgDxb\\nwy5WtlRVcqxaf50ilWzr8I/7fH7YceYDG4EbKxTHD0m+BOjbhrlmAlMO2sIUM3WK\\nfpmPCZiuLyCTmuC+kd8xK5ap79h3libgh/2/ReUpvdBhm+PQDOLC4CtCPYdtIn7T\\nP57jN8dRLXJokIIIBw+nH32dS62AQ9oXWYvZ1UKzAoGBAOWOSphZMnPlLeLN54/4\\nwKPI+D6G1JhzqQrUf8Z99J7m3r3ya+0ug5gRGQCoSRfqz9o87+fLCdSdc38L+j4T\\nBnuwIcY6n4LF+3yAPIF1rnrIBFRqzPta7epYPXHtUTvWOkEkKzNmsFVCZKF7nQjS\\ns/ucyyfUssPsTznYW3gXf3To\\n-----END PRIVATE KEY-----\\n',\r\n\t\t\t\tclient_email: 'lyxa-core@for-poc-325210.iam.gserviceaccount.com',\r\n\t\t\t},\r\n\t\t});\r\n\t}\r\n\r\n\tpublic async getKey(key: string): Promise<string | undefined> {\r\n\t\tconsole.log(key, 'key---');\r\n\t\tconst environmentTransformedKey = this._configurationService?.options?.environment + '_' + key;\r\n\r\n\t\tconsole.log('Attempting to fetch the following secret key: ' + environmentTransformedKey);\r\n\r\n\t\ttry {\r\n\t\t\tconsole.log('Fetching from Redis...', this?._configurationService?.options?.environment + '_KEYS');\r\n\t\t\tconst data = await this._redisManager.getCachedObjectByGroup<string>(\r\n\t\t\t\tthis?._configurationService?.options?.environment + '_KEYS',\r\n\t\t\t\tkey\r\n\t\t\t);\r\n\r\n\t\t\tif (data != undefined) {\r\n\t\t\t\treturn data;\r\n\t\t\t}\r\n\r\n\t\t\tconst [accessResponse] = await this._client.accessSecretVersion({\r\n\t\t\t\tname: 'projects/899369746265/secrets/' + environmentTransformedKey + '/versions/latest',\r\n\t\t\t});\r\n\r\n\t\t\tconst val = accessResponse.payload!.data!.toString();\r\n\r\n\t\t\tawait this.setKey(key, val);\r\n\r\n\t\t\treturn val;\r\n\t\t} catch (e) {\r\n\t\t\tconsole.error(e);\r\n\t\t}\r\n\t}\r\n\r\n\tpublic async setKey(key: string, value: string): Promise<string> {\r\n\t\tawait this._redisManager.setCachedObjectByGroup<string>(\r\n\t\t\tthis._configurationService.options.environment + '_KEYS',\r\n\t\t\tkey,\r\n\t\t\tvalue\r\n\t\t);\r\n\t\treturn value;\r\n\t}\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"/","sources":["libraries/trpc/context.ts"],"names":[],"mappings":";;;AAmBO,MAAM,iBAAiB,GAAG,KAAK,EACrC,IAA8B,EAC0B,EAAE;IAC1D,OAAO;QACN,GAAG,IAAI;QACP,MAAM,EAAE,SAAS;QACjB,SAAS,EAAE,SAAS;QACpB,SAAS,EAAE,SAAS;QACpB,gBAAgB,EAAE,KAAK;QACvB,YAAY,EAAE,KAAK;KACnB,CAAC;AACH,CAAC,CAAC;AAXW,QAAA,iBAAiB,qBAW5B","sourcesContent":["import { CreateHTTPContextOptions } from '@trpc/server/dist/adapters/standalone';\nimport { AuthEntityType } from '../auth';\nimport jwt from 'jsonwebtoken';\nimport { TokenType } from '../auth';\n\nexport interface EntityContext extends jwt.JwtPayload {\n\tid: string;\n\ttype: AuthEntityType;\n\tparameters: Record<string, unknown>;\n}\n\nexport interface LyxaContextParams {\n\tentity?: EntityContext;\n\trequestId?: string;\n\ttokenType?: TokenType;\n\tusedRefreshToken?: boolean;\n\ttokenRenewed?: boolean;\n}\n\nexport const createLyxaContext = async (\n\topts: CreateHTTPContextOptions\n): Promise<CreateHTTPContextOptions & LyxaContextParams> => {\n\treturn {\n\t\t...opts,\n\t\tentity: undefined,\n\t\trequestId: undefined,\n\t\ttokenType: undefined,\n\t\tusedRefreshToken: false,\n\t\ttokenRenewed: false,\n\t};\n};\n\nexport type LyxaContext = Awaited<ReturnType<typeof createLyxaContext>>;\n"]}
1
+ {"version":3,"file":"context.js","sourceRoot":"/","sources":["libraries/trpc/context.ts"],"names":[],"mappings":";;;AAmBO,MAAM,iBAAiB,GAAG,KAAK,EACrC,IAA8B,EAC0B,EAAE;IAC1D,OAAO;QACN,GAAG,IAAI;QACP,MAAM,EAAE,SAAS;QACjB,SAAS,EAAE,SAAS;QACpB,SAAS,EAAE,SAAS;QACpB,gBAAgB,EAAE,KAAK;QACvB,YAAY,EAAE,KAAK;KACnB,CAAC;AACH,CAAC,CAAC;AAXW,QAAA,iBAAiB,qBAW5B","sourcesContent":["import { CreateHTTPContextOptions } from '@trpc/server/dist/adapters/standalone';\r\nimport { AuthEntityType } from '../auth';\r\nimport jwt from 'jsonwebtoken';\r\nimport { TokenType } from '../auth';\r\n\r\nexport interface EntityContext extends jwt.JwtPayload {\r\n\tid: string;\r\n\ttype: AuthEntityType;\r\n\tparameters: Record<string, unknown>;\r\n}\r\n\r\nexport interface LyxaContextParams {\r\n\tentity?: EntityContext;\r\n\trequestId?: string;\r\n\ttokenType?: TokenType;\r\n\tusedRefreshToken?: boolean;\r\n\ttokenRenewed?: boolean;\r\n}\r\n\r\nexport const createLyxaContext = async (\r\n\topts: CreateHTTPContextOptions\r\n): Promise<CreateHTTPContextOptions & LyxaContextParams> => {\r\n\treturn {\r\n\t\t...opts,\r\n\t\tentity: undefined,\r\n\t\trequestId: undefined,\r\n\t\ttokenType: undefined,\r\n\t\tusedRefreshToken: false,\r\n\t\ttokenRenewed: false,\r\n\t};\r\n};\r\n\r\nexport type LyxaContext = Awaited<ReturnType<typeof createLyxaContext>>;\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"/","sources":["libraries/trpc/index.ts"],"names":[],"mappings":";;;AAAA,yCAAwC;AACxC,6BAA+B;AAGlB,QAAA,CAAC,GAAG,iBAAQ,CAAC,OAAO,EAAe,CAAC,MAAM,CAAC;IACvD,cAAc,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE;QAC9B,IAAI,SAAS,GAAG,IAAI,CAAC;QAErB,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,IAAI,KAAK,CAAC,KAAK,YAAY,cAAQ,EAAE,CAAC;YACrE,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YACxC,SAAS,GAAG,SAAS,CAAC,WAAW,CAAC;QACnC,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;QAE5D,OAAO;YACN,GAAG,KAAK;YACR,OAAO,EACN,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ;gBACzC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO;gBACnD,CAAC,CAAC,KAAK,CAAC,OAAO;YACjB,IAAI,EAAE;gBACL,GAAG,KAAK,CAAC,IAAI;gBAEb,KAAK,EAAE,SAAS;gBAChB,IAAI,EAAE,SAAS;aACf;YAED,KAAK,EAAE,SAAS;SAChB,CAAC;IACH,CAAC;CACD,CAAC,CAAC;AAEU,QAAA,eAAe,GAAG,SAAC,CAAC,SAAS,CAAC;AAC9B,QAAA,gBAAgB,GAAG,SAAC,CAAC,MAAM,CAAC;AAC5B,QAAA,mBAAmB,GAAG,SAAC,CAAC,mBAAmB,CAAC","sourcesContent":["import { initTRPC } from '@trpc/server';\nimport { ZodError } from 'zod';\nimport { LyxaContext } from './context';\n\nexport const t = initTRPC.context<LyxaContext>().create({\n\terrorFormatter({ shape, error }) {\n\t\tlet zodErrors = null;\n\n\t\tif (error.code === 'BAD_REQUEST' && error.cause instanceof ZodError) {\n\t\t\tconst flattened = error.cause.flatten();\n\t\t\tzodErrors = flattened.fieldErrors;\n\t\t}\n\n\t\tconsole.log('Error:', error, shape, 'error log', zodErrors);\n\n\t\treturn {\n\t\t\t...shape,\n\t\t\tmessage:\n\t\t\t\tzodErrors && typeof zodErrors === 'object'\n\t\t\t\t\t? Object.values(zodErrors)[0]?.[0] || shape.message\n\t\t\t\t\t: shape.message,\n\t\t\tdata: {\n\t\t\t\t...shape.data,\n\n\t\t\t\tstack: undefined,\n\t\t\t\tpath: undefined,\n\t\t\t},\n\t\t\t// Prevent stack trace from being returned in the response\n\t\t\tstack: undefined,\n\t\t};\n\t},\n});\n\nexport const publicProcedure = t.procedure;\nexport const createTRPCRouter = t.router;\nexport const createCallerFactory = t.createCallerFactory;\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"/","sources":["libraries/trpc/index.ts"],"names":[],"mappings":";;;AAAA,yCAAwC;AACxC,6BAA+B;AAGlB,QAAA,CAAC,GAAG,iBAAQ,CAAC,OAAO,EAAe,CAAC,MAAM,CAAC;IACvD,cAAc,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE;QAC9B,IAAI,SAAS,GAAG,IAAI,CAAC;QAErB,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,IAAI,KAAK,CAAC,KAAK,YAAY,cAAQ,EAAE,CAAC;YACrE,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YACxC,SAAS,GAAG,SAAS,CAAC,WAAW,CAAC;QACnC,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;QAE5D,OAAO;YACN,GAAG,KAAK;YACR,OAAO,EACN,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ;gBACzC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO;gBACnD,CAAC,CAAC,KAAK,CAAC,OAAO;YACjB,IAAI,EAAE;gBACL,GAAG,KAAK,CAAC,IAAI;gBAEb,KAAK,EAAE,SAAS;gBAChB,IAAI,EAAE,SAAS;aACf;YAED,KAAK,EAAE,SAAS;SAChB,CAAC;IACH,CAAC;CACD,CAAC,CAAC;AAEU,QAAA,eAAe,GAAG,SAAC,CAAC,SAAS,CAAC;AAC9B,QAAA,gBAAgB,GAAG,SAAC,CAAC,MAAM,CAAC;AAC5B,QAAA,mBAAmB,GAAG,SAAC,CAAC,mBAAmB,CAAC","sourcesContent":["import { initTRPC } from '@trpc/server';\r\nimport { ZodError } from 'zod';\r\nimport { LyxaContext } from './context';\r\n\r\nexport const t = initTRPC.context<LyxaContext>().create({\r\n\terrorFormatter({ shape, error }) {\r\n\t\tlet zodErrors = null;\r\n\r\n\t\tif (error.code === 'BAD_REQUEST' && error.cause instanceof ZodError) {\r\n\t\t\tconst flattened = error.cause.flatten();\r\n\t\t\tzodErrors = flattened.fieldErrors;\r\n\t\t}\r\n\r\n\t\tconsole.log('Error:', error, shape, 'error log', zodErrors);\r\n\r\n\t\treturn {\r\n\t\t\t...shape,\r\n\t\t\tmessage:\r\n\t\t\t\tzodErrors && typeof zodErrors === 'object'\r\n\t\t\t\t\t? Object.values(zodErrors)[0]?.[0] || shape.message\r\n\t\t\t\t\t: shape.message,\r\n\t\t\tdata: {\r\n\t\t\t\t...shape.data,\r\n\r\n\t\t\t\tstack: undefined,\r\n\t\t\t\tpath: undefined,\r\n\t\t\t},\r\n\t\t\t// Prevent stack trace from being returned in the response\r\n\t\t\tstack: undefined,\r\n\t\t};\r\n\t},\r\n});\r\n\r\nexport const publicProcedure = t.procedure;\r\nexport const createTRPCRouter = t.router;\r\nexport const createCallerFactory = t.createCallerFactory;\r\n"]}
@@ -24,12 +24,12 @@ export declare function createAuthenticatedProcedure(options: AuthOptions): impo
24
24
  _meta: object;
25
25
  _ctx_out: {
26
26
  requestId: string | undefined;
27
- res: import("http").ServerResponse<import("http").IncomingMessage>;
28
- tokenType: TokenType | undefined;
29
27
  entity: import("../context").EntityContext | undefined;
30
- req: import("http").IncomingMessage;
28
+ tokenType: TokenType | undefined;
31
29
  usedRefreshToken: boolean | undefined;
32
30
  tokenRenewed: boolean | undefined;
31
+ req: import("http").IncomingMessage;
32
+ res: import("http").ServerResponse<import("http").IncomingMessage>;
33
33
  };
34
34
  _input_in: typeof import("@trpc/server").unsetMarker;
35
35
  _input_out: typeof import("@trpc/server").unsetMarker;
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"/","sources":["libraries/trpc/middlewares/auth.ts"],"names":[],"mappings":"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","sourcesContent":["import { TRPCError } from '@trpc/server';\nimport { publicProcedure } from '../index';\nimport {\n\tAuthEntityType,\n\tverifyAccessToken,\n\tvalidateRefreshToken,\n\tsignAccessToken,\n\tTokenType,\n\trefreshTokens,\n\thandleTokenRenewal,\n} from '../../auth';\nimport { UserModel } from '../../mongo/models';\n\ninterface AuthOptions {\n\tentityTypes: AuthEntityType[];\n\tallowRefreshToken?: boolean;\n\tautoRefresh?: boolean;\n}\n\n/**\n * A factory that creates an authenticated procedure, optionally allowing\n * refresh tokens and auto-refreshing expired access tokens.\n */\nexport function createAuthenticatedProcedure(options: AuthOptions) {\n\tconst { entityTypes, allowRefreshToken = true, autoRefresh = true } = options;\n\n\treturn publicProcedure.use(async ({ ctx, next }) => {\n\t\tconst authHeader = ctx.req.headers['authorization'];\n\t\tconst refreshTokenHeader = ctx.req.headers['x-refresh-token'];\n\n\t\tif (!authHeader) {\n\t\t\tthrow new TRPCError({ code: 'UNAUTHORIZED', message: 'No authorization header' });\n\t\t}\n\n\t\tconst accessToken = authHeader.replace(/^Bearer\\s+/, '');\n\t\tlet refreshToken = '';\n\n\t\tif (refreshTokenHeader) {\n\t\t\trefreshToken =\n\t\t\t\ttypeof refreshTokenHeader === 'string'\n\t\t\t\t\t? refreshTokenHeader.replace(/^Bearer\\s+/, '')\n\t\t\t\t\t: refreshTokenHeader[0].replace(/^Bearer\\s+/, '');\n\t\t}\n\n\t\tif (!accessToken) {\n\t\t\tthrow new TRPCError({ code: 'UNAUTHORIZED', message: 'Missing access token' });\n\t\t}\n\n\t\tlet entity = await verifyAccessToken(entityTypes, accessToken);\n\n\t\tif (entity?.type == 'USER') {\n\t\t\tconst user = await UserModel.findOne({ _id: entity.id });\n\t\t\tif (!user) {\n\t\t\t\tthrow new TRPCError({ code: 'UNAUTHORIZED', message: 'User not found' });\n\t\t\t}\n\t\t}\n\t\tif (entity) {\n\t\t\tctx.entity = entity;\n\t\t\tctx.tokenType = TokenType.ACCESS;\n\t\t\tctx.usedRefreshToken = false;\n\t\t\tctx.tokenRenewed = false;\n\t\t\treturn next({ ctx });\n\t\t}\n\n\t\tif (!allowRefreshToken || !refreshToken) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'UNAUTHORIZED',\n\t\t\t\tmessage: 'Invalid access token',\n\t\t\t});\n\t\t}\n\n\t\tconst renewalResult = await handleTokenRenewal(refreshToken);\n\n\t\tif (!renewalResult.success) {\n\t\t\tconst errorMessage =\n\t\t\t\trenewalResult.tokenStatus === 'revoked' ? 'Refresh token has been revoked' : 'Invalid refresh token';\n\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'UNAUTHORIZED',\n\t\t\t\tmessage: errorMessage,\n\t\t\t});\n\t\t}\n\n\t\tif (!entityTypes.includes(renewalResult.entity!.type)) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'UNAUTHORIZED',\n\t\t\t\tmessage: 'Unauthorized entity type',\n\t\t\t});\n\t\t}\n\n\t\tctx.entity = renewalResult.entity;\n\t\tctx.tokenType = TokenType.REFRESH;\n\t\tctx.usedRefreshToken = true;\n\n\t\tctx.tokenRenewed = renewalResult.tokenStatus === 'expired';\n\n\t\tif (autoRefresh && renewalResult.newTokens) {\n\t\t\tif (renewalResult.newTokens.accessToken) {\n\t\t\t\tctx.res.setHeader('X-New-Access-Token', renewalResult.newTokens.accessToken);\n\t\t\t}\n\n\t\t\tif (renewalResult.newTokens.refreshToken) {\n\t\t\t\tctx.res.setHeader('X-New-Refresh-Token', renewalResult.newTokens.refreshToken);\n\t\t\t}\n\t\t}\n\n\t\treturn next({ ctx });\n\t});\n}\n"]}
1
+ {"version":3,"file":"auth.js","sourceRoot":"/","sources":["libraries/trpc/middlewares/auth.ts"],"names":[],"mappings":";;AAuBA,oEAqFC;AA5GD,yCAAyC;AACzC,oCAA2C;AAC3C,qCAQoB;AACpB,+CAA+C;AAY/C,SAAgB,4BAA4B,CAAC,OAAoB;IAChE,MAAM,EAAE,WAAW,EAAE,iBAAiB,GAAG,IAAI,EAAE,WAAW,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IAE9E,OAAO,uBAAe,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE;QAClD,MAAM,UAAU,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QACpD,MAAM,kBAAkB,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QAE9D,IAAI,CAAC,UAAU,EAAE,CAAC;YACjB,MAAM,IAAI,kBAAS,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC,CAAC;QACnF,CAAC;QAED,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QACzD,IAAI,YAAY,GAAG,EAAE,CAAC;QAEtB,IAAI,kBAAkB,EAAE,CAAC;YACxB,YAAY;gBACX,OAAO,kBAAkB,KAAK,QAAQ;oBACrC,CAAC,CAAC,kBAAkB,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC;oBAC9C,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QACrD,CAAC;QAED,IAAI,CAAC,WAAW,EAAE,CAAC;YAClB,MAAM,IAAI,kBAAS,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC,CAAC;QAChF,CAAC;QAED,IAAI,MAAM,GAAG,MAAM,IAAA,wBAAiB,EAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAE/D,IAAI,MAAM,EAAE,IAAI,IAAI,MAAM,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,MAAM,kBAAS,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;YACzD,IAAI,CAAC,IAAI,EAAE,CAAC;gBACX,MAAM,IAAI,kBAAS,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC;YAC1E,CAAC;QACF,CAAC;QACD,IAAI,MAAM,EAAE,CAAC;YACZ,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC;YACpB,GAAG,CAAC,SAAS,GAAG,gBAAS,CAAC,MAAM,CAAC;YACjC,GAAG,CAAC,gBAAgB,GAAG,KAAK,CAAC;YAC7B,GAAG,CAAC,YAAY,GAAG,KAAK,CAAC;YACzB,OAAO,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QACtB,CAAC;QAED,IAAI,CAAC,iBAAiB,IAAI,CAAC,YAAY,EAAE,CAAC;YACzC,MAAM,IAAI,kBAAS,CAAC;gBACnB,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,sBAAsB;aAC/B,CAAC,CAAC;QACJ,CAAC;QAED,MAAM,aAAa,GAAG,MAAM,IAAA,yBAAkB,EAAC,YAAY,CAAC,CAAC;QAE7D,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;YAC5B,MAAM,YAAY,GACjB,aAAa,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,gCAAgC,CAAC,CAAC,CAAC,uBAAuB,CAAC;YAEtG,MAAM,IAAI,kBAAS,CAAC;gBACnB,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,YAAY;aACrB,CAAC,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,aAAa,CAAC,MAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACvD,MAAM,IAAI,kBAAS,CAAC;gBACnB,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,0BAA0B;aACnC,CAAC,CAAC;QACJ,CAAC;QAED,GAAG,CAAC,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC;QAClC,GAAG,CAAC,SAAS,GAAG,gBAAS,CAAC,OAAO,CAAC;QAClC,GAAG,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAE5B,GAAG,CAAC,YAAY,GAAG,aAAa,CAAC,WAAW,KAAK,SAAS,CAAC;QAE3D,IAAI,WAAW,IAAI,aAAa,CAAC,SAAS,EAAE,CAAC;YAC5C,IAAI,aAAa,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;gBACzC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,oBAAoB,EAAE,aAAa,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YAC9E,CAAC;YAED,IAAI,aAAa,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;gBAC1C,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,qBAAqB,EAAE,aAAa,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;YAChF,CAAC;QACF,CAAC;QAED,OAAO,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import { TRPCError } from '@trpc/server';\r\nimport { publicProcedure } from '../index';\r\nimport {\r\n\tAuthEntityType,\r\n\tverifyAccessToken,\r\n\tvalidateRefreshToken,\r\n\tsignAccessToken,\r\n\tTokenType,\r\n\trefreshTokens,\r\n\thandleTokenRenewal,\r\n} from '../../auth';\r\nimport { UserModel } from '../../mongo/models';\r\n\r\ninterface AuthOptions {\r\n\tentityTypes: AuthEntityType[];\r\n\tallowRefreshToken?: boolean;\r\n\tautoRefresh?: boolean;\r\n}\r\n\r\n/**\r\n * A factory that creates an authenticated procedure, optionally allowing\r\n * refresh tokens and auto-refreshing expired access tokens.\r\n */\r\nexport function createAuthenticatedProcedure(options: AuthOptions) {\r\n\tconst { entityTypes, allowRefreshToken = true, autoRefresh = true } = options;\r\n\r\n\treturn publicProcedure.use(async ({ ctx, next }) => {\r\n\t\tconst authHeader = ctx.req.headers['authorization'];\r\n\t\tconst refreshTokenHeader = ctx.req.headers['x-refresh-token'];\r\n\r\n\t\tif (!authHeader) {\r\n\t\t\tthrow new TRPCError({ code: 'UNAUTHORIZED', message: 'No authorization header' });\r\n\t\t}\r\n\r\n\t\tconst accessToken = authHeader.replace(/^Bearer\\s+/, '');\r\n\t\tlet refreshToken = '';\r\n\r\n\t\tif (refreshTokenHeader) {\r\n\t\t\trefreshToken =\r\n\t\t\t\ttypeof refreshTokenHeader === 'string'\r\n\t\t\t\t\t? refreshTokenHeader.replace(/^Bearer\\s+/, '')\r\n\t\t\t\t\t: refreshTokenHeader[0].replace(/^Bearer\\s+/, '');\r\n\t\t}\r\n\r\n\t\tif (!accessToken) {\r\n\t\t\tthrow new TRPCError({ code: 'UNAUTHORIZED', message: 'Missing access token' });\r\n\t\t}\r\n\r\n\t\tlet entity = await verifyAccessToken(entityTypes, accessToken);\r\n\r\n\t\tif (entity?.type == 'USER') {\r\n\t\t\tconst user = await UserModel.findOne({ _id: entity.id });\r\n\t\t\tif (!user) {\r\n\t\t\t\tthrow new TRPCError({ code: 'UNAUTHORIZED', message: 'User not found' });\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (entity) {\r\n\t\t\tctx.entity = entity;\r\n\t\t\tctx.tokenType = TokenType.ACCESS;\r\n\t\t\tctx.usedRefreshToken = false;\r\n\t\t\tctx.tokenRenewed = false;\r\n\t\t\treturn next({ ctx });\r\n\t\t}\r\n\r\n\t\tif (!allowRefreshToken || !refreshToken) {\r\n\t\t\tthrow new TRPCError({\r\n\t\t\t\tcode: 'UNAUTHORIZED',\r\n\t\t\t\tmessage: 'Invalid access token',\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tconst renewalResult = await handleTokenRenewal(refreshToken);\r\n\r\n\t\tif (!renewalResult.success) {\r\n\t\t\tconst errorMessage =\r\n\t\t\t\trenewalResult.tokenStatus === 'revoked' ? 'Refresh token has been revoked' : 'Invalid refresh token';\r\n\r\n\t\t\tthrow new TRPCError({\r\n\t\t\t\tcode: 'UNAUTHORIZED',\r\n\t\t\t\tmessage: errorMessage,\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif (!entityTypes.includes(renewalResult.entity!.type)) {\r\n\t\t\tthrow new TRPCError({\r\n\t\t\t\tcode: 'UNAUTHORIZED',\r\n\t\t\t\tmessage: 'Unauthorized entity type',\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tctx.entity = renewalResult.entity;\r\n\t\tctx.tokenType = TokenType.REFRESH;\r\n\t\tctx.usedRefreshToken = true;\r\n\r\n\t\tctx.tokenRenewed = renewalResult.tokenStatus === 'expired';\r\n\r\n\t\tif (autoRefresh && renewalResult.newTokens) {\r\n\t\t\tif (renewalResult.newTokens.accessToken) {\r\n\t\t\t\tctx.res.setHeader('X-New-Access-Token', renewalResult.newTokens.accessToken);\r\n\t\t\t}\r\n\r\n\t\t\tif (renewalResult.newTokens.refreshToken) {\r\n\t\t\t\tctx.res.setHeader('X-New-Refresh-Token', renewalResult.newTokens.refreshToken);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn next({ ctx });\r\n\t});\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"cors.js","sourceRoot":"/","sources":["libraries/trpc/middlewares/cors.ts"],"names":[],"mappings":";;AAqBA,wCA6DC;AA7DD,SAAgB,cAAc,CAAC,UAAuB,EAAE;IAEvD,MAAM,MAAM,GAA0B;QACrC,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,GAAG;QAC7B,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,CAAC,oBAAoB,CAAC;QAClD,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,KAAK;QACzC,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,KAAK;QAC/B,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,IAAI,KAAK;QACrD,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,CAAC,cAAc,EAAE,eAAe,EAAE,kBAAkB,EAAE,iBAAiB,CAAC;QAClH,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,CAAC,eAAe,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,qBAAqB,CAAC;KAC3H,CAAC;IAGF,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;IACjG,MAAM,oBAAoB,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC;QAChE,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;QAClC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC;IACzB,MAAM,oBAAoB,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC;QAChE,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;QAClC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC;IAGzB,OAAO,CAAC,GAAoB,EAAE,GAAmB,EAAE,IAAgB,EAAE,EAAE;QACtE,IAAI,CAAC;YAEJ,GAAG,CAAC,SAAS,CAAC,6BAA6B,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YAG5D,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC9B,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,aAAa,CAAC,CAAC;gBAC7D,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,oBAAoB,CAAC,CAAC;gBAEpE,IAAI,oBAAoB,EAAE,CAAC;oBAC1B,GAAG,CAAC,SAAS,CAAC,+BAA+B,EAAE,oBAAoB,CAAC,CAAC;gBACtE,CAAC;gBAED,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;oBACxB,GAAG,CAAC,SAAS,CAAC,kCAAkC,EAAE,MAAM,CAAC,CAAC;gBAC3D,CAAC;gBAED,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;oBACnB,GAAG,CAAC,SAAS,CAAC,wBAAwB,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;gBACnE,CAAC;YACF,CAAC;YAGD,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC9B,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBACnB,GAAG,CAAC,GAAG,EAAE,CAAC;gBACV,OAAO;YACR,CAAC;YAGD,IAAI,EAAE,CAAC;QACR,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAEhB,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;YAE/C,IAAI,EAAE,CAAC;QACR,CAAC;IACF,CAAC,CAAC;AACH,CAAC","sourcesContent":["import type { IncomingMessage, ServerResponse } from 'http';\n\n/**\n * Interface for CORS middleware options\n */\ninterface CorsOptions {\n\torigin?: string | string[];\n\tmethods?: string[];\n\tallowedHeaders?: string[];\n\texposedHeaders?: string[];\n\tcredentials?: boolean;\n\tmaxAge?: number;\n\tpreflightContinue?: boolean;\n}\n\n/**\n * Creates a configurable CORS middleware for tRPC applications\n *\n * @param options Configuration options for CORS\n * @returns A middleware function for handling CORS\n */\nexport function corsMiddleware(options: CorsOptions = {}) {\n\t// Default configuration with sensible values\n\tconst config: Required<CorsOptions> = {\n\t\torigin: options.origin || '*',\n\t\tmethods: options.methods || ['GET, POST, OPTIONS'],\n\t\tcredentials: options.credentials || false,\n\t\tmaxAge: options.maxAge || 86400, // 24 hours\n\t\tpreflightContinue: options.preflightContinue || false,\n\t\tallowedHeaders: options.allowedHeaders || ['Content-Type', 'Authorization', 'X-Requested-With', 'x-refresh-token'],\n\t\texposedHeaders: options.exposedHeaders || ['Content-Range', 'X-Content-Range', 'X-New-Access-Token', 'X-New-Refresh-Token'],\n\t};\n\n\t// Convert arrays to comma-separated strings for header values\n\tconst methodsString = Array.isArray(config.methods) ? config.methods.join(', ') : config.methods;\n\tconst allowedHeadersString = Array.isArray(config.allowedHeaders)\n\t\t? config.allowedHeaders.join(', ')\n\t\t: config.allowedHeaders;\n\tconst exposedHeadersString = Array.isArray(config.exposedHeaders)\n\t\t? config.exposedHeaders.join(', ')\n\t\t: config.exposedHeaders;\n\n\t// Return the middleware function\n\treturn (req: IncomingMessage, res: ServerResponse, next: () => void) => {\n\t\ttry {\n\t\t\t// Always set the CORS headers\n\t\t\tres.setHeader('Access-Control-Allow-Origin', config.origin);\n\n\t\t\t// Only set other headers if origin is not blocking the request\n\t\t\tif (config.origin !== 'none') {\n\t\t\t\tres.setHeader('Access-Control-Allow-Methods', methodsString);\n\t\t\t\tres.setHeader('Access-Control-Allow-Headers', allowedHeadersString);\n\n\t\t\t\tif (exposedHeadersString) {\n\t\t\t\t\tres.setHeader('Access-Control-Expose-Headers', exposedHeadersString);\n\t\t\t\t}\n\n\t\t\t\tif (config.credentials) {\n\t\t\t\t\tres.setHeader('Access-Control-Allow-Credentials', 'true');\n\t\t\t\t}\n\n\t\t\t\tif (config.maxAge) {\n\t\t\t\t\tres.setHeader('Access-Control-Max-Age', config.maxAge.toString());\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Handle OPTIONS preflight requests\n\t\t\tif (req.method === 'OPTIONS') {\n\t\t\t\tres.writeHead(204); // 204 No Content is more appropriate for preflight\n\t\t\t\tres.end();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Move to the next middleware\n\t\t\tnext();\n\t\t} catch (error) {\n\t\t\t// Handle any errors that might occur\n\t\t\tconsole.error('CORS middleware error:', error);\n\t\t\t// Call next without the error as it expects no arguments\n\t\t\tnext();\n\t\t}\n\t};\n}\n"]}
1
+ {"version":3,"file":"cors.js","sourceRoot":"/","sources":["libraries/trpc/middlewares/cors.ts"],"names":[],"mappings":";;AAqBA,wCA6DC;AA7DD,SAAgB,cAAc,CAAC,UAAuB,EAAE;IAEvD,MAAM,MAAM,GAA0B;QACrC,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,GAAG;QAC7B,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,CAAC,oBAAoB,CAAC;QAClD,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,KAAK;QACzC,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,KAAK;QAC/B,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,IAAI,KAAK;QACrD,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,CAAC,cAAc,EAAE,eAAe,EAAE,kBAAkB,EAAE,iBAAiB,CAAC;QAClH,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,CAAC,eAAe,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,qBAAqB,CAAC;KAC3H,CAAC;IAGF,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;IACjG,MAAM,oBAAoB,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC;QAChE,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;QAClC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC;IACzB,MAAM,oBAAoB,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC;QAChE,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;QAClC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC;IAGzB,OAAO,CAAC,GAAoB,EAAE,GAAmB,EAAE,IAAgB,EAAE,EAAE;QACtE,IAAI,CAAC;YAEJ,GAAG,CAAC,SAAS,CAAC,6BAA6B,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YAG5D,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC9B,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,aAAa,CAAC,CAAC;gBAC7D,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,oBAAoB,CAAC,CAAC;gBAEpE,IAAI,oBAAoB,EAAE,CAAC;oBAC1B,GAAG,CAAC,SAAS,CAAC,+BAA+B,EAAE,oBAAoB,CAAC,CAAC;gBACtE,CAAC;gBAED,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;oBACxB,GAAG,CAAC,SAAS,CAAC,kCAAkC,EAAE,MAAM,CAAC,CAAC;gBAC3D,CAAC;gBAED,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;oBACnB,GAAG,CAAC,SAAS,CAAC,wBAAwB,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;gBACnE,CAAC;YACF,CAAC;YAGD,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC9B,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBACnB,GAAG,CAAC,GAAG,EAAE,CAAC;gBACV,OAAO;YACR,CAAC;YAGD,IAAI,EAAE,CAAC;QACR,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAEhB,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;YAE/C,IAAI,EAAE,CAAC;QACR,CAAC;IACF,CAAC,CAAC;AACH,CAAC","sourcesContent":["import type { IncomingMessage, ServerResponse } from 'http';\r\n\r\n/**\r\n * Interface for CORS middleware options\r\n */\r\ninterface CorsOptions {\r\n\torigin?: string | string[];\r\n\tmethods?: string[];\r\n\tallowedHeaders?: string[];\r\n\texposedHeaders?: string[];\r\n\tcredentials?: boolean;\r\n\tmaxAge?: number;\r\n\tpreflightContinue?: boolean;\r\n}\r\n\r\n/**\r\n * Creates a configurable CORS middleware for tRPC applications\r\n *\r\n * @param options Configuration options for CORS\r\n * @returns A middleware function for handling CORS\r\n */\r\nexport function corsMiddleware(options: CorsOptions = {}) {\r\n\t// Default configuration with sensible values\r\n\tconst config: Required<CorsOptions> = {\r\n\t\torigin: options.origin || '*',\r\n\t\tmethods: options.methods || ['GET, POST, OPTIONS'],\r\n\t\tcredentials: options.credentials || false,\r\n\t\tmaxAge: options.maxAge || 86400, // 24 hours\r\n\t\tpreflightContinue: options.preflightContinue || false,\r\n\t\tallowedHeaders: options.allowedHeaders || ['Content-Type', 'Authorization', 'X-Requested-With', 'x-refresh-token'],\r\n\t\texposedHeaders: options.exposedHeaders || ['Content-Range', 'X-Content-Range', 'X-New-Access-Token', 'X-New-Refresh-Token'],\r\n\t};\r\n\r\n\t// Convert arrays to comma-separated strings for header values\r\n\tconst methodsString = Array.isArray(config.methods) ? config.methods.join(', ') : config.methods;\r\n\tconst allowedHeadersString = Array.isArray(config.allowedHeaders)\r\n\t\t? config.allowedHeaders.join(', ')\r\n\t\t: config.allowedHeaders;\r\n\tconst exposedHeadersString = Array.isArray(config.exposedHeaders)\r\n\t\t? config.exposedHeaders.join(', ')\r\n\t\t: config.exposedHeaders;\r\n\r\n\t// Return the middleware function\r\n\treturn (req: IncomingMessage, res: ServerResponse, next: () => void) => {\r\n\t\ttry {\r\n\t\t\t// Always set the CORS headers\r\n\t\t\tres.setHeader('Access-Control-Allow-Origin', config.origin);\r\n\r\n\t\t\t// Only set other headers if origin is not blocking the request\r\n\t\t\tif (config.origin !== 'none') {\r\n\t\t\t\tres.setHeader('Access-Control-Allow-Methods', methodsString);\r\n\t\t\t\tres.setHeader('Access-Control-Allow-Headers', allowedHeadersString);\r\n\r\n\t\t\t\tif (exposedHeadersString) {\r\n\t\t\t\t\tres.setHeader('Access-Control-Expose-Headers', exposedHeadersString);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (config.credentials) {\r\n\t\t\t\t\tres.setHeader('Access-Control-Allow-Credentials', 'true');\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (config.maxAge) {\r\n\t\t\t\t\tres.setHeader('Access-Control-Max-Age', config.maxAge.toString());\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Handle OPTIONS preflight requests\r\n\t\t\tif (req.method === 'OPTIONS') {\r\n\t\t\t\tres.writeHead(204); // 204 No Content is more appropriate for preflight\r\n\t\t\t\tres.end();\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// Move to the next middleware\r\n\t\t\tnext();\r\n\t\t} catch (error) {\r\n\t\t\t// Handle any errors that might occur\r\n\t\t\tconsole.error('CORS middleware error:', error);\r\n\t\t\t// Call next without the error as it expects no arguments\r\n\t\t\tnext();\r\n\t\t}\r\n\t};\r\n}\r\n"]}
@@ -22,12 +22,12 @@ export declare function createPhoneVerifiedProcedure(options: PhoneVerifiedOptio
22
22
  _meta: object;
23
23
  _ctx_out: {
24
24
  requestId: string | undefined;
25
- res: import("http").ServerResponse<import("http").IncomingMessage>;
26
- tokenType: import("../../auth").TokenType | undefined;
27
25
  entity: import("../context").EntityContext | undefined;
28
- req: import("http").IncomingMessage;
26
+ tokenType: import("../../auth").TokenType | undefined;
29
27
  usedRefreshToken: boolean | undefined;
30
28
  tokenRenewed: boolean | undefined;
29
+ req: import("http").IncomingMessage;
30
+ res: import("http").ServerResponse<import("http").IncomingMessage>;
31
31
  };
32
32
  _input_in: typeof import("@trpc/server").unsetMarker;
33
33
  _input_out: typeof import("@trpc/server").unsetMarker;
@@ -1 +1 @@
1
- {"version":3,"file":"phone-verified.js","sourceRoot":"/","sources":["libraries/trpc/middlewares/phone-verified.ts"],"names":[],"mappings":";;AAaA,oEAkBC;AA/BD,yCAAyC;AACzC,iCAAsD;AAEtD,+CAA+C;AAU/C,SAAgB,4BAA4B,CAAC,OAA6B;IACzE,OAAO,IAAA,mCAA4B,EAAC,OAAO,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE;QACxE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,kBAAS,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,wBAAwB,EAAE,CAAC,CAAC;QAClF,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,kBAAS,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7D,IAAI,CAAC,IAAI,EAAE,CAAC;YACX,MAAM,IAAI,kBAAS,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC;QAC1E,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,eAAe;YACxB,MAAM,IAAI,kBAAS,CAAC;gBACnB,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,yDAAyD;aAClE,CAAC,CAAC;QAEJ,OAAO,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import { TRPCError } from '@trpc/server';\nimport { createAuthenticatedProcedure } from './auth'; // Adjust import path!\nimport { AuthEntityType } from '../../auth';\nimport { UserModel } from '../../mongo/models';\n\ninterface PhoneVerifiedOptions {\n\tentityTypes: AuthEntityType[];\n}\n\n/**\n * A factory that creates a procedure requiring a verified phone number,\n * ensuring the user is authenticated and their phone is verified.\n */\nexport function createPhoneVerifiedProcedure(options: PhoneVerifiedOptions) {\n\treturn createAuthenticatedProcedure(options).use(async ({ ctx, next }) => {\n\t\tif (!ctx.entity) {\n\t\t\tthrow new TRPCError({ code: 'UNAUTHORIZED', message: 'User not authenticated' });\n\t\t}\n\n\t\tconst user = await UserModel.findOne({ _id: ctx.entity.id });\n\t\tif (!user) {\n\t\t\tthrow new TRPCError({ code: 'UNAUTHORIZED', message: 'User not found' });\n\t\t}\n\t\tif (!user.isPhoneVerified)\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'FORBIDDEN',\n\t\t\t\tmessage: 'Please verify your phone number to access this resource',\n\t\t\t});\n\n\t\treturn next({ ctx });\n\t});\n}\n"]}
1
+ {"version":3,"file":"phone-verified.js","sourceRoot":"/","sources":["libraries/trpc/middlewares/phone-verified.ts"],"names":[],"mappings":";;AAaA,oEAkBC;AA/BD,yCAAyC;AACzC,iCAAsD;AAEtD,+CAA+C;AAU/C,SAAgB,4BAA4B,CAAC,OAA6B;IACzE,OAAO,IAAA,mCAA4B,EAAC,OAAO,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE;QACxE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,kBAAS,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,wBAAwB,EAAE,CAAC,CAAC;QAClF,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,kBAAS,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7D,IAAI,CAAC,IAAI,EAAE,CAAC;YACX,MAAM,IAAI,kBAAS,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC;QAC1E,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,eAAe;YACxB,MAAM,IAAI,kBAAS,CAAC;gBACnB,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,yDAAyD;aAClE,CAAC,CAAC;QAEJ,OAAO,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import { TRPCError } from '@trpc/server';\r\nimport { createAuthenticatedProcedure } from './auth'; // Adjust import path!\r\nimport { AuthEntityType } from '../../auth';\r\nimport { UserModel } from '../../mongo/models';\r\n\r\ninterface PhoneVerifiedOptions {\r\n\tentityTypes: AuthEntityType[];\r\n}\r\n\r\n/**\r\n * A factory that creates a procedure requiring a verified phone number,\r\n * ensuring the user is authenticated and their phone is verified.\r\n */\r\nexport function createPhoneVerifiedProcedure(options: PhoneVerifiedOptions) {\r\n\treturn createAuthenticatedProcedure(options).use(async ({ ctx, next }) => {\r\n\t\tif (!ctx.entity) {\r\n\t\t\tthrow new TRPCError({ code: 'UNAUTHORIZED', message: 'User not authenticated' });\r\n\t\t}\r\n\r\n\t\tconst user = await UserModel.findOne({ _id: ctx.entity.id });\r\n\t\tif (!user) {\r\n\t\t\tthrow new TRPCError({ code: 'UNAUTHORIZED', message: 'User not found' });\r\n\t\t}\r\n\t\tif (!user.isPhoneVerified)\r\n\t\t\tthrow new TRPCError({\r\n\t\t\t\tcode: 'FORBIDDEN',\r\n\t\t\t\tmessage: 'Please verify your phone number to access this resource',\r\n\t\t\t});\r\n\r\n\t\treturn next({ ctx });\r\n\t});\r\n}\r\n"]}
@@ -24,12 +24,12 @@ export declare function publicUserDecoder(options: AuthOptions): import("@trpc/s
24
24
  _meta: object;
25
25
  _ctx_out: {
26
26
  requestId: string | undefined;
27
- res: import("http").ServerResponse<import("http").IncomingMessage>;
28
- tokenType: TokenType | undefined;
29
27
  entity: import("../context").EntityContext | undefined;
30
- req: import("http").IncomingMessage;
28
+ tokenType: TokenType | undefined;
31
29
  usedRefreshToken: boolean | undefined;
32
30
  tokenRenewed: boolean | undefined;
31
+ req: import("http").IncomingMessage;
32
+ res: import("http").ServerResponse<import("http").IncomingMessage>;
33
33
  };
34
34
  _input_in: typeof import("@trpc/server").unsetMarker;
35
35
  _input_out: typeof import("@trpc/server").unsetMarker;
@@ -1 +1 @@
1
- {"version":3,"file":"publicUserDecoder.js","sourceRoot":"/","sources":["libraries/trpc/middlewares/publicUserDecoder.ts"],"names":[],"mappings":"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","sourcesContent":["import { TRPCError } from '@trpc/server';\nimport { publicProcedure } from '../index';\nimport {\n AuthEntityType,\n verifyAccessToken,\n TokenType,\n handleTokenRenewal,\n} from '../../auth';\n\ninterface AuthOptions {\n entityTypes: AuthEntityType[];\n allowRefreshToken?: boolean;\n autoRefresh?: boolean;\n}\n\n/**\n * A factory that creates an authenticated procedure, optionally allowing\n * refresh tokens and auto-refreshing expired access tokens.\n */\nexport function publicUserDecoder(options: AuthOptions) {\n const { entityTypes, allowRefreshToken = true, autoRefresh = true } = options;\n\n return publicProcedure.use(async ({ ctx, next }) => {\n const authHeader = ctx.req.headers['authorization'];\n if (!authHeader) {\n return next({ ctx });\n } else {\n const refreshTokenHeader = ctx.req.headers['x-refresh-token'];\n\n if (!authHeader) {\n throw new TRPCError({ code: 'UNAUTHORIZED', message: 'No authorization header' });\n }\n\n const accessToken = authHeader.replace(/^Bearer\\s+/, '');\n let refreshToken = '';\n\n if (refreshTokenHeader) {\n refreshToken =\n typeof refreshTokenHeader === 'string'\n ? refreshTokenHeader.replace(/^Bearer\\s+/, '')\n : refreshTokenHeader[0].replace(/^Bearer\\s+/, '');\n }\n\n if (!accessToken) {\n throw new TRPCError({ code: 'UNAUTHORIZED', message: 'Missing access token' });\n }\n\n let entity = await verifyAccessToken(entityTypes, accessToken);\n\n if (entity) {\n ctx.entity = entity;\n ctx.tokenType = TokenType.ACCESS;\n ctx.usedRefreshToken = false;\n ctx.tokenRenewed = false;\n return next({ ctx });\n }\n\n if (!allowRefreshToken || !refreshToken) {\n throw new TRPCError({\n code: 'UNAUTHORIZED',\n message: 'Invalid access token',\n });\n }\n\n const renewalResult = await handleTokenRenewal(refreshToken);\n\n if (!renewalResult.success) {\n const errorMessage =\n renewalResult.tokenStatus === 'revoked' ? 'Refresh token has been revoked' : 'Invalid refresh token';\n\n throw new TRPCError({\n code: 'UNAUTHORIZED',\n message: errorMessage,\n });\n }\n\n if (!entityTypes.includes(renewalResult.entity!.type)) {\n throw new TRPCError({\n code: 'UNAUTHORIZED',\n message: 'Unauthorized entity type',\n });\n }\n\n ctx.entity = renewalResult.entity;\n ctx.tokenType = TokenType.REFRESH;\n ctx.usedRefreshToken = true;\n\n ctx.tokenRenewed = renewalResult.tokenStatus === 'expired';\n\n if (autoRefresh && renewalResult.newTokens) {\n if (renewalResult.newTokens.accessToken) {\n ctx.res.setHeader('X-New-Access-Token', renewalResult.newTokens.accessToken);\n }\n\n if (renewalResult.newTokens.refreshToken) {\n ctx.res.setHeader('X-New-Refresh-Token', renewalResult.newTokens.refreshToken);\n }\n }\n\n return next({ ctx });\n }\n });\n}\n"]}
1
+ {"version":3,"file":"publicUserDecoder.js","sourceRoot":"/","sources":["libraries/trpc/middlewares/publicUserDecoder.ts"],"names":[],"mappings":"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","sourcesContent":["import { TRPCError } from '@trpc/server';\r\nimport { publicProcedure } from '../index';\r\nimport {\r\n AuthEntityType,\r\n verifyAccessToken,\r\n TokenType,\r\n handleTokenRenewal,\r\n} from '../../auth';\r\n\r\ninterface AuthOptions {\r\n entityTypes: AuthEntityType[];\r\n allowRefreshToken?: boolean;\r\n autoRefresh?: boolean;\r\n}\r\n\r\n/**\r\n * A factory that creates an authenticated procedure, optionally allowing\r\n * refresh tokens and auto-refreshing expired access tokens.\r\n */\r\nexport function publicUserDecoder(options: AuthOptions) {\r\n const { entityTypes, allowRefreshToken = true, autoRefresh = true } = options;\r\n\r\n return publicProcedure.use(async ({ ctx, next }) => {\r\n const authHeader = ctx.req.headers['authorization'];\r\n if (!authHeader) {\r\n return next({ ctx });\r\n } else {\r\n const refreshTokenHeader = ctx.req.headers['x-refresh-token'];\r\n\r\n if (!authHeader) {\r\n throw new TRPCError({ code: 'UNAUTHORIZED', message: 'No authorization header' });\r\n }\r\n\r\n const accessToken = authHeader.replace(/^Bearer\\s+/, '');\r\n let refreshToken = '';\r\n\r\n if (refreshTokenHeader) {\r\n refreshToken =\r\n typeof refreshTokenHeader === 'string'\r\n ? refreshTokenHeader.replace(/^Bearer\\s+/, '')\r\n : refreshTokenHeader[0].replace(/^Bearer\\s+/, '');\r\n }\r\n\r\n if (!accessToken) {\r\n throw new TRPCError({ code: 'UNAUTHORIZED', message: 'Missing access token' });\r\n }\r\n\r\n let entity = await verifyAccessToken(entityTypes, accessToken);\r\n\r\n if (entity) {\r\n ctx.entity = entity;\r\n ctx.tokenType = TokenType.ACCESS;\r\n ctx.usedRefreshToken = false;\r\n ctx.tokenRenewed = false;\r\n return next({ ctx });\r\n }\r\n\r\n if (!allowRefreshToken || !refreshToken) {\r\n throw new TRPCError({\r\n code: 'UNAUTHORIZED',\r\n message: 'Invalid access token',\r\n });\r\n }\r\n\r\n const renewalResult = await handleTokenRenewal(refreshToken);\r\n\r\n if (!renewalResult.success) {\r\n const errorMessage =\r\n renewalResult.tokenStatus === 'revoked' ? 'Refresh token has been revoked' : 'Invalid refresh token';\r\n\r\n throw new TRPCError({\r\n code: 'UNAUTHORIZED',\r\n message: errorMessage,\r\n });\r\n }\r\n\r\n if (!entityTypes.includes(renewalResult.entity!.type)) {\r\n throw new TRPCError({\r\n code: 'UNAUTHORIZED',\r\n message: 'Unauthorized entity type',\r\n });\r\n }\r\n\r\n ctx.entity = renewalResult.entity;\r\n ctx.tokenType = TokenType.REFRESH;\r\n ctx.usedRefreshToken = true;\r\n\r\n ctx.tokenRenewed = renewalResult.tokenStatus === 'expired';\r\n\r\n if (autoRefresh && renewalResult.newTokens) {\r\n if (renewalResult.newTokens.accessToken) {\r\n ctx.res.setHeader('X-New-Access-Token', renewalResult.newTokens.accessToken);\r\n }\r\n\r\n if (renewalResult.newTokens.refreshToken) {\r\n ctx.res.setHeader('X-New-Refresh-Token', renewalResult.newTokens.refreshToken);\r\n }\r\n }\r\n\r\n return next({ ctx });\r\n }\r\n });\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"/","sources":["libraries/twilio/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,mCAAiC;AACjC,mCAAgC;AAGzB,IAAM,aAAa,GAAnB,MAAM,aAAa;IACjB,OAAO,CAAS;IAExB;QACC,IAAI,CAAC,OAAO,GAAG,IAAI,eAAM,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC1F,CAAC;IAEM,KAAK,CAAC,eAAe,CAAC,QAAgB,EAAE,GAAW;QACzD,IAAI,CAAC;YACJ,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;gBACzC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB;gBACpC,EAAE,EAAE,YAAY,QAAQ,EAAE;gBAC1B,mBAAmB,EAAE,oCAAoC;gBACzD,UAAU,EAAE,oCAAoC;gBAChD,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC;oBAChC,GAAG,EAAE,GAAG;iBACR,CAAC;aACF,CAAC,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAEhB,OAAO,IAAI,CAAC;QACb,CAAC;IACF,CAAC;CACD,CAAA;AAvBY,sCAAa;wBAAb,aAAa;IADzB,IAAA,gBAAO,GAAE;;GACG,aAAa,CAuBzB","sourcesContent":["import { MessageInstance } from 'twilio/lib/rest/api/v2010/account/message';\nimport { Service } from 'typedi';\nimport { Twilio } from 'twilio';\n\n@Service()\nexport class TwilioService {\n\tprivate _client: Twilio;\n\n\tconstructor() {\n\t\tthis._client = new Twilio(process.env.TWILIO_ACCOUNT_SID, process.env.TWILIO_AUTH_TOKEN);\n\t}\n\n\tpublic async sendWhatsappOTP(toNumber: number, otp: string): Promise<MessageInstance | null> {\n\t\ttry {\n\t\t\treturn await this._client.messages.create({\n\t\t\t\tfrom: process.env.TWILIO_FROM_NUMBER,\n\t\t\t\tto: `whatsapp:${toNumber}`,\n\t\t\t\tmessagingServiceSid: 'MG7388a0916945dcd333451f22f9f723f7',\n\t\t\t\tcontentSid: 'HXbd364741884cfdbbfd7dd38ce7f6b5d3',\n\t\t\t\tcontentVariables: JSON.stringify({\n\t\t\t\t\t'1': otp,\n\t\t\t\t}),\n\t\t\t});\n\t\t} catch (error) {\n\t\t\t//todo log error in logger\n\t\t\treturn null;\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"/","sources":["libraries/twilio/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,mCAAiC;AACjC,mCAAgC;AAGzB,IAAM,aAAa,GAAnB,MAAM,aAAa;IACjB,OAAO,CAAS;IAExB;QACC,IAAI,CAAC,OAAO,GAAG,IAAI,eAAM,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC1F,CAAC;IAEM,KAAK,CAAC,eAAe,CAAC,QAAgB,EAAE,GAAW;QACzD,IAAI,CAAC;YACJ,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;gBACzC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB;gBACpC,EAAE,EAAE,YAAY,QAAQ,EAAE;gBAC1B,mBAAmB,EAAE,oCAAoC;gBACzD,UAAU,EAAE,oCAAoC;gBAChD,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC;oBAChC,GAAG,EAAE,GAAG;iBACR,CAAC;aACF,CAAC,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAEhB,OAAO,IAAI,CAAC;QACb,CAAC;IACF,CAAC;CACD,CAAA;AAvBY,sCAAa;wBAAb,aAAa;IADzB,IAAA,gBAAO,GAAE;;GACG,aAAa,CAuBzB","sourcesContent":["import { MessageInstance } from 'twilio/lib/rest/api/v2010/account/message';\r\nimport { Service } from 'typedi';\r\nimport { Twilio } from 'twilio';\r\n\r\n@Service()\r\nexport class TwilioService {\r\n\tprivate _client: Twilio;\r\n\r\n\tconstructor() {\r\n\t\tthis._client = new Twilio(process.env.TWILIO_ACCOUNT_SID, process.env.TWILIO_AUTH_TOKEN);\r\n\t}\r\n\r\n\tpublic async sendWhatsappOTP(toNumber: number, otp: string): Promise<MessageInstance | null> {\r\n\t\ttry {\r\n\t\t\treturn await this._client.messages.create({\r\n\t\t\t\tfrom: process.env.TWILIO_FROM_NUMBER,\r\n\t\t\t\tto: `whatsapp:${toNumber}`,\r\n\t\t\t\tmessagingServiceSid: 'MG7388a0916945dcd333451f22f9f723f7',\r\n\t\t\t\tcontentSid: 'HXbd364741884cfdbbfd7dd38ce7f6b5d3',\r\n\t\t\t\tcontentVariables: JSON.stringify({\r\n\t\t\t\t\t'1': otp,\r\n\t\t\t\t}),\r\n\t\t\t});\r\n\t\t} catch (error) {\r\n\t\t\t//todo log error in logger\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"/","sources":["libraries/upload/index.ts"],"names":[],"mappings":"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","sourcesContent":["import axios from 'axios';\nimport sharp from 'sharp';\nimport moment from 'moment';\nimport path from 'path';\nimport { getLibraries } from '../../index';\nimport mime from 'mime-types';\n\nfunction makeSlug(input: string): string {\n\treturn input\n\t\t.toLowerCase()\n\t\t.replace(/[^a-z0-9]+/g, '-')\n\t\t.replace(/(^-|-$)/g, '');\n}\n\nexport class UploadService {\n\tprivate bucket;\n\tprivate readonly websiteName;\n\n\tconstructor(bucketName?: string) {\n\t\tif (!bucketName) {\n\t\t\tbucketName = 'lyxa-global';\n\t\t}\n\n\t\tthis.bucket = getLibraries().getFirebaseService().superApp.storage().bucket(bucketName);\n\t\tthis.websiteName = 'lyxa-' + getLibraries().getConfigurationService().options.tenet;\n\t}\n\n\t/**\n\t * Generates a unique filename using the original filename.\n\t */\n\tprivate generateFilename(originalFilename: string, extension?: string): string {\n\t\tconst nameWithoutExt = path.parse(originalFilename).name;\n\t\tconst newExtension = extension || path.extname(originalFilename);\n\t\tconst timestamp = moment().format('DDMMYYHmmss');\n\t\tconst randomId = Math.floor(Math.random() * 100);\n\t\tconst baseName = `${makeSlug(nameWithoutExt)}-${this.websiteName}-${timestamp}-${randomId}`;\n\t\treturn baseName + newExtension;\n\t}\n\n\t/**\n\t * Uploads an image buffer after processing it with Sharp.\n\t * An optional destinationPath can be provided (e.g., 'images/product.jpg').\n\t */\n\tasync uploadImage(buffer: Buffer, originalFilename: string): Promise<{ filename: string; url: string }> {\n\t\tconst newFilename = this.generateFilename(originalFilename);\n\t\tconst extension = path.extname(newFilename).toLowerCase();\n\t\tlet processedImage: sharp.Sharp;\n\t\tlet contentType: string;\n\t\tif (extension === '.png') {\n\t\t\tprocessedImage = sharp(buffer).png({ quality: 80 });\n\t\t\tcontentType = 'image/png';\n\t\t} else if (extension === '.webp') {\n\t\t\tprocessedImage = sharp(buffer).webp({ quality: 80 });\n\t\t\tcontentType = 'image/webp';\n\t\t} else {\n\t\t\tprocessedImage = sharp(buffer).jpeg({ quality: 80 });\n\t\t\tcontentType = 'image/jpeg';\n\t\t}\n\n\t\tconst file = this.bucket.file(newFilename);\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst blobStream = file.createWriteStream({\n\t\t\t\tresumable: false,\n\t\t\t\tcontentType,\n\t\t\t});\n\n\t\t\tblobStream.on('error', (err: Error) => {\n\t\t\t\treject(err);\n\t\t\t});\n\n\t\t\tblobStream.on('finish', async () => {\n\t\t\t\ttry {\n\t\t\t\t\tawait file.makePublic();\n\t\t\t\t\tconst publicUrl = `https://storage.googleapis.com/${this.bucket.name}/${file.name}`;\n\t\t\t\t\tresolve({ filename: file.name, url: publicUrl });\n\t\t\t\t} catch (err) {\n\t\t\t\t\treject(err);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tprocessedImage.pipe(blobStream);\n\t\t});\n\t}\n\n\t/**\n\t * Transcodes (resizes) an image buffer into multiple resolutions.\n\t * An optional destinationPrefix can be provided to force a specific path or filename base.\n\t *\n\t * For example, if destinationPrefix is 'images/product', then the original might be\n\t * uploaded as 'images/product.jpg' and the resized versions as 'images/product-480.jpg', etc.\n\t */\n\tasync transcodeImage(\n\t\tbuffer: Buffer,\n\t\toriginalFilename: string,\n\t\tresolutions: number[]\n\t): Promise<{\n\t\toriginalUrl: string;\n\t\tresizedResults: Array<{ resolution: number; url: string }>;\n\t}> {\n\t\tconst extension = path.extname(originalFilename);\n\t\tconst contentType = `image/${extension.replace('.', '') || 'jpeg'}`;\n\t\tconst timestamp = moment().format('DDMMYYHmmss');\n\t\tconst randomId = Math.floor(Math.random() * 100);\n\n\t\tconst baseFilename = `${makeSlug(path.parse(originalFilename).name)}-${this.websiteName}-${timestamp}-${randomId}`;\n\n\t\tconst originalFileName = `${baseFilename}${extension}`;\n\t\tconst originalUrl = await this.uploadBuffer(buffer, originalFileName, contentType);\n\n\t\tconst metadata = await sharp(buffer).metadata();\n\t\tconst isLandscape = metadata.width && metadata.height ? metadata.width > metadata.height : true;\n\n\t\tconst resizedResults = await Promise.all(\n\t\t\tresolutions.map(async resolution => {\n\t\t\t\tconst resizeOptions = isLandscape ? { width: resolution } : { height: resolution };\n\t\t\t\tconst formatKey = (extension.replace('.', '') || 'jpeg') as keyof sharp.FormatEnum;\n\t\t\t\tconst resizedBuffer = await sharp(buffer)\n\t\t\t\t\t.resize({\n\t\t\t\t\t\t...resizeOptions,\n\t\t\t\t\t\twithoutEnlargement: true,\n\t\t\t\t\t})\n\t\t\t\t\t.toFormat(formatKey, { quality: 80 })\n\t\t\t\t\t.toBuffer();\n\t\t\t\tconst resizedFilename = `${baseFilename}-${resolution}${extension}`;\n\t\t\t\tconst resizedUrl = await this.uploadBuffer(resizedBuffer, resizedFilename, contentType);\n\t\t\t\treturn { resolution, url: resizedUrl };\n\t\t\t})\n\t\t);\n\n\t\treturn { originalUrl, resizedResults };\n\t}\n\n\t/**\n\t * Helper function to upload a buffer to a specified filename.\n\t */\n\tprivate async uploadBuffer(buffer: Buffer, filename: string, contentType: string): Promise<string> {\n\t\tconst file = this.bucket.file(filename);\n\t\tawait file.save(buffer, {\n\t\t\tresumable: false,\n\t\t\tcontentType,\n\t\t});\n\t\tawait file.makePublic();\n\t\treturn `https://storage.googleapis.com/${this.bucket.name}/${file.name}`;\n\t}\n\n\tasync getListFiles(): Promise<Array<{ name: string; url: string }>> {\n\t\tconst [files] = await this.bucket.getFiles();\n\t\treturn files.map(file => ({\n\t\t\tname: file.name!,\n\t\t\turl: file.metadata.mediaLink!,\n\t\t}));\n\t}\n\n\tasync downloadFile(filename: string): Promise<Buffer> {\n\t\tconst file = this.bucket.file(filename);\n\t\tconst [buffer] = await file.download();\n\t\treturn buffer;\n\t}\n\n\tasync deleteFile(filename: string): Promise<void> {\n\t\tconst file = this.bucket.file(filename);\n\t\tconst [exists] = await file.exists();\n\t\tif (!exists) {\n\t\t\tthrow new Error('File does not exist.');\n\t\t}\n\t\tawait file.delete();\n\t}\n\n\tpublic extractFilenameFromUrl(url: string): string {\n\t\ttry {\n\t\t\tconst urlObj = new URL(url);\n\t\t\tconst pathParts = urlObj.pathname.split('/');\n\t\t\treturn decodeURIComponent(pathParts[pathParts.length - 1]);\n\t\t} catch (err) {\n\t\t\tthrow new Error(`Invalid URL: ${url}`);\n\t\t}\n\t}\n\n\tasync deleteFileByUrl(url: string): Promise<void> {\n\t\tconst filename = this.extractFilenameFromUrl(url);\n\t\tconst file = this.bucket.file(filename);\n\t\tconst [exists] = await file.exists();\n\t\tif (!exists) {\n\t\t\tthrow new Error('File does not exist.');\n\t\t}\n\t\tawait file.delete();\n\t}\n\n\tasync downloadImage(url: string): Promise<Buffer> {\n\t\tconst response = await axios.get(url, { responseType: 'arraybuffer' });\n\t\treturn Buffer.from(response.data, 'binary');\n\t}\n\n\t/**\n\t * Uploads a buffer to Google Cloud Storage and makes it public\n\t */\n\tprivate async uploadToGCS(\n\t\tbuffer: Buffer,\n\t\tfilename: string,\n\t\tcontentType: string\n\t): Promise<{ filename: string; url: string }> {\n\t\tconst file = this.bucket.file(filename);\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\t// Create a write stream to upload the file\n\t\t\tconst blobStream = file.createWriteStream({\n\t\t\t\tresumable: false,\n\t\t\t\tcontentType,\n\t\t\t});\n\n\t\t\tblobStream.on('error', reject);\n\n\t\t\tblobStream.on('finish', async () => {\n\t\t\t\ttry {\n\t\t\t\t\t// Make the file publicly accessible\n\t\t\t\t\tawait file.makePublic();\n\t\t\t\t\tconst publicUrl = `https://storage.googleapis.com/${this.bucket.name}/${file.name}`;\n\t\t\t\t\tresolve({ filename: file.name, url: publicUrl });\n\t\t\t\t} catch (err) {\n\t\t\t\t\treject(err);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Start uploading the buffer\n\t\t\tblobStream.end(buffer);\n\t\t});\n\t}\n\n\t/**\n\t * Uploads and converts an image to WebP format, resizes if needed, and uploads to GCS\n\t */\n\tasync uploadProcessedImageToWebp(\n\t\tbuffer: Buffer,\n\t\toriginalFilename: string,\n\t\toptions?: { quality?: number; width?: number; height?: number }\n\t): Promise<{ filename: string; url: string }> {\n\t\tconst newFilename = this.generateFilename(originalFilename, '.webp');\n\n\t\tlet width = options?.width;\n\t\tlet height = options?.height;\n\t\tconst quality = options?.quality ?? 80;\n\n\t\t// Get original image dimensions if width or height is missing\n\t\tif (!width || !height) {\n\t\t\tconst imageMetadata = await sharp(buffer).metadata();\n\t\t\twidth = width || imageMetadata.width;\n\t\t\theight = height || imageMetadata.height;\n\t\t}\n\n\t\t// Convert to WebP and resize\n\t\tconst processedImage: sharp.Sharp = sharp(buffer)\n\t\t\t.resize(width, height, { fit: 'inside' })\n\t\t\t.webp({ quality });\n\n\t\tconst file = this.bucket.file(newFilename);\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst blobStream = file.createWriteStream({\n\t\t\t\tresumable: false,\n\t\t\t\tcontentType: 'image/webp',\n\t\t\t});\n\n\t\t\tblobStream.on('error', (err: Error) => {\n\t\t\t\treject(err);\n\t\t\t});\n\n\t\t\tblobStream.on('finish', async () => {\n\t\t\t\ttry {\n\t\t\t\t\tawait file.makePublic();\n\t\t\t\t\tconst publicUrl = `https://storage.googleapis.com/${this.bucket.name}/${file.name}`;\n\t\t\t\t\tresolve({ filename: file.name, url: publicUrl });\n\t\t\t\t} catch (err) {\n\t\t\t\t\treject(err);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tprocessedImage.pipe(blobStream);\n\t\t});\n\t}\n\n\t/**\n\t * Uploads any supported file type to GCS and returns its public URL\n\t */\n\tasync uploadFile(\n\t\tbuffer: Buffer,\n\t\toriginalFilename: string,\n\t\toptions?: { quality?: number; width?: number; height?: number; withExtension?: boolean }\n\t): Promise<{ filename: string; url: string }> {\n\t\tconst newFilename = this.generateFilename(originalFilename);\n\t\tconst extension = path.extname(newFilename).toLowerCase();\n\n\t\t// Guess the MIME type using the mime-types library\n\t\tconst contentType = mime.lookup(extension) || 'application/octet-stream';\n\n\t\t// Special image handling (compression)\n\t\tif (contentType.startsWith('image/')) {\n\t\t\tif (options?.withExtension) {\n\t\t\t\treturn this.uploadImage(buffer, originalFilename);\n\t\t\t} else {\n\t\t\t\treturn this.uploadProcessedImageToWebp(buffer, originalFilename, options);\n\t\t\t}\n\t\t}\n\n\t\treturn this.uploadToGCS(buffer, newFilename, contentType);\n\t}\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"/","sources":["libraries/upload/index.ts"],"names":[],"mappings":"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","sourcesContent":["import axios from 'axios';\r\nimport sharp from 'sharp';\r\nimport moment from 'moment';\r\nimport path from 'path';\r\nimport { getLibraries } from '../../index';\r\nimport mime from 'mime-types';\r\n\r\nfunction makeSlug(input: string): string {\r\n\treturn input\r\n\t\t.toLowerCase()\r\n\t\t.replace(/[^a-z0-9]+/g, '-')\r\n\t\t.replace(/(^-|-$)/g, '');\r\n}\r\n\r\nexport class UploadService {\r\n\tprivate bucket;\r\n\tprivate readonly websiteName;\r\n\r\n\tconstructor(bucketName?: string) {\r\n\t\tif (!bucketName) {\r\n\t\t\tbucketName = 'lyxa-global';\r\n\t\t}\r\n\r\n\t\tthis.bucket = getLibraries().getFirebaseService().superApp.storage().bucket(bucketName);\r\n\t\tthis.websiteName = 'lyxa-' + getLibraries().getConfigurationService().options.tenet;\r\n\t}\r\n\r\n\t/**\r\n\t * Generates a unique filename using the original filename.\r\n\t */\r\n\tprivate generateFilename(originalFilename: string, extension?: string): string {\r\n\t\tconst nameWithoutExt = path.parse(originalFilename).name;\r\n\t\tconst newExtension = extension || path.extname(originalFilename);\r\n\t\tconst timestamp = moment().format('DDMMYYHmmss');\r\n\t\tconst randomId = Math.floor(Math.random() * 100);\r\n\t\tconst baseName = `${makeSlug(nameWithoutExt)}-${this.websiteName}-${timestamp}-${randomId}`;\r\n\t\treturn baseName + newExtension;\r\n\t}\r\n\r\n\t/**\r\n\t * Uploads an image buffer after processing it with Sharp.\r\n\t * An optional destinationPath can be provided (e.g., 'images/product.jpg').\r\n\t */\r\n\tasync uploadImage(buffer: Buffer, originalFilename: string): Promise<{ filename: string; url: string }> {\r\n\t\tconst newFilename = this.generateFilename(originalFilename);\r\n\t\tconst extension = path.extname(newFilename).toLowerCase();\r\n\t\tlet processedImage: sharp.Sharp;\r\n\t\tlet contentType: string;\r\n\t\tif (extension === '.png') {\r\n\t\t\tprocessedImage = sharp(buffer).png({ quality: 80 });\r\n\t\t\tcontentType = 'image/png';\r\n\t\t} else if (extension === '.webp') {\r\n\t\t\tprocessedImage = sharp(buffer).webp({ quality: 80 });\r\n\t\t\tcontentType = 'image/webp';\r\n\t\t} else {\r\n\t\t\tprocessedImage = sharp(buffer).jpeg({ quality: 80 });\r\n\t\t\tcontentType = 'image/jpeg';\r\n\t\t}\r\n\r\n\t\tconst file = this.bucket.file(newFilename);\r\n\t\treturn new Promise((resolve, reject) => {\r\n\t\t\tconst blobStream = file.createWriteStream({\r\n\t\t\t\tresumable: false,\r\n\t\t\t\tcontentType,\r\n\t\t\t});\r\n\r\n\t\t\tblobStream.on('error', (err: Error) => {\r\n\t\t\t\treject(err);\r\n\t\t\t});\r\n\r\n\t\t\tblobStream.on('finish', async () => {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tawait file.makePublic();\r\n\t\t\t\t\tconst publicUrl = `https://storage.googleapis.com/${this.bucket.name}/${file.name}`;\r\n\t\t\t\t\tresolve({ filename: file.name, url: publicUrl });\r\n\t\t\t\t} catch (err) {\r\n\t\t\t\t\treject(err);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\tprocessedImage.pipe(blobStream);\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Transcodes (resizes) an image buffer into multiple resolutions.\r\n\t * An optional destinationPrefix can be provided to force a specific path or filename base.\r\n\t *\r\n\t * For example, if destinationPrefix is 'images/product', then the original might be\r\n\t * uploaded as 'images/product.jpg' and the resized versions as 'images/product-480.jpg', etc.\r\n\t */\r\n\tasync transcodeImage(\r\n\t\tbuffer: Buffer,\r\n\t\toriginalFilename: string,\r\n\t\tresolutions: number[]\r\n\t): Promise<{\r\n\t\toriginalUrl: string;\r\n\t\tresizedResults: Array<{ resolution: number; url: string }>;\r\n\t}> {\r\n\t\tconst extension = path.extname(originalFilename);\r\n\t\tconst contentType = `image/${extension.replace('.', '') || 'jpeg'}`;\r\n\t\tconst timestamp = moment().format('DDMMYYHmmss');\r\n\t\tconst randomId = Math.floor(Math.random() * 100);\r\n\r\n\t\tconst baseFilename = `${makeSlug(path.parse(originalFilename).name)}-${this.websiteName}-${timestamp}-${randomId}`;\r\n\r\n\t\tconst originalFileName = `${baseFilename}${extension}`;\r\n\t\tconst originalUrl = await this.uploadBuffer(buffer, originalFileName, contentType);\r\n\r\n\t\tconst metadata = await sharp(buffer).metadata();\r\n\t\tconst isLandscape = metadata.width && metadata.height ? metadata.width > metadata.height : true;\r\n\r\n\t\tconst resizedResults = await Promise.all(\r\n\t\t\tresolutions.map(async resolution => {\r\n\t\t\t\tconst resizeOptions = isLandscape ? { width: resolution } : { height: resolution };\r\n\t\t\t\tconst formatKey = (extension.replace('.', '') || 'jpeg') as keyof sharp.FormatEnum;\r\n\t\t\t\tconst resizedBuffer = await sharp(buffer)\r\n\t\t\t\t\t.resize({\r\n\t\t\t\t\t\t...resizeOptions,\r\n\t\t\t\t\t\twithoutEnlargement: true,\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.toFormat(formatKey, { quality: 80 })\r\n\t\t\t\t\t.toBuffer();\r\n\t\t\t\tconst resizedFilename = `${baseFilename}-${resolution}${extension}`;\r\n\t\t\t\tconst resizedUrl = await this.uploadBuffer(resizedBuffer, resizedFilename, contentType);\r\n\t\t\t\treturn { resolution, url: resizedUrl };\r\n\t\t\t})\r\n\t\t);\r\n\r\n\t\treturn { originalUrl, resizedResults };\r\n\t}\r\n\r\n\t/**\r\n\t * Helper function to upload a buffer to a specified filename.\r\n\t */\r\n\tprivate async uploadBuffer(buffer: Buffer, filename: string, contentType: string): Promise<string> {\r\n\t\tconst file = this.bucket.file(filename);\r\n\t\tawait file.save(buffer, {\r\n\t\t\tresumable: false,\r\n\t\t\tcontentType,\r\n\t\t});\r\n\t\tawait file.makePublic();\r\n\t\treturn `https://storage.googleapis.com/${this.bucket.name}/${file.name}`;\r\n\t}\r\n\r\n\tasync getListFiles(): Promise<Array<{ name: string; url: string }>> {\r\n\t\tconst [files] = await this.bucket.getFiles();\r\n\t\treturn files.map(file => ({\r\n\t\t\tname: file.name!,\r\n\t\t\turl: file.metadata.mediaLink!,\r\n\t\t}));\r\n\t}\r\n\r\n\tasync downloadFile(filename: string): Promise<Buffer> {\r\n\t\tconst file = this.bucket.file(filename);\r\n\t\tconst [buffer] = await file.download();\r\n\t\treturn buffer;\r\n\t}\r\n\r\n\tasync deleteFile(filename: string): Promise<void> {\r\n\t\tconst file = this.bucket.file(filename);\r\n\t\tconst [exists] = await file.exists();\r\n\t\tif (!exists) {\r\n\t\t\tthrow new Error('File does not exist.');\r\n\t\t}\r\n\t\tawait file.delete();\r\n\t}\r\n\r\n\tpublic extractFilenameFromUrl(url: string): string {\r\n\t\ttry {\r\n\t\t\tconst urlObj = new URL(url);\r\n\t\t\tconst pathParts = urlObj.pathname.split('/');\r\n\t\t\treturn decodeURIComponent(pathParts[pathParts.length - 1]);\r\n\t\t} catch (err) {\r\n\t\t\tthrow new Error(`Invalid URL: ${url}`);\r\n\t\t}\r\n\t}\r\n\r\n\tasync deleteFileByUrl(url: string): Promise<void> {\r\n\t\tconst filename = this.extractFilenameFromUrl(url);\r\n\t\tconst file = this.bucket.file(filename);\r\n\t\tconst [exists] = await file.exists();\r\n\t\tif (!exists) {\r\n\t\t\tthrow new Error('File does not exist.');\r\n\t\t}\r\n\t\tawait file.delete();\r\n\t}\r\n\r\n\tasync downloadImage(url: string): Promise<Buffer> {\r\n\t\tconst response = await axios.get(url, { responseType: 'arraybuffer' });\r\n\t\treturn Buffer.from(response.data, 'binary');\r\n\t}\r\n\r\n\t/**\r\n\t * Uploads a buffer to Google Cloud Storage and makes it public\r\n\t */\r\n\tprivate async uploadToGCS(\r\n\t\tbuffer: Buffer,\r\n\t\tfilename: string,\r\n\t\tcontentType: string\r\n\t): Promise<{ filename: string; url: string }> {\r\n\t\tconst file = this.bucket.file(filename);\r\n\r\n\t\treturn new Promise((resolve, reject) => {\r\n\t\t\t// Create a write stream to upload the file\r\n\t\t\tconst blobStream = file.createWriteStream({\r\n\t\t\t\tresumable: false,\r\n\t\t\t\tcontentType,\r\n\t\t\t});\r\n\r\n\t\t\tblobStream.on('error', reject);\r\n\r\n\t\t\tblobStream.on('finish', async () => {\r\n\t\t\t\ttry {\r\n\t\t\t\t\t// Make the file publicly accessible\r\n\t\t\t\t\tawait file.makePublic();\r\n\t\t\t\t\tconst publicUrl = `https://storage.googleapis.com/${this.bucket.name}/${file.name}`;\r\n\t\t\t\t\tresolve({ filename: file.name, url: publicUrl });\r\n\t\t\t\t} catch (err) {\r\n\t\t\t\t\treject(err);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\t// Start uploading the buffer\r\n\t\t\tblobStream.end(buffer);\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Uploads and converts an image to WebP format, resizes if needed, and uploads to GCS\r\n\t */\r\n\tasync uploadProcessedImageToWebp(\r\n\t\tbuffer: Buffer,\r\n\t\toriginalFilename: string,\r\n\t\toptions?: { quality?: number; width?: number; height?: number }\r\n\t): Promise<{ filename: string; url: string }> {\r\n\t\tconst newFilename = this.generateFilename(originalFilename, '.webp');\r\n\r\n\t\tlet width = options?.width;\r\n\t\tlet height = options?.height;\r\n\t\tconst quality = options?.quality ?? 80;\r\n\r\n\t\t// Get original image dimensions if width or height is missing\r\n\t\tif (!width || !height) {\r\n\t\t\tconst imageMetadata = await sharp(buffer).metadata();\r\n\t\t\twidth = width || imageMetadata.width;\r\n\t\t\theight = height || imageMetadata.height;\r\n\t\t}\r\n\r\n\t\t// Convert to WebP and resize\r\n\t\tconst processedImage: sharp.Sharp = sharp(buffer)\r\n\t\t\t.resize(width, height, { fit: 'inside' })\r\n\t\t\t.webp({ quality });\r\n\r\n\t\tconst file = this.bucket.file(newFilename);\r\n\r\n\t\treturn new Promise((resolve, reject) => {\r\n\t\t\tconst blobStream = file.createWriteStream({\r\n\t\t\t\tresumable: false,\r\n\t\t\t\tcontentType: 'image/webp',\r\n\t\t\t});\r\n\r\n\t\t\tblobStream.on('error', (err: Error) => {\r\n\t\t\t\treject(err);\r\n\t\t\t});\r\n\r\n\t\t\tblobStream.on('finish', async () => {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tawait file.makePublic();\r\n\t\t\t\t\tconst publicUrl = `https://storage.googleapis.com/${this.bucket.name}/${file.name}`;\r\n\t\t\t\t\tresolve({ filename: file.name, url: publicUrl });\r\n\t\t\t\t} catch (err) {\r\n\t\t\t\t\treject(err);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\tprocessedImage.pipe(blobStream);\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Uploads any supported file type to GCS and returns its public URL\r\n\t */\r\n\tasync uploadFile(\r\n\t\tbuffer: Buffer,\r\n\t\toriginalFilename: string,\r\n\t\toptions?: { quality?: number; width?: number; height?: number; withExtension?: boolean }\r\n\t): Promise<{ filename: string; url: string }> {\r\n\t\tconst newFilename = this.generateFilename(originalFilename);\r\n\t\tconst extension = path.extname(newFilename).toLowerCase();\r\n\r\n\t\t// Guess the MIME type using the mime-types library\r\n\t\tconst contentType = mime.lookup(extension) || 'application/octet-stream';\r\n\r\n\t\t// Special image handling (compression)\r\n\t\tif (contentType.startsWith('image/')) {\r\n\t\t\tif (options?.withExtension) {\r\n\t\t\t\treturn this.uploadImage(buffer, originalFilename);\r\n\t\t\t} else {\r\n\t\t\t\treturn this.uploadProcessedImageToWebp(buffer, originalFilename, options);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this.uploadToGCS(buffer, newFilename, contentType);\r\n\t}\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"password.js","sourceRoot":"/","sources":["utilities/common/password.ts"],"names":[],"mappings":";;;;;AAGA,oCAGC;AAED,wCAQC;AAhBD,yCAAyC;AACzC,wDAA8B;AAEvB,KAAK,UAAU,YAAY,CAAC,QAAgB;IAClD,MAAM,IAAI,GAAG,MAAM,kBAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACtC,OAAO,kBAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AACpC,CAAC;AAEM,KAAK,UAAU,cAAc,CAAC,aAAqB,EAAE,cAAsB;IACjF,MAAM,eAAe,GAAG,MAAM,kBAAM,CAAC,OAAO,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;IAC5E,IAAI,CAAC,eAAe,EAAE,CAAC;QACtB,MAAM,IAAI,kBAAS,CAAC;YACnB,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE,8BAA8B;SACvC,CAAC,CAAC;IACJ,CAAC;AACF,CAAC","sourcesContent":["import { TRPCError } from '@trpc/server';\nimport bcrypt from 'bcryptjs';\n\nexport async function hashPassword(password: string): Promise<string> {\n\tconst salt = await bcrypt.genSalt(10);\n\treturn bcrypt.hash(password, salt);\n}\n\nexport async function verifyPassword(inputPassword: string, hashedPassword: string) {\n\tconst isPasswordValid = await bcrypt.compare(inputPassword, hashedPassword);\n\tif (!isPasswordValid) {\n\t\tthrow new TRPCError({\n\t\t\tcode: 'UNAUTHORIZED',\n\t\t\tmessage: 'Incorrect email or password.',\n\t\t});\n\t}\n}\n"]}
1
+ {"version":3,"file":"password.js","sourceRoot":"/","sources":["utilities/common/password.ts"],"names":[],"mappings":";;;;;AAGA,oCAGC;AAED,wCAQC;AAhBD,yCAAyC;AACzC,wDAA8B;AAEvB,KAAK,UAAU,YAAY,CAAC,QAAgB;IAClD,MAAM,IAAI,GAAG,MAAM,kBAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACtC,OAAO,kBAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AACpC,CAAC;AAEM,KAAK,UAAU,cAAc,CAAC,aAAqB,EAAE,cAAsB;IACjF,MAAM,eAAe,GAAG,MAAM,kBAAM,CAAC,OAAO,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;IAC5E,IAAI,CAAC,eAAe,EAAE,CAAC;QACtB,MAAM,IAAI,kBAAS,CAAC;YACnB,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE,8BAA8B;SACvC,CAAC,CAAC;IACJ,CAAC;AACF,CAAC","sourcesContent":["import { TRPCError } from '@trpc/server';\r\nimport bcrypt from 'bcryptjs';\r\n\r\nexport async function hashPassword(password: string): Promise<string> {\r\n\tconst salt = await bcrypt.genSalt(10);\r\n\treturn bcrypt.hash(password, salt);\r\n}\r\n\r\nexport async function verifyPassword(inputPassword: string, hashedPassword: string) {\r\n\tconst isPasswordValid = await bcrypt.compare(inputPassword, hashedPassword);\r\n\tif (!isPasswordValid) {\r\n\t\tthrow new TRPCError({\r\n\t\t\tcode: 'UNAUTHORIZED',\r\n\t\t\tmessage: 'Incorrect email or password.',\r\n\t\t});\r\n\t}\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"week.js","sourceRoot":"/","sources":["utilities/common/week.ts"],"names":[],"mappings":";;;AAAa,QAAA,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACzD,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CACzF,CAAC","sourcesContent":["export const daysOfWeek = Array.from({ length: 7 }, (_, i) =>\n new Intl.DateTimeFormat('en-US', { weekday: 'long' }).format(new Date(1970, 0, 4 + i))\n);"]}
1
+ {"version":3,"file":"week.js","sourceRoot":"/","sources":["utilities/common/week.ts"],"names":[],"mappings":";;;AAAa,QAAA,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACzD,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CACzF,CAAC","sourcesContent":["export const daysOfWeek = Array.from({ length: 7 }, (_, i) =>\r\n new Intl.DateTimeFormat('en-US', { weekday: 'long' }).format(new Date(1970, 0, 4 + i))\r\n);"]}
@@ -1 +1 @@
1
- {"version":3,"file":"currency.js","sourceRoot":"/","sources":["utilities/currency.ts"],"names":[],"mappings":";;;AAAA,0BAAkC;AAGlC,iCAAsC;AAEtC,MAAM,uBAAuB,GAAG,IAAI,CAAC;AACrC,MAAM,qBAAqB,GAAG,CAAC,CAAC;AAEhC,MAAM,iBAAiB,GAAG,KAAK,EAAE,QAAsB,EAAmB,EAAE;IAC3E,MAAM,eAAe,GAAG,IAAA,gBAAY,GAAE,CAAC,wBAAwB,EAAE,CAAC;IAClE,MAAM,OAAO,GAAG,CAAC,MAAM,IAAA,gBAAY,GAAE,CAAC,wBAAwB,EAAE,CAAC,WAAW,EAAE,CAAY,CAAC;IAC3F,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;IAChD,IAAI,cAAkC,CAAC;IACvC,IAAI,eAAe,EAAE,CAAC;QACrB,QAAQ,QAAQ,EAAE,CAAC;YAClB,KAAK,mBAAY,CAAC,IAAI;gBACrB,cAAc,GAAG,eAAe,CAAC,YAAY,EAAE,OAAO,CAAC;gBACvD,MAAM;YACP,KAAK,mBAAY,CAAC,SAAS;gBAC1B,cAAc,GAAG,eAAe,CAAC,iBAAiB,EAAE,OAAO,CAAC;gBAC5D,MAAM;YACP;gBACC,cAAc,GAAG,uBAAuB,CAAC;gBACzC,MAAM;QACR,CAAC;IACF,CAAC;IACD,OAAO,cAAc,IAAI,uBAAuB,CAAC;AAClD,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,KAAK,IAAqB,EAAE;IACnD,MAAM,QAAQ,GAAG,CAAC,MAAM,IAAA,gBAAY,GAAE,CAAC,wBAAwB,EAAE,CAAC,WAAW,EAAE,CAAY,CAAC;IAC5F,MAAM,eAAe,GAAG,QAAQ,CAAC,eAAe,CAAC;IACjD,OAAO,eAAe,EAAE,YAAY,IAAI,qBAAqB,CAAC;AAC/D,CAAC,CAAC;AAEK,MAAM,aAAa,GAAG,KAAK,EAAE,MAAc,EAAE,QAAsB,EAAmB,EAAE;IAC9F,MAAM,cAAc,GAAG,MAAM,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACzD,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,cAAc,CAAC,GAAG,cAAc,CAAC;AAC7D,CAAC,CAAC;AAHW,QAAA,aAAa,iBAGxB;AAEK,MAAM,kBAAkB,GAAG,KAAK,EAAE,MAAc,EAAmB,EAAE;IAC3E,MAAM,WAAW,GAAG,MAAM,eAAe,EAAE,CAAC;IAC5C,OAAO,IAAA,qBAAa,EAAC,MAAM,GAAG,WAAW,EAAE,mBAAY,CAAC,SAAS,CAAC,CAAC;AACpE,CAAC,CAAC;AAHW,QAAA,kBAAkB,sBAG7B","sourcesContent":["import { getLibraries } from '..';\n\nimport { Setting } from '../libraries/mongo/models';\nimport { PaidCurrency } from './enum';\n\nconst DEFAULT_ROUNDING_FACTOR = 0.01;\nconst DEFAULT_EXCHANGE_RATE = 1;\n\nconst getRoundingFactor = async (currency: PaidCurrency): Promise<number> => {\n\tconst settingsService = getLibraries().getCachedSettingsService();\n\tconst setting = (await getLibraries().getCachedSettingsService().getSettings()) as Setting;\n\tconst currencySetting = setting.currencySetting;\n\tlet roundingFactor: number | undefined;\n\tif (currencySetting) {\n\t\tswitch (currency) {\n\t\t\tcase PaidCurrency.BASE:\n\t\t\t\troundingFactor = currencySetting.baseCurrency?.roundTo;\n\t\t\t\tbreak;\n\t\t\tcase PaidCurrency.SECONDARY:\n\t\t\t\troundingFactor = currencySetting.secondaryCurrency?.roundTo;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\troundingFactor = DEFAULT_ROUNDING_FACTOR;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\treturn roundingFactor || DEFAULT_ROUNDING_FACTOR;\n};\n\nconst getExchangeRate = async (): Promise<number> => {\n\tconst settings = (await getLibraries().getCachedSettingsService().getSettings()) as Setting;\n\tconst currencySetting = settings.currencySetting;\n\treturn currencySetting?.exchangeRate || DEFAULT_EXCHANGE_RATE;\n};\n\nexport const roundCurrency = async (amount: number, currency: PaidCurrency): Promise<number> => {\n\tconst roundingFactor = await getRoundingFactor(currency);\n\treturn Math.round(amount / roundingFactor) * roundingFactor;\n};\n\nexport const convertToSecondary = async (amount: number): Promise<number> => {\n\tconst exchageRate = await getExchangeRate();\n\treturn roundCurrency(amount * exchageRate, PaidCurrency.SECONDARY);\n};\n"]}
1
+ {"version":3,"file":"currency.js","sourceRoot":"/","sources":["utilities/currency.ts"],"names":[],"mappings":";;;AAAA,0BAAkC;AAGlC,iCAAsC;AAEtC,MAAM,uBAAuB,GAAG,IAAI,CAAC;AACrC,MAAM,qBAAqB,GAAG,CAAC,CAAC;AAEhC,MAAM,iBAAiB,GAAG,KAAK,EAAE,QAAsB,EAAmB,EAAE;IAC3E,MAAM,eAAe,GAAG,IAAA,gBAAY,GAAE,CAAC,wBAAwB,EAAE,CAAC;IAClE,MAAM,OAAO,GAAG,CAAC,MAAM,IAAA,gBAAY,GAAE,CAAC,wBAAwB,EAAE,CAAC,WAAW,EAAE,CAAY,CAAC;IAC3F,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;IAChD,IAAI,cAAkC,CAAC;IACvC,IAAI,eAAe,EAAE,CAAC;QACrB,QAAQ,QAAQ,EAAE,CAAC;YAClB,KAAK,mBAAY,CAAC,IAAI;gBACrB,cAAc,GAAG,eAAe,CAAC,YAAY,EAAE,OAAO,CAAC;gBACvD,MAAM;YACP,KAAK,mBAAY,CAAC,SAAS;gBAC1B,cAAc,GAAG,eAAe,CAAC,iBAAiB,EAAE,OAAO,CAAC;gBAC5D,MAAM;YACP;gBACC,cAAc,GAAG,uBAAuB,CAAC;gBACzC,MAAM;QACR,CAAC;IACF,CAAC;IACD,OAAO,cAAc,IAAI,uBAAuB,CAAC;AAClD,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,KAAK,IAAqB,EAAE;IACnD,MAAM,QAAQ,GAAG,CAAC,MAAM,IAAA,gBAAY,GAAE,CAAC,wBAAwB,EAAE,CAAC,WAAW,EAAE,CAAY,CAAC;IAC5F,MAAM,eAAe,GAAG,QAAQ,CAAC,eAAe,CAAC;IACjD,OAAO,eAAe,EAAE,YAAY,IAAI,qBAAqB,CAAC;AAC/D,CAAC,CAAC;AAEK,MAAM,aAAa,GAAG,KAAK,EAAE,MAAc,EAAE,QAAsB,EAAmB,EAAE;IAC9F,MAAM,cAAc,GAAG,MAAM,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACzD,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,cAAc,CAAC,GAAG,cAAc,CAAC;AAC7D,CAAC,CAAC;AAHW,QAAA,aAAa,iBAGxB;AAEK,MAAM,kBAAkB,GAAG,KAAK,EAAE,MAAc,EAAmB,EAAE;IAC3E,MAAM,WAAW,GAAG,MAAM,eAAe,EAAE,CAAC;IAC5C,OAAO,IAAA,qBAAa,EAAC,MAAM,GAAG,WAAW,EAAE,mBAAY,CAAC,SAAS,CAAC,CAAC;AACpE,CAAC,CAAC;AAHW,QAAA,kBAAkB,sBAG7B","sourcesContent":["import { getLibraries } from '..';\r\n\r\nimport { Setting } from '../libraries/mongo/models';\r\nimport { PaidCurrency } from './enum';\r\n\r\nconst DEFAULT_ROUNDING_FACTOR = 0.01;\r\nconst DEFAULT_EXCHANGE_RATE = 1;\r\n\r\nconst getRoundingFactor = async (currency: PaidCurrency): Promise<number> => {\r\n\tconst settingsService = getLibraries().getCachedSettingsService();\r\n\tconst setting = (await getLibraries().getCachedSettingsService().getSettings()) as Setting;\r\n\tconst currencySetting = setting.currencySetting;\r\n\tlet roundingFactor: number | undefined;\r\n\tif (currencySetting) {\r\n\t\tswitch (currency) {\r\n\t\t\tcase PaidCurrency.BASE:\r\n\t\t\t\troundingFactor = currencySetting.baseCurrency?.roundTo;\r\n\t\t\t\tbreak;\r\n\t\t\tcase PaidCurrency.SECONDARY:\r\n\t\t\t\troundingFactor = currencySetting.secondaryCurrency?.roundTo;\r\n\t\t\t\tbreak;\r\n\t\t\tdefault:\r\n\t\t\t\troundingFactor = DEFAULT_ROUNDING_FACTOR;\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\treturn roundingFactor || DEFAULT_ROUNDING_FACTOR;\r\n};\r\n\r\nconst getExchangeRate = async (): Promise<number> => {\r\n\tconst settings = (await getLibraries().getCachedSettingsService().getSettings()) as Setting;\r\n\tconst currencySetting = settings.currencySetting;\r\n\treturn currencySetting?.exchangeRate || DEFAULT_EXCHANGE_RATE;\r\n};\r\n\r\nexport const roundCurrency = async (amount: number, currency: PaidCurrency): Promise<number> => {\r\n\tconst roundingFactor = await getRoundingFactor(currency);\r\n\treturn Math.round(amount / roundingFactor) * roundingFactor;\r\n};\r\n\r\nexport const convertToSecondary = async (amount: number): Promise<number> => {\r\n\tconst exchageRate = await getExchangeRate();\r\n\treturn roundCurrency(amount * exchageRate, PaidCurrency.SECONDARY);\r\n};\r\n"]}
@@ -234,7 +234,8 @@ export declare enum CounterType {
234
234
  ORDER = "order",
235
235
  CRM_NUMBER = "crm_number",
236
236
  shop = "shop",
237
- PAYOUT = "payout"
237
+ PAYOUT = "payout",
238
+ TICKET = "ticket"
238
239
  }
239
240
  export declare enum FaqAccountType {
240
241
  USER = "user",
@@ -483,3 +484,23 @@ export declare enum RewardedToTypeEnum {
483
484
  BUSINESS_DEVELOPMENT_EXECUTIVE = "business_development_executive",
484
485
  RIDER = "rider"
485
486
  }
487
+ export declare enum TicketType {
488
+ ORDER = "order",
489
+ ACCOUNT = "account"
490
+ }
491
+ export declare enum TicketStatus {
492
+ PENDING = "pending",
493
+ ONGOING = "ongoing",
494
+ RESOLVED = "resolved"
495
+ }
496
+ export declare enum MessageSender {
497
+ User = "User",
498
+ Admin = "Admin",
499
+ Shop = "Shop",
500
+ Rider = "Rider"
501
+ }
502
+ export declare enum ChatroomType {
503
+ TICKET = "TICKET",
504
+ DIRECT = "DIRECT",
505
+ ORDER_CHAT = "ORDER_CHAT"
506
+ }
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.CardUserType = exports.CardType = exports.PaymentPreference = exports.CartStatus = exports.AdminRole = exports.MarketingStatus = exports.MarketingType = exports.FavouriteType = exports.CouponExpirationReason = exports.CouponType = exports.BobType = exports.BobModel = exports.BobSettlementStatus = exports.BobSettlementType = exports.BobAccountType = exports.ZoneStatus = exports.FaqAccountType = exports.CounterType = exports.BannerUserType = exports.BannerLinkType = exports.BannerClickType = exports.ShopRole = exports.ShopOnlineStatus = exports.ChargeType = exports.ClickType = exports.NotificationAccountType = exports.DishCategory = exports.ProductDietaryType = exports.AttributeItemSelectionType = exports.PriceOption = exports.ProductType = exports.CoreAuthIdentityType = exports.UserAppSectionItemType = exports.UserAppSectionType = exports.UpdatedField = exports.GeoLocationType = exports.RatingAccountType = exports.SubscriptionStatus = exports.SubscriptionPackage = exports.PaidCurrency = exports.PaymentStatus = exports.PaymentMethod = exports.ValueType = exports.HolidayWorkStatus = exports.WorkStatus = exports.WeekDay = exports.GlobalItemType = exports.ItemType = exports.Status = exports.AccountType = void 0;
4
- exports.RewardedToTypeEnum = exports.LogUser = exports.PayoutStatus = exports.PayoutType = exports.AddRemoveCreditAccountType = exports.SettingsReasonStatus = exports.CancellationReasonTypeEnum = exports.SupportReasonTypeEnum = exports.PlusSettingsPackageType = exports.AddRemoveCreditSettlementType = exports.SettlementType = exports.MediaType = exports.WorkingHourSettingsType = exports.ZoneGeometryType = exports.RiderAssignmentStatus = exports.CourierServiceType = exports.OrderCancelBy = exports.OrderFinanceStatus = exports.DeliveryStatus = exports.CourierOrderPaymentFrom = exports.CourierOrderStatus = exports.RegularOrderStatus = exports.OrderType = exports.Language = exports.RiderBagSize = exports.RiderType = exports.ShiftType = exports.CreatedBy = exports.LiveStatus = exports.AreebaCardStatus = void 0;
4
+ exports.ChatroomType = exports.MessageSender = exports.TicketStatus = exports.TicketType = exports.RewardedToTypeEnum = exports.LogUser = exports.PayoutStatus = exports.PayoutType = exports.AddRemoveCreditAccountType = exports.SettingsReasonStatus = exports.CancellationReasonTypeEnum = exports.SupportReasonTypeEnum = exports.PlusSettingsPackageType = exports.AddRemoveCreditSettlementType = exports.SettlementType = exports.MediaType = exports.WorkingHourSettingsType = exports.ZoneGeometryType = exports.RiderAssignmentStatus = exports.CourierServiceType = exports.OrderCancelBy = exports.OrderFinanceStatus = exports.DeliveryStatus = exports.CourierOrderPaymentFrom = exports.CourierOrderStatus = exports.RegularOrderStatus = exports.OrderType = exports.Language = exports.RiderBagSize = exports.RiderType = exports.ShiftType = exports.CreatedBy = exports.LiveStatus = exports.AreebaCardStatus = void 0;
5
5
  var AccountType;
6
6
  (function (AccountType) {
7
7
  AccountType["USER"] = "user";
@@ -272,6 +272,7 @@ var CounterType;
272
272
  CounterType["CRM_NUMBER"] = "crm_number";
273
273
  CounterType["shop"] = "shop";
274
274
  CounterType["PAYOUT"] = "payout";
275
+ CounterType["TICKET"] = "ticket";
275
276
  })(CounterType || (exports.CounterType = CounterType = {}));
276
277
  var FaqAccountType;
277
278
  (function (FaqAccountType) {
@@ -567,4 +568,28 @@ var RewardedToTypeEnum;
567
568
  RewardedToTypeEnum["BUSINESS_DEVELOPMENT_EXECUTIVE"] = "business_development_executive";
568
569
  RewardedToTypeEnum["RIDER"] = "rider";
569
570
  })(RewardedToTypeEnum || (exports.RewardedToTypeEnum = RewardedToTypeEnum = {}));
571
+ var TicketType;
572
+ (function (TicketType) {
573
+ TicketType["ORDER"] = "order";
574
+ TicketType["ACCOUNT"] = "account";
575
+ })(TicketType || (exports.TicketType = TicketType = {}));
576
+ var TicketStatus;
577
+ (function (TicketStatus) {
578
+ TicketStatus["PENDING"] = "pending";
579
+ TicketStatus["ONGOING"] = "ongoing";
580
+ TicketStatus["RESOLVED"] = "resolved";
581
+ })(TicketStatus || (exports.TicketStatus = TicketStatus = {}));
582
+ var MessageSender;
583
+ (function (MessageSender) {
584
+ MessageSender["User"] = "User";
585
+ MessageSender["Admin"] = "Admin";
586
+ MessageSender["Shop"] = "Shop";
587
+ MessageSender["Rider"] = "Rider";
588
+ })(MessageSender || (exports.MessageSender = MessageSender = {}));
589
+ var ChatroomType;
590
+ (function (ChatroomType) {
591
+ ChatroomType["TICKET"] = "TICKET";
592
+ ChatroomType["DIRECT"] = "DIRECT";
593
+ ChatroomType["ORDER_CHAT"] = "ORDER_CHAT";
594
+ })(ChatroomType || (exports.ChatroomType = ChatroomType = {}));
570
595
  //# sourceMappingURL=enum.js.map