@m5kdev/backend 0.6.0 → 0.8.0

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 (553) hide show
  1. package/dist/_virtual/_rolldown/runtime.mjs +13 -0
  2. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/api/index.d.mts +1 -0
  3. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/db/adapter/factory.d.mts +1 -0
  4. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/db/adapter/get-field-attributes.d.mts +1 -0
  5. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/db/adapter/get-id-field.d.mts +1 -0
  6. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/db/adapter/index.d.mts +1 -0
  7. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/db/adapter/types.d.mts +1 -0
  8. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/db/get-tables.d.mts +1 -0
  9. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/db/index.d.mts +1 -0
  10. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/db/schema/account.d.mts +1 -0
  11. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/db/schema/rate-limit.d.mts +1 -0
  12. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/db/schema/session.d.mts +1 -0
  13. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/db/schema/shared.d.mts +1 -0
  14. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/db/schema/user.d.mts +1 -0
  15. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/db/schema/verification.d.mts +1 -0
  16. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/index.d.mts +1 -0
  17. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/social-providers/index.d.mts +1 -0
  18. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/types/context.d.mts +1 -0
  19. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/types/helper.d.mts +7 -0
  20. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/types/init-options.d.mts +1 -0
  21. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/types/plugin-client.d.mts +1 -0
  22. package/dist/node_modules/.pnpm/@better-auth_core@1.4.18_@better-auth_utils@0.3.0_@better-fetch_fetch@1.1.21_better-cal_347838d331444e5371f256b914727290/node_modules/@better-auth/core/dist/types/plugin.d.mts +1 -0
  23. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/dialect-adapter-base.d.mts +1 -0
  24. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/dialect-adapter.d.mts +1 -0
  25. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/dialect.d.mts +1 -0
  26. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/mssql/mssql-adapter.d.mts +1 -0
  27. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/mssql/mssql-dialect.d.mts +1 -0
  28. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/mssql/mssql-introspector.d.mts +1 -0
  29. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/mysql/mysql-adapter.d.mts +1 -0
  30. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/mysql/mysql-dialect.d.mts +1 -0
  31. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/mysql/mysql-introspector.d.mts +1 -0
  32. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/postgres/postgres-adapter.d.mts +1 -0
  33. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/postgres/postgres-dialect.d.mts +1 -0
  34. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/postgres/postgres-introspector.d.mts +1 -0
  35. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/sqlite/sqlite-adapter.d.mts +1 -0
  36. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/sqlite/sqlite-dialect.d.mts +1 -0
  37. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/sqlite/sqlite-introspector.d.mts +1 -0
  38. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/expression/expression-builder.d.mts +1 -0
  39. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/index.d.mts +1 -0
  40. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/kysely.d.mts +38 -0
  41. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/migration/file-migration-provider.d.mts +1 -0
  42. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/migration/migrator.d.mts +1 -0
  43. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/binary-operation-parser.d.mts +1 -0
  44. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/delete-from-parser.d.mts +1 -0
  45. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/expression-parser.d.mts +1 -0
  46. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/group-by-parser.d.mts +1 -0
  47. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/insert-values-parser.d.mts +1 -0
  48. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/join-parser.d.mts +1 -0
  49. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/merge-into-parser.d.mts +1 -0
  50. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/reference-parser.d.mts +1 -0
  51. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/returning-parser.d.mts +1 -0
  52. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/select-from-parser.d.mts +1 -0
  53. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/select-parser.d.mts +1 -0
  54. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/set-operation-parser.d.mts +1 -0
  55. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/tuple-parser.d.mts +1 -0
  56. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/unary-operation-parser.d.mts +1 -0
  57. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/update-parser.d.mts +1 -0
  58. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/update-set-parser.d.mts +1 -0
  59. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/value-parser.d.mts +1 -0
  60. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/with-parser.d.mts +1 -0
  61. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/case-builder.d.mts +1 -0
  62. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/delete-query-builder.d.mts +1 -0
  63. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/having-interface.d.mts +1 -0
  64. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/insert-query-builder.d.mts +1 -0
  65. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/join-builder.d.mts +1 -0
  66. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/merge-query-builder.d.mts +1 -0
  67. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/on-conflict-builder.d.mts +1 -0
  68. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/output-interface.d.mts +1 -0
  69. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/returning-interface.d.mts +1 -0
  70. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/select-query-builder.d.mts +1 -0
  71. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/update-query-builder.d.mts +1 -0
  72. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/where-interface.d.mts +1 -0
  73. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-creator.d.mts +1 -0
  74. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-executor/default-query-executor.d.mts +1 -0
  75. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-executor/noop-query-executor.d.mts +1 -0
  76. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-executor/query-executor-base.d.mts +1 -0
  77. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-executor/query-executor-provider.d.mts +1 -0
  78. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-executor/query-executor.d.mts +1 -0
  79. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/raw-builder/raw-builder.d.mts +1 -0
  80. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/raw-builder/sql.d.mts +1 -0
  81. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/alter-table-add-foreign-key-constraint-builder.d.mts +1 -0
  82. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/alter-table-add-index-builder.d.mts +1 -0
  83. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/alter-table-builder.d.mts +1 -0
  84. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/alter-table-drop-constraint-builder.d.mts +1 -0
  85. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/alter-table-executor.d.mts +1 -0
  86. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/create-index-builder.d.mts +1 -0
  87. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/create-schema-builder.d.mts +1 -0
  88. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/create-table-builder.d.mts +1 -0
  89. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/create-type-builder.d.mts +1 -0
  90. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/create-view-builder.d.mts +1 -0
  91. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/drop-index-builder.d.mts +1 -0
  92. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/drop-schema-builder.d.mts +1 -0
  93. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/drop-table-builder.d.mts +1 -0
  94. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/drop-type-builder.d.mts +1 -0
  95. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/drop-view-builder.d.mts +1 -0
  96. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/refresh-materialized-view-builder.d.mts +1 -0
  97. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/schema.d.mts +1 -0
  98. package/dist/src/lib/posthog.d.mts +7 -0
  99. package/dist/src/lib/posthog.mjs +7 -0
  100. package/dist/src/lib/posthog.mjs.map +1 -0
  101. package/dist/src/lib/sentry.d.mts +1 -0
  102. package/dist/src/lib/sentry.mjs +10 -0
  103. package/dist/src/lib/sentry.mjs.map +1 -0
  104. package/dist/src/modules/access/access.repository.d.mts +2352 -0
  105. package/dist/src/modules/access/access.repository.mjs +24 -0
  106. package/dist/src/modules/access/access.repository.mjs.map +1 -0
  107. package/dist/src/modules/access/access.service.d.mts +25 -0
  108. package/dist/src/modules/access/access.service.mjs +40 -0
  109. package/dist/src/modules/access/access.service.mjs.map +1 -0
  110. package/dist/src/modules/access/access.utils.d.mts +19 -0
  111. package/dist/src/modules/access/access.utils.mjs +21 -0
  112. package/dist/src/modules/access/access.utils.mjs.map +1 -0
  113. package/dist/src/modules/ai/ai.db.d.mts +401 -0
  114. package/dist/src/modules/ai/ai.db.mjs +38 -0
  115. package/dist/src/modules/ai/ai.db.mjs.map +1 -0
  116. package/dist/src/modules/ai/ai.prompt.d.mts +30 -0
  117. package/dist/src/modules/ai/ai.prompt.mjs +30 -0
  118. package/dist/src/modules/ai/ai.prompt.mjs.map +1 -0
  119. package/dist/src/modules/ai/ai.prompts.d.mts +10 -0
  120. package/dist/src/modules/ai/{ai.prompts.js → ai.prompts.mjs} +17 -15
  121. package/dist/src/modules/ai/ai.prompts.mjs.map +1 -0
  122. package/dist/src/modules/ai/ai.repository.d.mts +428 -0
  123. package/dist/src/modules/ai/ai.repository.mjs +23 -0
  124. package/dist/src/modules/ai/ai.repository.mjs.map +1 -0
  125. package/dist/src/modules/ai/ai.router.d.mts +1 -0
  126. package/dist/src/modules/ai/ai.service.d.mts +128 -0
  127. package/dist/src/modules/ai/ai.service.mjs +267 -0
  128. package/dist/src/modules/ai/ai.service.mjs.map +1 -0
  129. package/dist/src/modules/ai/ai.trpc.d.mts +31 -0
  130. package/dist/src/modules/ai/ai.trpc.mjs +17 -0
  131. package/dist/src/modules/ai/ai.trpc.mjs.map +1 -0
  132. package/dist/src/modules/ai/ideogram/ideogram.constants.d.mts +11 -0
  133. package/dist/src/modules/ai/ideogram/ideogram.constants.mjs +184 -0
  134. package/dist/src/modules/ai/ideogram/ideogram.constants.mjs.map +1 -0
  135. package/dist/src/modules/ai/ideogram/ideogram.dto.d.mts +234 -0
  136. package/dist/src/modules/ai/ideogram/ideogram.dto.mjs +45 -0
  137. package/dist/src/modules/ai/ideogram/ideogram.dto.mjs.map +1 -0
  138. package/dist/src/modules/ai/ideogram/ideogram.prompt.d.mts +7 -0
  139. package/dist/src/modules/ai/ideogram/{ideogram.prompt.js → ideogram.prompt.mjs} +861 -859
  140. package/dist/src/modules/ai/ideogram/ideogram.prompt.mjs.map +1 -0
  141. package/dist/src/modules/ai/ideogram/ideogram.repository.d.mts +11 -0
  142. package/dist/src/modules/ai/ideogram/ideogram.repository.mjs +32 -0
  143. package/dist/src/modules/ai/ideogram/ideogram.repository.mjs.map +1 -0
  144. package/dist/src/modules/ai/ideogram/ideogram.service.d.mts +14 -0
  145. package/dist/src/modules/ai/ideogram/ideogram.service.mjs +11 -0
  146. package/dist/src/modules/ai/ideogram/ideogram.service.mjs.map +1 -0
  147. package/dist/src/modules/auth/auth.db.d.mts +2341 -0
  148. package/dist/src/modules/auth/auth.db.mjs +169 -0
  149. package/dist/src/modules/auth/auth.db.mjs.map +1 -0
  150. package/dist/src/modules/auth/auth.dto.d.mts +70 -0
  151. package/dist/src/modules/auth/auth.dto.mjs +43 -0
  152. package/dist/src/modules/auth/auth.dto.mjs.map +1 -0
  153. package/dist/src/modules/auth/auth.lib.d.mts +4894 -0
  154. package/dist/src/modules/auth/auth.lib.mjs +232 -0
  155. package/dist/src/modules/auth/auth.lib.mjs.map +1 -0
  156. package/dist/src/modules/auth/auth.middleware.d.mts +619 -0
  157. package/dist/src/modules/auth/auth.middleware.mjs +38 -0
  158. package/dist/src/modules/auth/auth.middleware.mjs.map +1 -0
  159. package/dist/src/modules/auth/auth.repository.d.mts +2453 -0
  160. package/dist/src/modules/auth/auth.repository.mjs +401 -0
  161. package/dist/src/modules/auth/auth.repository.mjs.map +1 -0
  162. package/dist/src/modules/auth/auth.service.d.mts +105 -0
  163. package/dist/src/modules/auth/auth.service.mjs +227 -0
  164. package/dist/src/modules/auth/auth.service.mjs.map +1 -0
  165. package/dist/src/modules/auth/auth.trpc.d.mts +303 -0
  166. package/dist/src/modules/auth/auth.trpc.mjs +108 -0
  167. package/dist/src/modules/auth/auth.trpc.mjs.map +1 -0
  168. package/dist/src/modules/auth/auth.utils.d.mts +2356 -0
  169. package/dist/src/modules/auth/auth.utils.mjs +77 -0
  170. package/dist/src/modules/auth/auth.utils.mjs.map +1 -0
  171. package/dist/src/modules/base/base.abstract.d.mts +29 -0
  172. package/dist/src/modules/base/base.abstract.mjs +60 -0
  173. package/dist/src/modules/base/base.abstract.mjs.map +1 -0
  174. package/dist/src/modules/base/base.actor.d.mts +73 -0
  175. package/dist/src/modules/base/base.actor.mjs +78 -0
  176. package/dist/src/modules/base/base.actor.mjs.map +1 -0
  177. package/dist/src/modules/base/base.dto.d.mts +67 -0
  178. package/dist/src/modules/base/base.dto.mjs +79 -0
  179. package/dist/src/modules/base/base.dto.mjs.map +1 -0
  180. package/dist/src/modules/base/base.grants.d.mts +28 -0
  181. package/dist/src/modules/base/base.grants.mjs +103 -0
  182. package/dist/src/modules/base/base.grants.mjs.map +1 -0
  183. package/dist/src/modules/base/base.procedure.d.mts +111 -0
  184. package/dist/src/modules/base/base.procedure.mjs +252 -0
  185. package/dist/src/modules/base/base.procedure.mjs.map +1 -0
  186. package/dist/src/modules/base/base.repository.d.mts +123 -0
  187. package/dist/src/modules/base/base.repository.mjs +250 -0
  188. package/dist/src/modules/base/base.repository.mjs.map +1 -0
  189. package/dist/src/modules/base/base.service.d.mts +44 -0
  190. package/dist/src/modules/base/base.service.mjs +116 -0
  191. package/dist/src/modules/base/base.service.mjs.map +1 -0
  192. package/dist/src/modules/base/base.types.d.mts +5 -0
  193. package/dist/src/modules/billing/billing.db.d.mts +371 -0
  194. package/dist/src/modules/billing/billing.db.mjs +31 -0
  195. package/dist/src/modules/billing/billing.db.mjs.map +1 -0
  196. package/dist/src/modules/billing/billing.repository.d.mts +2787 -0
  197. package/dist/src/modules/billing/billing.repository.mjs +188 -0
  198. package/dist/src/modules/billing/billing.repository.mjs.map +1 -0
  199. package/dist/src/modules/billing/billing.router.d.mts +9 -0
  200. package/dist/src/modules/billing/billing.router.mjs +40 -0
  201. package/dist/src/modules/billing/billing.router.mjs.map +1 -0
  202. package/dist/src/modules/billing/billing.service.d.mts +53 -0
  203. package/dist/src/modules/billing/billing.service.mjs +125 -0
  204. package/dist/src/modules/billing/billing.service.mjs.map +1 -0
  205. package/dist/src/modules/billing/billing.trpc.d.mts +29 -0
  206. package/dist/src/modules/billing/billing.trpc.mjs +17 -0
  207. package/dist/src/modules/billing/billing.trpc.mjs.map +1 -0
  208. package/dist/src/modules/clay/clay.repository.d.mts +10 -0
  209. package/dist/src/modules/clay/clay.repository.mjs +27 -0
  210. package/dist/src/modules/clay/clay.repository.mjs.map +1 -0
  211. package/dist/src/modules/clay/clay.service.d.mts +32 -0
  212. package/dist/src/modules/clay/clay.service.mjs +23 -0
  213. package/dist/src/modules/clay/clay.service.mjs.map +1 -0
  214. package/dist/src/modules/connect/connect.db.d.mts +362 -0
  215. package/dist/src/modules/connect/connect.db.mjs +30 -0
  216. package/dist/src/modules/connect/connect.db.mjs.map +1 -0
  217. package/dist/src/modules/connect/connect.dto.d.mts +79 -0
  218. package/dist/src/modules/connect/connect.dto.mjs +38 -0
  219. package/dist/src/modules/connect/connect.dto.mjs.map +1 -0
  220. package/dist/src/modules/connect/connect.linkedin.d.mts +7 -0
  221. package/dist/src/modules/connect/connect.linkedin.mjs +47 -0
  222. package/dist/src/modules/connect/connect.linkedin.mjs.map +1 -0
  223. package/dist/src/modules/connect/connect.oauth.d.mts +32 -0
  224. package/dist/src/modules/connect/connect.oauth.mjs +145 -0
  225. package/dist/src/modules/connect/connect.oauth.mjs.map +1 -0
  226. package/dist/src/modules/connect/connect.repository.d.mts +419 -0
  227. package/dist/src/modules/connect/connect.repository.mjs +40 -0
  228. package/dist/src/modules/connect/connect.repository.mjs.map +1 -0
  229. package/dist/src/modules/connect/connect.router.d.mts +9 -0
  230. package/dist/src/modules/connect/connect.router.mjs +46 -0
  231. package/dist/src/modules/connect/connect.router.mjs.map +1 -0
  232. package/dist/src/modules/connect/connect.service.d.mts +103 -0
  233. package/dist/src/modules/connect/connect.service.mjs +88 -0
  234. package/dist/src/modules/connect/connect.service.mjs.map +1 -0
  235. package/dist/src/modules/connect/connect.trpc.d.mts +53 -0
  236. package/dist/src/modules/connect/connect.trpc.mjs +17 -0
  237. package/dist/src/modules/connect/connect.trpc.mjs.map +1 -0
  238. package/dist/src/modules/connect/connect.types.d.mts +29 -0
  239. package/dist/src/modules/crypto/crypto.db.d.mts +157 -0
  240. package/dist/src/modules/crypto/crypto.db.mjs +19 -0
  241. package/dist/src/modules/crypto/crypto.db.mjs.map +1 -0
  242. package/dist/src/modules/crypto/crypto.repository.d.mts +163 -0
  243. package/dist/src/modules/crypto/crypto.repository.mjs +9 -0
  244. package/dist/src/modules/crypto/crypto.repository.mjs.map +1 -0
  245. package/dist/src/modules/crypto/crypto.service.d.mts +15 -0
  246. package/dist/src/modules/crypto/crypto.service.mjs +40 -0
  247. package/dist/src/modules/crypto/crypto.service.mjs.map +1 -0
  248. package/dist/src/modules/email/email.service.d.mts +62 -0
  249. package/dist/src/modules/email/email.service.mjs +105 -0
  250. package/dist/src/modules/email/email.service.mjs.map +1 -0
  251. package/dist/src/modules/file/file.repository.d.mts +17 -0
  252. package/dist/src/modules/file/file.repository.mjs +72 -0
  253. package/dist/src/modules/file/file.repository.mjs.map +1 -0
  254. package/dist/src/modules/file/{file.router.d.ts → file.router.d.mts} +4 -0
  255. package/dist/src/modules/file/file.router.mjs +88 -0
  256. package/dist/src/modules/file/file.router.mjs.map +1 -0
  257. package/dist/src/modules/file/file.service.d.mts +30 -0
  258. package/dist/src/modules/file/file.service.mjs +117 -0
  259. package/dist/src/modules/file/file.service.mjs.map +1 -0
  260. package/dist/src/modules/recurrence/recurrence.db.d.mts +568 -0
  261. package/dist/src/modules/recurrence/recurrence.db.mjs +47 -0
  262. package/dist/src/modules/recurrence/recurrence.db.mjs.map +1 -0
  263. package/dist/src/modules/recurrence/recurrence.repository.d.mts +588 -0
  264. package/dist/src/modules/recurrence/recurrence.repository.mjs +28 -0
  265. package/dist/src/modules/recurrence/recurrence.repository.mjs.map +1 -0
  266. package/dist/src/modules/recurrence/recurrence.service.d.mts +51 -0
  267. package/dist/src/modules/recurrence/recurrence.service.mjs +64 -0
  268. package/dist/src/modules/recurrence/recurrence.service.mjs.map +1 -0
  269. package/dist/src/modules/recurrence/recurrence.trpc.d.mts +65 -0
  270. package/dist/src/modules/recurrence/recurrence.trpc.mjs +44 -0
  271. package/dist/src/modules/recurrence/recurrence.trpc.mjs.map +1 -0
  272. package/dist/src/modules/social/social.dto.d.mts +39 -0
  273. package/dist/src/modules/social/social.dto.mjs +22 -0
  274. package/dist/src/modules/social/social.dto.mjs.map +1 -0
  275. package/dist/src/modules/social/{social.linkedin.d.ts → social.linkedin.d.mts} +8 -3
  276. package/dist/src/modules/social/social.linkedin.mjs +346 -0
  277. package/dist/src/modules/social/social.linkedin.mjs.map +1 -0
  278. package/dist/src/modules/social/social.service.d.mts +34 -0
  279. package/dist/src/modules/social/social.service.mjs +55 -0
  280. package/dist/src/modules/social/social.service.mjs.map +1 -0
  281. package/dist/src/modules/social/social.types.d.mts +40 -0
  282. package/dist/src/modules/tag/tag.db.d.mts +352 -0
  283. package/dist/src/modules/tag/tag.db.mjs +35 -0
  284. package/dist/src/modules/tag/tag.db.mjs.map +1 -0
  285. package/dist/src/modules/tag/tag.dto.d.mts +1025 -0
  286. package/dist/src/modules/tag/tag.dto.mjs +11 -0
  287. package/dist/src/modules/tag/tag.dto.mjs.map +1 -0
  288. package/dist/src/modules/tag/tag.repository.d.mts +394 -0
  289. package/dist/src/modules/tag/tag.repository.mjs +114 -0
  290. package/dist/src/modules/tag/tag.repository.mjs.map +1 -0
  291. package/dist/src/modules/tag/tag.service.d.mts +93 -0
  292. package/dist/src/modules/tag/tag.service.mjs +47 -0
  293. package/dist/src/modules/tag/tag.service.mjs.map +1 -0
  294. package/dist/src/modules/tag/tag.trpc.d.mts +109 -0
  295. package/dist/src/modules/tag/tag.trpc.mjs +30 -0
  296. package/dist/src/modules/tag/tag.trpc.mjs.map +1 -0
  297. package/dist/src/modules/utils/{applyPagination.d.ts → applyPagination.d.mts} +5 -1
  298. package/dist/src/modules/utils/applyPagination.mjs +15 -0
  299. package/dist/src/modules/utils/applyPagination.mjs.map +1 -0
  300. package/dist/src/modules/utils/applySorting.d.mts +13 -0
  301. package/dist/src/modules/utils/applySorting.mjs +18 -0
  302. package/dist/src/modules/utils/applySorting.mjs.map +1 -0
  303. package/dist/src/modules/utils/getConditionsFromFilters.d.mts +9 -0
  304. package/dist/src/modules/utils/getConditionsFromFilters.mjs +150 -0
  305. package/dist/src/modules/utils/getConditionsFromFilters.mjs.map +1 -0
  306. package/dist/src/modules/video/video.service.d.mts +12 -0
  307. package/dist/src/modules/video/video.service.mjs +50 -0
  308. package/dist/src/modules/video/video.service.mjs.map +1 -0
  309. package/dist/src/modules/webhook/webhook.constants.d.mts +12 -0
  310. package/dist/src/modules/webhook/webhook.constants.mjs +12 -0
  311. package/dist/src/modules/webhook/webhook.constants.mjs.map +1 -0
  312. package/dist/src/modules/webhook/webhook.db.d.mts +142 -0
  313. package/dist/src/modules/webhook/webhook.db.mjs +17 -0
  314. package/dist/src/modules/webhook/webhook.db.mjs.map +1 -0
  315. package/dist/src/modules/webhook/webhook.dto.d.mts +402 -0
  316. package/dist/src/modules/webhook/webhook.dto.mjs +9 -0
  317. package/dist/src/modules/webhook/webhook.dto.mjs.map +1 -0
  318. package/dist/src/modules/webhook/webhook.repository.d.mts +154 -0
  319. package/dist/src/modules/webhook/webhook.repository.mjs +50 -0
  320. package/dist/src/modules/webhook/webhook.repository.mjs.map +1 -0
  321. package/dist/src/modules/webhook/webhook.router.d.mts +8 -0
  322. package/dist/src/modules/webhook/webhook.router.mjs +23 -0
  323. package/dist/src/modules/webhook/webhook.router.mjs.map +1 -0
  324. package/dist/src/modules/webhook/webhook.service.d.mts +14 -0
  325. package/dist/src/modules/webhook/webhook.service.mjs +59 -0
  326. package/dist/src/modules/webhook/webhook.service.mjs.map +1 -0
  327. package/dist/src/modules/workflow/workflow.db.d.mts +302 -0
  328. package/dist/src/modules/workflow/workflow.db.mjs +28 -0
  329. package/dist/src/modules/workflow/workflow.db.mjs.map +1 -0
  330. package/dist/src/modules/workflow/workflow.repository.d.mts +371 -0
  331. package/dist/src/modules/workflow/workflow.repository.mjs +93 -0
  332. package/dist/src/modules/workflow/workflow.repository.mjs.map +1 -0
  333. package/dist/src/modules/workflow/workflow.service.d.mts +31 -0
  334. package/dist/src/modules/workflow/workflow.service.mjs +40 -0
  335. package/dist/src/modules/workflow/workflow.service.mjs.map +1 -0
  336. package/dist/src/modules/workflow/workflow.trpc.d.mts +28 -0
  337. package/dist/src/modules/workflow/workflow.trpc.mjs +17 -0
  338. package/dist/src/modules/workflow/workflow.trpc.mjs.map +1 -0
  339. package/dist/src/modules/workflow/workflow.types.d.mts +25 -0
  340. package/dist/src/modules/workflow/workflow.utils.d.mts +36 -0
  341. package/dist/src/modules/workflow/workflow.utils.mjs +181 -0
  342. package/dist/src/modules/workflow/workflow.utils.mjs.map +1 -0
  343. package/dist/src/types.d.mts +346 -0
  344. package/dist/src/types.mjs +13 -0
  345. package/dist/src/types.mjs.map +1 -0
  346. package/dist/src/utils/errors.d.mts +62 -0
  347. package/dist/src/utils/errors.mjs +96 -0
  348. package/dist/src/utils/errors.mjs.map +1 -0
  349. package/dist/src/utils/logger.d.mts +7 -0
  350. package/dist/src/utils/logger.mjs +10 -0
  351. package/dist/src/utils/logger.mjs.map +1 -0
  352. package/dist/src/utils/posthog.d.mts +17 -0
  353. package/dist/src/utils/posthog.mjs +25 -0
  354. package/dist/src/utils/posthog.mjs.map +1 -0
  355. package/dist/src/utils/trpc.d.mts +54 -0
  356. package/dist/src/utils/trpc.mjs +146 -0
  357. package/dist/src/utils/trpc.mjs.map +1 -0
  358. package/dist/src/utils/types.d.mts +9 -0
  359. package/package.json +5 -4
  360. package/dist/src/lib/posthog.d.ts +0 -2
  361. package/dist/src/lib/posthog.js +0 -7
  362. package/dist/src/lib/sentry.js +0 -9
  363. package/dist/src/modules/access/access.repository.d.ts +0 -2347
  364. package/dist/src/modules/access/access.repository.js +0 -32
  365. package/dist/src/modules/access/access.service.d.ts +0 -21
  366. package/dist/src/modules/access/access.service.js +0 -51
  367. package/dist/src/modules/access/access.test.js +0 -182
  368. package/dist/src/modules/access/access.utils.d.ts +0 -16
  369. package/dist/src/modules/access/access.utils.js +0 -20
  370. package/dist/src/modules/ai/ai.db.d.ts +0 -395
  371. package/dist/src/modules/ai/ai.db.js +0 -39
  372. package/dist/src/modules/ai/ai.prompt.d.ts +0 -26
  373. package/dist/src/modules/ai/ai.prompt.js +0 -30
  374. package/dist/src/modules/ai/ai.prompts.d.ts +0 -5
  375. package/dist/src/modules/ai/ai.repository.d.ts +0 -423
  376. package/dist/src/modules/ai/ai.repository.js +0 -26
  377. package/dist/src/modules/ai/ai.router.js +0 -132
  378. package/dist/src/modules/ai/ai.service.d.ts +0 -127
  379. package/dist/src/modules/ai/ai.service.js +0 -297
  380. package/dist/src/modules/ai/ai.trpc.d.ts +0 -22
  381. package/dist/src/modules/ai/ai.trpc.js +0 -20
  382. package/dist/src/modules/ai/ideogram/ideogram.constants.d.ts +0 -7
  383. package/dist/src/modules/ai/ideogram/ideogram.constants.js +0 -167
  384. package/dist/src/modules/ai/ideogram/ideogram.dto.d.ts +0 -229
  385. package/dist/src/modules/ai/ideogram/ideogram.dto.js +0 -49
  386. package/dist/src/modules/ai/ideogram/ideogram.prompt.d.ts +0 -2
  387. package/dist/src/modules/ai/ideogram/ideogram.repository.d.ts +0 -6
  388. package/dist/src/modules/ai/ideogram/ideogram.repository.js +0 -46
  389. package/dist/src/modules/ai/ideogram/ideogram.service.d.ts +0 -9
  390. package/dist/src/modules/ai/ideogram/ideogram.service.js +0 -11
  391. package/dist/src/modules/auth/auth.db.d.ts +0 -2335
  392. package/dist/src/modules/auth/auth.db.js +0 -215
  393. package/dist/src/modules/auth/auth.dto.d.ts +0 -65
  394. package/dist/src/modules/auth/auth.dto.js +0 -38
  395. package/dist/src/modules/auth/auth.lib.d.ts +0 -4873
  396. package/dist/src/modules/auth/auth.lib.js +0 -284
  397. package/dist/src/modules/auth/auth.middleware.d.ts +0 -614
  398. package/dist/src/modules/auth/auth.middleware.js +0 -52
  399. package/dist/src/modules/auth/auth.repository.d.ts +0 -2421
  400. package/dist/src/modules/auth/auth.repository.js +0 -636
  401. package/dist/src/modules/auth/auth.service.d.ts +0 -108
  402. package/dist/src/modules/auth/auth.service.js +0 -246
  403. package/dist/src/modules/auth/auth.trpc.d.ts +0 -292
  404. package/dist/src/modules/auth/auth.trpc.js +0 -179
  405. package/dist/src/modules/auth/auth.utils.d.ts +0 -2351
  406. package/dist/src/modules/auth/auth.utils.js +0 -97
  407. package/dist/src/modules/base/base.abstract.d.ts +0 -19
  408. package/dist/src/modules/base/base.abstract.js +0 -62
  409. package/dist/src/modules/base/base.dto.d.ts +0 -69
  410. package/dist/src/modules/base/base.dto.js +0 -112
  411. package/dist/src/modules/base/base.grants.d.ts +0 -28
  412. package/dist/src/modules/base/base.grants.js +0 -123
  413. package/dist/src/modules/base/base.grants.test.js +0 -668
  414. package/dist/src/modules/base/base.procedure.d.ts +0 -112
  415. package/dist/src/modules/base/base.procedure.js +0 -289
  416. package/dist/src/modules/base/base.repository.d.ts +0 -97
  417. package/dist/src/modules/base/base.repository.js +0 -317
  418. package/dist/src/modules/base/base.service.d.ts +0 -52
  419. package/dist/src/modules/base/base.service.js +0 -116
  420. package/dist/src/modules/base/base.service.test.js +0 -415
  421. package/dist/src/modules/base/base.types.d.ts +0 -1
  422. package/dist/src/modules/base/base.types.js +0 -2
  423. package/dist/src/modules/billing/billing.db.d.ts +0 -365
  424. package/dist/src/modules/billing/billing.db.js +0 -29
  425. package/dist/src/modules/billing/billing.repository.d.ts +0 -2763
  426. package/dist/src/modules/billing/billing.repository.js +0 -235
  427. package/dist/src/modules/billing/billing.router.d.ts +0 -4
  428. package/dist/src/modules/billing/billing.router.js +0 -56
  429. package/dist/src/modules/billing/billing.service.d.ts +0 -59
  430. package/dist/src/modules/billing/billing.service.js +0 -147
  431. package/dist/src/modules/billing/billing.trpc.d.ts +0 -38
  432. package/dist/src/modules/billing/billing.trpc.js +0 -17
  433. package/dist/src/modules/clay/clay.repository.d.ts +0 -5
  434. package/dist/src/modules/clay/clay.repository.js +0 -26
  435. package/dist/src/modules/clay/clay.service.d.ts +0 -28
  436. package/dist/src/modules/clay/clay.service.js +0 -24
  437. package/dist/src/modules/connect/connect.db.d.ts +0 -356
  438. package/dist/src/modules/connect/connect.db.js +0 -30
  439. package/dist/src/modules/connect/connect.dto.d.ts +0 -74
  440. package/dist/src/modules/connect/connect.dto.js +0 -36
  441. package/dist/src/modules/connect/connect.linkedin.d.ts +0 -2
  442. package/dist/src/modules/connect/connect.linkedin.js +0 -53
  443. package/dist/src/modules/connect/connect.oauth.d.ts +0 -27
  444. package/dist/src/modules/connect/connect.oauth.js +0 -198
  445. package/dist/src/modules/connect/connect.repository.d.ts +0 -413
  446. package/dist/src/modules/connect/connect.repository.js +0 -54
  447. package/dist/src/modules/connect/connect.router.d.ts +0 -4
  448. package/dist/src/modules/connect/connect.router.js +0 -54
  449. package/dist/src/modules/connect/connect.service.d.ts +0 -88
  450. package/dist/src/modules/connect/connect.service.js +0 -114
  451. package/dist/src/modules/connect/connect.trpc.d.ts +0 -44
  452. package/dist/src/modules/connect/connect.trpc.js +0 -21
  453. package/dist/src/modules/connect/connect.types.d.ts +0 -25
  454. package/dist/src/modules/connect/connect.types.js +0 -2
  455. package/dist/src/modules/crypto/crypto.db.d.ts +0 -151
  456. package/dist/src/modules/crypto/crypto.db.js +0 -17
  457. package/dist/src/modules/crypto/crypto.repository.d.ts +0 -159
  458. package/dist/src/modules/crypto/crypto.repository.js +0 -10
  459. package/dist/src/modules/crypto/crypto.service.d.ts +0 -10
  460. package/dist/src/modules/crypto/crypto.service.js +0 -52
  461. package/dist/src/modules/email/email.service.d.ts +0 -56
  462. package/dist/src/modules/email/email.service.js +0 -106
  463. package/dist/src/modules/file/file.repository.d.ts +0 -12
  464. package/dist/src/modules/file/file.repository.js +0 -79
  465. package/dist/src/modules/file/file.router.js +0 -99
  466. package/dist/src/modules/file/file.service.d.ts +0 -24
  467. package/dist/src/modules/file/file.service.js +0 -150
  468. package/dist/src/modules/recurrence/recurrence.db.d.ts +0 -562
  469. package/dist/src/modules/recurrence/recurrence.db.js +0 -66
  470. package/dist/src/modules/recurrence/recurrence.repository.d.ts +0 -584
  471. package/dist/src/modules/recurrence/recurrence.repository.js +0 -39
  472. package/dist/src/modules/recurrence/recurrence.service.d.ts +0 -50
  473. package/dist/src/modules/recurrence/recurrence.service.js +0 -69
  474. package/dist/src/modules/recurrence/recurrence.trpc.d.ts +0 -206
  475. package/dist/src/modules/recurrence/recurrence.trpc.js +0 -65
  476. package/dist/src/modules/social/social.dto.d.ts +0 -34
  477. package/dist/src/modules/social/social.dto.js +0 -18
  478. package/dist/src/modules/social/social.linkedin.js +0 -427
  479. package/dist/src/modules/social/social.linkedin.test.js +0 -235
  480. package/dist/src/modules/social/social.service.d.ts +0 -28
  481. package/dist/src/modules/social/social.service.js +0 -76
  482. package/dist/src/modules/social/social.types.d.ts +0 -35
  483. package/dist/src/modules/social/social.types.js +0 -2
  484. package/dist/src/modules/tag/tag.db.d.ts +0 -346
  485. package/dist/src/modules/tag/tag.db.js +0 -42
  486. package/dist/src/modules/tag/tag.dto.d.ts +0 -1018
  487. package/dist/src/modules/tag/tag.dto.js +0 -9
  488. package/dist/src/modules/tag/tag.repository.d.ts +0 -383
  489. package/dist/src/modules/tag/tag.repository.js +0 -156
  490. package/dist/src/modules/tag/tag.service.d.ts +0 -109
  491. package/dist/src/modules/tag/tag.service.js +0 -42
  492. package/dist/src/modules/tag/tag.trpc.d.ts +0 -164
  493. package/dist/src/modules/tag/tag.trpc.js +0 -53
  494. package/dist/src/modules/utils/applyPagination.js +0 -16
  495. package/dist/src/modules/utils/applySorting.d.ts +0 -8
  496. package/dist/src/modules/utils/applySorting.js +0 -18
  497. package/dist/src/modules/utils/getConditionsFromFilters.d.ts +0 -4
  498. package/dist/src/modules/utils/getConditionsFromFilters.js +0 -200
  499. package/dist/src/modules/video/video.service.d.ts +0 -7
  500. package/dist/src/modules/video/video.service.js +0 -84
  501. package/dist/src/modules/webhook/webhook.constants.d.ts +0 -8
  502. package/dist/src/modules/webhook/webhook.constants.js +0 -10
  503. package/dist/src/modules/webhook/webhook.db.d.ts +0 -136
  504. package/dist/src/modules/webhook/webhook.db.js +0 -17
  505. package/dist/src/modules/webhook/webhook.dto.d.ts +0 -394
  506. package/dist/src/modules/webhook/webhook.dto.js +0 -7
  507. package/dist/src/modules/webhook/webhook.repository.d.ts +0 -148
  508. package/dist/src/modules/webhook/webhook.repository.js +0 -56
  509. package/dist/src/modules/webhook/webhook.router.d.ts +0 -3
  510. package/dist/src/modules/webhook/webhook.router.js +0 -30
  511. package/dist/src/modules/webhook/webhook.service.d.ts +0 -9
  512. package/dist/src/modules/webhook/webhook.service.js +0 -68
  513. package/dist/src/modules/workflow/workflow.db.d.ts +0 -296
  514. package/dist/src/modules/workflow/workflow.db.js +0 -30
  515. package/dist/src/modules/workflow/workflow.repository.d.ts +0 -343
  516. package/dist/src/modules/workflow/workflow.repository.js +0 -105
  517. package/dist/src/modules/workflow/workflow.service.d.ts +0 -21
  518. package/dist/src/modules/workflow/workflow.service.js +0 -37
  519. package/dist/src/modules/workflow/workflow.trpc.d.ts +0 -56
  520. package/dist/src/modules/workflow/workflow.trpc.js +0 -21
  521. package/dist/src/modules/workflow/workflow.types.d.ts +0 -20
  522. package/dist/src/modules/workflow/workflow.types.js +0 -2
  523. package/dist/src/modules/workflow/workflow.utils.d.ts +0 -21
  524. package/dist/src/modules/workflow/workflow.utils.js +0 -173
  525. package/dist/src/test/stubs/utils.d.ts +0 -2
  526. package/dist/src/test/stubs/utils.js +0 -5
  527. package/dist/src/trpc/context.d.ts +0 -41
  528. package/dist/src/trpc/context.js +0 -17
  529. package/dist/src/trpc/index.d.ts +0 -3
  530. package/dist/src/trpc/index.js +0 -6
  531. package/dist/src/trpc/procedures.d.ts +0 -233
  532. package/dist/src/trpc/procedures.js +0 -32
  533. package/dist/src/trpc/utils.d.ts +0 -4
  534. package/dist/src/trpc/utils.js +0 -20
  535. package/dist/src/types.d.ts +0 -358
  536. package/dist/src/types.js +0 -12
  537. package/dist/src/utils/errors.d.ts +0 -49
  538. package/dist/src/utils/errors.js +0 -104
  539. package/dist/src/utils/logger.d.ts +0 -1
  540. package/dist/src/utils/logger.js +0 -11
  541. package/dist/src/utils/posthog.d.ts +0 -13
  542. package/dist/src/utils/posthog.js +0 -31
  543. package/dist/src/utils/trpc.d.ts +0 -58
  544. package/dist/src/utils/trpc.js +0 -63
  545. package/dist/src/utils/types.d.ts +0 -4
  546. package/dist/src/utils/types.js +0 -2
  547. package/dist/tsconfig.tsbuildinfo +0 -1
  548. /package/dist/src/{lib/sentry.d.ts → modules/ai/ai.router.mjs} +0 -0
  549. /package/dist/src/modules/{access/access.test.d.ts → base/base.types.mjs} +0 -0
  550. /package/dist/src/modules/{ai/ai.router.d.ts → connect/connect.types.mjs} +0 -0
  551. /package/dist/src/modules/{base/base.grants.test.d.ts → social/social.types.mjs} +0 -0
  552. /package/dist/src/modules/{base/base.service.test.d.ts → workflow/workflow.types.mjs} +0 -0
  553. /package/dist/src/{modules/social/social.linkedin.test.d.ts → utils/types.mjs} +0 -0
@@ -0,0 +1,103 @@
1
+ import { err, ok } from "neverthrow";
2
+ //#region src/modules/base/base.grants.ts
3
+ function flattenNestedGrants(nestedGrants) {
4
+ return Object.entries(nestedGrants).flatMap(([resource, levels]) => {
5
+ return Object.entries(levels).flatMap(([level, roles]) => {
6
+ return Object.entries(roles).flatMap(([role, actions]) => {
7
+ return Object.entries(actions).map(([action, access]) => {
8
+ return {
9
+ resource,
10
+ level,
11
+ role,
12
+ action,
13
+ access
14
+ };
15
+ });
16
+ });
17
+ });
18
+ });
19
+ }
20
+ function checkOwnership(entityField, contextValue, entities) {
21
+ if (!contextValue) return false;
22
+ if (!entities) return false;
23
+ return Array.isArray(entities) ? entities.every((e) => e[entityField] === contextValue) : entities[entityField] === contextValue;
24
+ }
25
+ const LEVEL_PRIORITY = [
26
+ "user",
27
+ "team",
28
+ "organization"
29
+ ];
30
+ function getRoleForLevel(level, ctx) {
31
+ switch (level) {
32
+ case "user": return ctx.userRole;
33
+ case "team": return ctx.teamRole;
34
+ case "organization": return ctx.organizationRole;
35
+ }
36
+ }
37
+ function getContextValueForLevel(level, ctx) {
38
+ switch (level) {
39
+ case "user": return ctx.userId;
40
+ case "team": return ctx.teamId;
41
+ case "organization": return ctx.organizationId;
42
+ }
43
+ }
44
+ function getOwnershipFieldForLevel(level) {
45
+ switch (level) {
46
+ case "user": return "userId";
47
+ case "team": return "teamId";
48
+ case "organization": return "organizationId";
49
+ }
50
+ }
51
+ function hasAllAccess(grants, roles) {
52
+ for (const level of LEVEL_PRIORITY) for (const grant of grants) {
53
+ if (grant.level !== level) continue;
54
+ if (grant.access !== "all") continue;
55
+ if (grant.role === getRoleForLevel(level, roles)) return true;
56
+ }
57
+ return false;
58
+ }
59
+ function checkOwnAccess(grants, roles, contextValues, entities) {
60
+ for (const level of LEVEL_PRIORITY) for (const grant of grants) {
61
+ if (grant.level !== level) continue;
62
+ if (grant.access !== "own") continue;
63
+ if (grant.role !== getRoleForLevel(level, roles)) continue;
64
+ if (checkOwnership(getOwnershipFieldForLevel(level), getContextValueForLevel(level, contextValues), entities)) return true;
65
+ }
66
+ return false;
67
+ }
68
+ function checkPermissionSync(actor, grants, entities) {
69
+ if (!grants || grants.length === 0) return false;
70
+ const roles = {
71
+ userRole: actor.userRole,
72
+ teamRole: actor.teamRole,
73
+ organizationRole: actor.organizationRole
74
+ };
75
+ const contextValues = {
76
+ userId: actor.userId,
77
+ teamId: actor.teamId,
78
+ organizationId: actor.organizationId
79
+ };
80
+ if (hasAllAccess(grants, roles)) return true;
81
+ return checkOwnAccess(grants, roles, contextValues, entities);
82
+ }
83
+ async function checkPermissionAsync(actor, grants, getEntities) {
84
+ if (!grants || grants.length === 0) return ok(false);
85
+ const roles = {
86
+ userRole: actor.userRole,
87
+ teamRole: actor.teamRole,
88
+ organizationRole: actor.organizationRole
89
+ };
90
+ const contextValues = {
91
+ userId: actor.userId,
92
+ teamId: actor.teamId,
93
+ organizationId: actor.organizationId
94
+ };
95
+ if (hasAllAccess(grants, roles)) return ok(true);
96
+ const entities = await getEntities();
97
+ if (entities.isErr()) return err(entities.error);
98
+ return ok(checkOwnAccess(grants, roles, contextValues, entities.value));
99
+ }
100
+ //#endregion
101
+ export { checkPermissionAsync, checkPermissionSync, flattenNestedGrants };
102
+
103
+ //# sourceMappingURL=base.grants.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.grants.mjs","names":[],"sources":["../../../../src/modules/base/base.grants.ts"],"sourcesContent":["import { err, ok } from \"neverthrow\";\r\nimport type { ServiceActor } from \"./base.actor\";\r\nimport type { ServerResultAsync } from \"./base.dto\";\r\n\r\ntype Level = \"user\" | \"team\" | \"organization\";\r\ntype Access = \"all\" | \"own\";\r\n\r\nexport type Entity = Partial<{\r\n userId: string | null;\r\n teamId: string | null;\r\n organizationId: string | null;\r\n}>;\r\n\r\nexport type Grant = {\r\n level: Level;\r\n role: string;\r\n action: string;\r\n resource: string;\r\n access: Access;\r\n attributes?: string[];\r\n};\r\n\r\nexport type NestedGrants = Record<\r\n string,\r\n Partial<Record<Level, Record<string, Record<string, Access>>>>\r\n>;\r\n\r\nexport type ResourceGrant = Omit<Grant, \"resource\">;\r\n\r\nexport type ResourceActionGrant = Omit<ResourceGrant, \"action\">;\r\n\r\nexport function flattenNestedGrants(nestedGrants: NestedGrants): Grant[] {\r\n return Object.entries(nestedGrants).flatMap(([resource, levels]) => {\r\n return Object.entries(levels).flatMap(([level, roles]) => {\r\n return Object.entries(roles).flatMap(([role, actions]) => {\r\n return Object.entries(actions).map(([action, access]) => {\r\n return {\r\n resource,\r\n level: level as Level,\r\n role,\r\n action,\r\n access,\r\n };\r\n });\r\n });\r\n });\r\n });\r\n}\r\n\r\nfunction checkOwnership(\r\n entityField: keyof Entity,\r\n contextValue: string | null | undefined,\r\n entities?: Entity | Entity[]\r\n): boolean {\r\n if (!contextValue) return false;\r\n if (!entities) return false;\r\n return Array.isArray(entities)\r\n ? entities.every((e) => e[entityField] === contextValue)\r\n : entities[entityField] === contextValue;\r\n}\r\n\r\ntype GrantLevel = \"user\" | \"team\" | \"organization\";\r\n\r\n// Level priority: user -> team -> organization (bottom-up)\r\nconst LEVEL_PRIORITY: readonly GrantLevel[] = [\"user\", \"team\", \"organization\"];\r\n\r\ninterface RoleContext {\r\n userRole: string | null;\r\n teamRole: string | null;\r\n organizationRole: string | null;\r\n}\r\n\r\ninterface ContextValues {\r\n userId: string;\r\n teamId: string | null;\r\n organizationId: string | null;\r\n}\r\n\r\nfunction getRoleForLevel(level: GrantLevel, ctx: RoleContext): string | null {\r\n switch (level) {\r\n case \"user\":\r\n return ctx.userRole;\r\n case \"team\":\r\n return ctx.teamRole;\r\n case \"organization\":\r\n return ctx.organizationRole;\r\n }\r\n}\r\n\r\nfunction getContextValueForLevel(level: GrantLevel, ctx: ContextValues): string | null {\r\n switch (level) {\r\n case \"user\":\r\n return ctx.userId;\r\n case \"team\":\r\n return ctx.teamId;\r\n case \"organization\":\r\n return ctx.organizationId;\r\n }\r\n}\r\n\r\nfunction getOwnershipFieldForLevel(level: GrantLevel): keyof Entity {\r\n switch (level) {\r\n case \"user\":\r\n return \"userId\";\r\n case \"team\":\r\n return \"teamId\";\r\n case \"organization\":\r\n return \"organizationId\";\r\n }\r\n}\r\n\r\nfunction hasAllAccess(grants: ResourceActionGrant[], roles: RoleContext): boolean {\r\n for (const level of LEVEL_PRIORITY) {\r\n for (const grant of grants) {\r\n if (grant.level !== level) continue;\r\n if (grant.access !== \"all\") continue;\r\n if (grant.role === getRoleForLevel(level, roles)) return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nfunction checkOwnAccess(\r\n grants: ResourceActionGrant[],\r\n roles: RoleContext,\r\n contextValues: ContextValues,\r\n entities: Entity | Entity[] | undefined\r\n): boolean {\r\n for (const level of LEVEL_PRIORITY) {\r\n for (const grant of grants) {\r\n if (grant.level !== level) continue;\r\n if (grant.access !== \"own\") continue;\r\n if (grant.role !== getRoleForLevel(level, roles)) continue;\r\n\r\n const ownershipField = getOwnershipFieldForLevel(level);\r\n const contextValue = getContextValueForLevel(level, contextValues);\r\n\r\n if (checkOwnership(ownershipField, contextValue, entities)) return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nexport function checkPermissionSync<T extends Entity>(\r\n actor: ServiceActor,\r\n grants: ResourceActionGrant[],\r\n entities?: T | T[]\r\n): boolean {\r\n if (!grants || grants.length === 0) return false;\r\n\r\n const roles = {\r\n userRole: actor.userRole,\r\n teamRole: actor.teamRole,\r\n organizationRole: actor.organizationRole,\r\n };\r\n const contextValues = {\r\n userId: actor.userId,\r\n teamId: actor.teamId,\r\n organizationId: actor.organizationId,\r\n };\r\n\r\n // Pass 1: Check for \"all\" access first (no ownership check needed)\r\n if (hasAllAccess(grants, roles)) return true;\r\n\r\n // Pass 2: Check \"own\" access with ownership validation\r\n return checkOwnAccess(grants, roles, contextValues, entities);\r\n}\r\n\r\nexport async function checkPermissionAsync<T extends Entity>(\r\n actor: ServiceActor,\r\n grants: ResourceActionGrant[],\r\n getEntities: () => ServerResultAsync<T | T[] | undefined>\r\n): ServerResultAsync<boolean> {\r\n if (!grants || grants.length === 0) return ok(false);\r\n\r\n const roles = {\r\n userRole: actor.userRole,\r\n teamRole: actor.teamRole,\r\n organizationRole: actor.organizationRole,\r\n };\r\n const contextValues = {\r\n userId: actor.userId,\r\n teamId: actor.teamId,\r\n organizationId: actor.organizationId,\r\n };\r\n\r\n // Pass 1: Check for \"all\" access first (no entity fetch needed)\r\n if (hasAllAccess(grants, roles)) return ok(true);\r\n\r\n // Pass 2: Only fetch entities if we need to check ownership\r\n const entities = await getEntities();\r\n if (entities.isErr()) return err(entities.error);\r\n return ok(checkOwnAccess(grants, roles, contextValues, entities.value));\r\n}\r\n"],"mappings":";;AA+BA,SAAgB,oBAAoB,cAAqC;AACvE,QAAO,OAAO,QAAQ,aAAa,CAAC,SAAS,CAAC,UAAU,YAAY;AAClE,SAAO,OAAO,QAAQ,OAAO,CAAC,SAAS,CAAC,OAAO,WAAW;AACxD,UAAO,OAAO,QAAQ,MAAM,CAAC,SAAS,CAAC,MAAM,aAAa;AACxD,WAAO,OAAO,QAAQ,QAAQ,CAAC,KAAK,CAAC,QAAQ,YAAY;AACvD,YAAO;MACL;MACO;MACP;MACA;MACA;MACD;MACD;KACF;IACF;GACF;;AAGJ,SAAS,eACP,aACA,cACA,UACS;AACT,KAAI,CAAC,aAAc,QAAO;AAC1B,KAAI,CAAC,SAAU,QAAO;AACtB,QAAO,MAAM,QAAQ,SAAS,GAC1B,SAAS,OAAO,MAAM,EAAE,iBAAiB,aAAa,GACtD,SAAS,iBAAiB;;AAMhC,MAAM,iBAAwC;CAAC;CAAQ;CAAQ;CAAe;AAc9E,SAAS,gBAAgB,OAAmB,KAAiC;AAC3E,SAAQ,OAAR;EACE,KAAK,OACH,QAAO,IAAI;EACb,KAAK,OACH,QAAO,IAAI;EACb,KAAK,eACH,QAAO,IAAI;;;AAIjB,SAAS,wBAAwB,OAAmB,KAAmC;AACrF,SAAQ,OAAR;EACE,KAAK,OACH,QAAO,IAAI;EACb,KAAK,OACH,QAAO,IAAI;EACb,KAAK,eACH,QAAO,IAAI;;;AAIjB,SAAS,0BAA0B,OAAiC;AAClE,SAAQ,OAAR;EACE,KAAK,OACH,QAAO;EACT,KAAK,OACH,QAAO;EACT,KAAK,eACH,QAAO;;;AAIb,SAAS,aAAa,QAA+B,OAA6B;AAChF,MAAK,MAAM,SAAS,eAClB,MAAK,MAAM,SAAS,QAAQ;AAC1B,MAAI,MAAM,UAAU,MAAO;AAC3B,MAAI,MAAM,WAAW,MAAO;AAC5B,MAAI,MAAM,SAAS,gBAAgB,OAAO,MAAM,CAAE,QAAO;;AAG7D,QAAO;;AAGT,SAAS,eACP,QACA,OACA,eACA,UACS;AACT,MAAK,MAAM,SAAS,eAClB,MAAK,MAAM,SAAS,QAAQ;AAC1B,MAAI,MAAM,UAAU,MAAO;AAC3B,MAAI,MAAM,WAAW,MAAO;AAC5B,MAAI,MAAM,SAAS,gBAAgB,OAAO,MAAM,CAAE;AAKlD,MAAI,eAHmB,0BAA0B,MAAM,EAClC,wBAAwB,OAAO,cAAc,EAEjB,SAAS,CAAE,QAAO;;AAGvE,QAAO;;AAGT,SAAgB,oBACd,OACA,QACA,UACS;AACT,KAAI,CAAC,UAAU,OAAO,WAAW,EAAG,QAAO;CAE3C,MAAM,QAAQ;EACZ,UAAU,MAAM;EAChB,UAAU,MAAM;EAChB,kBAAkB,MAAM;EACzB;CACD,MAAM,gBAAgB;EACpB,QAAQ,MAAM;EACd,QAAQ,MAAM;EACd,gBAAgB,MAAM;EACvB;AAGD,KAAI,aAAa,QAAQ,MAAM,CAAE,QAAO;AAGxC,QAAO,eAAe,QAAQ,OAAO,eAAe,SAAS;;AAG/D,eAAsB,qBACpB,OACA,QACA,aAC4B;AAC5B,KAAI,CAAC,UAAU,OAAO,WAAW,EAAG,QAAO,GAAG,MAAM;CAEpD,MAAM,QAAQ;EACZ,UAAU,MAAM;EAChB,UAAU,MAAM;EAChB,kBAAkB,MAAM;EACzB;CACD,MAAM,gBAAgB;EACpB,QAAQ,MAAM;EACd,QAAQ,MAAM;EACd,gBAAgB,MAAM;EACvB;AAGD,KAAI,aAAa,QAAQ,MAAM,CAAE,QAAO,GAAG,KAAK;CAGhD,MAAM,WAAW,MAAM,aAAa;AACpC,KAAI,SAAS,OAAO,CAAE,QAAO,IAAI,SAAS,MAAM;AAChD,QAAO,GAAG,eAAe,QAAQ,OAAO,eAAe,SAAS,MAAM,CAAC"}
@@ -0,0 +1,111 @@
1
+ import { ServerError } from "../../utils/errors.mjs";
2
+ import { ServerResult, ServerResultAsync } from "./base.dto.mjs";
3
+ import { logger } from "../../utils/logger.mjs";
4
+ import { Base } from "./base.abstract.mjs";
5
+ import { Actor, ActorScope, AuthenticatedActor } from "./base.actor.mjs";
6
+ import { Entity, ResourceActionGrant } from "./base.grants.mjs";
7
+ import { TRPC_ERROR_CODE_KEY } from "@trpc/server";
8
+ import { QueryInput } from "@m5kdev/commons/modules/schemas/query.schema";
9
+
10
+ //#region src/modules/base/base.procedure.d.ts
11
+ type ServiceLogger = ReturnType<typeof logger.child>;
12
+ type RepositoryMap = Record<string, Base>;
13
+ type ServiceMap = Record<string, Base>;
14
+ type ServiceProcedureContext = {
15
+ actor?: AuthenticatedActor | null;
16
+ } & Record<string, unknown>;
17
+ type ServiceProcedureState = Record<string, unknown>;
18
+ type ServiceProcedureStoredValue<T> = [T] extends [undefined] ? undefined : Awaited<T>;
19
+ type ServiceProcedureResultLike<T> = T | ServerResult<T> | Promise<T | ServerResult<T>>;
20
+ type ServiceProcedureContextFilterScope = ActorScope;
21
+ type ServiceProcedureContextFilteredInput<TInput> = Extract<NonNullable<TInput>, QueryInput>;
22
+ type ServiceProcedureAuthContext<Scope extends ActorScope> = {
23
+ actor: Actor[Scope];
24
+ };
25
+ type ServiceProcedureRequiredScopeFromFilter<TInclude extends readonly ServiceProcedureContextFilterScope[] | undefined> = TInclude extends readonly ServiceProcedureContextFilterScope[] ? "team" extends TInclude[number] ? "team" : "organization" extends TInclude[number] ? "organization" : "user" : "user";
26
+ type ServiceProcedure<TInput, TCtx extends ServiceProcedureContext, TOutput> = (input: TInput, ctx: TCtx) => ServerResultAsync<TOutput>;
27
+ type ServiceProcedureArgs<TInput, TCtx extends ServiceProcedureContext, Repositories extends RepositoryMap, Services extends ServiceMap, State extends ServiceProcedureState> = {
28
+ input: TInput;
29
+ ctx: TCtx;
30
+ state: State;
31
+ repository: Repositories;
32
+ service: Services;
33
+ logger: ServiceLogger;
34
+ };
35
+ type ServiceProcedureStep<TInput, TCtx extends ServiceProcedureContext, Repositories extends RepositoryMap, Services extends ServiceMap, State extends ServiceProcedureState, TOutput = undefined> = (args: ServiceProcedureArgs<TInput, TCtx, Repositories, Services, State>) => ServiceProcedureResultLike<ServiceProcedureStoredValue<TOutput>>;
36
+ type ServiceProcedureInputMapper<TInput, TCtx extends ServiceProcedureContext, Repositories extends RepositoryMap, Services extends ServiceMap, State extends ServiceProcedureState, TNextInput> = (args: ServiceProcedureArgs<TInput, TCtx, Repositories, Services, State>) => ServiceProcedureResultLike<ServiceProcedureStoredValue<TNextInput>>;
37
+ type ServiceProcedureHandler<TInput, TCtx extends ServiceProcedureContext, Repositories extends RepositoryMap, Services extends ServiceMap, State extends ServiceProcedureState, TOutput> = (args: ServiceProcedureArgs<TInput, TCtx, Repositories, Services, State>) => ServiceProcedureResultLike<TOutput>;
38
+ type ServiceProcedureEntityResolver<TInput, TCtx extends ServiceProcedureContext, Repositories extends RepositoryMap, Services extends ServiceMap, State extends ServiceProcedureState, TEntities extends Entity | Entity[] | undefined> = TEntities | ((args: ServiceProcedureArgs<TInput, TCtx, Repositories, Services, State>) => ServiceProcedureResultLike<TEntities>);
39
+ type ServiceProcedureAccessBaseConfig = {
40
+ action: string;
41
+ grants?: ResourceActionGrant[];
42
+ };
43
+ type ServiceProcedureEntityStepName<State extends ServiceProcedureState> = Extract<{ [Key in keyof State]: State[Key] extends Entity | Entity[] | undefined ? Key : never }[keyof State], string>;
44
+ type ServiceProcedureAccessEntitiesConfig<TInput, TCtx extends ServiceProcedureContext, Repositories extends RepositoryMap, Services extends ServiceMap, State extends ServiceProcedureState, TEntities extends Entity | Entity[] | undefined = undefined> = ServiceProcedureAccessBaseConfig & {
45
+ entities?: ServiceProcedureEntityResolver<TInput, TCtx, Repositories, Services, State, TEntities>;
46
+ entityStep?: never;
47
+ };
48
+ type ServiceProcedureAccessStateConfig<State extends ServiceProcedureState, StepName extends ServiceProcedureEntityStepName<State>> = ServiceProcedureAccessBaseConfig & {
49
+ entityStep: StepName;
50
+ entities?: never;
51
+ };
52
+ type ServiceProcedureAccessConfig<TInput, TCtx extends ServiceProcedureContext, Repositories extends RepositoryMap, Services extends ServiceMap, State extends ServiceProcedureState, TEntities extends Entity | Entity[] | undefined = undefined> = ServiceProcedureAccessEntitiesConfig<TInput, TCtx, Repositories, Services, State, TEntities> | ServiceProcedureAccessStateConfig<State, ServiceProcedureEntityStepName<State>>;
53
+ interface ServiceProcedureBuilder<TInput, TCtx extends ServiceProcedureContext, Repositories extends RepositoryMap, Services extends ServiceMap, State extends ServiceProcedureState = Record<string, never>> {
54
+ use<StepName extends string, TOutput = void>(stepName: StepName, step: ServiceProcedureStep<TInput, TCtx, Repositories, Services, State, TOutput>): ServiceProcedureBuilder<TInput, TCtx, Repositories, Services, State & Record<StepName, ServiceProcedureStoredValue<TOutput>>>;
55
+ mapInput<StepName extends string, TNextInput>(stepName: StepName, step: ServiceProcedureInputMapper<TInput, TCtx, Repositories, Services, State, TNextInput>): ServiceProcedureBuilder<ServiceProcedureStoredValue<TNextInput>, TCtx, Repositories, Services, State & Record<StepName, ServiceProcedureStoredValue<TNextInput>>>;
56
+ addContextFilter<TInclude extends readonly ServiceProcedureContextFilterScope[] | undefined = undefined>(include?: TInclude): ServiceProcedureBuilder<ServiceProcedureContextFilteredInput<TInput>, TCtx & ServiceProcedureAuthContext<ServiceProcedureRequiredScopeFromFilter<TInclude>>, Repositories, Services, State & {
57
+ contextFilter: ServiceProcedureContextFilteredInput<TInput>;
58
+ }>;
59
+ requireAuth<Scope extends ActorScope = "user">(scope?: Scope): ServiceProcedureBuilder<TInput, TCtx & ServiceProcedureAuthContext<Scope>, Repositories, Services, State>;
60
+ handle<TOutput>(handler: ServiceProcedureHandler<TInput, TCtx, Repositories, Services, State, TOutput>): ServiceProcedure<TInput, TCtx, TOutput>;
61
+ }
62
+ interface PermissionServiceProcedureBuilder<TInput, TCtx extends ServiceProcedureContext, Repositories extends RepositoryMap, Services extends ServiceMap, State extends ServiceProcedureState = Record<string, never>> extends ServiceProcedureBuilder<TInput, TCtx, Repositories, Services, State> {
63
+ use<StepName extends string, TOutput = void>(stepName: StepName, step: ServiceProcedureStep<TInput, TCtx, Repositories, Services, State, TOutput>): PermissionServiceProcedureBuilder<TInput, TCtx, Repositories, Services, State & Record<StepName, ServiceProcedureStoredValue<TOutput>>>;
64
+ mapInput<StepName extends string, TNextInput>(stepName: StepName, step: ServiceProcedureInputMapper<TInput, TCtx, Repositories, Services, State, TNextInput>): PermissionServiceProcedureBuilder<ServiceProcedureStoredValue<TNextInput>, TCtx, Repositories, Services, State & Record<StepName, ServiceProcedureStoredValue<TNextInput>>>;
65
+ addContextFilter<TInclude extends readonly ServiceProcedureContextFilterScope[] | undefined = undefined>(include?: TInclude): PermissionServiceProcedureBuilder<ServiceProcedureContextFilteredInput<TInput>, TCtx & ServiceProcedureAuthContext<ServiceProcedureRequiredScopeFromFilter<TInclude>>, Repositories, Services, State & {
66
+ contextFilter: ServiceProcedureContextFilteredInput<TInput>;
67
+ }>;
68
+ requireAuth<Scope extends ActorScope = "user">(scope?: Scope): PermissionServiceProcedureBuilder<TInput, TCtx & ServiceProcedureAuthContext<Scope>, Repositories, Services, State>;
69
+ access(config: ServiceProcedureAccessEntitiesConfig<TInput, TCtx, Repositories, Services, State>): PermissionServiceProcedureBuilder<TInput, TCtx & ServiceProcedureAuthContext<"user">, Repositories, Services, State>;
70
+ access<TEntities extends Entity | Entity[] | undefined>(config: ServiceProcedureAccessEntitiesConfig<TInput, TCtx, Repositories, Services, State, TEntities>): PermissionServiceProcedureBuilder<TInput, TCtx & ServiceProcedureAuthContext<"user">, Repositories, Services, State & {
71
+ access: TEntities;
72
+ }>;
73
+ access<StepName extends ServiceProcedureEntityStepName<State>>(config: ServiceProcedureAccessStateConfig<State, StepName>): PermissionServiceProcedureBuilder<TInput, TCtx & ServiceProcedureAuthContext<"user">, Repositories, Services, State & {
74
+ access: State[StepName];
75
+ }>;
76
+ }
77
+ type BaseServiceProcedureHost<Repositories extends RepositoryMap, Services extends ServiceMap> = {
78
+ repository: Repositories;
79
+ service: Services;
80
+ logger: ServiceLogger;
81
+ addContextFilter(actor: AuthenticatedActor, include?: {
82
+ user?: boolean;
83
+ organization?: boolean;
84
+ team?: boolean;
85
+ }, query?: QueryInput): QueryInput;
86
+ error(code: TRPC_ERROR_CODE_KEY, message?: string, options?: {
87
+ cause?: unknown;
88
+ clientMessage?: string;
89
+ log?: boolean;
90
+ }): ServerResult<never>;
91
+ throwableAsync<T>(fn: () => ServerResultAsync<T>): ServerResultAsync<T>;
92
+ handleUnknownError(error: unknown): ServerError;
93
+ };
94
+ type PermissionServiceProcedureHost<Repositories extends RepositoryMap, Services extends ServiceMap> = BaseServiceProcedureHost<Repositories, Services> & {
95
+ checkPermission<T extends Entity>(actor: AuthenticatedActor, action: string, entities?: T | T[], grants?: ResourceActionGrant[]): boolean;
96
+ checkPermissionAsync<T extends Entity>(actor: AuthenticatedActor, action: string, getEntities: () => ServerResultAsync<T | T[] | undefined>, grants?: ResourceActionGrant[]): ServerResultAsync<boolean>;
97
+ };
98
+ type ProcedureRuntimeStep<Repositories extends RepositoryMap, Services extends ServiceMap> = {
99
+ stage: "use" | "input" | "auth" | "access";
100
+ stepName: string;
101
+ run: (args: ServiceProcedureArgs<unknown, ServiceProcedureContext, Repositories, Services, ServiceProcedureState>) => Promise<ServerResult<unknown>>;
102
+ };
103
+ type ProcedureBuilderConfig<Repositories extends RepositoryMap, Services extends ServiceMap> = {
104
+ name: string;
105
+ steps: ProcedureRuntimeStep<Repositories, Services>[];
106
+ };
107
+ declare function createServiceProcedureBuilder<TInput, TCtx extends ServiceProcedureContext, Repositories extends RepositoryMap, Services extends ServiceMap, State extends ServiceProcedureState = Record<string, never>>(host: BaseServiceProcedureHost<Repositories, Services>, config: ProcedureBuilderConfig<Repositories, Services>): ServiceProcedureBuilder<TInput, TCtx, Repositories, Services, State>;
108
+ declare function createPermissionServiceProcedureBuilder<TInput, TCtx extends ServiceProcedureContext, Repositories extends RepositoryMap, Services extends ServiceMap, State extends ServiceProcedureState = Record<string, never>>(host: PermissionServiceProcedureHost<Repositories, Services>, config: ProcedureBuilderConfig<Repositories, Services>): PermissionServiceProcedureBuilder<TInput, TCtx, Repositories, Services, State>;
109
+ //#endregion
110
+ export { PermissionServiceProcedureBuilder, ServiceProcedure, ServiceProcedureAccessConfig, ServiceProcedureAccessEntitiesConfig, ServiceProcedureAccessStateConfig, ServiceProcedureArgs, ServiceProcedureBuilder, ServiceProcedureContext, ServiceProcedureContextFilterScope, ServiceProcedureContextFilteredInput, ServiceProcedureEntityResolver, ServiceProcedureEntityStepName, ServiceProcedureHandler, ServiceProcedureInputMapper, ServiceProcedureResultLike, ServiceProcedureState, ServiceProcedureStep, ServiceProcedureStoredValue, createPermissionServiceProcedureBuilder, createServiceProcedureBuilder };
111
+ //# sourceMappingURL=base.procedure.d.mts.map
@@ -0,0 +1,252 @@
1
+ import { validateActor } from "./base.actor.mjs";
2
+ import { ok } from "neverthrow";
3
+ //#region src/modules/base/base.procedure.ts
4
+ const DEFAULT_CONTEXT_FILTER_INCLUDE = ["user"];
5
+ function isServerResult(value) {
6
+ return typeof value === "object" && value !== null && "isErr" in value && typeof value.isErr === "function" && "isOk" in value && typeof value.isOk === "function";
7
+ }
8
+ async function normalizeProcedureResult(result) {
9
+ const resolved = await result;
10
+ return isServerResult(resolved) ? resolved : ok(resolved);
11
+ }
12
+ function assertUniqueStepName(steps, stepName) {
13
+ if (steps.some((step) => step.stepName === stepName)) throw new Error(`Duplicate service procedure step name: ${stepName}`);
14
+ }
15
+ function hasStepName(steps, stepName) {
16
+ return steps.some((step) => step.stepName === stepName);
17
+ }
18
+ function getContextFilterInclude(include = DEFAULT_CONTEXT_FILTER_INCLUDE) {
19
+ return {
20
+ user: include.includes("user"),
21
+ organization: include.includes("organization"),
22
+ team: include.includes("team")
23
+ };
24
+ }
25
+ function getFailureStage(code) {
26
+ return code === "FORBIDDEN" || code === "UNAUTHORIZED" ? "forbidden" : "error";
27
+ }
28
+ function logProcedureStage(host, procedureName, ctx, stage, { stepName, durationMs, errorCode } = {}) {
29
+ host.logger.debug({
30
+ procedureName,
31
+ stage,
32
+ stepName,
33
+ durationMs,
34
+ errorCode,
35
+ hasActor: Boolean(ctx.actor)
36
+ });
37
+ }
38
+ function requireProcedureActor(host, ctx, scope) {
39
+ if (!ctx.actor) return host.error("UNAUTHORIZED", "Unauthorized");
40
+ if (!validateActor(ctx.actor, scope)) return host.error("FORBIDDEN", "Forbidden");
41
+ return ok(ctx.actor);
42
+ }
43
+ function createRequireAuthStep(host, scope = "user") {
44
+ return {
45
+ stage: "auth",
46
+ stepName: "auth",
47
+ run: async ({ ctx }) => {
48
+ return requireProcedureActor(host, ctx, scope);
49
+ }
50
+ };
51
+ }
52
+ function createUseStep(stepName, step) {
53
+ return {
54
+ stage: "use",
55
+ stepName,
56
+ run: async (args) => normalizeProcedureResult(step(args))
57
+ };
58
+ }
59
+ function createInputStep(stepName, step) {
60
+ return {
61
+ stage: "input",
62
+ stepName,
63
+ run: async (args) => normalizeProcedureResult(step(args))
64
+ };
65
+ }
66
+ function createContextFilterStep(host, include) {
67
+ const contextInclude = getContextFilterInclude(include);
68
+ const requiredScope = contextInclude.team ? "team" : contextInclude.organization ? "organization" : "user";
69
+ return {
70
+ stage: "input",
71
+ stepName: "contextFilter",
72
+ run: async ({ input, ctx }) => {
73
+ const actor = requireProcedureActor(host, ctx, requiredScope);
74
+ if (actor.isErr()) return actor;
75
+ return ok(host.addContextFilter(actor.value, contextInclude, input));
76
+ }
77
+ };
78
+ }
79
+ function createAccessStep(host, config) {
80
+ return {
81
+ stage: "access",
82
+ stepName: "access",
83
+ run: async (args) => {
84
+ const typedArgs = args;
85
+ const actor = requireProcedureActor(host, typedArgs.ctx, "user");
86
+ if (actor.isErr()) return actor;
87
+ if ("entityStep" in config && typeof config.entityStep === "string") {
88
+ const entities = typedArgs.state[config.entityStep];
89
+ if (!host.checkPermission(actor.value, config.action, entities, config.grants)) return host.error("FORBIDDEN");
90
+ return ok(entities);
91
+ }
92
+ if (typeof config.entities === "function") {
93
+ const resolveEntities = config.entities;
94
+ let loadedEntities;
95
+ const permission = await host.checkPermissionAsync(actor.value, config.action, async () => {
96
+ const entityResult = await normalizeProcedureResult(resolveEntities(typedArgs));
97
+ if (entityResult.isOk()) loadedEntities = entityResult.value;
98
+ return entityResult;
99
+ }, config.grants);
100
+ if (permission.isErr()) return permission;
101
+ if (!permission.value) return host.error("FORBIDDEN");
102
+ return ok(loadedEntities);
103
+ }
104
+ const entities = config.entities;
105
+ if (!host.checkPermission(actor.value, config.action, entities, config.grants)) return host.error("FORBIDDEN");
106
+ return ok(entities);
107
+ }
108
+ };
109
+ }
110
+ function createProcedureHandler(host, config, handler) {
111
+ return async (input, ctx) => host.throwableAsync(async () => {
112
+ const state = {};
113
+ const startTime = Date.now();
114
+ const typedCtx = ctx;
115
+ let currentInput = input;
116
+ logProcedureStage(host, config.name, typedCtx, "start");
117
+ try {
118
+ for (const step of config.steps) {
119
+ const stepResult = await step.run({
120
+ input: currentInput,
121
+ ctx: typedCtx,
122
+ state,
123
+ repository: host.repository,
124
+ service: host.service,
125
+ logger: host.logger
126
+ });
127
+ if (stepResult.isErr()) {
128
+ logProcedureStage(host, config.name, typedCtx, getFailureStage(stepResult.error.code), {
129
+ stepName: step.stepName,
130
+ durationMs: Date.now() - startTime,
131
+ errorCode: stepResult.error.code
132
+ });
133
+ return stepResult;
134
+ }
135
+ state[step.stepName] = stepResult.value;
136
+ if (step.stage === "input") currentInput = stepResult.value;
137
+ if (step.stage === "auth") logProcedureStage(host, config.name, typedCtx, "auth_passed", { stepName: step.stepName });
138
+ if (step.stage === "access") logProcedureStage(host, config.name, typedCtx, "access_passed", { stepName: step.stepName });
139
+ }
140
+ const handlerResult = await normalizeProcedureResult(handler({
141
+ input: currentInput,
142
+ ctx,
143
+ state,
144
+ repository: host.repository,
145
+ service: host.service,
146
+ logger: host.logger
147
+ }));
148
+ if (handlerResult.isErr()) {
149
+ logProcedureStage(host, config.name, typedCtx, getFailureStage(handlerResult.error.code), {
150
+ durationMs: Date.now() - startTime,
151
+ errorCode: handlerResult.error.code
152
+ });
153
+ return handlerResult;
154
+ }
155
+ logProcedureStage(host, config.name, typedCtx, "success", { durationMs: Date.now() - startTime });
156
+ return handlerResult;
157
+ } catch (error) {
158
+ const serverError = host.handleUnknownError(error);
159
+ logProcedureStage(host, config.name, typedCtx, getFailureStage(serverError.code), {
160
+ durationMs: Date.now() - startTime,
161
+ errorCode: serverError.code
162
+ });
163
+ throw error;
164
+ }
165
+ });
166
+ }
167
+ function createServiceProcedureBuilder(host, config) {
168
+ function addContextFilter(include) {
169
+ const steps = hasStepName(config.steps, "auth") ? config.steps : [...config.steps, createRequireAuthStep(host, "user")];
170
+ assertUniqueStepName(steps, "contextFilter");
171
+ return createServiceProcedureBuilder(host, {
172
+ ...config,
173
+ steps: [...steps, createContextFilterStep(host, include)]
174
+ });
175
+ }
176
+ return {
177
+ use(stepName, step) {
178
+ assertUniqueStepName(config.steps, stepName);
179
+ return createServiceProcedureBuilder(host, {
180
+ ...config,
181
+ steps: [...config.steps, createUseStep(stepName, step)]
182
+ });
183
+ },
184
+ mapInput(stepName, step) {
185
+ assertUniqueStepName(config.steps, stepName);
186
+ return createServiceProcedureBuilder(host, {
187
+ ...config,
188
+ steps: [...config.steps, createInputStep(stepName, step)]
189
+ });
190
+ },
191
+ addContextFilter,
192
+ requireAuth(scope) {
193
+ assertUniqueStepName(config.steps, "auth");
194
+ return createServiceProcedureBuilder(host, {
195
+ ...config,
196
+ steps: [...config.steps, createRequireAuthStep(host, scope ?? "user")]
197
+ });
198
+ },
199
+ handle(handler) {
200
+ return createProcedureHandler(host, config, handler);
201
+ }
202
+ };
203
+ }
204
+ function createPermissionServiceProcedureBuilder(host, config) {
205
+ function addContextFilter(include) {
206
+ const steps = hasStepName(config.steps, "auth") ? config.steps : [...config.steps, createRequireAuthStep(host, "user")];
207
+ assertUniqueStepName(steps, "contextFilter");
208
+ return createPermissionServiceProcedureBuilder(host, {
209
+ ...config,
210
+ steps: [...steps, createContextFilterStep(host, include)]
211
+ });
212
+ }
213
+ function access(accessConfig) {
214
+ assertUniqueStepName(config.steps, "access");
215
+ return createPermissionServiceProcedureBuilder(host, {
216
+ ...config,
217
+ steps: [...config.steps, createAccessStep(host, accessConfig)]
218
+ });
219
+ }
220
+ return {
221
+ use(stepName, step) {
222
+ assertUniqueStepName(config.steps, stepName);
223
+ return createPermissionServiceProcedureBuilder(host, {
224
+ ...config,
225
+ steps: [...config.steps, createUseStep(stepName, step)]
226
+ });
227
+ },
228
+ mapInput(stepName, step) {
229
+ assertUniqueStepName(config.steps, stepName);
230
+ return createPermissionServiceProcedureBuilder(host, {
231
+ ...config,
232
+ steps: [...config.steps, createInputStep(stepName, step)]
233
+ });
234
+ },
235
+ addContextFilter,
236
+ requireAuth(scope) {
237
+ assertUniqueStepName(config.steps, "auth");
238
+ return createPermissionServiceProcedureBuilder(host, {
239
+ ...config,
240
+ steps: [...config.steps, createRequireAuthStep(host, scope ?? "user")]
241
+ });
242
+ },
243
+ access,
244
+ handle(handler) {
245
+ return createProcedureHandler(host, config, handler);
246
+ }
247
+ };
248
+ }
249
+ //#endregion
250
+ export { createPermissionServiceProcedureBuilder, createServiceProcedureBuilder };
251
+
252
+ //# sourceMappingURL=base.procedure.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.procedure.mjs","names":[],"sources":["../../../../src/modules/base/base.procedure.ts"],"sourcesContent":["import type { QueryInput } from \"@m5kdev/commons/modules/schemas/query.schema\";\r\nimport type { TRPC_ERROR_CODE_KEY } from \"@trpc/server\";\r\nimport { ok } from \"neverthrow\";\r\nimport type { ServerError } from \"../../utils/errors\";\r\nimport type { logger } from \"../../utils/logger\";\r\nimport type { Base } from \"./base.abstract\";\r\nimport { type Actor, type ActorScope, type AuthenticatedActor, validateActor } from \"./base.actor\";\r\nimport type { ServerResult, ServerResultAsync } from \"./base.dto\";\r\nimport type { Entity, ResourceActionGrant } from \"./base.grants\";\r\n\r\ntype ServiceLogger = ReturnType<typeof logger.child>;\r\ntype RepositoryMap = Record<string, Base>;\r\ntype ServiceMap = Record<string, Base>;\r\n\r\nexport type ServiceProcedureContext = {\r\n actor?: AuthenticatedActor | null;\r\n} & Record<string, unknown>;\r\n\r\nexport type ServiceProcedureState = Record<string, unknown>;\r\nexport type ServiceProcedureStoredValue<T> = [T] extends [undefined] ? undefined : Awaited<T>;\r\nexport type ServiceProcedureResultLike<T> = T | ServerResult<T> | Promise<T | ServerResult<T>>;\r\nexport type ServiceProcedureContextFilterScope = ActorScope;\r\nexport type ServiceProcedureContextFilteredInput<TInput> = Extract<NonNullable<TInput>, QueryInput>;\r\ntype ServiceProcedureAuthContext<Scope extends ActorScope> = {\r\n actor: Actor[Scope];\r\n};\r\ntype ServiceProcedureRequiredScopeFromFilter<\r\n TInclude extends readonly ServiceProcedureContextFilterScope[] | undefined,\r\n> = TInclude extends readonly ServiceProcedureContextFilterScope[]\r\n ? \"team\" extends TInclude[number]\r\n ? \"team\"\r\n : \"organization\" extends TInclude[number]\r\n ? \"organization\"\r\n : \"user\"\r\n : \"user\";\r\n\r\nexport type ServiceProcedure<TInput, TCtx extends ServiceProcedureContext, TOutput> = (\r\n input: TInput,\r\n ctx: TCtx\r\n) => ServerResultAsync<TOutput>;\r\n\r\nexport type ServiceProcedureArgs<\r\n TInput,\r\n TCtx extends ServiceProcedureContext,\r\n Repositories extends RepositoryMap,\r\n Services extends ServiceMap,\r\n State extends ServiceProcedureState,\r\n> = {\r\n input: TInput;\r\n ctx: TCtx;\r\n state: State;\r\n repository: Repositories;\r\n service: Services;\r\n logger: ServiceLogger;\r\n};\r\n\r\nexport type ServiceProcedureStep<\r\n TInput,\r\n TCtx extends ServiceProcedureContext,\r\n Repositories extends RepositoryMap,\r\n Services extends ServiceMap,\r\n State extends ServiceProcedureState,\r\n TOutput = undefined,\r\n> = (\r\n args: ServiceProcedureArgs<TInput, TCtx, Repositories, Services, State>\r\n) => ServiceProcedureResultLike<ServiceProcedureStoredValue<TOutput>>;\r\n\r\nexport type ServiceProcedureInputMapper<\r\n TInput,\r\n TCtx extends ServiceProcedureContext,\r\n Repositories extends RepositoryMap,\r\n Services extends ServiceMap,\r\n State extends ServiceProcedureState,\r\n TNextInput,\r\n> = (\r\n args: ServiceProcedureArgs<TInput, TCtx, Repositories, Services, State>\r\n) => ServiceProcedureResultLike<ServiceProcedureStoredValue<TNextInput>>;\r\n\r\nexport type ServiceProcedureHandler<\r\n TInput,\r\n TCtx extends ServiceProcedureContext,\r\n Repositories extends RepositoryMap,\r\n Services extends ServiceMap,\r\n State extends ServiceProcedureState,\r\n TOutput,\r\n> = (\r\n args: ServiceProcedureArgs<TInput, TCtx, Repositories, Services, State>\r\n) => ServiceProcedureResultLike<TOutput>;\r\n\r\nexport type ServiceProcedureEntityResolver<\r\n TInput,\r\n TCtx extends ServiceProcedureContext,\r\n Repositories extends RepositoryMap,\r\n Services extends ServiceMap,\r\n State extends ServiceProcedureState,\r\n TEntities extends Entity | Entity[] | undefined,\r\n> =\r\n | TEntities\r\n | ((\r\n args: ServiceProcedureArgs<TInput, TCtx, Repositories, Services, State>\r\n ) => ServiceProcedureResultLike<TEntities>);\r\n\r\ntype ServiceProcedureAccessBaseConfig = {\r\n action: string;\r\n grants?: ResourceActionGrant[];\r\n};\r\n\r\nexport type ServiceProcedureEntityStepName<State extends ServiceProcedureState> = Extract<\r\n {\r\n [Key in keyof State]: State[Key] extends Entity | Entity[] | undefined ? Key : never;\r\n }[keyof State],\r\n string\r\n>;\r\n\r\nexport type ServiceProcedureAccessEntitiesConfig<\r\n TInput,\r\n TCtx extends ServiceProcedureContext,\r\n Repositories extends RepositoryMap,\r\n Services extends ServiceMap,\r\n State extends ServiceProcedureState,\r\n TEntities extends Entity | Entity[] | undefined = undefined,\r\n> = ServiceProcedureAccessBaseConfig & {\r\n entities?: ServiceProcedureEntityResolver<TInput, TCtx, Repositories, Services, State, TEntities>;\r\n entityStep?: never;\r\n};\r\n\r\nexport type ServiceProcedureAccessStateConfig<\r\n State extends ServiceProcedureState,\r\n StepName extends ServiceProcedureEntityStepName<State>,\r\n> = ServiceProcedureAccessBaseConfig & {\r\n entityStep: StepName;\r\n entities?: never;\r\n};\r\n\r\nexport type ServiceProcedureAccessConfig<\r\n TInput,\r\n TCtx extends ServiceProcedureContext,\r\n Repositories extends RepositoryMap,\r\n Services extends ServiceMap,\r\n State extends ServiceProcedureState,\r\n TEntities extends Entity | Entity[] | undefined = undefined,\r\n> =\r\n | ServiceProcedureAccessEntitiesConfig<TInput, TCtx, Repositories, Services, State, TEntities>\r\n | ServiceProcedureAccessStateConfig<State, ServiceProcedureEntityStepName<State>>;\r\n\r\nexport interface ServiceProcedureBuilder<\r\n TInput,\r\n TCtx extends ServiceProcedureContext,\r\n Repositories extends RepositoryMap,\r\n Services extends ServiceMap,\r\n State extends ServiceProcedureState = Record<string, never>,\r\n> {\r\n use<StepName extends string, TOutput = void>(\r\n stepName: StepName,\r\n step: ServiceProcedureStep<TInput, TCtx, Repositories, Services, State, TOutput>\r\n ): ServiceProcedureBuilder<\r\n TInput,\r\n TCtx,\r\n Repositories,\r\n Services,\r\n State & Record<StepName, ServiceProcedureStoredValue<TOutput>>\r\n >;\r\n mapInput<StepName extends string, TNextInput>(\r\n stepName: StepName,\r\n step: ServiceProcedureInputMapper<TInput, TCtx, Repositories, Services, State, TNextInput>\r\n ): ServiceProcedureBuilder<\r\n ServiceProcedureStoredValue<TNextInput>,\r\n TCtx,\r\n Repositories,\r\n Services,\r\n State & Record<StepName, ServiceProcedureStoredValue<TNextInput>>\r\n >;\r\n addContextFilter<\r\n TInclude extends readonly ServiceProcedureContextFilterScope[] | undefined = undefined,\r\n >(\r\n include?: TInclude\r\n ): ServiceProcedureBuilder<\r\n ServiceProcedureContextFilteredInput<TInput>,\r\n TCtx & ServiceProcedureAuthContext<ServiceProcedureRequiredScopeFromFilter<TInclude>>,\r\n Repositories,\r\n Services,\r\n State & { contextFilter: ServiceProcedureContextFilteredInput<TInput> }\r\n >;\r\n requireAuth<Scope extends ActorScope = \"user\">(\r\n scope?: Scope\r\n ): ServiceProcedureBuilder<\r\n TInput,\r\n TCtx & ServiceProcedureAuthContext<Scope>,\r\n Repositories,\r\n Services,\r\n State\r\n >;\r\n handle<TOutput>(\r\n handler: ServiceProcedureHandler<TInput, TCtx, Repositories, Services, State, TOutput>\r\n ): ServiceProcedure<TInput, TCtx, TOutput>;\r\n}\r\n\r\nexport interface PermissionServiceProcedureBuilder<\r\n TInput,\r\n TCtx extends ServiceProcedureContext,\r\n Repositories extends RepositoryMap,\r\n Services extends ServiceMap,\r\n State extends ServiceProcedureState = Record<string, never>,\r\n> extends ServiceProcedureBuilder<TInput, TCtx, Repositories, Services, State> {\r\n use<StepName extends string, TOutput = void>(\r\n stepName: StepName,\r\n step: ServiceProcedureStep<TInput, TCtx, Repositories, Services, State, TOutput>\r\n ): PermissionServiceProcedureBuilder<\r\n TInput,\r\n TCtx,\r\n Repositories,\r\n Services,\r\n State & Record<StepName, ServiceProcedureStoredValue<TOutput>>\r\n >;\r\n mapInput<StepName extends string, TNextInput>(\r\n stepName: StepName,\r\n step: ServiceProcedureInputMapper<TInput, TCtx, Repositories, Services, State, TNextInput>\r\n ): PermissionServiceProcedureBuilder<\r\n ServiceProcedureStoredValue<TNextInput>,\r\n TCtx,\r\n Repositories,\r\n Services,\r\n State & Record<StepName, ServiceProcedureStoredValue<TNextInput>>\r\n >;\r\n addContextFilter<\r\n TInclude extends readonly ServiceProcedureContextFilterScope[] | undefined = undefined,\r\n >(\r\n include?: TInclude\r\n ): PermissionServiceProcedureBuilder<\r\n ServiceProcedureContextFilteredInput<TInput>,\r\n TCtx & ServiceProcedureAuthContext<ServiceProcedureRequiredScopeFromFilter<TInclude>>,\r\n Repositories,\r\n Services,\r\n State & { contextFilter: ServiceProcedureContextFilteredInput<TInput> }\r\n >;\r\n requireAuth<Scope extends ActorScope = \"user\">(\r\n scope?: Scope\r\n ): PermissionServiceProcedureBuilder<\r\n TInput,\r\n TCtx & ServiceProcedureAuthContext<Scope>,\r\n Repositories,\r\n Services,\r\n State\r\n >;\r\n access(\r\n config: ServiceProcedureAccessEntitiesConfig<TInput, TCtx, Repositories, Services, State>\r\n ): PermissionServiceProcedureBuilder<\r\n TInput,\r\n TCtx & ServiceProcedureAuthContext<\"user\">,\r\n Repositories,\r\n Services,\r\n State\r\n >;\r\n access<TEntities extends Entity | Entity[] | undefined>(\r\n config: ServiceProcedureAccessEntitiesConfig<\r\n TInput,\r\n TCtx,\r\n Repositories,\r\n Services,\r\n State,\r\n TEntities\r\n >\r\n ): PermissionServiceProcedureBuilder<\r\n TInput,\r\n TCtx & ServiceProcedureAuthContext<\"user\">,\r\n Repositories,\r\n Services,\r\n State & { access: TEntities }\r\n >;\r\n access<StepName extends ServiceProcedureEntityStepName<State>>(\r\n config: ServiceProcedureAccessStateConfig<State, StepName>\r\n ): PermissionServiceProcedureBuilder<\r\n TInput,\r\n TCtx & ServiceProcedureAuthContext<\"user\">,\r\n Repositories,\r\n Services,\r\n State & { access: State[StepName] }\r\n >;\r\n}\r\n\r\ntype BaseServiceProcedureHost<Repositories extends RepositoryMap, Services extends ServiceMap> = {\r\n repository: Repositories;\r\n service: Services;\r\n logger: ServiceLogger;\r\n addContextFilter(\r\n actor: AuthenticatedActor,\r\n include?: { user?: boolean; organization?: boolean; team?: boolean },\r\n query?: QueryInput\r\n ): QueryInput;\r\n error(\r\n code: TRPC_ERROR_CODE_KEY,\r\n message?: string,\r\n options?: { cause?: unknown; clientMessage?: string; log?: boolean }\r\n ): ServerResult<never>;\r\n throwableAsync<T>(fn: () => ServerResultAsync<T>): ServerResultAsync<T>;\r\n handleUnknownError(error: unknown): ServerError;\r\n};\r\n\r\ntype PermissionServiceProcedureHost<\r\n Repositories extends RepositoryMap,\r\n Services extends ServiceMap,\r\n> = BaseServiceProcedureHost<Repositories, Services> & {\r\n checkPermission<T extends Entity>(\r\n actor: AuthenticatedActor,\r\n action: string,\r\n entities?: T | T[],\r\n grants?: ResourceActionGrant[]\r\n ): boolean;\r\n checkPermissionAsync<T extends Entity>(\r\n actor: AuthenticatedActor,\r\n action: string,\r\n getEntities: () => ServerResultAsync<T | T[] | undefined>,\r\n grants?: ResourceActionGrant[]\r\n ): ServerResultAsync<boolean>;\r\n};\r\n\r\ntype ProcedureStage = \"start\" | \"auth_passed\" | \"access_passed\" | \"forbidden\" | \"success\" | \"error\";\r\n\r\ntype ProcedureRuntimeStep<Repositories extends RepositoryMap, Services extends ServiceMap> = {\r\n stage: \"use\" | \"input\" | \"auth\" | \"access\";\r\n stepName: string;\r\n run: (\r\n args: ServiceProcedureArgs<\r\n unknown,\r\n ServiceProcedureContext,\r\n Repositories,\r\n Services,\r\n ServiceProcedureState\r\n >\r\n ) => Promise<ServerResult<unknown>>;\r\n};\r\n\r\ntype ProcedureBuilderConfig<Repositories extends RepositoryMap, Services extends ServiceMap> = {\r\n name: string;\r\n steps: ProcedureRuntimeStep<Repositories, Services>[];\r\n};\r\n\r\nconst DEFAULT_CONTEXT_FILTER_INCLUDE = [\r\n \"user\",\r\n] as const satisfies readonly ServiceProcedureContextFilterScope[];\r\n\r\nfunction isServerResult<T>(value: unknown): value is ServerResult<T> {\r\n return (\r\n typeof value === \"object\" &&\r\n value !== null &&\r\n \"isErr\" in value &&\r\n typeof (value as { isErr: unknown }).isErr === \"function\" &&\r\n \"isOk\" in value &&\r\n typeof (value as { isOk: unknown }).isOk === \"function\"\r\n );\r\n}\r\n\r\nasync function normalizeProcedureResult<T>(\r\n result: ServiceProcedureResultLike<T>\r\n): Promise<ServerResult<T>> {\r\n const resolved = await result;\r\n return isServerResult<T>(resolved) ? resolved : ok(resolved);\r\n}\r\n\r\nfunction assertUniqueStepName<Repositories extends RepositoryMap, Services extends ServiceMap>(\r\n steps: ProcedureRuntimeStep<Repositories, Services>[],\r\n stepName: string\r\n) {\r\n if (steps.some((step) => step.stepName === stepName)) {\r\n throw new Error(`Duplicate service procedure step name: ${stepName}`);\r\n }\r\n}\r\n\r\nfunction hasStepName<Repositories extends RepositoryMap, Services extends ServiceMap>(\r\n steps: ProcedureRuntimeStep<Repositories, Services>[],\r\n stepName: string\r\n) {\r\n return steps.some((step) => step.stepName === stepName);\r\n}\r\n\r\nfunction getContextFilterInclude(\r\n include: readonly ServiceProcedureContextFilterScope[] = DEFAULT_CONTEXT_FILTER_INCLUDE\r\n) {\r\n return {\r\n user: include.includes(\"user\"),\r\n organization: include.includes(\"organization\"),\r\n team: include.includes(\"team\"),\r\n };\r\n}\r\n\r\nfunction getFailureStage(code: TRPC_ERROR_CODE_KEY | undefined): ProcedureStage {\r\n return code === \"FORBIDDEN\" || code === \"UNAUTHORIZED\" ? \"forbidden\" : \"error\";\r\n}\r\n\r\nfunction logProcedureStage<Repositories extends RepositoryMap, Services extends ServiceMap>(\r\n host: BaseServiceProcedureHost<Repositories, Services>,\r\n procedureName: string,\r\n ctx: ServiceProcedureContext,\r\n stage: ProcedureStage,\r\n {\r\n stepName,\r\n durationMs,\r\n errorCode,\r\n }: {\r\n stepName?: string;\r\n durationMs?: number;\r\n errorCode?: TRPC_ERROR_CODE_KEY;\r\n } = {}\r\n) {\r\n host.logger.debug({\r\n procedureName,\r\n stage,\r\n stepName,\r\n durationMs,\r\n errorCode,\r\n hasActor: Boolean(ctx.actor),\r\n });\r\n}\r\n\r\nfunction requireProcedureActor<\r\n Scope extends ActorScope,\r\n Repositories extends RepositoryMap,\r\n Services extends ServiceMap,\r\n>(\r\n host: BaseServiceProcedureHost<Repositories, Services>,\r\n ctx: ServiceProcedureContext,\r\n scope: Scope\r\n): ServerResult<Actor[Scope]> {\r\n if (!ctx.actor) {\r\n return host.error(\"UNAUTHORIZED\", \"Unauthorized\");\r\n }\r\n\r\n if (!validateActor(ctx.actor, scope)) {\r\n return host.error(\"FORBIDDEN\", \"Forbidden\");\r\n }\r\n\r\n return ok(ctx.actor as Actor[Scope]);\r\n}\r\n\r\nfunction createRequireAuthStep<Repositories extends RepositoryMap, Services extends ServiceMap>(\r\n host: BaseServiceProcedureHost<Repositories, Services>,\r\n scope: ActorScope = \"user\"\r\n): ProcedureRuntimeStep<Repositories, Services> {\r\n return {\r\n stage: \"auth\",\r\n stepName: \"auth\",\r\n run: async ({ ctx }) => {\r\n return requireProcedureActor(host, ctx, scope);\r\n },\r\n };\r\n}\r\n\r\nfunction createUseStep<\r\n TInput,\r\n TCtx extends ServiceProcedureContext,\r\n Repositories extends RepositoryMap,\r\n Services extends ServiceMap,\r\n State extends ServiceProcedureState,\r\n TOutput,\r\n>(\r\n stepName: string,\r\n step: ServiceProcedureStep<TInput, TCtx, Repositories, Services, State, TOutput>\r\n): ProcedureRuntimeStep<Repositories, Services> {\r\n return {\r\n stage: \"use\",\r\n stepName,\r\n run: async (args) =>\r\n normalizeProcedureResult(\r\n step(args as ServiceProcedureArgs<TInput, TCtx, Repositories, Services, State>)\r\n ),\r\n };\r\n}\r\n\r\nfunction createInputStep<\r\n TInput,\r\n TCtx extends ServiceProcedureContext,\r\n Repositories extends RepositoryMap,\r\n Services extends ServiceMap,\r\n State extends ServiceProcedureState,\r\n TNextInput,\r\n>(\r\n stepName: string,\r\n step: ServiceProcedureInputMapper<TInput, TCtx, Repositories, Services, State, TNextInput>\r\n): ProcedureRuntimeStep<Repositories, Services> {\r\n return {\r\n stage: \"input\",\r\n stepName,\r\n run: async (args) =>\r\n normalizeProcedureResult(\r\n step(args as ServiceProcedureArgs<TInput, TCtx, Repositories, Services, State>)\r\n ),\r\n };\r\n}\r\n\r\nfunction createContextFilterStep<Repositories extends RepositoryMap, Services extends ServiceMap>(\r\n host: BaseServiceProcedureHost<Repositories, Services>,\r\n include?: readonly ServiceProcedureContextFilterScope[]\r\n): ProcedureRuntimeStep<Repositories, Services> {\r\n const contextInclude = getContextFilterInclude(include);\r\n const requiredScope: ActorScope = contextInclude.team\r\n ? \"team\"\r\n : contextInclude.organization\r\n ? \"organization\"\r\n : \"user\";\r\n\r\n return {\r\n stage: \"input\",\r\n stepName: \"contextFilter\",\r\n run: async ({ input, ctx }) => {\r\n const actor = requireProcedureActor(host, ctx, requiredScope);\r\n if (actor.isErr()) return actor;\r\n return ok(host.addContextFilter(actor.value, contextInclude, input as QueryInput));\r\n },\r\n };\r\n}\r\n\r\nfunction createAccessStep<\r\n TInput,\r\n TCtx extends ServiceProcedureContext,\r\n Repositories extends RepositoryMap,\r\n Services extends ServiceMap,\r\n State extends ServiceProcedureState,\r\n TEntities extends Entity | Entity[] | undefined,\r\n>(\r\n host: PermissionServiceProcedureHost<Repositories, Services>,\r\n config: ServiceProcedureAccessConfig<TInput, TCtx, Repositories, Services, State, TEntities>\r\n): ProcedureRuntimeStep<Repositories, Services> {\r\n return {\r\n stage: \"access\",\r\n stepName: \"access\",\r\n run: async (args) => {\r\n const typedArgs = args as ServiceProcedureArgs<TInput, TCtx, Repositories, Services, State>;\r\n const actor = requireProcedureActor(host, typedArgs.ctx, \"user\");\r\n if (actor.isErr()) return actor;\r\n\r\n if (\"entityStep\" in config && typeof config.entityStep === \"string\") {\r\n const entities = typedArgs.state[config.entityStep] as TEntities;\r\n const hasPermission = host.checkPermission(\r\n actor.value,\r\n config.action,\r\n entities as Entity | Entity[] | undefined,\r\n config.grants\r\n );\r\n\r\n if (!hasPermission) {\r\n return host.error(\"FORBIDDEN\");\r\n }\r\n\r\n return ok(entities);\r\n }\r\n\r\n if (typeof config.entities === \"function\") {\r\n const resolveEntities = config.entities as (\r\n args: ServiceProcedureArgs<TInput, TCtx, Repositories, Services, State>\r\n ) => ServiceProcedureResultLike<TEntities>;\r\n\r\n let loadedEntities: TEntities | undefined;\r\n const permission = await host.checkPermissionAsync(\r\n actor.value,\r\n config.action,\r\n async () => {\r\n const entityResult = await normalizeProcedureResult(resolveEntities(typedArgs));\r\n if (entityResult.isOk()) {\r\n loadedEntities = entityResult.value;\r\n }\r\n return entityResult;\r\n },\r\n config.grants\r\n );\r\n\r\n if (permission.isErr()) {\r\n return permission;\r\n }\r\n\r\n if (!permission.value) {\r\n return host.error(\"FORBIDDEN\");\r\n }\r\n\r\n return ok(loadedEntities);\r\n }\r\n\r\n const entities = config.entities;\r\n const hasPermission = host.checkPermission(\r\n actor.value,\r\n config.action,\r\n entities,\r\n config.grants\r\n );\r\n\r\n if (!hasPermission) {\r\n return host.error(\"FORBIDDEN\");\r\n }\r\n\r\n return ok(entities);\r\n },\r\n };\r\n}\r\n\r\nfunction createProcedureHandler<\r\n TInput,\r\n TCtx extends ServiceProcedureContext,\r\n Repositories extends RepositoryMap,\r\n Services extends ServiceMap,\r\n State extends ServiceProcedureState,\r\n TOutput,\r\n>(\r\n host: BaseServiceProcedureHost<Repositories, Services>,\r\n config: ProcedureBuilderConfig<Repositories, Services>,\r\n handler: ServiceProcedureHandler<TInput, TCtx, Repositories, Services, State, TOutput>\r\n): ServiceProcedure<TInput, TCtx, TOutput> {\r\n return async (input, ctx) =>\r\n host.throwableAsync(async () => {\r\n const state: ServiceProcedureState = {};\r\n const startTime = Date.now();\r\n const typedCtx = ctx as ServiceProcedureContext;\r\n let currentInput: unknown = input;\r\n\r\n logProcedureStage(host, config.name, typedCtx, \"start\");\r\n\r\n try {\r\n for (const step of config.steps) {\r\n const stepResult = await step.run({\r\n input: currentInput,\r\n ctx: typedCtx,\r\n state,\r\n repository: host.repository,\r\n service: host.service,\r\n logger: host.logger,\r\n });\r\n\r\n if (stepResult.isErr()) {\r\n logProcedureStage(host, config.name, typedCtx, getFailureStage(stepResult.error.code), {\r\n stepName: step.stepName,\r\n durationMs: Date.now() - startTime,\r\n errorCode: stepResult.error.code,\r\n });\r\n return stepResult as ServerResult<TOutput>;\r\n }\r\n\r\n state[step.stepName] = stepResult.value;\r\n\r\n if (step.stage === \"input\") {\r\n currentInput = stepResult.value;\r\n }\r\n\r\n if (step.stage === \"auth\") {\r\n logProcedureStage(host, config.name, typedCtx, \"auth_passed\", {\r\n stepName: step.stepName,\r\n });\r\n }\r\n\r\n if (step.stage === \"access\") {\r\n logProcedureStage(host, config.name, typedCtx, \"access_passed\", {\r\n stepName: step.stepName,\r\n });\r\n }\r\n }\r\n\r\n const handlerResult = await normalizeProcedureResult(\r\n handler({\r\n input: currentInput as TInput,\r\n ctx: ctx as TCtx,\r\n state: state as State,\r\n repository: host.repository,\r\n service: host.service,\r\n logger: host.logger,\r\n })\r\n );\r\n\r\n if (handlerResult.isErr()) {\r\n logProcedureStage(\r\n host,\r\n config.name,\r\n typedCtx,\r\n getFailureStage(handlerResult.error.code),\r\n {\r\n durationMs: Date.now() - startTime,\r\n errorCode: handlerResult.error.code,\r\n }\r\n );\r\n return handlerResult;\r\n }\r\n\r\n logProcedureStage(host, config.name, typedCtx, \"success\", {\r\n durationMs: Date.now() - startTime,\r\n });\r\n return handlerResult;\r\n } catch (error) {\r\n const serverError = host.handleUnknownError(error);\r\n logProcedureStage(host, config.name, typedCtx, getFailureStage(serverError.code), {\r\n durationMs: Date.now() - startTime,\r\n errorCode: serverError.code,\r\n });\r\n throw error;\r\n }\r\n });\r\n}\r\n\r\nexport function createServiceProcedureBuilder<\r\n TInput,\r\n TCtx extends ServiceProcedureContext,\r\n Repositories extends RepositoryMap,\r\n Services extends ServiceMap,\r\n State extends ServiceProcedureState = Record<string, never>,\r\n>(\r\n host: BaseServiceProcedureHost<Repositories, Services>,\r\n config: ProcedureBuilderConfig<Repositories, Services>\r\n): ServiceProcedureBuilder<TInput, TCtx, Repositories, Services, State> {\r\n function addContextFilter<\r\n TInclude extends readonly ServiceProcedureContextFilterScope[] | undefined = undefined,\r\n >(include?: TInclude) {\r\n const steps = hasStepName(config.steps, \"auth\")\r\n ? config.steps\r\n : [...config.steps, createRequireAuthStep(host, \"user\")];\r\n\r\n assertUniqueStepName(steps, \"contextFilter\");\r\n\r\n return createServiceProcedureBuilder<\r\n ServiceProcedureContextFilteredInput<TInput>,\r\n TCtx & ServiceProcedureAuthContext<ServiceProcedureRequiredScopeFromFilter<TInclude>>,\r\n Repositories,\r\n Services,\r\n State & { contextFilter: ServiceProcedureContextFilteredInput<TInput> }\r\n >(host, {\r\n ...config,\r\n steps: [...steps, createContextFilterStep(host, include)],\r\n });\r\n }\r\n\r\n const builder: ServiceProcedureBuilder<TInput, TCtx, Repositories, Services, State> = {\r\n use<StepName extends string, TOutput = void>(\r\n stepName: StepName,\r\n step: ServiceProcedureStep<TInput, TCtx, Repositories, Services, State, TOutput>\r\n ) {\r\n assertUniqueStepName(config.steps, stepName);\r\n return createServiceProcedureBuilder<\r\n TInput,\r\n TCtx,\r\n Repositories,\r\n Services,\r\n State & Record<StepName, ServiceProcedureStoredValue<TOutput>>\r\n >(host, {\r\n ...config,\r\n steps: [...config.steps, createUseStep(stepName, step)],\r\n });\r\n },\r\n mapInput<StepName extends string, TNextInput>(\r\n stepName: StepName,\r\n step: ServiceProcedureInputMapper<TInput, TCtx, Repositories, Services, State, TNextInput>\r\n ) {\r\n assertUniqueStepName(config.steps, stepName);\r\n return createServiceProcedureBuilder<\r\n ServiceProcedureStoredValue<TNextInput>,\r\n TCtx,\r\n Repositories,\r\n Services,\r\n State & Record<StepName, ServiceProcedureStoredValue<TNextInput>>\r\n >(host, {\r\n ...config,\r\n steps: [...config.steps, createInputStep(stepName, step)],\r\n });\r\n },\r\n addContextFilter,\r\n requireAuth<Scope extends ActorScope = \"user\">(scope?: Scope) {\r\n assertUniqueStepName(config.steps, \"auth\");\r\n return createServiceProcedureBuilder<\r\n TInput,\r\n TCtx & ServiceProcedureAuthContext<Scope>,\r\n Repositories,\r\n Services,\r\n State\r\n >(host, {\r\n ...config,\r\n steps: [...config.steps, createRequireAuthStep(host, scope ?? \"user\")],\r\n });\r\n },\r\n handle<TOutput>(\r\n handler: ServiceProcedureHandler<TInput, TCtx, Repositories, Services, State, TOutput>\r\n ) {\r\n return createProcedureHandler(host, config, handler);\r\n },\r\n };\r\n\r\n return builder;\r\n}\r\n\r\nexport function createPermissionServiceProcedureBuilder<\r\n TInput,\r\n TCtx extends ServiceProcedureContext,\r\n Repositories extends RepositoryMap,\r\n Services extends ServiceMap,\r\n State extends ServiceProcedureState = Record<string, never>,\r\n>(\r\n host: PermissionServiceProcedureHost<Repositories, Services>,\r\n config: ProcedureBuilderConfig<Repositories, Services>\r\n): PermissionServiceProcedureBuilder<TInput, TCtx, Repositories, Services, State> {\r\n function addContextFilter<\r\n TInclude extends readonly ServiceProcedureContextFilterScope[] | undefined = undefined,\r\n >(include?: TInclude) {\r\n const steps = hasStepName(config.steps, \"auth\")\r\n ? config.steps\r\n : [...config.steps, createRequireAuthStep(host, \"user\")];\r\n\r\n assertUniqueStepName(steps, \"contextFilter\");\r\n\r\n return createPermissionServiceProcedureBuilder<\r\n ServiceProcedureContextFilteredInput<TInput>,\r\n TCtx & ServiceProcedureAuthContext<ServiceProcedureRequiredScopeFromFilter<TInclude>>,\r\n Repositories,\r\n Services,\r\n State & { contextFilter: ServiceProcedureContextFilteredInput<TInput> }\r\n >(host, {\r\n ...config,\r\n steps: [...steps, createContextFilterStep(host, include)],\r\n });\r\n }\r\n\r\n function access(\r\n accessConfig: ServiceProcedureAccessEntitiesConfig<TInput, TCtx, Repositories, Services, State>\r\n ): PermissionServiceProcedureBuilder<\r\n TInput,\r\n TCtx & ServiceProcedureAuthContext<\"user\">,\r\n Repositories,\r\n Services,\r\n State\r\n >;\r\n function access<TEntities extends Entity | Entity[] | undefined>(\r\n accessConfig: ServiceProcedureAccessEntitiesConfig<\r\n TInput,\r\n TCtx,\r\n Repositories,\r\n Services,\r\n State,\r\n TEntities\r\n >\r\n ): PermissionServiceProcedureBuilder<\r\n TInput,\r\n TCtx & ServiceProcedureAuthContext<\"user\">,\r\n Repositories,\r\n Services,\r\n State & { access: TEntities }\r\n >;\r\n function access<StepName extends ServiceProcedureEntityStepName<State>>(\r\n accessConfig: ServiceProcedureAccessStateConfig<State, StepName>\r\n ): PermissionServiceProcedureBuilder<\r\n TInput,\r\n TCtx & ServiceProcedureAuthContext<\"user\">,\r\n Repositories,\r\n Services,\r\n State & { access: State[StepName] }\r\n >;\r\n function access(\r\n accessConfig:\r\n | ServiceProcedureAccessEntitiesConfig<\r\n TInput,\r\n TCtx,\r\n Repositories,\r\n Services,\r\n State,\r\n Entity | Entity[] | undefined\r\n >\r\n | ServiceProcedureAccessStateConfig<State, ServiceProcedureEntityStepName<State>>\r\n ) {\r\n assertUniqueStepName(config.steps, \"access\");\r\n return createPermissionServiceProcedureBuilder<\r\n TInput,\r\n TCtx & ServiceProcedureAuthContext<\"user\">,\r\n Repositories,\r\n Services,\r\n State\r\n >(host, {\r\n ...config,\r\n steps: [...config.steps, createAccessStep(host, accessConfig)],\r\n });\r\n }\r\n\r\n const builder: PermissionServiceProcedureBuilder<TInput, TCtx, Repositories, Services, State> = {\r\n use<StepName extends string, TOutput = void>(\r\n stepName: StepName,\r\n step: ServiceProcedureStep<TInput, TCtx, Repositories, Services, State, TOutput>\r\n ) {\r\n assertUniqueStepName(config.steps, stepName);\r\n return createPermissionServiceProcedureBuilder<\r\n TInput,\r\n TCtx,\r\n Repositories,\r\n Services,\r\n State & Record<StepName, ServiceProcedureStoredValue<TOutput>>\r\n >(host, {\r\n ...config,\r\n steps: [...config.steps, createUseStep(stepName, step)],\r\n });\r\n },\r\n mapInput<StepName extends string, TNextInput>(\r\n stepName: StepName,\r\n step: ServiceProcedureInputMapper<TInput, TCtx, Repositories, Services, State, TNextInput>\r\n ) {\r\n assertUniqueStepName(config.steps, stepName);\r\n return createPermissionServiceProcedureBuilder<\r\n ServiceProcedureStoredValue<TNextInput>,\r\n TCtx,\r\n Repositories,\r\n Services,\r\n State & Record<StepName, ServiceProcedureStoredValue<TNextInput>>\r\n >(host, {\r\n ...config,\r\n steps: [...config.steps, createInputStep(stepName, step)],\r\n });\r\n },\r\n addContextFilter,\r\n requireAuth<Scope extends ActorScope = \"user\">(scope?: Scope) {\r\n assertUniqueStepName(config.steps, \"auth\");\r\n return createPermissionServiceProcedureBuilder<\r\n TInput,\r\n TCtx & ServiceProcedureAuthContext<Scope>,\r\n Repositories,\r\n Services,\r\n State\r\n >(host, {\r\n ...config,\r\n steps: [...config.steps, createRequireAuthStep(host, scope ?? \"user\")],\r\n });\r\n },\r\n access,\r\n handle<TOutput>(\r\n handler: ServiceProcedureHandler<TInput, TCtx, Repositories, Services, State, TOutput>\r\n ) {\r\n return createProcedureHandler(host, config, handler);\r\n },\r\n };\r\n\r\n return builder;\r\n}\r\n"],"mappings":"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"}