@m5kdev/backend 0.8.7 → 0.8.8
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.
- package/dist/_virtual/_rolldown/runtime.cjs +33 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/dialect-adapter-base.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/dialect-adapter.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/dialect.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/mssql/mssql-adapter.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/mssql/mssql-dialect.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/mssql/mssql-introspector.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/mysql/mysql-adapter.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/mysql/mysql-dialect.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/mysql/mysql-introspector.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/postgres/postgres-adapter.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/postgres/postgres-dialect.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/postgres/postgres-introspector.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/sqlite/sqlite-adapter.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/sqlite/sqlite-dialect.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/dialect/sqlite/sqlite-introspector.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/expression/expression-builder.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/index.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/kysely.d.cts +38 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/migration/file-migration-provider.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/migration/migrator.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/binary-operation-parser.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/delete-from-parser.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/expression-parser.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/group-by-parser.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/insert-values-parser.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/join-parser.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/merge-into-parser.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/reference-parser.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/returning-parser.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/select-from-parser.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/select-parser.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/set-operation-parser.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/tuple-parser.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/unary-operation-parser.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/update-parser.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/update-set-parser.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/value-parser.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/parser/with-parser.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/case-builder.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/delete-query-builder.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/having-interface.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/insert-query-builder.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/join-builder.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/merge-query-builder.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/on-conflict-builder.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/output-interface.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/returning-interface.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/select-query-builder.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/update-query-builder.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-builder/where-interface.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-creator.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-executor/default-query-executor.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-executor/noop-query-executor.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-executor/query-executor-base.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-executor/query-executor-provider.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/query-executor/query-executor.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/raw-builder/raw-builder.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/raw-builder/sql.d.cts +1 -0
- 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
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/alter-table-add-index-builder.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/alter-table-builder.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/alter-table-drop-constraint-builder.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/alter-table-executor.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/create-index-builder.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/create-schema-builder.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/create-table-builder.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/create-type-builder.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/create-view-builder.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/drop-index-builder.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/drop-schema-builder.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/drop-table-builder.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/drop-type-builder.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/drop-view-builder.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/refresh-materialized-view-builder.d.cts +1 -0
- package/dist/node_modules/.pnpm/kysely@0.28.5/node_modules/kysely/dist/esm/schema/schema.d.cts +1 -0
- package/dist/src/lib/posthog.cjs +8 -0
- package/dist/src/lib/posthog.cjs.map +1 -0
- package/dist/src/lib/posthog.d.cts +7 -0
- package/dist/src/lib/sentry.cjs +11 -0
- package/dist/src/lib/sentry.cjs.map +1 -0
- package/dist/src/lib/sentry.d.cts +1 -0
- package/dist/src/modules/access/access.repository.cjs +26 -0
- package/dist/src/modules/access/access.repository.cjs.map +1 -0
- package/dist/src/modules/access/access.repository.d.cts +2352 -0
- package/dist/src/modules/access/access.service.cjs +42 -0
- package/dist/src/modules/access/access.service.cjs.map +1 -0
- package/dist/src/modules/access/access.service.d.cts +25 -0
- package/dist/src/modules/access/access.utils.cjs +23 -0
- package/dist/src/modules/access/access.utils.cjs.map +1 -0
- package/dist/src/modules/access/access.utils.d.cts +19 -0
- package/dist/src/modules/ai/ai.db.cjs +46 -0
- package/dist/src/modules/ai/ai.db.cjs.map +1 -0
- package/dist/src/modules/ai/ai.db.d.cts +401 -0
- package/dist/src/modules/ai/ai.prompt.cjs +33 -0
- package/dist/src/modules/ai/ai.prompt.cjs.map +1 -0
- package/dist/src/modules/ai/ai.prompt.d.cts +30 -0
- package/dist/src/modules/ai/ai.prompts.cjs +18 -0
- package/dist/src/modules/ai/ai.prompts.cjs.map +1 -0
- package/dist/src/modules/ai/ai.prompts.d.cts +10 -0
- package/dist/src/modules/ai/ai.repository.cjs +25 -0
- package/dist/src/modules/ai/ai.repository.cjs.map +1 -0
- package/dist/src/modules/ai/ai.repository.d.cts +428 -0
- package/dist/src/modules/ai/ai.router.cjs +0 -0
- package/dist/src/modules/ai/ai.router.d.cts +1 -0
- package/dist/src/modules/ai/ai.service.cjs +312 -0
- package/dist/src/modules/ai/ai.service.cjs.map +1 -0
- package/dist/src/modules/ai/ai.service.d.cts +141 -0
- package/dist/src/modules/ai/ai.trpc.cjs +19 -0
- package/dist/src/modules/ai/ai.trpc.cjs.map +1 -0
- package/dist/src/modules/ai/ai.trpc.d.cts +31 -0
- package/dist/src/modules/ai/ideogram/ideogram.constants.cjs +191 -0
- package/dist/src/modules/ai/ideogram/ideogram.constants.cjs.map +1 -0
- package/dist/src/modules/ai/ideogram/ideogram.constants.d.cts +11 -0
- package/dist/src/modules/ai/ideogram/ideogram.dto.cjs +49 -0
- package/dist/src/modules/ai/ideogram/ideogram.dto.cjs.map +1 -0
- package/dist/src/modules/ai/ideogram/ideogram.dto.d.cts +234 -0
- package/dist/src/modules/ai/ideogram/ideogram.prompt.cjs +862 -0
- package/dist/src/modules/ai/ideogram/ideogram.prompt.cjs.map +1 -0
- package/dist/src/modules/ai/ideogram/ideogram.prompt.d.cts +7 -0
- package/dist/src/modules/ai/ideogram/ideogram.repository.cjs +34 -0
- package/dist/src/modules/ai/ideogram/ideogram.repository.cjs.map +1 -0
- package/dist/src/modules/ai/ideogram/ideogram.repository.d.cts +11 -0
- package/dist/src/modules/ai/ideogram/ideogram.service.cjs +12 -0
- package/dist/src/modules/ai/ideogram/ideogram.service.cjs.map +1 -0
- package/dist/src/modules/ai/ideogram/ideogram.service.d.cts +14 -0
- package/dist/src/modules/auth/auth.db.cjs +187 -0
- package/dist/src/modules/auth/auth.db.cjs.map +1 -0
- package/dist/src/modules/auth/auth.db.d.cts +2341 -0
- package/dist/src/modules/auth/auth.dto.cjs +50 -0
- package/dist/src/modules/auth/auth.dto.cjs.map +1 -0
- package/dist/src/modules/auth/auth.dto.d.cts +70 -0
- package/dist/src/modules/auth/auth.dto.d.mts +2 -2
- package/dist/src/modules/auth/auth.lib.cjs +234 -0
- package/dist/src/modules/auth/auth.lib.cjs.map +1 -0
- package/dist/src/modules/auth/auth.lib.d.cts +4894 -0
- package/dist/src/modules/auth/auth.lib.d.mts +1 -1
- package/dist/src/modules/auth/auth.middleware.cjs +41 -0
- package/dist/src/modules/auth/auth.middleware.cjs.map +1 -0
- package/dist/src/modules/auth/auth.middleware.d.cts +619 -0
- package/dist/src/modules/auth/auth.repository.cjs +403 -0
- package/dist/src/modules/auth/auth.repository.cjs.map +1 -0
- package/dist/src/modules/auth/auth.repository.d.cts +2453 -0
- package/dist/src/modules/auth/auth.service.cjs +229 -0
- package/dist/src/modules/auth/auth.service.cjs.map +1 -0
- package/dist/src/modules/auth/auth.service.d.cts +105 -0
- package/dist/src/modules/auth/auth.trpc.cjs +110 -0
- package/dist/src/modules/auth/auth.trpc.cjs.map +1 -0
- package/dist/src/modules/auth/auth.trpc.d.cts +303 -0
- package/dist/src/modules/auth/auth.trpc.d.mts +6 -6
- package/dist/src/modules/auth/auth.utils.cjs +80 -0
- package/dist/src/modules/auth/auth.utils.cjs.map +1 -0
- package/dist/src/modules/auth/auth.utils.d.cts +2356 -0
- package/dist/src/modules/base/base.abstract.cjs +62 -0
- package/dist/src/modules/base/base.abstract.cjs.map +1 -0
- package/dist/src/modules/base/base.abstract.d.cts +29 -0
- package/dist/src/modules/base/base.actor.cjs +83 -0
- package/dist/src/modules/base/base.actor.cjs.map +1 -0
- package/dist/src/modules/base/base.actor.d.cts +73 -0
- package/dist/src/modules/base/base.dto.cjs +98 -0
- package/dist/src/modules/base/base.dto.cjs.map +1 -0
- package/dist/src/modules/base/base.dto.d.cts +67 -0
- package/dist/src/modules/base/base.grants.cjs +107 -0
- package/dist/src/modules/base/base.grants.cjs.map +1 -0
- package/dist/src/modules/base/base.grants.d.cts +28 -0
- package/dist/src/modules/base/base.procedure.cjs +255 -0
- package/dist/src/modules/base/base.procedure.cjs.map +1 -0
- package/dist/src/modules/base/base.procedure.d.cts +111 -0
- package/dist/src/modules/base/base.repository.cjs +269 -0
- package/dist/src/modules/base/base.repository.cjs.map +1 -0
- package/dist/src/modules/base/base.repository.d.cts +125 -0
- package/dist/src/modules/base/base.repository.d.mts +2 -0
- package/dist/src/modules/base/base.repository.mjs +12 -0
- package/dist/src/modules/base/base.repository.mjs.map +1 -1
- package/dist/src/modules/base/base.service.cjs +119 -0
- package/dist/src/modules/base/base.service.cjs.map +1 -0
- package/dist/src/modules/base/base.service.d.cts +44 -0
- package/dist/src/modules/base/base.types.cjs +0 -0
- package/dist/src/modules/base/base.types.d.cts +5 -0
- package/dist/src/modules/billing/billing.db.cjs +38 -0
- package/dist/src/modules/billing/billing.db.cjs.map +1 -0
- package/dist/src/modules/billing/billing.db.d.cts +371 -0
- package/dist/src/modules/billing/billing.repository.cjs +190 -0
- package/dist/src/modules/billing/billing.repository.cjs.map +1 -0
- package/dist/src/modules/billing/billing.repository.d.cts +2787 -0
- package/dist/src/modules/billing/billing.router.cjs +43 -0
- package/dist/src/modules/billing/billing.router.cjs.map +1 -0
- package/dist/src/modules/billing/billing.router.d.cts +9 -0
- package/dist/src/modules/billing/billing.service.cjs +127 -0
- package/dist/src/modules/billing/billing.service.cjs.map +1 -0
- package/dist/src/modules/billing/billing.service.d.cts +53 -0
- package/dist/src/modules/billing/billing.trpc.cjs +19 -0
- package/dist/src/modules/billing/billing.trpc.cjs.map +1 -0
- package/dist/src/modules/billing/billing.trpc.d.cts +48 -0
- package/dist/src/modules/clay/clay.repository.cjs +29 -0
- package/dist/src/modules/clay/clay.repository.cjs.map +1 -0
- package/dist/src/modules/clay/clay.repository.d.cts +10 -0
- package/dist/src/modules/clay/clay.service.cjs +24 -0
- package/dist/src/modules/clay/clay.service.cjs.map +1 -0
- package/dist/src/modules/clay/clay.service.d.cts +32 -0
- package/dist/src/modules/connect/connect.db.cjs +37 -0
- package/dist/src/modules/connect/connect.db.cjs.map +1 -0
- package/dist/src/modules/connect/connect.db.d.cts +362 -0
- package/dist/src/modules/connect/connect.dto.cjs +45 -0
- package/dist/src/modules/connect/connect.dto.cjs.map +1 -0
- package/dist/src/modules/connect/connect.dto.d.cts +79 -0
- package/dist/src/modules/connect/connect.dto.d.mts +2 -2
- package/dist/src/modules/connect/connect.linkedin.cjs +48 -0
- package/dist/src/modules/connect/connect.linkedin.cjs.map +1 -0
- package/dist/src/modules/connect/connect.linkedin.d.cts +7 -0
- package/dist/src/modules/connect/connect.oauth.cjs +153 -0
- package/dist/src/modules/connect/connect.oauth.cjs.map +1 -0
- package/dist/src/modules/connect/connect.oauth.d.cts +32 -0
- package/dist/src/modules/connect/connect.repository.cjs +42 -0
- package/dist/src/modules/connect/connect.repository.cjs.map +1 -0
- package/dist/src/modules/connect/connect.repository.d.cts +419 -0
- package/dist/src/modules/connect/connect.repository.d.mts +1 -1
- package/dist/src/modules/connect/connect.router.cjs +48 -0
- package/dist/src/modules/connect/connect.router.cjs.map +1 -0
- package/dist/src/modules/connect/connect.router.d.cts +9 -0
- package/dist/src/modules/connect/connect.service.cjs +90 -0
- package/dist/src/modules/connect/connect.service.cjs.map +1 -0
- package/dist/src/modules/connect/connect.service.d.cts +103 -0
- package/dist/src/modules/connect/connect.service.d.mts +2 -2
- package/dist/src/modules/connect/connect.trpc.cjs +18 -0
- package/dist/src/modules/connect/connect.trpc.cjs.map +1 -0
- package/dist/src/modules/connect/connect.trpc.d.cts +53 -0
- package/dist/src/modules/connect/connect.types.cjs +0 -0
- package/dist/src/modules/connect/connect.types.d.cts +29 -0
- package/dist/src/modules/crypto/crypto.db.cjs +26 -0
- package/dist/src/modules/crypto/crypto.db.cjs.map +1 -0
- package/dist/src/modules/crypto/crypto.db.d.cts +157 -0
- package/dist/src/modules/crypto/crypto.repository.cjs +9 -0
- package/dist/src/modules/crypto/crypto.repository.cjs.map +1 -0
- package/dist/src/modules/crypto/crypto.repository.d.cts +163 -0
- package/dist/src/modules/crypto/crypto.service.cjs +46 -0
- package/dist/src/modules/crypto/crypto.service.cjs.map +1 -0
- package/dist/src/modules/crypto/crypto.service.d.cts +15 -0
- package/dist/src/modules/email/email.service.cjs +107 -0
- package/dist/src/modules/email/email.service.cjs.map +1 -0
- package/dist/src/modules/email/email.service.d.cts +62 -0
- package/dist/src/modules/file/file.repository.cjs +74 -0
- package/dist/src/modules/file/file.repository.cjs.map +1 -0
- package/dist/src/modules/file/file.repository.d.cts +17 -0
- package/dist/src/modules/file/file.router.cjs +94 -0
- package/dist/src/modules/file/file.router.cjs.map +1 -0
- package/dist/src/modules/file/file.router.d.cts +7 -0
- package/dist/src/modules/file/file.service.cjs +120 -0
- package/dist/src/modules/file/file.service.cjs.map +1 -0
- package/dist/src/modules/file/file.service.d.cts +30 -0
- package/dist/src/modules/recurrence/recurrence.db.cjs +55 -0
- package/dist/src/modules/recurrence/recurrence.db.cjs.map +1 -0
- package/dist/src/modules/recurrence/recurrence.db.d.cts +568 -0
- package/dist/src/modules/recurrence/recurrence.repository.cjs +31 -0
- package/dist/src/modules/recurrence/recurrence.repository.cjs.map +1 -0
- package/dist/src/modules/recurrence/recurrence.repository.d.cts +588 -0
- package/dist/src/modules/recurrence/recurrence.service.cjs +66 -0
- package/dist/src/modules/recurrence/recurrence.service.cjs.map +1 -0
- package/dist/src/modules/recurrence/recurrence.service.d.cts +88 -0
- package/dist/src/modules/recurrence/recurrence.service.d.mts +3 -2
- package/dist/src/modules/recurrence/recurrence.service.mjs +1 -1
- package/dist/src/modules/recurrence/recurrence.service.mjs.map +1 -1
- package/dist/src/modules/recurrence/recurrence.trpc.cjs +46 -0
- package/dist/src/modules/recurrence/recurrence.trpc.cjs.map +1 -0
- package/dist/src/modules/recurrence/recurrence.trpc.d.cts +216 -0
- package/dist/src/modules/recurrence/recurrence.trpc.d.mts +1 -0
- package/dist/src/modules/social/social.dto.cjs +26 -0
- package/dist/src/modules/social/social.dto.cjs.map +1 -0
- package/dist/src/modules/social/social.dto.d.cts +39 -0
- package/dist/src/modules/social/social.linkedin.cjs +349 -0
- package/dist/src/modules/social/social.linkedin.cjs.map +1 -0
- package/dist/src/modules/social/social.linkedin.d.cts +15 -0
- package/dist/src/modules/social/social.service.cjs +57 -0
- package/dist/src/modules/social/social.service.cjs.map +1 -0
- package/dist/src/modules/social/social.service.d.cts +34 -0
- package/dist/src/modules/social/social.types.cjs +0 -0
- package/dist/src/modules/social/social.types.d.cts +40 -0
- package/dist/src/modules/tag/tag.db.cjs +43 -0
- package/dist/src/modules/tag/tag.db.cjs.map +1 -0
- package/dist/src/modules/tag/tag.db.d.cts +352 -0
- package/dist/src/modules/tag/tag.dto.cjs +15 -0
- package/dist/src/modules/tag/tag.dto.cjs.map +1 -0
- package/dist/src/modules/tag/tag.dto.d.cts +1025 -0
- package/dist/src/modules/tag/tag.repository.cjs +116 -0
- package/dist/src/modules/tag/tag.repository.cjs.map +1 -0
- package/dist/src/modules/tag/tag.repository.d.cts +394 -0
- package/dist/src/modules/tag/tag.service.cjs +48 -0
- package/dist/src/modules/tag/tag.service.cjs.map +1 -0
- package/dist/src/modules/tag/tag.service.d.cts +120 -0
- package/dist/src/modules/tag/tag.trpc.cjs +32 -0
- package/dist/src/modules/tag/tag.trpc.cjs.map +1 -0
- package/dist/src/modules/tag/tag.trpc.d.cts +174 -0
- package/dist/src/modules/tag/tag.trpc.d.mts +1 -0
- package/dist/src/modules/utils/applyPagination.cjs +16 -0
- package/dist/src/modules/utils/applyPagination.cjs.map +1 -0
- package/dist/src/modules/utils/applyPagination.d.cts +10 -0
- package/dist/src/modules/utils/applySorting.cjs +20 -0
- package/dist/src/modules/utils/applySorting.cjs.map +1 -0
- package/dist/src/modules/utils/applySorting.d.cts +13 -0
- package/dist/src/modules/utils/getConditionsFromFilters.cjs +152 -0
- package/dist/src/modules/utils/getConditionsFromFilters.cjs.map +1 -0
- package/dist/src/modules/utils/getConditionsFromFilters.d.cts +9 -0
- package/dist/src/modules/utils/getGlobalSearchCondition.cjs +30 -0
- package/dist/src/modules/utils/getGlobalSearchCondition.cjs.map +1 -0
- package/dist/src/modules/utils/getGlobalSearchCondition.d.cts +18 -0
- package/dist/src/modules/utils/getGlobalSearchCondition.d.mts +18 -0
- package/dist/src/modules/utils/getGlobalSearchCondition.mjs +26 -0
- package/dist/src/modules/utils/getGlobalSearchCondition.mjs.map +1 -0
- package/dist/src/modules/video/video.service.cjs +114 -0
- package/dist/src/modules/video/video.service.cjs.map +1 -0
- package/dist/src/modules/video/video.service.d.cts +12 -0
- package/dist/src/modules/video/video.service.mjs.map +1 -1
- package/dist/src/modules/webhook/webhook.constants.cjs +13 -0
- package/dist/src/modules/webhook/webhook.constants.cjs.map +1 -0
- package/dist/src/modules/webhook/webhook.constants.d.cts +12 -0
- package/dist/src/modules/webhook/webhook.db.cjs +19 -0
- package/dist/src/modules/webhook/webhook.db.cjs.map +1 -0
- package/dist/src/modules/webhook/webhook.db.d.cts +142 -0
- package/dist/src/modules/webhook/webhook.dto.cjs +11 -0
- package/dist/src/modules/webhook/webhook.dto.cjs.map +1 -0
- package/dist/src/modules/webhook/webhook.dto.d.cts +402 -0
- package/dist/src/modules/webhook/webhook.repository.cjs +52 -0
- package/dist/src/modules/webhook/webhook.repository.cjs.map +1 -0
- package/dist/src/modules/webhook/webhook.repository.d.cts +154 -0
- package/dist/src/modules/webhook/webhook.router.cjs +26 -0
- package/dist/src/modules/webhook/webhook.router.cjs.map +1 -0
- package/dist/src/modules/webhook/webhook.router.d.cts +8 -0
- package/dist/src/modules/webhook/webhook.service.cjs +61 -0
- package/dist/src/modules/webhook/webhook.service.cjs.map +1 -0
- package/dist/src/modules/webhook/webhook.service.d.cts +14 -0
- package/dist/src/modules/workflow/workflow.db.cjs +35 -0
- package/dist/src/modules/workflow/workflow.db.cjs.map +1 -0
- package/dist/src/modules/workflow/workflow.db.d.cts +302 -0
- package/dist/src/modules/workflow/workflow.repository.cjs +95 -0
- package/dist/src/modules/workflow/workflow.repository.cjs.map +1 -0
- package/dist/src/modules/workflow/workflow.repository.d.cts +371 -0
- package/dist/src/modules/workflow/workflow.service.cjs +41 -0
- package/dist/src/modules/workflow/workflow.service.cjs.map +1 -0
- package/dist/src/modules/workflow/workflow.service.d.cts +68 -0
- package/dist/src/modules/workflow/workflow.trpc.cjs +19 -0
- package/dist/src/modules/workflow/workflow.trpc.cjs.map +1 -0
- package/dist/src/modules/workflow/workflow.trpc.d.cts +65 -0
- package/dist/src/modules/workflow/workflow.types.cjs +0 -0
- package/dist/src/modules/workflow/workflow.types.d.cts +25 -0
- package/dist/src/modules/workflow/workflow.utils.cjs +185 -0
- package/dist/src/modules/workflow/workflow.utils.cjs.map +1 -0
- package/dist/src/modules/workflow/workflow.utils.d.cts +36 -0
- package/dist/src/types.cjs +12 -0
- package/dist/src/types.cjs.map +1 -0
- package/dist/src/types.d.cts +344 -0
- package/dist/src/utils/errors.cjs +101 -0
- package/dist/src/utils/errors.cjs.map +1 -0
- package/dist/src/utils/errors.d.cts +62 -0
- package/dist/src/utils/logger.cjs +13 -0
- package/dist/src/utils/logger.cjs.map +1 -0
- package/dist/src/utils/logger.d.cts +7 -0
- package/dist/src/utils/posthog.cjs +31 -0
- package/dist/src/utils/posthog.cjs.map +1 -0
- package/dist/src/utils/posthog.d.cts +17 -0
- package/dist/src/utils/trpc.cjs +156 -0
- package/dist/src/utils/trpc.cjs.map +1 -0
- package/dist/src/utils/trpc.d.cts +54 -0
- package/dist/src/utils/types.cjs +0 -0
- package/dist/src/utils/types.d.cts +9 -0
- 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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"}
|