@m5kdev/backend 0.8.7 → 0.8.9

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 (385) hide show
  1. package/dist/_virtual/_rolldown/runtime.cjs +33 -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.cts +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.cts +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.cts +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.cts +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.cts +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.cts +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.cts +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.cts +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.cts +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.cts +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.cts +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.cts +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.cts +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.cts +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.cts +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.cts +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.cts +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.cts +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.cts +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.cts +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.cts +1 -0
  23. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/dialect-adapter-base.d.cts +1 -0
  24. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/dialect-adapter.d.cts +1 -0
  25. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/dialect.d.cts +1 -0
  26. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/mssql/mssql-adapter.d.cts +1 -0
  27. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/mssql/mssql-dialect.d.cts +1 -0
  28. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/mssql/mssql-introspector.d.cts +1 -0
  29. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/mysql/mysql-adapter.d.cts +1 -0
  30. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/mysql/mysql-dialect.d.cts +1 -0
  31. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/mysql/mysql-introspector.d.cts +1 -0
  32. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/postgres/postgres-adapter.d.cts +1 -0
  33. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/postgres/postgres-dialect.d.cts +1 -0
  34. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/postgres/postgres-introspector.d.cts +1 -0
  35. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/sqlite/sqlite-adapter.d.cts +1 -0
  36. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/sqlite/sqlite-dialect.d.cts +1 -0
  37. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/sqlite/sqlite-introspector.d.cts +1 -0
  38. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/expression/expression-builder.d.cts +1 -0
  39. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/index.d.cts +1 -0
  40. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/kysely.d.cts +38 -0
  41. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/migration/file-migration-provider.d.cts +1 -0
  42. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/migration/migrator.d.cts +1 -0
  43. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/binary-operation-parser.d.cts +1 -0
  44. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/delete-from-parser.d.cts +1 -0
  45. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/expression-parser.d.cts +1 -0
  46. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/group-by-parser.d.cts +1 -0
  47. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/insert-values-parser.d.cts +1 -0
  48. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/join-parser.d.cts +1 -0
  49. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/merge-into-parser.d.cts +1 -0
  50. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/reference-parser.d.cts +1 -0
  51. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/returning-parser.d.cts +1 -0
  52. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/select-from-parser.d.cts +1 -0
  53. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/select-parser.d.cts +1 -0
  54. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/set-operation-parser.d.cts +1 -0
  55. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/tuple-parser.d.cts +1 -0
  56. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/unary-operation-parser.d.cts +1 -0
  57. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/update-parser.d.cts +1 -0
  58. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/update-set-parser.d.cts +1 -0
  59. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/value-parser.d.cts +1 -0
  60. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/with-parser.d.cts +1 -0
  61. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/case-builder.d.cts +1 -0
  62. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/delete-query-builder.d.cts +1 -0
  63. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/having-interface.d.cts +1 -0
  64. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/insert-query-builder.d.cts +1 -0
  65. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/join-builder.d.cts +1 -0
  66. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/merge-query-builder.d.cts +1 -0
  67. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/on-conflict-builder.d.cts +1 -0
  68. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/output-interface.d.cts +1 -0
  69. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/returning-interface.d.cts +1 -0
  70. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/select-query-builder.d.cts +1 -0
  71. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/update-query-builder.d.cts +1 -0
  72. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/where-interface.d.cts +1 -0
  73. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-creator.d.cts +1 -0
  74. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-executor/default-query-executor.d.cts +1 -0
  75. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-executor/noop-query-executor.d.cts +1 -0
  76. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-executor/query-executor-base.d.cts +1 -0
  77. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-executor/query-executor-provider.d.cts +1 -0
  78. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-executor/query-executor.d.cts +1 -0
  79. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/raw-builder/raw-builder.d.cts +1 -0
  80. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/raw-builder/sql.d.cts +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.cts +1 -0
  82. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/alter-table-add-index-builder.d.cts +1 -0
  83. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/alter-table-builder.d.cts +1 -0
  84. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/alter-table-drop-constraint-builder.d.cts +1 -0
  85. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/alter-table-executor.d.cts +1 -0
  86. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/create-index-builder.d.cts +1 -0
  87. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/create-schema-builder.d.cts +1 -0
  88. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/create-table-builder.d.cts +1 -0
  89. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/create-type-builder.d.cts +1 -0
  90. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/create-view-builder.d.cts +1 -0
  91. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/drop-index-builder.d.cts +1 -0
  92. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/drop-schema-builder.d.cts +1 -0
  93. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/drop-table-builder.d.cts +1 -0
  94. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/drop-type-builder.d.cts +1 -0
  95. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/drop-view-builder.d.cts +1 -0
  96. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/refresh-materialized-view-builder.d.cts +1 -0
  97. package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/schema.d.cts +1 -0
  98. package/dist/src/lib/posthog.cjs +8 -0
  99. package/dist/src/lib/posthog.cjs.map +1 -0
  100. package/dist/src/lib/posthog.d.cts +7 -0
  101. package/dist/src/lib/sentry.cjs +11 -0
  102. package/dist/src/lib/sentry.cjs.map +1 -0
  103. package/dist/src/lib/sentry.d.cts +1 -0
  104. package/dist/src/modules/access/access.repository.cjs +26 -0
  105. package/dist/src/modules/access/access.repository.cjs.map +1 -0
  106. package/dist/src/modules/access/access.repository.d.cts +2352 -0
  107. package/dist/src/modules/access/access.service.cjs +42 -0
  108. package/dist/src/modules/access/access.service.cjs.map +1 -0
  109. package/dist/src/modules/access/access.service.d.cts +25 -0
  110. package/dist/src/modules/access/access.utils.cjs +23 -0
  111. package/dist/src/modules/access/access.utils.cjs.map +1 -0
  112. package/dist/src/modules/access/access.utils.d.cts +19 -0
  113. package/dist/src/modules/ai/ai.db.cjs +46 -0
  114. package/dist/src/modules/ai/ai.db.cjs.map +1 -0
  115. package/dist/src/modules/ai/ai.db.d.cts +401 -0
  116. package/dist/src/modules/ai/ai.prompt.cjs +33 -0
  117. package/dist/src/modules/ai/ai.prompt.cjs.map +1 -0
  118. package/dist/src/modules/ai/ai.prompt.d.cts +30 -0
  119. package/dist/src/modules/ai/ai.prompts.cjs +18 -0
  120. package/dist/src/modules/ai/ai.prompts.cjs.map +1 -0
  121. package/dist/src/modules/ai/ai.prompts.d.cts +10 -0
  122. package/dist/src/modules/ai/ai.repository.cjs +25 -0
  123. package/dist/src/modules/ai/ai.repository.cjs.map +1 -0
  124. package/dist/src/modules/ai/ai.repository.d.cts +428 -0
  125. package/dist/src/modules/ai/ai.router.cjs +0 -0
  126. package/dist/src/modules/ai/ai.router.d.cts +1 -0
  127. package/dist/src/modules/ai/ai.service.cjs +312 -0
  128. package/dist/src/modules/ai/ai.service.cjs.map +1 -0
  129. package/dist/src/modules/ai/ai.service.d.cts +141 -0
  130. package/dist/src/modules/ai/ai.trpc.cjs +19 -0
  131. package/dist/src/modules/ai/ai.trpc.cjs.map +1 -0
  132. package/dist/src/modules/ai/ai.trpc.d.cts +31 -0
  133. package/dist/src/modules/ai/ideogram/ideogram.constants.cjs +191 -0
  134. package/dist/src/modules/ai/ideogram/ideogram.constants.cjs.map +1 -0
  135. package/dist/src/modules/ai/ideogram/ideogram.constants.d.cts +11 -0
  136. package/dist/src/modules/ai/ideogram/ideogram.dto.cjs +49 -0
  137. package/dist/src/modules/ai/ideogram/ideogram.dto.cjs.map +1 -0
  138. package/dist/src/modules/ai/ideogram/ideogram.dto.d.cts +234 -0
  139. package/dist/src/modules/ai/ideogram/ideogram.prompt.cjs +862 -0
  140. package/dist/src/modules/ai/ideogram/ideogram.prompt.cjs.map +1 -0
  141. package/dist/src/modules/ai/ideogram/ideogram.prompt.d.cts +7 -0
  142. package/dist/src/modules/ai/ideogram/ideogram.repository.cjs +34 -0
  143. package/dist/src/modules/ai/ideogram/ideogram.repository.cjs.map +1 -0
  144. package/dist/src/modules/ai/ideogram/ideogram.repository.d.cts +11 -0
  145. package/dist/src/modules/ai/ideogram/ideogram.service.cjs +12 -0
  146. package/dist/src/modules/ai/ideogram/ideogram.service.cjs.map +1 -0
  147. package/dist/src/modules/ai/ideogram/ideogram.service.d.cts +14 -0
  148. package/dist/src/modules/auth/auth.db.cjs +187 -0
  149. package/dist/src/modules/auth/auth.db.cjs.map +1 -0
  150. package/dist/src/modules/auth/auth.db.d.cts +2341 -0
  151. package/dist/src/modules/auth/auth.dto.cjs +50 -0
  152. package/dist/src/modules/auth/auth.dto.cjs.map +1 -0
  153. package/dist/src/modules/auth/auth.dto.d.cts +70 -0
  154. package/dist/src/modules/auth/auth.lib.cjs +234 -0
  155. package/dist/src/modules/auth/auth.lib.cjs.map +1 -0
  156. package/dist/src/modules/auth/auth.lib.d.cts +4894 -0
  157. package/dist/src/modules/auth/auth.middleware.cjs +41 -0
  158. package/dist/src/modules/auth/auth.middleware.cjs.map +1 -0
  159. package/dist/src/modules/auth/auth.middleware.d.cts +619 -0
  160. package/dist/src/modules/auth/auth.repository.cjs +403 -0
  161. package/dist/src/modules/auth/auth.repository.cjs.map +1 -0
  162. package/dist/src/modules/auth/auth.repository.d.cts +2453 -0
  163. package/dist/src/modules/auth/auth.service.cjs +229 -0
  164. package/dist/src/modules/auth/auth.service.cjs.map +1 -0
  165. package/dist/src/modules/auth/auth.service.d.cts +105 -0
  166. package/dist/src/modules/auth/auth.trpc.cjs +110 -0
  167. package/dist/src/modules/auth/auth.trpc.cjs.map +1 -0
  168. package/dist/src/modules/auth/auth.trpc.d.cts +303 -0
  169. package/dist/src/modules/auth/auth.utils.cjs +80 -0
  170. package/dist/src/modules/auth/auth.utils.cjs.map +1 -0
  171. package/dist/src/modules/auth/auth.utils.d.cts +2356 -0
  172. package/dist/src/modules/base/base.abstract.cjs +62 -0
  173. package/dist/src/modules/base/base.abstract.cjs.map +1 -0
  174. package/dist/src/modules/base/base.abstract.d.cts +29 -0
  175. package/dist/src/modules/base/base.actor.cjs +83 -0
  176. package/dist/src/modules/base/base.actor.cjs.map +1 -0
  177. package/dist/src/modules/base/base.actor.d.cts +73 -0
  178. package/dist/src/modules/base/base.dto.cjs +98 -0
  179. package/dist/src/modules/base/base.dto.cjs.map +1 -0
  180. package/dist/src/modules/base/base.dto.d.cts +67 -0
  181. package/dist/src/modules/base/base.grants.cjs +107 -0
  182. package/dist/src/modules/base/base.grants.cjs.map +1 -0
  183. package/dist/src/modules/base/base.grants.d.cts +28 -0
  184. package/dist/src/modules/base/base.procedure.cjs +255 -0
  185. package/dist/src/modules/base/base.procedure.cjs.map +1 -0
  186. package/dist/src/modules/base/base.procedure.d.cts +111 -0
  187. package/dist/src/modules/base/base.repository.cjs +269 -0
  188. package/dist/src/modules/base/base.repository.cjs.map +1 -0
  189. package/dist/src/modules/base/base.repository.d.cts +125 -0
  190. package/dist/src/modules/base/base.repository.d.mts +2 -0
  191. package/dist/src/modules/base/base.repository.mjs +12 -0
  192. package/dist/src/modules/base/base.repository.mjs.map +1 -1
  193. package/dist/src/modules/base/base.service.cjs +119 -0
  194. package/dist/src/modules/base/base.service.cjs.map +1 -0
  195. package/dist/src/modules/base/base.service.d.cts +44 -0
  196. package/dist/src/modules/base/base.types.cjs +0 -0
  197. package/dist/src/modules/base/base.types.d.cts +5 -0
  198. package/dist/src/modules/billing/billing.db.cjs +38 -0
  199. package/dist/src/modules/billing/billing.db.cjs.map +1 -0
  200. package/dist/src/modules/billing/billing.db.d.cts +371 -0
  201. package/dist/src/modules/billing/billing.repository.cjs +190 -0
  202. package/dist/src/modules/billing/billing.repository.cjs.map +1 -0
  203. package/dist/src/modules/billing/billing.repository.d.cts +2787 -0
  204. package/dist/src/modules/billing/billing.router.cjs +43 -0
  205. package/dist/src/modules/billing/billing.router.cjs.map +1 -0
  206. package/dist/src/modules/billing/billing.router.d.cts +9 -0
  207. package/dist/src/modules/billing/billing.service.cjs +127 -0
  208. package/dist/src/modules/billing/billing.service.cjs.map +1 -0
  209. package/dist/src/modules/billing/billing.service.d.cts +53 -0
  210. package/dist/src/modules/billing/billing.trpc.cjs +19 -0
  211. package/dist/src/modules/billing/billing.trpc.cjs.map +1 -0
  212. package/dist/src/modules/billing/billing.trpc.d.cts +48 -0
  213. package/dist/src/modules/clay/clay.repository.cjs +29 -0
  214. package/dist/src/modules/clay/clay.repository.cjs.map +1 -0
  215. package/dist/src/modules/clay/clay.repository.d.cts +10 -0
  216. package/dist/src/modules/clay/clay.service.cjs +24 -0
  217. package/dist/src/modules/clay/clay.service.cjs.map +1 -0
  218. package/dist/src/modules/clay/clay.service.d.cts +32 -0
  219. package/dist/src/modules/connect/connect.db.cjs +37 -0
  220. package/dist/src/modules/connect/connect.db.cjs.map +1 -0
  221. package/dist/src/modules/connect/connect.db.d.cts +362 -0
  222. package/dist/src/modules/connect/connect.dto.cjs +45 -0
  223. package/dist/src/modules/connect/connect.dto.cjs.map +1 -0
  224. package/dist/src/modules/connect/connect.dto.d.cts +79 -0
  225. package/dist/src/modules/connect/connect.dto.d.mts +2 -2
  226. package/dist/src/modules/connect/connect.linkedin.cjs +48 -0
  227. package/dist/src/modules/connect/connect.linkedin.cjs.map +1 -0
  228. package/dist/src/modules/connect/connect.linkedin.d.cts +7 -0
  229. package/dist/src/modules/connect/connect.oauth.cjs +153 -0
  230. package/dist/src/modules/connect/connect.oauth.cjs.map +1 -0
  231. package/dist/src/modules/connect/connect.oauth.d.cts +32 -0
  232. package/dist/src/modules/connect/connect.repository.cjs +42 -0
  233. package/dist/src/modules/connect/connect.repository.cjs.map +1 -0
  234. package/dist/src/modules/connect/connect.repository.d.cts +419 -0
  235. package/dist/src/modules/connect/connect.repository.d.mts +1 -1
  236. package/dist/src/modules/connect/connect.router.cjs +48 -0
  237. package/dist/src/modules/connect/connect.router.cjs.map +1 -0
  238. package/dist/src/modules/connect/connect.router.d.cts +9 -0
  239. package/dist/src/modules/connect/connect.service.cjs +90 -0
  240. package/dist/src/modules/connect/connect.service.cjs.map +1 -0
  241. package/dist/src/modules/connect/connect.service.d.cts +103 -0
  242. package/dist/src/modules/connect/connect.service.d.mts +2 -2
  243. package/dist/src/modules/connect/connect.trpc.cjs +18 -0
  244. package/dist/src/modules/connect/connect.trpc.cjs.map +1 -0
  245. package/dist/src/modules/connect/connect.trpc.d.cts +53 -0
  246. package/dist/src/modules/connect/connect.trpc.d.mts +1 -1
  247. package/dist/src/modules/connect/connect.types.cjs +0 -0
  248. package/dist/src/modules/connect/connect.types.d.cts +29 -0
  249. package/dist/src/modules/crypto/crypto.db.cjs +26 -0
  250. package/dist/src/modules/crypto/crypto.db.cjs.map +1 -0
  251. package/dist/src/modules/crypto/crypto.db.d.cts +157 -0
  252. package/dist/src/modules/crypto/crypto.repository.cjs +9 -0
  253. package/dist/src/modules/crypto/crypto.repository.cjs.map +1 -0
  254. package/dist/src/modules/crypto/crypto.repository.d.cts +163 -0
  255. package/dist/src/modules/crypto/crypto.service.cjs +46 -0
  256. package/dist/src/modules/crypto/crypto.service.cjs.map +1 -0
  257. package/dist/src/modules/crypto/crypto.service.d.cts +15 -0
  258. package/dist/src/modules/email/email.service.cjs +107 -0
  259. package/dist/src/modules/email/email.service.cjs.map +1 -0
  260. package/dist/src/modules/email/email.service.d.cts +62 -0
  261. package/dist/src/modules/file/file.repository.cjs +74 -0
  262. package/dist/src/modules/file/file.repository.cjs.map +1 -0
  263. package/dist/src/modules/file/file.repository.d.cts +17 -0
  264. package/dist/src/modules/file/file.router.cjs +94 -0
  265. package/dist/src/modules/file/file.router.cjs.map +1 -0
  266. package/dist/src/modules/file/file.router.d.cts +7 -0
  267. package/dist/src/modules/file/file.service.cjs +120 -0
  268. package/dist/src/modules/file/file.service.cjs.map +1 -0
  269. package/dist/src/modules/file/file.service.d.cts +30 -0
  270. package/dist/src/modules/recurrence/recurrence.db.cjs +55 -0
  271. package/dist/src/modules/recurrence/recurrence.db.cjs.map +1 -0
  272. package/dist/src/modules/recurrence/recurrence.db.d.cts +568 -0
  273. package/dist/src/modules/recurrence/recurrence.repository.cjs +31 -0
  274. package/dist/src/modules/recurrence/recurrence.repository.cjs.map +1 -0
  275. package/dist/src/modules/recurrence/recurrence.repository.d.cts +588 -0
  276. package/dist/src/modules/recurrence/recurrence.service.cjs +66 -0
  277. package/dist/src/modules/recurrence/recurrence.service.cjs.map +1 -0
  278. package/dist/src/modules/recurrence/recurrence.service.d.cts +88 -0
  279. package/dist/src/modules/recurrence/recurrence.service.d.mts +2 -1
  280. package/dist/src/modules/recurrence/recurrence.service.mjs +1 -1
  281. package/dist/src/modules/recurrence/recurrence.service.mjs.map +1 -1
  282. package/dist/src/modules/recurrence/recurrence.trpc.cjs +46 -0
  283. package/dist/src/modules/recurrence/recurrence.trpc.cjs.map +1 -0
  284. package/dist/src/modules/recurrence/recurrence.trpc.d.cts +216 -0
  285. package/dist/src/modules/recurrence/recurrence.trpc.d.mts +2 -1
  286. package/dist/src/modules/social/social.dto.cjs +26 -0
  287. package/dist/src/modules/social/social.dto.cjs.map +1 -0
  288. package/dist/src/modules/social/social.dto.d.cts +39 -0
  289. package/dist/src/modules/social/social.linkedin.cjs +349 -0
  290. package/dist/src/modules/social/social.linkedin.cjs.map +1 -0
  291. package/dist/src/modules/social/social.linkedin.d.cts +15 -0
  292. package/dist/src/modules/social/social.service.cjs +57 -0
  293. package/dist/src/modules/social/social.service.cjs.map +1 -0
  294. package/dist/src/modules/social/social.service.d.cts +34 -0
  295. package/dist/src/modules/social/social.types.cjs +0 -0
  296. package/dist/src/modules/social/social.types.d.cts +40 -0
  297. package/dist/src/modules/tag/tag.db.cjs +43 -0
  298. package/dist/src/modules/tag/tag.db.cjs.map +1 -0
  299. package/dist/src/modules/tag/tag.db.d.cts +352 -0
  300. package/dist/src/modules/tag/tag.dto.cjs +15 -0
  301. package/dist/src/modules/tag/tag.dto.cjs.map +1 -0
  302. package/dist/src/modules/tag/tag.dto.d.cts +1025 -0
  303. package/dist/src/modules/tag/tag.repository.cjs +116 -0
  304. package/dist/src/modules/tag/tag.repository.cjs.map +1 -0
  305. package/dist/src/modules/tag/tag.repository.d.cts +394 -0
  306. package/dist/src/modules/tag/tag.service.cjs +48 -0
  307. package/dist/src/modules/tag/tag.service.cjs.map +1 -0
  308. package/dist/src/modules/tag/tag.service.d.cts +120 -0
  309. package/dist/src/modules/tag/tag.trpc.cjs +32 -0
  310. package/dist/src/modules/tag/tag.trpc.cjs.map +1 -0
  311. package/dist/src/modules/tag/tag.trpc.d.cts +174 -0
  312. package/dist/src/modules/tag/tag.trpc.d.mts +3 -2
  313. package/dist/src/modules/utils/applyPagination.cjs +16 -0
  314. package/dist/src/modules/utils/applyPagination.cjs.map +1 -0
  315. package/dist/src/modules/utils/applyPagination.d.cts +10 -0
  316. package/dist/src/modules/utils/applySorting.cjs +20 -0
  317. package/dist/src/modules/utils/applySorting.cjs.map +1 -0
  318. package/dist/src/modules/utils/applySorting.d.cts +13 -0
  319. package/dist/src/modules/utils/getConditionsFromFilters.cjs +152 -0
  320. package/dist/src/modules/utils/getConditionsFromFilters.cjs.map +1 -0
  321. package/dist/src/modules/utils/getConditionsFromFilters.d.cts +9 -0
  322. package/dist/src/modules/utils/getGlobalSearchCondition.cjs +30 -0
  323. package/dist/src/modules/utils/getGlobalSearchCondition.cjs.map +1 -0
  324. package/dist/src/modules/utils/getGlobalSearchCondition.d.cts +18 -0
  325. package/dist/src/modules/utils/getGlobalSearchCondition.d.mts +18 -0
  326. package/dist/src/modules/utils/getGlobalSearchCondition.mjs +26 -0
  327. package/dist/src/modules/utils/getGlobalSearchCondition.mjs.map +1 -0
  328. package/dist/src/modules/video/video.service.cjs +114 -0
  329. package/dist/src/modules/video/video.service.cjs.map +1 -0
  330. package/dist/src/modules/video/video.service.d.cts +12 -0
  331. package/dist/src/modules/video/video.service.mjs.map +1 -1
  332. package/dist/src/modules/webhook/webhook.constants.cjs +13 -0
  333. package/dist/src/modules/webhook/webhook.constants.cjs.map +1 -0
  334. package/dist/src/modules/webhook/webhook.constants.d.cts +12 -0
  335. package/dist/src/modules/webhook/webhook.db.cjs +19 -0
  336. package/dist/src/modules/webhook/webhook.db.cjs.map +1 -0
  337. package/dist/src/modules/webhook/webhook.db.d.cts +142 -0
  338. package/dist/src/modules/webhook/webhook.dto.cjs +11 -0
  339. package/dist/src/modules/webhook/webhook.dto.cjs.map +1 -0
  340. package/dist/src/modules/webhook/webhook.dto.d.cts +402 -0
  341. package/dist/src/modules/webhook/webhook.repository.cjs +52 -0
  342. package/dist/src/modules/webhook/webhook.repository.cjs.map +1 -0
  343. package/dist/src/modules/webhook/webhook.repository.d.cts +154 -0
  344. package/dist/src/modules/webhook/webhook.router.cjs +26 -0
  345. package/dist/src/modules/webhook/webhook.router.cjs.map +1 -0
  346. package/dist/src/modules/webhook/webhook.router.d.cts +8 -0
  347. package/dist/src/modules/webhook/webhook.service.cjs +61 -0
  348. package/dist/src/modules/webhook/webhook.service.cjs.map +1 -0
  349. package/dist/src/modules/webhook/webhook.service.d.cts +14 -0
  350. package/dist/src/modules/workflow/workflow.db.cjs +35 -0
  351. package/dist/src/modules/workflow/workflow.db.cjs.map +1 -0
  352. package/dist/src/modules/workflow/workflow.db.d.cts +302 -0
  353. package/dist/src/modules/workflow/workflow.repository.cjs +95 -0
  354. package/dist/src/modules/workflow/workflow.repository.cjs.map +1 -0
  355. package/dist/src/modules/workflow/workflow.repository.d.cts +371 -0
  356. package/dist/src/modules/workflow/workflow.service.cjs +41 -0
  357. package/dist/src/modules/workflow/workflow.service.cjs.map +1 -0
  358. package/dist/src/modules/workflow/workflow.service.d.cts +68 -0
  359. package/dist/src/modules/workflow/workflow.trpc.cjs +19 -0
  360. package/dist/src/modules/workflow/workflow.trpc.cjs.map +1 -0
  361. package/dist/src/modules/workflow/workflow.trpc.d.cts +65 -0
  362. package/dist/src/modules/workflow/workflow.types.cjs +0 -0
  363. package/dist/src/modules/workflow/workflow.types.d.cts +25 -0
  364. package/dist/src/modules/workflow/workflow.utils.cjs +185 -0
  365. package/dist/src/modules/workflow/workflow.utils.cjs.map +1 -0
  366. package/dist/src/modules/workflow/workflow.utils.d.cts +36 -0
  367. package/dist/src/types.cjs +12 -0
  368. package/dist/src/types.cjs.map +1 -0
  369. package/dist/src/types.d.cts +344 -0
  370. package/dist/src/types.d.mts +6 -6
  371. package/dist/src/utils/errors.cjs +101 -0
  372. package/dist/src/utils/errors.cjs.map +1 -0
  373. package/dist/src/utils/errors.d.cts +62 -0
  374. package/dist/src/utils/logger.cjs +13 -0
  375. package/dist/src/utils/logger.cjs.map +1 -0
  376. package/dist/src/utils/logger.d.cts +7 -0
  377. package/dist/src/utils/posthog.cjs +31 -0
  378. package/dist/src/utils/posthog.cjs.map +1 -0
  379. package/dist/src/utils/posthog.d.cts +17 -0
  380. package/dist/src/utils/trpc.cjs +156 -0
  381. package/dist/src/utils/trpc.cjs.map +1 -0
  382. package/dist/src/utils/trpc.d.cts +54 -0
  383. package/dist/src/utils/types.cjs +0 -0
  384. package/dist/src/utils/types.d.cts +9 -0
  385. package/package.json +171 -45
@@ -0,0 +1,269 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ require("../../../_virtual/_rolldown/runtime.cjs");
3
+ const require_src_utils_errors = require("../../utils/errors.cjs");
4
+ const require_src_modules_utils_applyPagination = require("../utils/applyPagination.cjs");
5
+ const require_src_modules_utils_applySorting = require("../utils/applySorting.cjs");
6
+ const require_src_modules_utils_getConditionsFromFilters = require("../utils/getConditionsFromFilters.cjs");
7
+ const require_src_modules_utils_getGlobalSearchCondition = require("../utils/getGlobalSearchCondition.cjs");
8
+ const require_src_modules_base_base_abstract = require("./base.abstract.cjs");
9
+ const require_src_modules_base_base_dto = require("./base.dto.cjs");
10
+ let drizzle_orm = require("drizzle-orm");
11
+ let neverthrow = require("neverthrow");
12
+ //#region src/modules/base/base.repository.ts
13
+ var ConditionBuilder = class {
14
+ constructor(conditions = []) {
15
+ this.conditions = conditions;
16
+ this.conditions = conditions;
17
+ }
18
+ push(condition) {
19
+ if (condition) this.conditions.push(condition);
20
+ }
21
+ join(type = "and") {
22
+ if (this.conditions.length === 0) return void 0;
23
+ if (this.conditions.length === 1) return this.conditions[0];
24
+ return type === "and" ? (0, drizzle_orm.and)(...this.conditions) : (0, drizzle_orm.or)(...this.conditions);
25
+ }
26
+ [Symbol.iterator]() {
27
+ return this.conditions[Symbol.iterator]();
28
+ }
29
+ };
30
+ var TableConditionBuilder = class extends ConditionBuilder {
31
+ table;
32
+ constructor(table) {
33
+ super();
34
+ this.table = table;
35
+ }
36
+ applyFilters({ filters } = {}) {
37
+ if (filters && filters.length > 0) require_src_modules_utils_getConditionsFromFilters.getConditionsFromFilters(this, filters, this.table);
38
+ }
39
+ applyGlobalSearch(q, columns) {
40
+ require_src_modules_utils_getGlobalSearchCondition.pushGlobalSearch(this, q, columns);
41
+ }
42
+ };
43
+ const arrayContains = (table, values) => {
44
+ const arrayContains = [];
45
+ for (const value of values) arrayContains.push((0, drizzle_orm.like)(table, `%"${value}%"`));
46
+ return (0, drizzle_orm.or)(...arrayContains);
47
+ };
48
+ var BaseRepository = class extends require_src_modules_base_base_abstract.Base {
49
+ orm;
50
+ schema;
51
+ repository;
52
+ constructor(options, repository) {
53
+ super("repository");
54
+ this.orm = options.orm;
55
+ this.schema = options.schema;
56
+ this.repository = repository;
57
+ }
58
+ getConditionBuilder(table) {
59
+ if (table === void 0) return new ConditionBuilder();
60
+ return new TableConditionBuilder(table);
61
+ }
62
+ throwableQuery(fn) {
63
+ return this.throwablePromise(() => fn(), (error) => new require_src_utils_errors.ServerError({
64
+ code: "INTERNAL_SERVER_ERROR",
65
+ layer: "repository",
66
+ layerName: this.constructor.name,
67
+ message: "Database query failed",
68
+ cause: error
69
+ }));
70
+ }
71
+ withPagination(query, { page, limit }) {
72
+ return require_src_modules_utils_applyPagination.applyPagination(query, limit, page);
73
+ }
74
+ withSorting(query, { sort, order }, table) {
75
+ if (!table) throw new Error("No table provided");
76
+ return require_src_modules_utils_applySorting.applySorting(query, table, sort, order);
77
+ }
78
+ withSortingAndPagination(query, { sort, order, page, limit }, table) {
79
+ if (!table) throw new Error("No table provided");
80
+ return this.withSorting(this.withPagination(query, {
81
+ page,
82
+ limit
83
+ }), {
84
+ sort,
85
+ order
86
+ }, table);
87
+ }
88
+ addUserIdFilter(userId, query) {
89
+ const userIdFilter = {
90
+ columnId: "userId",
91
+ type: "string",
92
+ method: "equals",
93
+ value: userId
94
+ };
95
+ return query ? {
96
+ ...query,
97
+ filters: [...query?.filters ?? [], userIdFilter]
98
+ } : { filters: [userIdFilter] };
99
+ }
100
+ helpers = {
101
+ pickColumns: require_src_modules_base_base_dto.pickColumns,
102
+ arrayContains,
103
+ ConditionBuilder
104
+ };
105
+ };
106
+ /**
107
+ * Generic table-bound repository with typed CRUD, returning ServerResultAsync via throwableAsync.
108
+ *
109
+ * Example:
110
+ * const userRepo = new UserRepository(db, schema);
111
+ * class UserRepository extends BaseTableRepository<typeof schema.user> {
112
+ * constructor(db: LibSQLDatabase<typeof schema>, schema: typeof schema) {
113
+ * super(db, schema, schema.user);
114
+ * }
115
+ * }
116
+ */
117
+ var BaseTableRepository = class extends BaseRepository {
118
+ table;
119
+ idKey;
120
+ idColumn;
121
+ constructor(options, repository) {
122
+ super({
123
+ orm: options.orm,
124
+ schema: options.schema
125
+ }, repository);
126
+ this.table = options.table;
127
+ this.idKey = options.idKey ?? "id";
128
+ this.idColumn = this.table[this.idKey];
129
+ }
130
+ withSorting(query, { sort, order }, table) {
131
+ return super.withSorting(query, {
132
+ sort,
133
+ order
134
+ }, table || this.table);
135
+ }
136
+ withSortingAndPagination(query, { sort, order, page, limit }, table) {
137
+ return super.withSortingAndPagination(query, {
138
+ sort,
139
+ order,
140
+ page,
141
+ limit
142
+ }, table || this.table);
143
+ }
144
+ async queryList(query, options, tx) {
145
+ return this.throwableAsync(async () => {
146
+ const db = tx ?? this.orm;
147
+ const conditions = options?.conditions ?? this.getConditionBuilder(this.table);
148
+ conditions.applyFilters(query);
149
+ if (options?.globalSearchColumns?.length) {
150
+ const columns = options.globalSearchColumns.map((c) => {
151
+ const column = this.table[c];
152
+ if (!column) throw new Error(`Column ${c} not found in table ${this.table.name}`);
153
+ return column;
154
+ });
155
+ conditions.applyGlobalSearch(query?.q, columns);
156
+ }
157
+ const whereClause = conditions.join();
158
+ const rowsQuery = this.withSortingAndPagination((options?.select ? db.select(options.select) : db.select()).from(this.table).where(whereClause), query || {});
159
+ const countQuery = db.select({ count: (0, drizzle_orm.count)() }).from(this.table).where(whereClause);
160
+ const [rows, [totalResult]] = await Promise.all([rowsQuery, countQuery]);
161
+ return (0, neverthrow.ok)({
162
+ rows,
163
+ total: totalResult?.count ?? 0
164
+ });
165
+ });
166
+ }
167
+ async findById(id, tx) {
168
+ return this.throwableAsync(async () => {
169
+ return (0, neverthrow.ok)((await (tx ?? this.orm).select().from(this.table).where((0, drizzle_orm.eq)(this.idColumn, id)))[0]);
170
+ });
171
+ }
172
+ async findManyById(ids, tx) {
173
+ return this.throwableAsync(async () => {
174
+ const db = tx ?? this.orm;
175
+ if (ids.length === 0) return (0, neverthrow.ok)([]);
176
+ return (0, neverthrow.ok)(await db.select().from(this.table).where((0, drizzle_orm.inArray)(this.idColumn, ids)));
177
+ });
178
+ }
179
+ async create(data, tx) {
180
+ return this.throwableAsync(async () => {
181
+ const rows = await (tx ?? this.orm).insert(this.table).values(data).returning();
182
+ if (rows.length === 0) return this.error("UNPROCESSABLE_CONTENT");
183
+ return (0, neverthrow.ok)(rows[0]);
184
+ });
185
+ }
186
+ async createMany(data, tx) {
187
+ return this.throwableAsync(async () => {
188
+ const db = tx ?? this.orm;
189
+ if (data.length === 0) return (0, neverthrow.ok)([]);
190
+ return (0, neverthrow.ok)(await db.insert(this.table).values(data).returning());
191
+ });
192
+ }
193
+ async update(data, tx) {
194
+ return this.throwableAsync(async () => {
195
+ const db = tx ?? this.orm;
196
+ const single = data;
197
+ const id = String(single[this.idKey]);
198
+ const { [this.idKey]: _removed, ...rest } = single;
199
+ const update = rest;
200
+ if (this.table.updatedAt) update.updatedAt = /* @__PURE__ */ new Date();
201
+ const [row] = await db.update(this.table).set(update).where((0, drizzle_orm.eq)(this.idColumn, id)).returning();
202
+ if (!row) return this.error("NOT_FOUND");
203
+ return (0, neverthrow.ok)(row);
204
+ });
205
+ }
206
+ async updateMany(data, tx) {
207
+ return this.throwableAsync(async () => {
208
+ const db = tx ?? this.orm;
209
+ if (data.length === 0) return (0, neverthrow.ok)([]);
210
+ const results = [];
211
+ for (const item of data) {
212
+ const record = item;
213
+ const id = String(record[this.idKey]);
214
+ const { [this.idKey]: _removed, ...rest } = record;
215
+ const update = rest;
216
+ if (this.table.updatedAt) update.updatedAt = /* @__PURE__ */ new Date();
217
+ const rows = await db.update(this.table).set(update).where((0, drizzle_orm.eq)(this.idColumn, id)).returning();
218
+ if (rows[0]) results.push(rows[0]);
219
+ }
220
+ return (0, neverthrow.ok)(results);
221
+ });
222
+ }
223
+ async softDeleteById(id, tx) {
224
+ return this.throwableAsync(async () => {
225
+ const db = tx ?? this.orm;
226
+ if (!this.table.deletedAt) return this.error("METHOD_NOT_SUPPORTED");
227
+ const rows = await db.update(this.table).set({ deletedAt: /* @__PURE__ */ new Date() }).where((0, drizzle_orm.eq)(this.idColumn, id)).returning({ id: this.idColumn });
228
+ if (rows.length === 0) return this.error("NOT_FOUND");
229
+ return (0, neverthrow.ok)(rows[0]);
230
+ });
231
+ }
232
+ async softDeleteManyById(ids, tx) {
233
+ return this.throwableAsync(async () => {
234
+ const db = tx ?? this.orm;
235
+ if (!this.table.deletedAt) return this.error("METHOD_NOT_SUPPORTED");
236
+ const rows = await db.update(this.table).set({ deletedAt: /* @__PURE__ */ new Date() }).where((0, drizzle_orm.inArray)(this.idColumn, ids)).returning({ id: this.idColumn });
237
+ if (rows.length === 0) return this.error("NOT_FOUND");
238
+ return (0, neverthrow.ok)(rows);
239
+ });
240
+ }
241
+ async deleteById(id, tx) {
242
+ return this.throwableAsync(async () => {
243
+ const rows = await (tx ?? this.orm).delete(this.table).where((0, drizzle_orm.eq)(this.idColumn, id)).returning({ id: this.idColumn });
244
+ if (rows.length === 0) return this.error("NOT_FOUND");
245
+ return (0, neverthrow.ok)(rows[0]);
246
+ });
247
+ }
248
+ async deleteManyById(ids, tx) {
249
+ return this.throwableAsync(async () => {
250
+ const db = tx ?? this.orm;
251
+ if (ids.length === 0) return (0, neverthrow.ok)([]);
252
+ return (0, neverthrow.ok)(await db.delete(this.table).where((0, drizzle_orm.inArray)(this.idColumn, ids)).returning({ id: this.idColumn }));
253
+ });
254
+ }
255
+ };
256
+ var BaseExternaRepository = class extends require_src_modules_base_base_abstract.Base {
257
+ constructor() {
258
+ super("repository");
259
+ }
260
+ };
261
+ //#endregion
262
+ exports.BaseExternaRepository = BaseExternaRepository;
263
+ exports.BaseRepository = BaseRepository;
264
+ exports.BaseTableRepository = BaseTableRepository;
265
+ exports.ConditionBuilder = ConditionBuilder;
266
+ exports.TableConditionBuilder = TableConditionBuilder;
267
+ exports.arrayContains = arrayContains;
268
+
269
+ //# sourceMappingURL=base.repository.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.repository.cjs","names":["Base","ServerError","applyPagination","applySorting"],"sources":["../../../../src/modules/base/base.repository.ts"],"sourcesContent":["import type {\r\n QueryFilter,\r\n QueryFilters,\r\n QueryInput,\r\n} from \"@m5kdev/commons/modules/schemas/query.schema\";\r\nimport {\r\n and,\r\n count,\r\n eq,\r\n type InferInsertModel,\r\n type InferSelectModel,\r\n inArray,\r\n like,\r\n or,\r\n type SelectedFields,\r\n type SQL,\r\n} from \"drizzle-orm\";\r\nimport type { LibSQLDatabase } from \"drizzle-orm/libsql\";\r\nimport type { SQLiteColumn, SQLiteTableWithColumns } from \"drizzle-orm/sqlite-core\";\r\nimport { ok } from \"neverthrow\";\r\nimport { ServerError } from \"../../utils/errors\";\r\nimport { applyPagination } from \"../utils/applyPagination\";\r\nimport { applySorting } from \"../utils/applySorting\";\r\nimport { getConditionsFromFilters } from \"../utils/getConditionsFromFilters\";\r\nimport { pushGlobalSearch } from \"../utils/getGlobalSearchCondition\";\r\nimport { Base } from \"./base.abstract\";\r\nimport { pickColumns, type ServerResult, type ServerResultAsync } from \"./base.dto\";\r\n\r\n/** Payload for update/updateMany: id key required (string), other table fields optional. */\r\nexport type TableUpdatePayload<\r\n TTable extends SQLiteTableWithColumns<any>,\r\n TIdKey extends Extract<keyof InferSelectModel<TTable>, string> = \"id\",\r\n> = Record<TIdKey, string> & Partial<Omit<InferSelectModel<TTable>, TIdKey>>;\r\n\r\nexport class ConditionBuilder {\r\n constructor(private conditions: SQL[] = []) {\r\n this.conditions = conditions;\r\n }\r\n\r\n push(condition?: SQL) {\r\n if (condition) this.conditions.push(condition);\r\n }\r\n\r\n join(type: \"and\" | \"or\" = \"and\") {\r\n if (this.conditions.length === 0) return undefined;\r\n if (this.conditions.length === 1) return this.conditions[0];\r\n return type === \"and\" ? and(...this.conditions) : or(...this.conditions);\r\n }\r\n\r\n [Symbol.iterator]() {\r\n return this.conditions[Symbol.iterator]();\r\n }\r\n}\r\n\r\nexport class TableConditionBuilder<\r\n TTable extends SQLiteTableWithColumns<any>,\r\n> extends ConditionBuilder {\r\n private table: TTable;\r\n\r\n constructor(table: TTable) {\r\n super();\r\n this.table = table;\r\n }\r\n\r\n applyFilters({ filters }: { filters?: QueryFilters } = {}) {\r\n if (filters && filters.length > 0) getConditionsFromFilters(this, filters, this.table);\r\n }\r\n\r\n applyGlobalSearch(q: string | undefined, columns: readonly SQLiteColumn[]) {\r\n pushGlobalSearch(this, q, columns);\r\n }\r\n}\r\n\r\nexport const arrayContains = (table: SQLiteColumn, values: string[]) => {\r\n const arrayContains: SQL[] = [];\r\n for (const value of values) {\r\n arrayContains.push(like(table, `%\"${value}%\"`));\r\n }\r\n return or(...arrayContains);\r\n};\r\n\r\nexport class BaseRepository<\r\n O extends LibSQLDatabase<any>,\r\n S extends Record<string, SQLiteTableWithColumns<any>>,\r\n R extends Record<string, BaseRepository<any, any, any> | BaseExternaRepository>,\r\n> extends Base {\r\n protected orm: O;\r\n protected schema: S;\r\n public repository?: R;\r\n\r\n constructor(options: { orm: O; schema: S }, repository?: R) {\r\n super(\"repository\");\r\n this.orm = options.orm;\r\n this.schema = options.schema;\r\n this.repository = repository;\r\n }\r\n getConditionBuilder(): ConditionBuilder;\r\n getConditionBuilder(table: undefined): ConditionBuilder;\r\n getConditionBuilder<TTable extends SQLiteTableWithColumns<any>>(\r\n table: TTable\r\n ): TableConditionBuilder<TTable>;\r\n getConditionBuilder<TTable extends SQLiteTableWithColumns<any>>(\r\n table?: TTable\r\n ): ConditionBuilder | TableConditionBuilder<TTable> {\r\n if (table === undefined) {\r\n return new ConditionBuilder();\r\n }\r\n return new TableConditionBuilder(table);\r\n }\r\n throwableQuery<T>(fn: () => Promise<T>): ServerResultAsync<T> {\r\n return this.throwablePromise(\r\n () => fn(),\r\n (error) =>\r\n new ServerError({\r\n code: \"INTERNAL_SERVER_ERROR\",\r\n layer: \"repository\",\r\n layerName: this.constructor.name,\r\n message: \"Database query failed\",\r\n cause: error,\r\n })\r\n );\r\n }\r\n\r\n withPagination<TQuery>(\r\n query: TQuery,\r\n { page, limit }: Pick<QueryInput, \"page\" | \"limit\">\r\n ): TQuery {\r\n return applyPagination(query, limit, page);\r\n }\r\n\r\n withSorting<TTable extends SQLiteTableWithColumns<any>, TQuery>(\r\n query: TQuery,\r\n { sort, order }: Pick<QueryInput, \"sort\" | \"order\">,\r\n table?: TTable\r\n ): TQuery {\r\n if (!table) throw new Error(\"No table provided\");\r\n return applySorting(query, table, sort, order);\r\n }\r\n\r\n withSortingAndPagination<TTable extends SQLiteTableWithColumns<any>, TQuery>(\r\n query: TQuery,\r\n { sort, order, page, limit }: Pick<QueryInput, \"sort\" | \"order\" | \"page\" | \"limit\">,\r\n table?: TTable\r\n ): TQuery {\r\n if (!table) throw new Error(\"No table provided\");\r\n return this.withSorting(this.withPagination(query, { page, limit }), { sort, order }, table);\r\n }\r\n\r\n addUserIdFilter(userId: string, query?: QueryInput): QueryInput {\r\n const userIdFilter: QueryFilter = {\r\n columnId: \"userId\",\r\n type: \"string\",\r\n method: \"equals\",\r\n value: userId,\r\n };\r\n return query\r\n ? { ...query, filters: [...(query?.filters ?? []), userIdFilter] }\r\n : { filters: [userIdFilter] };\r\n }\r\n\r\n helpers = {\r\n pickColumns,\r\n arrayContains,\r\n ConditionBuilder,\r\n };\r\n}\r\n\r\n/**\r\n * Generic table-bound repository with typed CRUD, returning ServerResultAsync via throwableAsync.\r\n *\r\n * Example:\r\n * const userRepo = new UserRepository(db, schema);\r\n * class UserRepository extends BaseTableRepository<typeof schema.user> {\r\n * constructor(db: LibSQLDatabase<typeof schema>, schema: typeof schema) {\r\n * super(db, schema, schema.user);\r\n * }\r\n * }\r\n */\r\nexport class BaseTableRepository<\r\n O extends LibSQLDatabase<any>,\r\n S extends Record<string, SQLiteTableWithColumns<any>>,\r\n R extends Record<string, BaseRepository<any, any, any> | BaseExternaRepository>,\r\n TTable extends SQLiteTableWithColumns<any>,\r\n TIdKey extends Extract<keyof InferSelectModel<TTable>, string> = \"id\",\r\n> extends BaseRepository<O, S, R> {\r\n protected readonly table: TTable;\r\n protected readonly idKey: TIdKey;\r\n protected readonly idColumn: SQLiteColumn;\r\n\r\n constructor(options: { orm: O; schema: S; table: TTable; idKey?: TIdKey }, repository?: R) {\r\n super({ orm: options.orm, schema: options.schema }, repository);\r\n this.table = options.table;\r\n this.idKey = options.idKey ?? (\"id\" as TIdKey);\r\n this.idColumn = (this.table as any)[this.idKey] as SQLiteColumn;\r\n }\r\n\r\n override withSorting<TQuery>(\r\n query: TQuery,\r\n { sort, order }: Pick<QueryInput, \"sort\" | \"order\">,\r\n table?: SQLiteTableWithColumns<any>\r\n ): TQuery {\r\n return super.withSorting(query, { sort, order }, table || this.table);\r\n }\r\n\r\n override withSortingAndPagination<MTable extends SQLiteTableWithColumns<any>, TQuery>(\r\n query: TQuery,\r\n { sort, order, page, limit }: Pick<QueryInput, \"sort\" | \"order\" | \"page\" | \"limit\">,\r\n table?: MTable\r\n ): TQuery {\r\n return super.withSortingAndPagination(query, { sort, order, page, limit }, table || this.table);\r\n }\r\n\r\n async queryList(\r\n query?: QueryInput,\r\n options?: {\r\n conditions?: TableConditionBuilder<TTable>;\r\n select?: SelectedFields<SQLiteColumn, TTable>;\r\n globalSearchColumns?: string[];\r\n },\r\n tx?: O\r\n ): ServerResultAsync<{ rows: InferSelectModel<TTable>[]; total: number }> {\r\n return this.throwableAsync(async () => {\r\n type Row = InferSelectModel<TTable>;\r\n\r\n const db = tx ?? this.orm;\r\n const conditions = options?.conditions ?? this.getConditionBuilder(this.table);\r\n conditions.applyFilters(query);\r\n if (options?.globalSearchColumns?.length) {\r\n const columns = options.globalSearchColumns.map((c) => {\r\n const column = this.table[c as keyof TTable] as SQLiteColumn;\r\n if (!column) {\r\n throw new Error(`Column ${c} not found in table ${this.table.name}`);\r\n }\r\n return column;\r\n });\r\n conditions.applyGlobalSearch(query?.q, columns);\r\n }\r\n const whereClause = conditions.join();\r\n const rowsQuery = this.withSortingAndPagination(\r\n (options?.select ? db.select(options.select) : db.select())\r\n .from(this.table as any)\r\n .where(whereClause),\r\n query || {}\r\n );\r\n const countQuery = db\r\n .select({ count: count() })\r\n .from(this.table as any)\r\n .where(whereClause);\r\n const [rows, [totalResult]] = await Promise.all([rowsQuery, countQuery]);\r\n\r\n return ok({ rows: rows as Row[], total: totalResult?.count ?? 0 });\r\n });\r\n }\r\n\r\n async findById(id: string, tx?: O): ServerResultAsync<InferSelectModel<TTable> | undefined> {\r\n return this.throwableAsync(async () => {\r\n const db = tx ?? this.orm;\r\n type Row = InferSelectModel<TTable>;\r\n\r\n const rows = (await db\r\n .select()\r\n .from(this.table as any)\r\n .where(eq(this.idColumn as SQLiteColumn, id))) as Row[];\r\n\r\n return ok(rows[0]);\r\n });\r\n }\r\n\r\n async findManyById(\r\n ids: readonly string[],\r\n tx?: O\r\n ): ServerResultAsync<Array<InferSelectModel<TTable>>> {\r\n return this.throwableAsync(async () => {\r\n const db = tx ?? this.orm;\r\n type Row = InferSelectModel<TTable>;\r\n\r\n if (ids.length === 0) {\r\n return ok<Row[]>([]);\r\n }\r\n\r\n const rows = (await db\r\n .select()\r\n .from(this.table as any)\r\n .where(inArray(this.idColumn as SQLiteColumn, ids as string[]))) as Row[];\r\n\r\n return ok(rows);\r\n });\r\n }\r\n\r\n async create(\r\n data: InferInsertModel<TTable>,\r\n tx?: O\r\n ): ServerResultAsync<InferSelectModel<TTable>> {\r\n return this.throwableAsync(async () => {\r\n const db = tx ?? this.orm;\r\n type Row = InferSelectModel<TTable>;\r\n\r\n const rows = (await db\r\n .insert(this.table as any)\r\n .values(data as any)\r\n .returning()) as unknown as Row[];\r\n\r\n if (rows.length === 0) return this.error(\"UNPROCESSABLE_CONTENT\");\r\n return ok(rows[0] as Row);\r\n });\r\n }\r\n\r\n async createMany(\r\n data: readonly InferInsertModel<TTable>[],\r\n tx?: O\r\n ): ServerResultAsync<Array<InferSelectModel<TTable>>> {\r\n return this.throwableAsync(async () => {\r\n const db = tx ?? this.orm;\r\n type Row = InferSelectModel<TTable>;\r\n\r\n if (data.length === 0) {\r\n return ok<Row[]>([]);\r\n }\r\n\r\n const rows = (await db\r\n .insert(this.table as any)\r\n .values(data as any)\r\n .returning()) as unknown as Row[];\r\n\r\n return ok(rows as Row[]);\r\n });\r\n }\r\n\r\n async update(\r\n data: TableUpdatePayload<TTable, TIdKey>,\r\n tx?: O\r\n ): ServerResultAsync<InferSelectModel<TTable>> {\r\n return this.throwableAsync(async () => {\r\n const db = tx ?? this.orm;\r\n type Row = InferSelectModel<TTable>;\r\n\r\n const single = data as Record<string, unknown>;\r\n const id = String(single[this.idKey]);\r\n const { [this.idKey]: _removed, ...rest } = single;\r\n const update = rest;\r\n if (this.table.updatedAt) (update as any).updatedAt = new Date();\r\n const rows = (await db\r\n .update(this.table as any)\r\n .set(update as unknown as Partial<InferInsertModel<TTable>>)\r\n .where(eq(this.idColumn as SQLiteColumn, id))\r\n .returning()) as unknown as Row[];\r\n const [row] = rows;\r\n\r\n if (!row) return this.error(\"NOT_FOUND\");\r\n return ok(row) as ServerResult<Row>;\r\n });\r\n }\r\n\r\n async updateMany(\r\n data: readonly TableUpdatePayload<TTable, TIdKey>[],\r\n tx?: O\r\n ): ServerResultAsync<Array<InferSelectModel<TTable>>> {\r\n return this.throwableAsync(async () => {\r\n const db = tx ?? this.orm;\r\n type Row = InferSelectModel<TTable>;\r\n\r\n if (data.length === 0) {\r\n return ok<Row[]>([]);\r\n }\r\n\r\n const results: Row[] = [];\r\n for (const item of data) {\r\n const record = item as Record<string, unknown>;\r\n const id = String(record[this.idKey]);\r\n const { [this.idKey]: _removed, ...rest } = record;\r\n const update = rest;\r\n if (this.table.updatedAt) (update as any).updatedAt = new Date();\r\n const rows = (await db\r\n .update(this.table as any)\r\n .set(update as unknown as Partial<InferInsertModel<TTable>>)\r\n .where(eq(this.idColumn as SQLiteColumn, id))\r\n .returning()) as unknown as Row[];\r\n if (rows[0]) results.push(rows[0]);\r\n }\r\n\r\n return ok(results) as ServerResult<Row[]>;\r\n });\r\n }\r\n\r\n async softDeleteById(id: string, tx?: O): ServerResultAsync<{ id: string }> {\r\n return this.throwableAsync(async () => {\r\n const db = tx ?? this.orm;\r\n if (!this.table.deletedAt) return this.error(\"METHOD_NOT_SUPPORTED\");\r\n\r\n const rows = await db\r\n .update(this.table as any)\r\n .set({ deletedAt: new Date() })\r\n .where(eq(this.idColumn as SQLiteColumn, id))\r\n .returning({\r\n id: this.idColumn as SQLiteColumn,\r\n });\r\n\r\n if (rows.length === 0) return this.error(\"NOT_FOUND\");\r\n return ok(rows[0] as { id: string });\r\n });\r\n }\r\n\r\n async softDeleteManyById(\r\n ids: readonly string[],\r\n tx?: O\r\n ): ServerResultAsync<Array<{ id: string }>> {\r\n return this.throwableAsync(async () => {\r\n const db = tx ?? this.orm;\r\n if (!this.table.deletedAt) return this.error(\"METHOD_NOT_SUPPORTED\");\r\n\r\n const rows = await db\r\n .update(this.table as any)\r\n .set({ deletedAt: new Date() })\r\n .where(inArray(this.idColumn as SQLiteColumn, ids as string[]))\r\n .returning({\r\n id: this.idColumn as SQLiteColumn,\r\n });\r\n if (rows.length === 0) return this.error(\"NOT_FOUND\");\r\n return ok(rows as { id: string }[]);\r\n });\r\n }\r\n\r\n async deleteById(id: string, tx?: O): ServerResultAsync<{ id: string }> {\r\n return this.throwableAsync(async () => {\r\n const db = tx ?? this.orm;\r\n\r\n const rows = await db\r\n .delete(this.table as any)\r\n .where(eq(this.idColumn as SQLiteColumn, id))\r\n .returning({\r\n id: this.idColumn as SQLiteColumn,\r\n });\r\n\r\n if (rows.length === 0) return this.error(\"NOT_FOUND\");\r\n return ok(rows[0] as { id: string });\r\n });\r\n }\r\n\r\n async deleteManyById(ids: readonly string[], tx?: O): ServerResultAsync<Array<{ id: string }>> {\r\n return this.throwableAsync(async () => {\r\n const db = tx ?? this.orm;\r\n\r\n if (ids.length === 0) {\r\n return ok<{ id: string }[]>([]);\r\n }\r\n\r\n const rows = await db\r\n .delete(this.table as any)\r\n .where(inArray(this.idColumn as SQLiteColumn, ids as string[]))\r\n .returning({\r\n id: this.idColumn as SQLiteColumn,\r\n });\r\n\r\n return ok(rows as { id: string }[]);\r\n });\r\n }\r\n}\r\n\r\nexport class BaseExternaRepository extends Base {\r\n constructor() {\r\n super(\"repository\");\r\n }\r\n}\r\n"],"mappings":"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"}
@@ -0,0 +1,125 @@
1
+ import { ServerResultAsync, pickColumns } from "./base.dto.cjs";
2
+ import { Base } from "./base.abstract.cjs";
3
+ import { SQLiteColumn, SQLiteTableWithColumns } from "drizzle-orm/sqlite-core";
4
+ import { LibSQLDatabase } from "drizzle-orm/libsql";
5
+ import { InferInsertModel, InferSelectModel, SQL, SelectedFields } from "drizzle-orm";
6
+ import { QueryFilters, QueryInput } from "@m5kdev/commons/modules/schemas/query.schema";
7
+
8
+ //#region src/modules/base/base.repository.d.ts
9
+ /** Payload for update/updateMany: id key required (string), other table fields optional. */
10
+ type TableUpdatePayload<TTable extends SQLiteTableWithColumns<any>, TIdKey extends Extract<keyof InferSelectModel<TTable>, string> = "id"> = Record<TIdKey, string> & Partial<Omit<InferSelectModel<TTable>, TIdKey>>;
11
+ declare class ConditionBuilder {
12
+ private conditions;
13
+ constructor(conditions?: SQL[]);
14
+ push(condition?: SQL): void;
15
+ join(type?: "and" | "or"): SQL<unknown> | undefined;
16
+ [Symbol.iterator](): ArrayIterator<SQL<unknown>>;
17
+ }
18
+ declare class TableConditionBuilder<TTable extends SQLiteTableWithColumns<any>> extends ConditionBuilder {
19
+ private table;
20
+ constructor(table: TTable);
21
+ applyFilters({
22
+ filters
23
+ }?: {
24
+ filters?: QueryFilters;
25
+ }): void;
26
+ applyGlobalSearch(q: string | undefined, columns: readonly SQLiteColumn[]): void;
27
+ }
28
+ declare const arrayContains: (table: SQLiteColumn, values: string[]) => SQL<unknown> | undefined;
29
+ declare class BaseRepository<O extends LibSQLDatabase<any>, S extends Record<string, SQLiteTableWithColumns<any>>, R extends Record<string, BaseRepository<any, any, any> | BaseExternaRepository>> extends Base {
30
+ protected orm: O;
31
+ protected schema: S;
32
+ repository?: R;
33
+ constructor(options: {
34
+ orm: O;
35
+ schema: S;
36
+ }, repository?: R);
37
+ getConditionBuilder(): ConditionBuilder;
38
+ getConditionBuilder(table: undefined): ConditionBuilder;
39
+ getConditionBuilder<TTable extends SQLiteTableWithColumns<any>>(table: TTable): TableConditionBuilder<TTable>;
40
+ throwableQuery<T>(fn: () => Promise<T>): ServerResultAsync<T>;
41
+ withPagination<TQuery>(query: TQuery, {
42
+ page,
43
+ limit
44
+ }: Pick<QueryInput, "page" | "limit">): TQuery;
45
+ withSorting<TTable extends SQLiteTableWithColumns<any>, TQuery>(query: TQuery, {
46
+ sort,
47
+ order
48
+ }: Pick<QueryInput, "sort" | "order">, table?: TTable): TQuery;
49
+ withSortingAndPagination<TTable extends SQLiteTableWithColumns<any>, TQuery>(query: TQuery, {
50
+ sort,
51
+ order,
52
+ page,
53
+ limit
54
+ }: Pick<QueryInput, "sort" | "order" | "page" | "limit">, table?: TTable): TQuery;
55
+ addUserIdFilter(userId: string, query?: QueryInput): QueryInput;
56
+ helpers: {
57
+ pickColumns: typeof pickColumns;
58
+ arrayContains: (table: SQLiteColumn, values: string[]) => SQL<unknown> | undefined;
59
+ ConditionBuilder: typeof ConditionBuilder;
60
+ };
61
+ }
62
+ /**
63
+ * Generic table-bound repository with typed CRUD, returning ServerResultAsync via throwableAsync.
64
+ *
65
+ * Example:
66
+ * const userRepo = new UserRepository(db, schema);
67
+ * class UserRepository extends BaseTableRepository<typeof schema.user> {
68
+ * constructor(db: LibSQLDatabase<typeof schema>, schema: typeof schema) {
69
+ * super(db, schema, schema.user);
70
+ * }
71
+ * }
72
+ */
73
+ declare class BaseTableRepository<O extends LibSQLDatabase<any>, S extends Record<string, SQLiteTableWithColumns<any>>, R extends Record<string, BaseRepository<any, any, any> | BaseExternaRepository>, TTable extends SQLiteTableWithColumns<any>, TIdKey extends Extract<keyof InferSelectModel<TTable>, string> = "id"> extends BaseRepository<O, S, R> {
74
+ protected readonly table: TTable;
75
+ protected readonly idKey: TIdKey;
76
+ protected readonly idColumn: SQLiteColumn;
77
+ constructor(options: {
78
+ orm: O;
79
+ schema: S;
80
+ table: TTable;
81
+ idKey?: TIdKey;
82
+ }, repository?: R);
83
+ withSorting<TQuery>(query: TQuery, {
84
+ sort,
85
+ order
86
+ }: Pick<QueryInput, "sort" | "order">, table?: SQLiteTableWithColumns<any>): TQuery;
87
+ withSortingAndPagination<MTable extends SQLiteTableWithColumns<any>, TQuery>(query: TQuery, {
88
+ sort,
89
+ order,
90
+ page,
91
+ limit
92
+ }: Pick<QueryInput, "sort" | "order" | "page" | "limit">, table?: MTable): TQuery;
93
+ queryList(query?: QueryInput, options?: {
94
+ conditions?: TableConditionBuilder<TTable>;
95
+ select?: SelectedFields<SQLiteColumn, TTable>;
96
+ globalSearchColumns?: string[];
97
+ }, tx?: O): ServerResultAsync<{
98
+ rows: InferSelectModel<TTable>[];
99
+ total: number;
100
+ }>;
101
+ findById(id: string, tx?: O): ServerResultAsync<InferSelectModel<TTable> | undefined>;
102
+ findManyById(ids: readonly string[], tx?: O): ServerResultAsync<Array<InferSelectModel<TTable>>>;
103
+ create(data: InferInsertModel<TTable>, tx?: O): ServerResultAsync<InferSelectModel<TTable>>;
104
+ createMany(data: readonly InferInsertModel<TTable>[], tx?: O): ServerResultAsync<Array<InferSelectModel<TTable>>>;
105
+ update(data: TableUpdatePayload<TTable, TIdKey>, tx?: O): ServerResultAsync<InferSelectModel<TTable>>;
106
+ updateMany(data: readonly TableUpdatePayload<TTable, TIdKey>[], tx?: O): ServerResultAsync<Array<InferSelectModel<TTable>>>;
107
+ softDeleteById(id: string, tx?: O): ServerResultAsync<{
108
+ id: string;
109
+ }>;
110
+ softDeleteManyById(ids: readonly string[], tx?: O): ServerResultAsync<Array<{
111
+ id: string;
112
+ }>>;
113
+ deleteById(id: string, tx?: O): ServerResultAsync<{
114
+ id: string;
115
+ }>;
116
+ deleteManyById(ids: readonly string[], tx?: O): ServerResultAsync<Array<{
117
+ id: string;
118
+ }>>;
119
+ }
120
+ declare class BaseExternaRepository extends Base {
121
+ constructor();
122
+ }
123
+ //#endregion
124
+ export { BaseExternaRepository, BaseRepository, BaseTableRepository, ConditionBuilder, TableConditionBuilder, TableUpdatePayload, arrayContains };
125
+ //# sourceMappingURL=base.repository.d.cts.map
@@ -23,6 +23,7 @@ declare class TableConditionBuilder<TTable extends SQLiteTableWithColumns<any>>
23
23
  }?: {
24
24
  filters?: QueryFilters;
25
25
  }): void;
26
+ applyGlobalSearch(q: string | undefined, columns: readonly SQLiteColumn[]): void;
26
27
  }
27
28
  declare const arrayContains: (table: SQLiteColumn, values: string[]) => SQL<unknown> | undefined;
28
29
  declare class BaseRepository<O extends LibSQLDatabase<any>, S extends Record<string, SQLiteTableWithColumns<any>>, R extends Record<string, BaseRepository<any, any, any> | BaseExternaRepository>> extends Base {
@@ -92,6 +93,7 @@ declare class BaseTableRepository<O extends LibSQLDatabase<any>, S extends Recor
92
93
  queryList(query?: QueryInput, options?: {
93
94
  conditions?: TableConditionBuilder<TTable>;
94
95
  select?: SelectedFields<SQLiteColumn, TTable>;
96
+ globalSearchColumns?: string[];
95
97
  }, tx?: O): ServerResultAsync<{
96
98
  rows: InferSelectModel<TTable>[];
97
99
  total: number;
@@ -2,6 +2,7 @@ import { ServerError } from "../../utils/errors.mjs";
2
2
  import { applyPagination } from "../utils/applyPagination.mjs";
3
3
  import { applySorting } from "../utils/applySorting.mjs";
4
4
  import { getConditionsFromFilters } from "../utils/getConditionsFromFilters.mjs";
5
+ import { pushGlobalSearch } from "../utils/getGlobalSearchCondition.mjs";
5
6
  import { Base } from "./base.abstract.mjs";
6
7
  import { pickColumns } from "./base.dto.mjs";
7
8
  import { and, count, eq, inArray, like, or } from "drizzle-orm";
@@ -33,6 +34,9 @@ var TableConditionBuilder = class extends ConditionBuilder {
33
34
  applyFilters({ filters } = {}) {
34
35
  if (filters && filters.length > 0) getConditionsFromFilters(this, filters, this.table);
35
36
  }
37
+ applyGlobalSearch(q, columns) {
38
+ pushGlobalSearch(this, q, columns);
39
+ }
36
40
  };
37
41
  const arrayContains = (table, values) => {
38
42
  const arrayContains = [];
@@ -140,6 +144,14 @@ var BaseTableRepository = class extends BaseRepository {
140
144
  const db = tx ?? this.orm;
141
145
  const conditions = options?.conditions ?? this.getConditionBuilder(this.table);
142
146
  conditions.applyFilters(query);
147
+ if (options?.globalSearchColumns?.length) {
148
+ const columns = options.globalSearchColumns.map((c) => {
149
+ const column = this.table[c];
150
+ if (!column) throw new Error(`Column ${c} not found in table ${this.table.name}`);
151
+ return column;
152
+ });
153
+ conditions.applyGlobalSearch(query?.q, columns);
154
+ }
143
155
  const whereClause = conditions.join();
144
156
  const rowsQuery = this.withSortingAndPagination((options?.select ? db.select(options.select) : db.select()).from(this.table).where(whereClause), query || {});
145
157
  const countQuery = db.select({ count: count() }).from(this.table).where(whereClause);
@@ -1 +1 @@
1
- {"version":3,"file":"base.repository.mjs","names":[],"sources":["../../../../src/modules/base/base.repository.ts"],"sourcesContent":["import type {\r\n QueryFilter,\r\n QueryFilters,\r\n QueryInput,\r\n} from \"@m5kdev/commons/modules/schemas/query.schema\";\r\nimport {\r\n and,\r\n count,\r\n eq,\r\n type InferInsertModel,\r\n type InferSelectModel,\r\n inArray,\r\n like,\r\n or,\r\n type SelectedFields,\r\n type SQL,\r\n} from \"drizzle-orm\";\r\nimport type { LibSQLDatabase } from \"drizzle-orm/libsql\";\r\nimport type { SQLiteColumn, SQLiteTableWithColumns } from \"drizzle-orm/sqlite-core\";\r\nimport { ok } from \"neverthrow\";\r\nimport { ServerError } from \"../../utils/errors\";\r\nimport { applyPagination } from \"../utils/applyPagination\";\r\nimport { applySorting } from \"../utils/applySorting\";\r\nimport { getConditionsFromFilters } from \"../utils/getConditionsFromFilters\";\r\nimport { Base } from \"./base.abstract\";\r\nimport { pickColumns, type ServerResult, type ServerResultAsync } from \"./base.dto\";\r\n\r\n/** Payload for update/updateMany: id key required (string), other table fields optional. */\r\nexport type TableUpdatePayload<\r\n TTable extends SQLiteTableWithColumns<any>,\r\n TIdKey extends Extract<keyof InferSelectModel<TTable>, string> = \"id\",\r\n> = Record<TIdKey, string> & Partial<Omit<InferSelectModel<TTable>, TIdKey>>;\r\n\r\nexport class ConditionBuilder {\r\n constructor(private conditions: SQL[] = []) {\r\n this.conditions = conditions;\r\n }\r\n\r\n push(condition?: SQL) {\r\n if (condition) this.conditions.push(condition);\r\n }\r\n\r\n join(type: \"and\" | \"or\" = \"and\") {\r\n if (this.conditions.length === 0) return undefined;\r\n if (this.conditions.length === 1) return this.conditions[0];\r\n return type === \"and\" ? and(...this.conditions) : or(...this.conditions);\r\n }\r\n\r\n [Symbol.iterator]() {\r\n return this.conditions[Symbol.iterator]();\r\n }\r\n}\r\n\r\nexport class TableConditionBuilder<\r\n TTable extends SQLiteTableWithColumns<any>,\r\n> extends ConditionBuilder {\r\n private table: TTable;\r\n\r\n constructor(table: TTable) {\r\n super();\r\n this.table = table;\r\n }\r\n\r\n applyFilters({ filters }: { filters?: QueryFilters } = {}) {\r\n if (filters && filters.length > 0) getConditionsFromFilters(this, filters, this.table);\r\n }\r\n}\r\n\r\nexport const arrayContains = (table: SQLiteColumn, values: string[]) => {\r\n const arrayContains: SQL[] = [];\r\n for (const value of values) {\r\n arrayContains.push(like(table, `%\"${value}%\"`));\r\n }\r\n return or(...arrayContains);\r\n};\r\n\r\nexport class BaseRepository<\r\n O extends LibSQLDatabase<any>,\r\n S extends Record<string, SQLiteTableWithColumns<any>>,\r\n R extends Record<string, BaseRepository<any, any, any> | BaseExternaRepository>,\r\n> extends Base {\r\n protected orm: O;\r\n protected schema: S;\r\n public repository?: R;\r\n\r\n constructor(options: { orm: O; schema: S }, repository?: R) {\r\n super(\"repository\");\r\n this.orm = options.orm;\r\n this.schema = options.schema;\r\n this.repository = repository;\r\n }\r\n getConditionBuilder(): ConditionBuilder;\r\n getConditionBuilder(table: undefined): ConditionBuilder;\r\n getConditionBuilder<TTable extends SQLiteTableWithColumns<any>>(\r\n table: TTable\r\n ): TableConditionBuilder<TTable>;\r\n getConditionBuilder<TTable extends SQLiteTableWithColumns<any>>(\r\n table?: TTable\r\n ): ConditionBuilder | TableConditionBuilder<TTable> {\r\n if (table === undefined) {\r\n return new ConditionBuilder();\r\n }\r\n return new TableConditionBuilder(table);\r\n }\r\n throwableQuery<T>(fn: () => Promise<T>): ServerResultAsync<T> {\r\n return this.throwablePromise(\r\n () => fn(),\r\n (error) =>\r\n new ServerError({\r\n code: \"INTERNAL_SERVER_ERROR\",\r\n layer: \"repository\",\r\n layerName: this.constructor.name,\r\n message: \"Database query failed\",\r\n cause: error,\r\n })\r\n );\r\n }\r\n\r\n withPagination<TQuery>(\r\n query: TQuery,\r\n { page, limit }: Pick<QueryInput, \"page\" | \"limit\">\r\n ): TQuery {\r\n return applyPagination(query, limit, page);\r\n }\r\n\r\n withSorting<TTable extends SQLiteTableWithColumns<any>, TQuery>(\r\n query: TQuery,\r\n { sort, order }: Pick<QueryInput, \"sort\" | \"order\">,\r\n table?: TTable\r\n ): TQuery {\r\n if (!table) throw new Error(\"No table provided\");\r\n return applySorting(query, table, sort, order);\r\n }\r\n\r\n withSortingAndPagination<TTable extends SQLiteTableWithColumns<any>, TQuery>(\r\n query: TQuery,\r\n { sort, order, page, limit }: Pick<QueryInput, \"sort\" | \"order\" | \"page\" | \"limit\">,\r\n table?: TTable\r\n ): TQuery {\r\n if (!table) throw new Error(\"No table provided\");\r\n return this.withSorting(this.withPagination(query, { page, limit }), { sort, order }, table);\r\n }\r\n\r\n addUserIdFilter(userId: string, query?: QueryInput): QueryInput {\r\n const userIdFilter: QueryFilter = {\r\n columnId: \"userId\",\r\n type: \"string\",\r\n method: \"equals\",\r\n value: userId,\r\n };\r\n return query\r\n ? { ...query, filters: [...(query?.filters ?? []), userIdFilter] }\r\n : { filters: [userIdFilter] };\r\n }\r\n\r\n helpers = {\r\n pickColumns,\r\n arrayContains,\r\n ConditionBuilder,\r\n };\r\n}\r\n\r\n/**\r\n * Generic table-bound repository with typed CRUD, returning ServerResultAsync via throwableAsync.\r\n *\r\n * Example:\r\n * const userRepo = new UserRepository(db, schema);\r\n * class UserRepository extends BaseTableRepository<typeof schema.user> {\r\n * constructor(db: LibSQLDatabase<typeof schema>, schema: typeof schema) {\r\n * super(db, schema, schema.user);\r\n * }\r\n * }\r\n */\r\nexport class BaseTableRepository<\r\n O extends LibSQLDatabase<any>,\r\n S extends Record<string, SQLiteTableWithColumns<any>>,\r\n R extends Record<string, BaseRepository<any, any, any> | BaseExternaRepository>,\r\n TTable extends SQLiteTableWithColumns<any>,\r\n TIdKey extends Extract<keyof InferSelectModel<TTable>, string> = \"id\",\r\n> extends BaseRepository<O, S, R> {\r\n protected readonly table: TTable;\r\n protected readonly idKey: TIdKey;\r\n protected readonly idColumn: SQLiteColumn;\r\n\r\n constructor(options: { orm: O; schema: S; table: TTable; idKey?: TIdKey }, repository?: R) {\r\n super({ orm: options.orm, schema: options.schema }, repository);\r\n this.table = options.table;\r\n this.idKey = options.idKey ?? (\"id\" as TIdKey);\r\n this.idColumn = (this.table as any)[this.idKey] as SQLiteColumn;\r\n }\r\n\r\n override withSorting<TQuery>(\r\n query: TQuery,\r\n { sort, order }: Pick<QueryInput, \"sort\" | \"order\">,\r\n table?: SQLiteTableWithColumns<any>\r\n ): TQuery {\r\n return super.withSorting(query, { sort, order }, table || this.table);\r\n }\r\n\r\n override withSortingAndPagination<MTable extends SQLiteTableWithColumns<any>, TQuery>(\r\n query: TQuery,\r\n { sort, order, page, limit }: Pick<QueryInput, \"sort\" | \"order\" | \"page\" | \"limit\">,\r\n table?: MTable\r\n ): TQuery {\r\n return super.withSortingAndPagination(query, { sort, order, page, limit }, table || this.table);\r\n }\r\n\r\n async queryList(\r\n query?: QueryInput,\r\n options?: {\r\n conditions?: TableConditionBuilder<TTable>;\r\n select?: SelectedFields<SQLiteColumn, TTable>;\r\n },\r\n tx?: O\r\n ): ServerResultAsync<{ rows: InferSelectModel<TTable>[]; total: number }> {\r\n return this.throwableAsync(async () => {\r\n type Row = InferSelectModel<TTable>;\r\n\r\n const db = tx ?? this.orm;\r\n const conditions = options?.conditions ?? this.getConditionBuilder(this.table);\r\n conditions.applyFilters(query);\r\n const whereClause = conditions.join();\r\n const rowsQuery = this.withSortingAndPagination(\r\n (options?.select ? db.select(options.select) : db.select())\r\n .from(this.table as any)\r\n .where(whereClause),\r\n query || {}\r\n );\r\n const countQuery = db\r\n .select({ count: count() })\r\n .from(this.table as any)\r\n .where(whereClause);\r\n const [rows, [totalResult]] = await Promise.all([rowsQuery, countQuery]);\r\n\r\n return ok({ rows: rows as Row[], total: totalResult?.count ?? 0 });\r\n });\r\n }\r\n\r\n async findById(id: string, tx?: O): ServerResultAsync<InferSelectModel<TTable> | undefined> {\r\n return this.throwableAsync(async () => {\r\n const db = tx ?? this.orm;\r\n type Row = InferSelectModel<TTable>;\r\n\r\n const rows = (await db\r\n .select()\r\n .from(this.table as any)\r\n .where(eq(this.idColumn as SQLiteColumn, id))) as Row[];\r\n\r\n return ok(rows[0]);\r\n });\r\n }\r\n\r\n async findManyById(\r\n ids: readonly string[],\r\n tx?: O\r\n ): ServerResultAsync<Array<InferSelectModel<TTable>>> {\r\n return this.throwableAsync(async () => {\r\n const db = tx ?? this.orm;\r\n type Row = InferSelectModel<TTable>;\r\n\r\n if (ids.length === 0) {\r\n return ok<Row[]>([]);\r\n }\r\n\r\n const rows = (await db\r\n .select()\r\n .from(this.table as any)\r\n .where(inArray(this.idColumn as SQLiteColumn, ids as string[]))) as Row[];\r\n\r\n return ok(rows);\r\n });\r\n }\r\n\r\n async create(\r\n data: InferInsertModel<TTable>,\r\n tx?: O\r\n ): ServerResultAsync<InferSelectModel<TTable>> {\r\n return this.throwableAsync(async () => {\r\n const db = tx ?? this.orm;\r\n type Row = InferSelectModel<TTable>;\r\n\r\n const rows = (await db\r\n .insert(this.table as any)\r\n .values(data as any)\r\n .returning()) as unknown as Row[];\r\n\r\n if (rows.length === 0) return this.error(\"UNPROCESSABLE_CONTENT\");\r\n return ok(rows[0] as Row);\r\n });\r\n }\r\n\r\n async createMany(\r\n data: readonly InferInsertModel<TTable>[],\r\n tx?: O\r\n ): ServerResultAsync<Array<InferSelectModel<TTable>>> {\r\n return this.throwableAsync(async () => {\r\n const db = tx ?? this.orm;\r\n type Row = InferSelectModel<TTable>;\r\n\r\n if (data.length === 0) {\r\n return ok<Row[]>([]);\r\n }\r\n\r\n const rows = (await db\r\n .insert(this.table as any)\r\n .values(data as any)\r\n .returning()) as unknown as Row[];\r\n\r\n return ok(rows as Row[]);\r\n });\r\n }\r\n\r\n async update(\r\n data: TableUpdatePayload<TTable, TIdKey>,\r\n tx?: O\r\n ): ServerResultAsync<InferSelectModel<TTable>> {\r\n return this.throwableAsync(async () => {\r\n const db = tx ?? this.orm;\r\n type Row = InferSelectModel<TTable>;\r\n\r\n const single = data as Record<string, unknown>;\r\n const id = String(single[this.idKey]);\r\n const { [this.idKey]: _removed, ...rest } = single;\r\n const update = rest;\r\n if (this.table.updatedAt) (update as any).updatedAt = new Date();\r\n const rows = (await db\r\n .update(this.table as any)\r\n .set(update as unknown as Partial<InferInsertModel<TTable>>)\r\n .where(eq(this.idColumn as SQLiteColumn, id))\r\n .returning()) as unknown as Row[];\r\n const [row] = rows;\r\n\r\n if (!row) return this.error(\"NOT_FOUND\");\r\n return ok(row) as ServerResult<Row>;\r\n });\r\n }\r\n\r\n async updateMany(\r\n data: readonly TableUpdatePayload<TTable, TIdKey>[],\r\n tx?: O\r\n ): ServerResultAsync<Array<InferSelectModel<TTable>>> {\r\n return this.throwableAsync(async () => {\r\n const db = tx ?? this.orm;\r\n type Row = InferSelectModel<TTable>;\r\n\r\n if (data.length === 0) {\r\n return ok<Row[]>([]);\r\n }\r\n\r\n const results: Row[] = [];\r\n for (const item of data) {\r\n const record = item as Record<string, unknown>;\r\n const id = String(record[this.idKey]);\r\n const { [this.idKey]: _removed, ...rest } = record;\r\n const update = rest;\r\n if (this.table.updatedAt) (update as any).updatedAt = new Date();\r\n const rows = (await db\r\n .update(this.table as any)\r\n .set(update as unknown as Partial<InferInsertModel<TTable>>)\r\n .where(eq(this.idColumn as SQLiteColumn, id))\r\n .returning()) as unknown as Row[];\r\n if (rows[0]) results.push(rows[0]);\r\n }\r\n\r\n return ok(results) as ServerResult<Row[]>;\r\n });\r\n }\r\n\r\n async softDeleteById(id: string, tx?: O): ServerResultAsync<{ id: string }> {\r\n return this.throwableAsync(async () => {\r\n const db = tx ?? this.orm;\r\n if (!this.table.deletedAt) return this.error(\"METHOD_NOT_SUPPORTED\");\r\n\r\n const rows = await db\r\n .update(this.table as any)\r\n .set({ deletedAt: new Date() })\r\n .where(eq(this.idColumn as SQLiteColumn, id))\r\n .returning({\r\n id: this.idColumn as SQLiteColumn,\r\n });\r\n\r\n if (rows.length === 0) return this.error(\"NOT_FOUND\");\r\n return ok(rows[0] as { id: string });\r\n });\r\n }\r\n\r\n async softDeleteManyById(\r\n ids: readonly string[],\r\n tx?: O\r\n ): ServerResultAsync<Array<{ id: string }>> {\r\n return this.throwableAsync(async () => {\r\n const db = tx ?? this.orm;\r\n if (!this.table.deletedAt) return this.error(\"METHOD_NOT_SUPPORTED\");\r\n\r\n const rows = await db\r\n .update(this.table as any)\r\n .set({ deletedAt: new Date() })\r\n .where(inArray(this.idColumn as SQLiteColumn, ids as string[]))\r\n .returning({\r\n id: this.idColumn as SQLiteColumn,\r\n });\r\n if (rows.length === 0) return this.error(\"NOT_FOUND\");\r\n return ok(rows as { id: string }[]);\r\n });\r\n }\r\n\r\n async deleteById(id: string, tx?: O): ServerResultAsync<{ id: string }> {\r\n return this.throwableAsync(async () => {\r\n const db = tx ?? this.orm;\r\n\r\n const rows = await db\r\n .delete(this.table as any)\r\n .where(eq(this.idColumn as SQLiteColumn, id))\r\n .returning({\r\n id: this.idColumn as SQLiteColumn,\r\n });\r\n\r\n if (rows.length === 0) return this.error(\"NOT_FOUND\");\r\n return ok(rows[0] as { id: string });\r\n });\r\n }\r\n\r\n async deleteManyById(ids: readonly string[], tx?: O): ServerResultAsync<Array<{ id: string }>> {\r\n return this.throwableAsync(async () => {\r\n const db = tx ?? this.orm;\r\n\r\n if (ids.length === 0) {\r\n return ok<{ id: string }[]>([]);\r\n }\r\n\r\n const rows = await db\r\n .delete(this.table as any)\r\n .where(inArray(this.idColumn as SQLiteColumn, ids as string[]))\r\n .returning({\r\n id: this.idColumn as SQLiteColumn,\r\n });\r\n\r\n return ok(rows as { id: string }[]);\r\n });\r\n }\r\n}\r\n\r\nexport class BaseExternaRepository extends Base {\r\n constructor() {\r\n super(\"repository\");\r\n }\r\n}\r\n"],"mappings":"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"}
1
+ {"version":3,"file":"base.repository.mjs","names":[],"sources":["../../../../src/modules/base/base.repository.ts"],"sourcesContent":["import type {\r\n QueryFilter,\r\n QueryFilters,\r\n QueryInput,\r\n} from \"@m5kdev/commons/modules/schemas/query.schema\";\r\nimport {\r\n and,\r\n count,\r\n eq,\r\n type InferInsertModel,\r\n type InferSelectModel,\r\n inArray,\r\n like,\r\n or,\r\n type SelectedFields,\r\n type SQL,\r\n} from \"drizzle-orm\";\r\nimport type { LibSQLDatabase } from \"drizzle-orm/libsql\";\r\nimport type { SQLiteColumn, SQLiteTableWithColumns } from \"drizzle-orm/sqlite-core\";\r\nimport { ok } from \"neverthrow\";\r\nimport { ServerError } from \"../../utils/errors\";\r\nimport { applyPagination } from \"../utils/applyPagination\";\r\nimport { applySorting } from \"../utils/applySorting\";\r\nimport { getConditionsFromFilters } from \"../utils/getConditionsFromFilters\";\r\nimport { pushGlobalSearch } from \"../utils/getGlobalSearchCondition\";\r\nimport { Base } from \"./base.abstract\";\r\nimport { pickColumns, type ServerResult, type ServerResultAsync } from \"./base.dto\";\r\n\r\n/** Payload for update/updateMany: id key required (string), other table fields optional. */\r\nexport type TableUpdatePayload<\r\n TTable extends SQLiteTableWithColumns<any>,\r\n TIdKey extends Extract<keyof InferSelectModel<TTable>, string> = \"id\",\r\n> = Record<TIdKey, string> & Partial<Omit<InferSelectModel<TTable>, TIdKey>>;\r\n\r\nexport class ConditionBuilder {\r\n constructor(private conditions: SQL[] = []) {\r\n this.conditions = conditions;\r\n }\r\n\r\n push(condition?: SQL) {\r\n if (condition) this.conditions.push(condition);\r\n }\r\n\r\n join(type: \"and\" | \"or\" = \"and\") {\r\n if (this.conditions.length === 0) return undefined;\r\n if (this.conditions.length === 1) return this.conditions[0];\r\n return type === \"and\" ? and(...this.conditions) : or(...this.conditions);\r\n }\r\n\r\n [Symbol.iterator]() {\r\n return this.conditions[Symbol.iterator]();\r\n }\r\n}\r\n\r\nexport class TableConditionBuilder<\r\n TTable extends SQLiteTableWithColumns<any>,\r\n> extends ConditionBuilder {\r\n private table: TTable;\r\n\r\n constructor(table: TTable) {\r\n super();\r\n this.table = table;\r\n }\r\n\r\n applyFilters({ filters }: { filters?: QueryFilters } = {}) {\r\n if (filters && filters.length > 0) getConditionsFromFilters(this, filters, this.table);\r\n }\r\n\r\n applyGlobalSearch(q: string | undefined, columns: readonly SQLiteColumn[]) {\r\n pushGlobalSearch(this, q, columns);\r\n }\r\n}\r\n\r\nexport const arrayContains = (table: SQLiteColumn, values: string[]) => {\r\n const arrayContains: SQL[] = [];\r\n for (const value of values) {\r\n arrayContains.push(like(table, `%\"${value}%\"`));\r\n }\r\n return or(...arrayContains);\r\n};\r\n\r\nexport class BaseRepository<\r\n O extends LibSQLDatabase<any>,\r\n S extends Record<string, SQLiteTableWithColumns<any>>,\r\n R extends Record<string, BaseRepository<any, any, any> | BaseExternaRepository>,\r\n> extends Base {\r\n protected orm: O;\r\n protected schema: S;\r\n public repository?: R;\r\n\r\n constructor(options: { orm: O; schema: S }, repository?: R) {\r\n super(\"repository\");\r\n this.orm = options.orm;\r\n this.schema = options.schema;\r\n this.repository = repository;\r\n }\r\n getConditionBuilder(): ConditionBuilder;\r\n getConditionBuilder(table: undefined): ConditionBuilder;\r\n getConditionBuilder<TTable extends SQLiteTableWithColumns<any>>(\r\n table: TTable\r\n ): TableConditionBuilder<TTable>;\r\n getConditionBuilder<TTable extends SQLiteTableWithColumns<any>>(\r\n table?: TTable\r\n ): ConditionBuilder | TableConditionBuilder<TTable> {\r\n if (table === undefined) {\r\n return new ConditionBuilder();\r\n }\r\n return new TableConditionBuilder(table);\r\n }\r\n throwableQuery<T>(fn: () => Promise<T>): ServerResultAsync<T> {\r\n return this.throwablePromise(\r\n () => fn(),\r\n (error) =>\r\n new ServerError({\r\n code: \"INTERNAL_SERVER_ERROR\",\r\n layer: \"repository\",\r\n layerName: this.constructor.name,\r\n message: \"Database query failed\",\r\n cause: error,\r\n })\r\n );\r\n }\r\n\r\n withPagination<TQuery>(\r\n query: TQuery,\r\n { page, limit }: Pick<QueryInput, \"page\" | \"limit\">\r\n ): TQuery {\r\n return applyPagination(query, limit, page);\r\n }\r\n\r\n withSorting<TTable extends SQLiteTableWithColumns<any>, TQuery>(\r\n query: TQuery,\r\n { sort, order }: Pick<QueryInput, \"sort\" | \"order\">,\r\n table?: TTable\r\n ): TQuery {\r\n if (!table) throw new Error(\"No table provided\");\r\n return applySorting(query, table, sort, order);\r\n }\r\n\r\n withSortingAndPagination<TTable extends SQLiteTableWithColumns<any>, TQuery>(\r\n query: TQuery,\r\n { sort, order, page, limit }: Pick<QueryInput, \"sort\" | \"order\" | \"page\" | \"limit\">,\r\n table?: TTable\r\n ): TQuery {\r\n if (!table) throw new Error(\"No table provided\");\r\n return this.withSorting(this.withPagination(query, { page, limit }), { sort, order }, table);\r\n }\r\n\r\n addUserIdFilter(userId: string, query?: QueryInput): QueryInput {\r\n const userIdFilter: QueryFilter = {\r\n columnId: \"userId\",\r\n type: \"string\",\r\n method: \"equals\",\r\n value: userId,\r\n };\r\n return query\r\n ? { ...query, filters: [...(query?.filters ?? []), userIdFilter] }\r\n : { filters: [userIdFilter] };\r\n }\r\n\r\n helpers = {\r\n pickColumns,\r\n arrayContains,\r\n ConditionBuilder,\r\n };\r\n}\r\n\r\n/**\r\n * Generic table-bound repository with typed CRUD, returning ServerResultAsync via throwableAsync.\r\n *\r\n * Example:\r\n * const userRepo = new UserRepository(db, schema);\r\n * class UserRepository extends BaseTableRepository<typeof schema.user> {\r\n * constructor(db: LibSQLDatabase<typeof schema>, schema: typeof schema) {\r\n * super(db, schema, schema.user);\r\n * }\r\n * }\r\n */\r\nexport class BaseTableRepository<\r\n O extends LibSQLDatabase<any>,\r\n S extends Record<string, SQLiteTableWithColumns<any>>,\r\n R extends Record<string, BaseRepository<any, any, any> | BaseExternaRepository>,\r\n TTable extends SQLiteTableWithColumns<any>,\r\n TIdKey extends Extract<keyof InferSelectModel<TTable>, string> = \"id\",\r\n> extends BaseRepository<O, S, R> {\r\n protected readonly table: TTable;\r\n protected readonly idKey: TIdKey;\r\n protected readonly idColumn: SQLiteColumn;\r\n\r\n constructor(options: { orm: O; schema: S; table: TTable; idKey?: TIdKey }, repository?: R) {\r\n super({ orm: options.orm, schema: options.schema }, repository);\r\n this.table = options.table;\r\n this.idKey = options.idKey ?? (\"id\" as TIdKey);\r\n this.idColumn = (this.table as any)[this.idKey] as SQLiteColumn;\r\n }\r\n\r\n override withSorting<TQuery>(\r\n query: TQuery,\r\n { sort, order }: Pick<QueryInput, \"sort\" | \"order\">,\r\n table?: SQLiteTableWithColumns<any>\r\n ): TQuery {\r\n return super.withSorting(query, { sort, order }, table || this.table);\r\n }\r\n\r\n override withSortingAndPagination<MTable extends SQLiteTableWithColumns<any>, TQuery>(\r\n query: TQuery,\r\n { sort, order, page, limit }: Pick<QueryInput, \"sort\" | \"order\" | \"page\" | \"limit\">,\r\n table?: MTable\r\n ): TQuery {\r\n return super.withSortingAndPagination(query, { sort, order, page, limit }, table || this.table);\r\n }\r\n\r\n async queryList(\r\n query?: QueryInput,\r\n options?: {\r\n conditions?: TableConditionBuilder<TTable>;\r\n select?: SelectedFields<SQLiteColumn, TTable>;\r\n globalSearchColumns?: string[];\r\n },\r\n tx?: O\r\n ): ServerResultAsync<{ rows: InferSelectModel<TTable>[]; total: number }> {\r\n return this.throwableAsync(async () => {\r\n type Row = InferSelectModel<TTable>;\r\n\r\n const db = tx ?? this.orm;\r\n const conditions = options?.conditions ?? this.getConditionBuilder(this.table);\r\n conditions.applyFilters(query);\r\n if (options?.globalSearchColumns?.length) {\r\n const columns = options.globalSearchColumns.map((c) => {\r\n const column = this.table[c as keyof TTable] as SQLiteColumn;\r\n if (!column) {\r\n throw new Error(`Column ${c} not found in table ${this.table.name}`);\r\n }\r\n return column;\r\n });\r\n conditions.applyGlobalSearch(query?.q, columns);\r\n }\r\n const whereClause = conditions.join();\r\n const rowsQuery = this.withSortingAndPagination(\r\n (options?.select ? db.select(options.select) : db.select())\r\n .from(this.table as any)\r\n .where(whereClause),\r\n query || {}\r\n );\r\n const countQuery = db\r\n .select({ count: count() })\r\n .from(this.table as any)\r\n .where(whereClause);\r\n const [rows, [totalResult]] = await Promise.all([rowsQuery, countQuery]);\r\n\r\n return ok({ rows: rows as Row[], total: totalResult?.count ?? 0 });\r\n });\r\n }\r\n\r\n async findById(id: string, tx?: O): ServerResultAsync<InferSelectModel<TTable> | undefined> {\r\n return this.throwableAsync(async () => {\r\n const db = tx ?? this.orm;\r\n type Row = InferSelectModel<TTable>;\r\n\r\n const rows = (await db\r\n .select()\r\n .from(this.table as any)\r\n .where(eq(this.idColumn as SQLiteColumn, id))) as Row[];\r\n\r\n return ok(rows[0]);\r\n });\r\n }\r\n\r\n async findManyById(\r\n ids: readonly string[],\r\n tx?: O\r\n ): ServerResultAsync<Array<InferSelectModel<TTable>>> {\r\n return this.throwableAsync(async () => {\r\n const db = tx ?? this.orm;\r\n type Row = InferSelectModel<TTable>;\r\n\r\n if (ids.length === 0) {\r\n return ok<Row[]>([]);\r\n }\r\n\r\n const rows = (await db\r\n .select()\r\n .from(this.table as any)\r\n .where(inArray(this.idColumn as SQLiteColumn, ids as string[]))) as Row[];\r\n\r\n return ok(rows);\r\n });\r\n }\r\n\r\n async create(\r\n data: InferInsertModel<TTable>,\r\n tx?: O\r\n ): ServerResultAsync<InferSelectModel<TTable>> {\r\n return this.throwableAsync(async () => {\r\n const db = tx ?? this.orm;\r\n type Row = InferSelectModel<TTable>;\r\n\r\n const rows = (await db\r\n .insert(this.table as any)\r\n .values(data as any)\r\n .returning()) as unknown as Row[];\r\n\r\n if (rows.length === 0) return this.error(\"UNPROCESSABLE_CONTENT\");\r\n return ok(rows[0] as Row);\r\n });\r\n }\r\n\r\n async createMany(\r\n data: readonly InferInsertModel<TTable>[],\r\n tx?: O\r\n ): ServerResultAsync<Array<InferSelectModel<TTable>>> {\r\n return this.throwableAsync(async () => {\r\n const db = tx ?? this.orm;\r\n type Row = InferSelectModel<TTable>;\r\n\r\n if (data.length === 0) {\r\n return ok<Row[]>([]);\r\n }\r\n\r\n const rows = (await db\r\n .insert(this.table as any)\r\n .values(data as any)\r\n .returning()) as unknown as Row[];\r\n\r\n return ok(rows as Row[]);\r\n });\r\n }\r\n\r\n async update(\r\n data: TableUpdatePayload<TTable, TIdKey>,\r\n tx?: O\r\n ): ServerResultAsync<InferSelectModel<TTable>> {\r\n return this.throwableAsync(async () => {\r\n const db = tx ?? this.orm;\r\n type Row = InferSelectModel<TTable>;\r\n\r\n const single = data as Record<string, unknown>;\r\n const id = String(single[this.idKey]);\r\n const { [this.idKey]: _removed, ...rest } = single;\r\n const update = rest;\r\n if (this.table.updatedAt) (update as any).updatedAt = new Date();\r\n const rows = (await db\r\n .update(this.table as any)\r\n .set(update as unknown as Partial<InferInsertModel<TTable>>)\r\n .where(eq(this.idColumn as SQLiteColumn, id))\r\n .returning()) as unknown as Row[];\r\n const [row] = rows;\r\n\r\n if (!row) return this.error(\"NOT_FOUND\");\r\n return ok(row) as ServerResult<Row>;\r\n });\r\n }\r\n\r\n async updateMany(\r\n data: readonly TableUpdatePayload<TTable, TIdKey>[],\r\n tx?: O\r\n ): ServerResultAsync<Array<InferSelectModel<TTable>>> {\r\n return this.throwableAsync(async () => {\r\n const db = tx ?? this.orm;\r\n type Row = InferSelectModel<TTable>;\r\n\r\n if (data.length === 0) {\r\n return ok<Row[]>([]);\r\n }\r\n\r\n const results: Row[] = [];\r\n for (const item of data) {\r\n const record = item as Record<string, unknown>;\r\n const id = String(record[this.idKey]);\r\n const { [this.idKey]: _removed, ...rest } = record;\r\n const update = rest;\r\n if (this.table.updatedAt) (update as any).updatedAt = new Date();\r\n const rows = (await db\r\n .update(this.table as any)\r\n .set(update as unknown as Partial<InferInsertModel<TTable>>)\r\n .where(eq(this.idColumn as SQLiteColumn, id))\r\n .returning()) as unknown as Row[];\r\n if (rows[0]) results.push(rows[0]);\r\n }\r\n\r\n return ok(results) as ServerResult<Row[]>;\r\n });\r\n }\r\n\r\n async softDeleteById(id: string, tx?: O): ServerResultAsync<{ id: string }> {\r\n return this.throwableAsync(async () => {\r\n const db = tx ?? this.orm;\r\n if (!this.table.deletedAt) return this.error(\"METHOD_NOT_SUPPORTED\");\r\n\r\n const rows = await db\r\n .update(this.table as any)\r\n .set({ deletedAt: new Date() })\r\n .where(eq(this.idColumn as SQLiteColumn, id))\r\n .returning({\r\n id: this.idColumn as SQLiteColumn,\r\n });\r\n\r\n if (rows.length === 0) return this.error(\"NOT_FOUND\");\r\n return ok(rows[0] as { id: string });\r\n });\r\n }\r\n\r\n async softDeleteManyById(\r\n ids: readonly string[],\r\n tx?: O\r\n ): ServerResultAsync<Array<{ id: string }>> {\r\n return this.throwableAsync(async () => {\r\n const db = tx ?? this.orm;\r\n if (!this.table.deletedAt) return this.error(\"METHOD_NOT_SUPPORTED\");\r\n\r\n const rows = await db\r\n .update(this.table as any)\r\n .set({ deletedAt: new Date() })\r\n .where(inArray(this.idColumn as SQLiteColumn, ids as string[]))\r\n .returning({\r\n id: this.idColumn as SQLiteColumn,\r\n });\r\n if (rows.length === 0) return this.error(\"NOT_FOUND\");\r\n return ok(rows as { id: string }[]);\r\n });\r\n }\r\n\r\n async deleteById(id: string, tx?: O): ServerResultAsync<{ id: string }> {\r\n return this.throwableAsync(async () => {\r\n const db = tx ?? this.orm;\r\n\r\n const rows = await db\r\n .delete(this.table as any)\r\n .where(eq(this.idColumn as SQLiteColumn, id))\r\n .returning({\r\n id: this.idColumn as SQLiteColumn,\r\n });\r\n\r\n if (rows.length === 0) return this.error(\"NOT_FOUND\");\r\n return ok(rows[0] as { id: string });\r\n });\r\n }\r\n\r\n async deleteManyById(ids: readonly string[], tx?: O): ServerResultAsync<Array<{ id: string }>> {\r\n return this.throwableAsync(async () => {\r\n const db = tx ?? this.orm;\r\n\r\n if (ids.length === 0) {\r\n return ok<{ id: string }[]>([]);\r\n }\r\n\r\n const rows = await db\r\n .delete(this.table as any)\r\n .where(inArray(this.idColumn as SQLiteColumn, ids as string[]))\r\n .returning({\r\n id: this.idColumn as SQLiteColumn,\r\n });\r\n\r\n return ok(rows as { id: string }[]);\r\n });\r\n }\r\n}\r\n\r\nexport class BaseExternaRepository extends Base {\r\n constructor() {\r\n super(\"repository\");\r\n }\r\n}\r\n"],"mappings":"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"}