@fivepixels-js/lite-api 0.2.1
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/LICENSE +93 -0
- package/README.md +537 -0
- package/dist/app.d.ts +10 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +70 -0
- package/dist/app.js.map +1 -0
- package/dist/auth/identity.repository.d.ts +62 -0
- package/dist/auth/identity.repository.d.ts.map +1 -0
- package/dist/auth/identity.repository.js +202 -0
- package/dist/auth/identity.repository.js.map +1 -0
- package/dist/auth/identity.routes.d.ts +5 -0
- package/dist/auth/identity.routes.d.ts.map +1 -0
- package/dist/auth/identity.routes.js +56 -0
- package/dist/auth/identity.routes.js.map +1 -0
- package/dist/auth/identity.schemas.d.ts +2711 -0
- package/dist/auth/identity.schemas.d.ts.map +1 -0
- package/dist/auth/identity.schemas.js +117 -0
- package/dist/auth/identity.schemas.js.map +1 -0
- package/dist/auth/identity.service.d.ts +37 -0
- package/dist/auth/identity.service.d.ts.map +1 -0
- package/dist/auth/identity.service.js +131 -0
- package/dist/auth/identity.service.js.map +1 -0
- package/dist/auth/password.service.d.ts +15 -0
- package/dist/auth/password.service.d.ts.map +1 -0
- package/dist/auth/password.service.js +116 -0
- package/dist/auth/password.service.js.map +1 -0
- package/dist/auth/token.service.d.ts +38 -0
- package/dist/auth/token.service.d.ts.map +1 -0
- package/dist/auth/token.service.js +54 -0
- package/dist/auth/token.service.js.map +1 -0
- package/dist/cli/cli.d.ts +3 -0
- package/dist/cli/cli.d.ts.map +1 -0
- package/dist/cli/cli.js +132 -0
- package/dist/cli/cli.js.map +1 -0
- package/dist/cli/commands/backup.d.ts +4 -0
- package/dist/cli/commands/backup.d.ts.map +1 -0
- package/dist/cli/commands/backup.js +24 -0
- package/dist/cli/commands/backup.js.map +1 -0
- package/dist/cli/commands/init.d.ts +4 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +23 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/migrate.d.ts +4 -0
- package/dist/cli/commands/migrate.d.ts.map +1 -0
- package/dist/cli/commands/migrate.js +20 -0
- package/dist/cli/commands/migrate.js.map +1 -0
- package/dist/cli/commands/start.d.ts +4 -0
- package/dist/cli/commands/start.d.ts.map +1 -0
- package/dist/cli/commands/start.js +13 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/status.d.ts +4 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +48 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +4 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/io.d.ts +6 -0
- package/dist/cli/io.d.ts.map +1 -0
- package/dist/cli/io.js +9 -0
- package/dist/cli/io.js.map +1 -0
- package/dist/community/contracts.d.ts +29 -0
- package/dist/community/contracts.d.ts.map +1 -0
- package/dist/community/contracts.js +41 -0
- package/dist/community/contracts.js.map +1 -0
- package/dist/community/error-handler.d.ts +3 -0
- package/dist/community/error-handler.d.ts.map +1 -0
- package/dist/community/error-handler.js +66 -0
- package/dist/community/error-handler.js.map +1 -0
- package/dist/community/errors.d.ts +10 -0
- package/dist/community/errors.d.ts.map +1 -0
- package/dist/community/errors.js +39 -0
- package/dist/community/errors.js.map +1 -0
- package/dist/community/etag.d.ts +5 -0
- package/dist/community/etag.d.ts.map +1 -0
- package/dist/community/etag.js +31 -0
- package/dist/community/etag.js.map +1 -0
- package/dist/community/input.d.ts +10 -0
- package/dist/community/input.d.ts.map +1 -0
- package/dist/community/input.js +48 -0
- package/dist/community/input.js.map +1 -0
- package/dist/community/mutation-route.d.ts +7 -0
- package/dist/community/mutation-route.d.ts.map +1 -0
- package/dist/community/mutation-route.js +47 -0
- package/dist/community/mutation-route.js.map +1 -0
- package/dist/community/schemas.d.ts +807 -0
- package/dist/community/schemas.d.ts.map +1 -0
- package/dist/community/schemas.js +100 -0
- package/dist/community/schemas.js.map +1 -0
- package/dist/community/system.schemas.d.ts +40 -0
- package/dist/community/system.schemas.d.ts.map +1 -0
- package/dist/community/system.schemas.js +30 -0
- package/dist/community/system.schemas.js.map +1 -0
- package/dist/config/config.d.ts +43 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +208 -0
- package/dist/config/config.js.map +1 -0
- package/dist/config/data-path.d.ts +2 -0
- package/dist/config/data-path.d.ts.map +1 -0
- package/dist/config/data-path.js +16 -0
- package/dist/config/data-path.js.map +1 -0
- package/dist/config/jwt-secret.d.ts +3 -0
- package/dist/config/jwt-secret.d.ts.map +1 -0
- package/dist/config/jwt-secret.js +67 -0
- package/dist/config/jwt-secret.js.map +1 -0
- package/dist/db/backup.d.ts +10 -0
- package/dist/db/backup.d.ts.map +1 -0
- package/dist/db/backup.js +51 -0
- package/dist/db/backup.js.map +1 -0
- package/dist/db/connection.d.ts +15 -0
- package/dist/db/connection.d.ts.map +1 -0
- package/dist/db/connection.js +82 -0
- package/dist/db/connection.js.map +1 -0
- package/dist/db/guid-order.d.ts +2 -0
- package/dist/db/guid-order.d.ts.map +1 -0
- package/dist/db/guid-order.js +9 -0
- package/dist/db/guid-order.js.map +1 -0
- package/dist/db/migrate.d.ts +37 -0
- package/dist/db/migrate.d.ts.map +1 -0
- package/dist/db/migrate.js +145 -0
- package/dist/db/migrate.js.map +1 -0
- package/dist/db/migrations/001_schema_migrations.sql +6 -0
- package/dist/db/migrations/002_identity.sql +95 -0
- package/dist/db/migrations/003_projects.sql +62 -0
- package/dist/db/migrations/004_feedback_core.sql +236 -0
- package/dist/db/migrations/005_project_member_management.sql +55 -0
- package/dist/db/migrations/006_align_credentials.sql +33 -0
- package/dist/db/migrations/007_align_storage_values.sql +78 -0
- package/dist/db/storage-migration.d.ts +9 -0
- package/dist/db/storage-migration.d.ts.map +1 -0
- package/dist/db/storage-migration.js +79 -0
- package/dist/db/storage-migration.js.map +1 -0
- package/dist/db/transaction.d.ts +9 -0
- package/dist/db/transaction.d.ts.map +1 -0
- package/dist/db/transaction.js +14 -0
- package/dist/db/transaction.js.map +1 -0
- package/dist/errors/error-handler.d.ts +3 -0
- package/dist/errors/error-handler.d.ts.map +1 -0
- package/dist/errors/error-handler.js +50 -0
- package/dist/errors/error-handler.js.map +1 -0
- package/dist/feedbacks/feedback-workflow.service.d.ts +59 -0
- package/dist/feedbacks/feedback-workflow.service.d.ts.map +1 -0
- package/dist/feedbacks/feedback-workflow.service.js +89 -0
- package/dist/feedbacks/feedback-workflow.service.js.map +1 -0
- package/dist/feedbacks/feedback.input.d.ts +4 -0
- package/dist/feedbacks/feedback.input.d.ts.map +1 -0
- package/dist/feedbacks/feedback.input.js +25 -0
- package/dist/feedbacks/feedback.input.js.map +1 -0
- package/dist/feedbacks/feedback.repository.d.ts +48 -0
- package/dist/feedbacks/feedback.repository.d.ts.map +1 -0
- package/dist/feedbacks/feedback.repository.js +238 -0
- package/dist/feedbacks/feedback.repository.js.map +1 -0
- package/dist/feedbacks/feedback.routes.d.ts +4 -0
- package/dist/feedbacks/feedback.routes.d.ts.map +1 -0
- package/dist/feedbacks/feedback.routes.js +78 -0
- package/dist/feedbacks/feedback.routes.js.map +1 -0
- package/dist/feedbacks/feedback.schemas.d.ts +642 -0
- package/dist/feedbacks/feedback.schemas.d.ts.map +1 -0
- package/dist/feedbacks/feedback.schemas.js +131 -0
- package/dist/feedbacks/feedback.schemas.js.map +1 -0
- package/dist/feedbacks/feedback.service.d.ts +23 -0
- package/dist/feedbacks/feedback.service.d.ts.map +1 -0
- package/dist/feedbacks/feedback.service.js +74 -0
- package/dist/feedbacks/feedback.service.js.map +1 -0
- package/dist/feedbacks/feedback.types.d.ts +64 -0
- package/dist/feedbacks/feedback.types.d.ts.map +1 -0
- package/dist/feedbacks/feedback.types.js +2 -0
- package/dist/feedbacks/feedback.types.js.map +1 -0
- package/dist/page-elements/page-element.input.d.ts +7 -0
- package/dist/page-elements/page-element.input.d.ts.map +1 -0
- package/dist/page-elements/page-element.input.js +59 -0
- package/dist/page-elements/page-element.input.js.map +1 -0
- package/dist/page-elements/page-element.repository.d.ts +21 -0
- package/dist/page-elements/page-element.repository.d.ts.map +1 -0
- package/dist/page-elements/page-element.repository.js +123 -0
- package/dist/page-elements/page-element.repository.js.map +1 -0
- package/dist/page-elements/page-element.schemas.d.ts +97 -0
- package/dist/page-elements/page-element.schemas.d.ts.map +1 -0
- package/dist/page-elements/page-element.schemas.js +40 -0
- package/dist/page-elements/page-element.schemas.js.map +1 -0
- package/dist/page-elements/page-element.types.d.ts +24 -0
- package/dist/page-elements/page-element.types.d.ts.map +1 -0
- package/dist/page-elements/page-element.types.js +2 -0
- package/dist/page-elements/page-element.types.js.map +1 -0
- package/dist/plugins/auth.plugin.d.ts +3 -0
- package/dist/plugins/auth.plugin.d.ts.map +1 -0
- package/dist/plugins/auth.plugin.js +28 -0
- package/dist/plugins/auth.plugin.js.map +1 -0
- package/dist/plugins/community-api.plugin.d.ts +5 -0
- package/dist/plugins/community-api.plugin.d.ts.map +1 -0
- package/dist/plugins/community-api.plugin.js +25 -0
- package/dist/plugins/community-api.plugin.js.map +1 -0
- package/dist/plugins/cors.plugin.d.ts +3 -0
- package/dist/plugins/cors.plugin.d.ts.map +1 -0
- package/dist/plugins/cors.plugin.js +19 -0
- package/dist/plugins/cors.plugin.js.map +1 -0
- package/dist/plugins/swagger.plugin.d.ts +3 -0
- package/dist/plugins/swagger.plugin.d.ts.map +1 -0
- package/dist/plugins/swagger.plugin.js +59 -0
- package/dist/plugins/swagger.plugin.js.map +1 -0
- package/dist/plugins/user-auth.plugin.d.ts +33 -0
- package/dist/plugins/user-auth.plugin.d.ts.map +1 -0
- package/dist/plugins/user-auth.plugin.js +62 -0
- package/dist/plugins/user-auth.plugin.js.map +1 -0
- package/dist/projects/members/project-member.repository.d.ts +49 -0
- package/dist/projects/members/project-member.repository.d.ts.map +1 -0
- package/dist/projects/members/project-member.repository.js +215 -0
- package/dist/projects/members/project-member.repository.js.map +1 -0
- package/dist/projects/members/project-member.routes.d.ts +4 -0
- package/dist/projects/members/project-member.routes.d.ts.map +1 -0
- package/dist/projects/members/project-member.routes.js +82 -0
- package/dist/projects/members/project-member.routes.js.map +1 -0
- package/dist/projects/members/project-member.schemas.d.ts +2735 -0
- package/dist/projects/members/project-member.schemas.d.ts.map +1 -0
- package/dist/projects/members/project-member.schemas.js +138 -0
- package/dist/projects/members/project-member.schemas.js.map +1 -0
- package/dist/projects/members/project-member.service.d.ts +29 -0
- package/dist/projects/members/project-member.service.d.ts.map +1 -0
- package/dist/projects/members/project-member.service.js +92 -0
- package/dist/projects/members/project-member.service.js.map +1 -0
- package/dist/projects/project-access.policy.d.ts +11 -0
- package/dist/projects/project-access.policy.d.ts.map +1 -0
- package/dist/projects/project-access.policy.js +30 -0
- package/dist/projects/project-access.policy.js.map +1 -0
- package/dist/projects/project-access.repository.d.ts +12 -0
- package/dist/projects/project-access.repository.d.ts.map +1 -0
- package/dist/projects/project-access.repository.js +45 -0
- package/dist/projects/project-access.repository.js.map +1 -0
- package/dist/projects/project-access.types.d.ts +9 -0
- package/dist/projects/project-access.types.d.ts.map +1 -0
- package/dist/projects/project-access.types.js +2 -0
- package/dist/projects/project-access.types.js.map +1 -0
- package/dist/projects/project-mutation.service.d.ts +15 -0
- package/dist/projects/project-mutation.service.d.ts.map +1 -0
- package/dist/projects/project-mutation.service.js +39 -0
- package/dist/projects/project-mutation.service.js.map +1 -0
- package/dist/projects/project.repository.d.ts +49 -0
- package/dist/projects/project.repository.d.ts.map +1 -0
- package/dist/projects/project.repository.js +155 -0
- package/dist/projects/project.repository.js.map +1 -0
- package/dist/projects/project.routes.d.ts +4 -0
- package/dist/projects/project.routes.d.ts.map +1 -0
- package/dist/projects/project.routes.js +45 -0
- package/dist/projects/project.routes.js.map +1 -0
- package/dist/projects/project.schemas.d.ts +2044 -0
- package/dist/projects/project.schemas.d.ts.map +1 -0
- package/dist/projects/project.schemas.js +90 -0
- package/dist/projects/project.schemas.js.map +1 -0
- package/dist/projects/project.service.d.ts +40 -0
- package/dist/projects/project.service.d.ts.map +1 -0
- package/dist/projects/project.service.js +128 -0
- package/dist/projects/project.service.js.map +1 -0
- package/dist/replies/reply-mutation.service.d.ts +19 -0
- package/dist/replies/reply-mutation.service.d.ts.map +1 -0
- package/dist/replies/reply-mutation.service.js +51 -0
- package/dist/replies/reply-mutation.service.js.map +1 -0
- package/dist/replies/reply.input.d.ts +4 -0
- package/dist/replies/reply.input.d.ts.map +1 -0
- package/dist/replies/reply.input.js +33 -0
- package/dist/replies/reply.input.js.map +1 -0
- package/dist/replies/reply.repository.d.ts +40 -0
- package/dist/replies/reply.repository.d.ts.map +1 -0
- package/dist/replies/reply.repository.js +173 -0
- package/dist/replies/reply.repository.js.map +1 -0
- package/dist/replies/reply.routes.d.ts +4 -0
- package/dist/replies/reply.routes.d.ts.map +1 -0
- package/dist/replies/reply.routes.js +64 -0
- package/dist/replies/reply.routes.js.map +1 -0
- package/dist/replies/reply.schemas.d.ts +251 -0
- package/dist/replies/reply.schemas.d.ts.map +1 -0
- package/dist/replies/reply.schemas.js +51 -0
- package/dist/replies/reply.schemas.js.map +1 -0
- package/dist/replies/reply.service.d.ts +19 -0
- package/dist/replies/reply.service.d.ts.map +1 -0
- package/dist/replies/reply.service.js +50 -0
- package/dist/replies/reply.service.js.map +1 -0
- package/dist/replies/reply.types.d.ts +31 -0
- package/dist/replies/reply.types.d.ts.map +1 -0
- package/dist/replies/reply.types.js +2 -0
- package/dist/replies/reply.types.js.map +1 -0
- package/dist/report-cases/report-case-workflow.service.d.ts +39 -0
- package/dist/report-cases/report-case-workflow.service.d.ts.map +1 -0
- package/dist/report-cases/report-case-workflow.service.js +103 -0
- package/dist/report-cases/report-case-workflow.service.js.map +1 -0
- package/dist/report-cases/report-case.input.d.ts +4 -0
- package/dist/report-cases/report-case.input.d.ts.map +1 -0
- package/dist/report-cases/report-case.input.js +29 -0
- package/dist/report-cases/report-case.input.js.map +1 -0
- package/dist/report-cases/report-case.repository.d.ts +45 -0
- package/dist/report-cases/report-case.repository.d.ts.map +1 -0
- package/dist/report-cases/report-case.repository.js +185 -0
- package/dist/report-cases/report-case.repository.js.map +1 -0
- package/dist/report-cases/report-case.routes.d.ts +4 -0
- package/dist/report-cases/report-case.routes.d.ts.map +1 -0
- package/dist/report-cases/report-case.routes.js +94 -0
- package/dist/report-cases/report-case.routes.js.map +1 -0
- package/dist/report-cases/report-case.schemas.d.ts +294 -0
- package/dist/report-cases/report-case.schemas.d.ts.map +1 -0
- package/dist/report-cases/report-case.schemas.js +77 -0
- package/dist/report-cases/report-case.schemas.js.map +1 -0
- package/dist/report-cases/report-case.service.d.ts +21 -0
- package/dist/report-cases/report-case.service.d.ts.map +1 -0
- package/dist/report-cases/report-case.service.js +60 -0
- package/dist/report-cases/report-case.service.js.map +1 -0
- package/dist/report-cases/report-case.types.d.ts +39 -0
- package/dist/report-cases/report-case.types.d.ts.map +1 -0
- package/dist/report-cases/report-case.types.js +2 -0
- package/dist/report-cases/report-case.types.js.map +1 -0
- package/dist/routes/health.route.d.ts +4 -0
- package/dist/routes/health.route.d.ts.map +1 -0
- package/dist/routes/health.route.js +39 -0
- package/dist/routes/health.route.js.map +1 -0
- package/dist/routes/version.route.d.ts +3 -0
- package/dist/routes/version.route.d.ts.map +1 -0
- package/dist/routes/version.route.js +22 -0
- package/dist/routes/version.route.js.map +1 -0
- package/dist/runtime/index.d.ts +8 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +11 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/server.d.ts +11 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +66 -0
- package/dist/server.js.map +1 -0
- package/dist/storage/values.d.ts +3 -0
- package/dist/storage/values.d.ts.map +1 -0
- package/dist/storage/values.js +30 -0
- package/dist/storage/values.js.map +1 -0
- package/dist/users/current-user.routes.d.ts +3 -0
- package/dist/users/current-user.routes.d.ts.map +1 -0
- package/dist/users/current-user.routes.js +9 -0
- package/dist/users/current-user.routes.js.map +1 -0
- package/dist/users/current-user.schemas.d.ts +641 -0
- package/dist/users/current-user.schemas.d.ts.map +1 -0
- package/dist/users/current-user.schemas.js +21 -0
- package/dist/users/current-user.schemas.js.map +1 -0
- package/dist/users/user-search.repository.d.ts +19 -0
- package/dist/users/user-search.repository.d.ts.map +1 -0
- package/dist/users/user-search.repository.js +55 -0
- package/dist/users/user-search.repository.js.map +1 -0
- package/dist/users/user-search.routes.d.ts +4 -0
- package/dist/users/user-search.routes.d.ts.map +1 -0
- package/dist/users/user-search.routes.js +19 -0
- package/dist/users/user-search.routes.js.map +1 -0
- package/dist/users/user-search.schemas.d.ts +693 -0
- package/dist/users/user-search.schemas.d.ts.map +1 -0
- package/dist/users/user-search.schemas.js +41 -0
- package/dist/users/user-search.schemas.js.map +1 -0
- package/dist/users/user-search.service.d.ts +20 -0
- package/dist/users/user-search.service.d.ts.map +1 -0
- package/dist/users/user-search.service.js +41 -0
- package/dist/users/user-search.service.js.map +1 -0
- package/dist/users/user.schemas.d.ts +47 -0
- package/dist/users/user.schemas.d.ts.map +1 -0
- package/dist/users/user.schemas.js +13 -0
- package/dist/users/user.schemas.js.map +1 -0
- package/dist/users/user.types.d.ts +6 -0
- package/dist/users/user.types.d.ts.map +1 -0
- package/dist/users/user.types.js +2 -0
- package/dist/users/user.types.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +5 -0
- package/dist/version.js.map +1 -0
- package/docs/guides/community-api-quickstart.md +171 -0
- package/docs/guides/feature-structure.md +138 -0
- package/docs/guides/independent-cli.md +73 -0
- package/docs/guides/non-attachment-api-contract.md +138 -0
- package/docs/plans/selfdev-schema-alignment.md +61 -0
- package/package.json +76 -0
- package/sql/fivepixels-lite-init.sql +518 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-member.schemas.d.ts","sourceRoot":"","sources":["../../../src/projects/members/project-member.schemas.ts"],"names":[],"mappings":"AAuCA,eAAO,MAAM,iCAAiC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqBpC,CAAC;AASX,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoB3B,CAAC;AAEX,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BzB,CAAC;AAEX,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmBhC,CAAC;AAEX,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAU5B,CAAC"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { communityErrorResponses, communityResponseSchema, nullableStringSchema, uuidSchema, } from '../../community/schemas.js';
|
|
2
|
+
const timestampSchema = { type: 'string', format: 'date-time' };
|
|
3
|
+
const roleInputSchema = { type: 'string', minLength: 1, maxLength: 20 };
|
|
4
|
+
const roleResponseSchema = { type: 'string', enum: ['OWNER', 'MEMBER'] };
|
|
5
|
+
const projectParamsSchema = {
|
|
6
|
+
type: 'object',
|
|
7
|
+
additionalProperties: false,
|
|
8
|
+
required: ['projectId'],
|
|
9
|
+
properties: { projectId: uuidSchema },
|
|
10
|
+
};
|
|
11
|
+
const projectMemberParamsSchema = {
|
|
12
|
+
type: 'object',
|
|
13
|
+
additionalProperties: false,
|
|
14
|
+
required: ['projectId', 'userId'],
|
|
15
|
+
properties: {
|
|
16
|
+
projectId: uuidSchema,
|
|
17
|
+
userId: uuidSchema,
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
const ifMatchHeadersSchema = {
|
|
21
|
+
type: 'object',
|
|
22
|
+
required: ['if-match'],
|
|
23
|
+
properties: {
|
|
24
|
+
'if-match': {
|
|
25
|
+
type: 'string',
|
|
26
|
+
description: '현재 멤버 버전 ETag 값입니다.',
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
export const projectMemberResponseResultSchema = {
|
|
31
|
+
type: 'object',
|
|
32
|
+
additionalProperties: false,
|
|
33
|
+
required: [
|
|
34
|
+
'userId',
|
|
35
|
+
'userName',
|
|
36
|
+
'profileImageUrl',
|
|
37
|
+
'role',
|
|
38
|
+
'version',
|
|
39
|
+
'joinedAt',
|
|
40
|
+
'updatedAt',
|
|
41
|
+
],
|
|
42
|
+
properties: {
|
|
43
|
+
userId: uuidSchema,
|
|
44
|
+
userName: { type: 'string', minLength: 1, maxLength: 100 },
|
|
45
|
+
profileImageUrl: nullableStringSchema,
|
|
46
|
+
role: roleResponseSchema,
|
|
47
|
+
version: { type: 'integer', minimum: 0 },
|
|
48
|
+
joinedAt: timestampSchema,
|
|
49
|
+
updatedAt: timestampSchema,
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
const memberResponseHeaders = {
|
|
53
|
+
ETag: {
|
|
54
|
+
type: 'string',
|
|
55
|
+
description: '멤버의 현재 lock version입니다.',
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
export const listProjectMembersSchema = {
|
|
59
|
+
tags: ['project-members'],
|
|
60
|
+
summary: '프로젝트 멤버 목록 조회',
|
|
61
|
+
security: [{ userJwt: [] }],
|
|
62
|
+
params: projectParamsSchema,
|
|
63
|
+
querystring: {
|
|
64
|
+
type: 'object',
|
|
65
|
+
additionalProperties: false,
|
|
66
|
+
properties: {
|
|
67
|
+
page: { type: 'integer', default: 1 },
|
|
68
|
+
pageSize: { type: 'integer', default: 20 },
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
response: {
|
|
72
|
+
200: communityResponseSchema({
|
|
73
|
+
type: 'array',
|
|
74
|
+
items: projectMemberResponseResultSchema,
|
|
75
|
+
}),
|
|
76
|
+
...communityErrorResponses,
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
export const addProjectMemberSchema = {
|
|
80
|
+
tags: ['project-members'],
|
|
81
|
+
summary: '프로젝트 멤버 추가',
|
|
82
|
+
security: [{ userJwt: [] }],
|
|
83
|
+
params: projectParamsSchema,
|
|
84
|
+
body: {
|
|
85
|
+
type: 'object',
|
|
86
|
+
additionalProperties: false,
|
|
87
|
+
required: ['userId', 'role'],
|
|
88
|
+
properties: {
|
|
89
|
+
userId: uuidSchema,
|
|
90
|
+
role: roleInputSchema,
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
response: {
|
|
94
|
+
201: {
|
|
95
|
+
...communityResponseSchema(projectMemberResponseResultSchema),
|
|
96
|
+
headers: {
|
|
97
|
+
...memberResponseHeaders,
|
|
98
|
+
Location: {
|
|
99
|
+
type: 'string',
|
|
100
|
+
description: '생성된 프로젝트 멤버 경로입니다.',
|
|
101
|
+
},
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
...communityErrorResponses,
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
export const changeProjectMemberRoleSchema = {
|
|
108
|
+
tags: ['project-members'],
|
|
109
|
+
summary: '프로젝트 멤버 역할 변경',
|
|
110
|
+
security: [{ userJwt: [] }],
|
|
111
|
+
params: projectMemberParamsSchema,
|
|
112
|
+
headers: ifMatchHeadersSchema,
|
|
113
|
+
body: {
|
|
114
|
+
type: 'object',
|
|
115
|
+
additionalProperties: false,
|
|
116
|
+
required: ['role'],
|
|
117
|
+
properties: { role: roleInputSchema },
|
|
118
|
+
},
|
|
119
|
+
response: {
|
|
120
|
+
200: {
|
|
121
|
+
...communityResponseSchema(projectMemberResponseResultSchema),
|
|
122
|
+
headers: memberResponseHeaders,
|
|
123
|
+
},
|
|
124
|
+
...communityErrorResponses,
|
|
125
|
+
},
|
|
126
|
+
};
|
|
127
|
+
export const removeProjectMemberSchema = {
|
|
128
|
+
tags: ['project-members'],
|
|
129
|
+
summary: '프로젝트 멤버 제거',
|
|
130
|
+
security: [{ userJwt: [] }],
|
|
131
|
+
params: projectMemberParamsSchema,
|
|
132
|
+
headers: ifMatchHeadersSchema,
|
|
133
|
+
response: {
|
|
134
|
+
204: { type: 'null', description: '멤버 제거 완료' },
|
|
135
|
+
...communityErrorResponses,
|
|
136
|
+
},
|
|
137
|
+
};
|
|
138
|
+
//# sourceMappingURL=project-member.schemas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-member.schemas.js","sourceRoot":"","sources":["../../../src/projects/members/project-member.schemas.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type PaginationMetadata } from '../../community/contracts.js';
|
|
2
|
+
import type { ProjectRole } from '../project.service.js';
|
|
3
|
+
import type { ProjectMemberRepository } from './project-member.repository.js';
|
|
4
|
+
export interface ProjectMemberResponse {
|
|
5
|
+
joinedAt: string;
|
|
6
|
+
profileImageUrl: string | null;
|
|
7
|
+
role: ProjectRole;
|
|
8
|
+
updatedAt: string;
|
|
9
|
+
userId: string;
|
|
10
|
+
userName: string;
|
|
11
|
+
version: number;
|
|
12
|
+
}
|
|
13
|
+
export interface ProjectMemberListRequest {
|
|
14
|
+
page?: number;
|
|
15
|
+
pageSize?: number;
|
|
16
|
+
}
|
|
17
|
+
export interface ProjectMemberListResponse {
|
|
18
|
+
items: ProjectMemberResponse[];
|
|
19
|
+
pagination: PaginationMetadata;
|
|
20
|
+
}
|
|
21
|
+
export declare class ProjectMemberService {
|
|
22
|
+
private readonly repository;
|
|
23
|
+
constructor(repository: ProjectMemberRepository);
|
|
24
|
+
list(projectId: string, currentUserId: string, request: ProjectMemberListRequest): ProjectMemberListResponse;
|
|
25
|
+
add(projectId: string, currentUserId: string, targetUserId: string, role: string): ProjectMemberResponse;
|
|
26
|
+
changeRole(projectId: string, currentUserId: string, targetUserId: string, role: string, expectedVersion: number): ProjectMemberResponse;
|
|
27
|
+
remove(projectId: string, currentUserId: string, targetUserId: string, expectedVersion: number): void;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=project-member.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-member.service.d.ts","sourceRoot":"","sources":["../../../src/projects/members/project-member.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkC,KAAK,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAIvG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAuB,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAKnG,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,qBAAqB,EAAE,CAAC;IAC/B,UAAU,EAAE,kBAAkB,CAAC;CAChC;AAyCD,qBAAa,oBAAoB;IACZ,OAAO,CAAC,QAAQ,CAAC,UAAU;gBAAV,UAAU,EAAE,uBAAuB;IAEhE,IAAI,CACT,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,wBAAwB,GAChC,yBAAyB;IAmBrB,GAAG,CACR,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,GACX,qBAAqB;IAYjB,UAAU,CACf,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,EACZ,eAAe,EAAE,MAAM,GACtB,qBAAqB;IAcjB,MAAM,CACX,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,MAAM,GACtB,IAAI;CAWR"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { pageMetadata, parsePageRequest } from '../../community/contracts.js';
|
|
2
|
+
import { CommunityApiError } from '../../community/errors.js';
|
|
3
|
+
import { requireUuid } from '../../community/input.js';
|
|
4
|
+
import { storageTimestamp } from '../../storage/values.js';
|
|
5
|
+
const OWNER_ROLE = 1;
|
|
6
|
+
const MEMBER_ROLE = 2;
|
|
7
|
+
function normalizeRole(value) {
|
|
8
|
+
const role = value.trim().toUpperCase();
|
|
9
|
+
if (role === 'OWNER')
|
|
10
|
+
return OWNER_ROLE;
|
|
11
|
+
if (role === 'MEMBER')
|
|
12
|
+
return MEMBER_ROLE;
|
|
13
|
+
throw new CommunityApiError(400, 'invalid-project-role', '역할은 OWNER 또는 MEMBER여야 합니다.');
|
|
14
|
+
}
|
|
15
|
+
function roleName(roleCode) {
|
|
16
|
+
if (roleCode === OWNER_ROLE)
|
|
17
|
+
return 'OWNER';
|
|
18
|
+
if (roleCode === MEMBER_ROLE)
|
|
19
|
+
return 'MEMBER';
|
|
20
|
+
throw new Error('Unknown project member role code.');
|
|
21
|
+
}
|
|
22
|
+
function validateExpectedVersion(expectedVersion) {
|
|
23
|
+
if (!Number.isSafeInteger(expectedVersion) || expectedVersion < 0) {
|
|
24
|
+
throw new CommunityApiError(400, 'invalid-if-match', 'If-Match 헤더 형식이 올바르지 않습니다.');
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function mapMember(member) {
|
|
28
|
+
return {
|
|
29
|
+
userId: member.userId,
|
|
30
|
+
userName: member.userName,
|
|
31
|
+
profileImageUrl: member.profileImageUrl,
|
|
32
|
+
role: roleName(member.roleCode),
|
|
33
|
+
version: member.lockVersion,
|
|
34
|
+
joinedAt: member.joinedAt,
|
|
35
|
+
updatedAt: member.updatedAt,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
export class ProjectMemberService {
|
|
39
|
+
repository;
|
|
40
|
+
constructor(repository) {
|
|
41
|
+
this.repository = repository;
|
|
42
|
+
}
|
|
43
|
+
list(projectId, currentUserId, request) {
|
|
44
|
+
const normalizedProjectId = requireUuid(projectId, 'projectId');
|
|
45
|
+
const { page, pageSize } = parsePageRequest(request.page, request.pageSize);
|
|
46
|
+
const offset = (page - 1) * pageSize;
|
|
47
|
+
if (!Number.isSafeInteger(offset)) {
|
|
48
|
+
throw new CommunityApiError(400, 'invalid-page', 'page는 1 이상이어야 합니다.');
|
|
49
|
+
}
|
|
50
|
+
const records = this.repository.list(normalizedProjectId, currentUserId, pageSize, offset);
|
|
51
|
+
return {
|
|
52
|
+
items: records.items.map(mapMember),
|
|
53
|
+
pagination: pageMetadata(page, pageSize, records.totalCount),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
add(projectId, currentUserId, targetUserId, role) {
|
|
57
|
+
const normalizedProjectId = requireUuid(projectId, 'projectId');
|
|
58
|
+
const normalizedTargetUserId = requireUuid(targetUserId, 'userId');
|
|
59
|
+
return mapMember(this.repository.add({
|
|
60
|
+
projectId: normalizedProjectId,
|
|
61
|
+
actorId: currentUserId,
|
|
62
|
+
targetUserId: normalizedTargetUserId,
|
|
63
|
+
roleCode: normalizeRole(role),
|
|
64
|
+
timestamp: storageTimestamp(new Date()),
|
|
65
|
+
}));
|
|
66
|
+
}
|
|
67
|
+
changeRole(projectId, currentUserId, targetUserId, role, expectedVersion) {
|
|
68
|
+
validateExpectedVersion(expectedVersion);
|
|
69
|
+
const normalizedProjectId = requireUuid(projectId, 'projectId');
|
|
70
|
+
const normalizedTargetUserId = requireUuid(targetUserId, 'userId');
|
|
71
|
+
return mapMember(this.repository.changeRole({
|
|
72
|
+
projectId: normalizedProjectId,
|
|
73
|
+
actorId: currentUserId,
|
|
74
|
+
targetUserId: normalizedTargetUserId,
|
|
75
|
+
roleCode: normalizeRole(role),
|
|
76
|
+
expectedVersion,
|
|
77
|
+
timestamp: storageTimestamp(new Date()),
|
|
78
|
+
}));
|
|
79
|
+
}
|
|
80
|
+
remove(projectId, currentUserId, targetUserId, expectedVersion) {
|
|
81
|
+
validateExpectedVersion(expectedVersion);
|
|
82
|
+
const normalizedProjectId = requireUuid(projectId, 'projectId');
|
|
83
|
+
const normalizedTargetUserId = requireUuid(targetUserId, 'userId');
|
|
84
|
+
this.repository.remove({
|
|
85
|
+
projectId: normalizedProjectId,
|
|
86
|
+
actorId: currentUserId,
|
|
87
|
+
targetUserId: normalizedTargetUserId,
|
|
88
|
+
expectedVersion,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=project-member.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-member.service.js","sourceRoot":"","sources":["../../../src/projects/members/project-member.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ProjectAccessRepository } from './project-access.repository.js';
|
|
2
|
+
import type { ProjectTarget } from './project-access.types.js';
|
|
3
|
+
export declare function editable(allowed: boolean, code: string): void;
|
|
4
|
+
export declare class ProjectAccessPolicy {
|
|
5
|
+
private readonly access;
|
|
6
|
+
constructor(access: ProjectAccessRepository);
|
|
7
|
+
authorize(target: ProjectTarget, active?: boolean): boolean;
|
|
8
|
+
owner(isOwner: boolean): void;
|
|
9
|
+
assignee(projectId: string, value: string | null | undefined): string | null;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=project-access.policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-access.policy.d.ts","sourceRoot":"","sources":["../../src/projects/project-access.policy.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE/D,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAE7D;AAED,qBAAa,mBAAmB;IACX,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,uBAAuB;IAE5D,SAAS,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,UAAO,GAAG,OAAO;IAQxD,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAI7B,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI;CAMpF"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { CommunityApiError } from '../community/errors.js';
|
|
2
|
+
import { requireUuid } from '../community/input.js';
|
|
3
|
+
export function editable(allowed, code) {
|
|
4
|
+
if (!allowed)
|
|
5
|
+
throw new CommunityApiError(403, code, '이 작업을 수행할 권한이 없습니다.');
|
|
6
|
+
}
|
|
7
|
+
export class ProjectAccessPolicy {
|
|
8
|
+
access;
|
|
9
|
+
constructor(access) {
|
|
10
|
+
this.access = access;
|
|
11
|
+
}
|
|
12
|
+
authorize(target, active = true) {
|
|
13
|
+
// Normalize all route IDs before comparisons as Guid binding does in selfdev.
|
|
14
|
+
for (const key of Object.keys(target)) {
|
|
15
|
+
target[key] = requireUuid(target[key], key);
|
|
16
|
+
}
|
|
17
|
+
return this.access.requireAccess(target.projectId, target.actorId, active).roleCode === 1;
|
|
18
|
+
}
|
|
19
|
+
owner(isOwner) {
|
|
20
|
+
editable(isOwner, 'project-owner-required');
|
|
21
|
+
}
|
|
22
|
+
assignee(projectId, value) {
|
|
23
|
+
if (value == null)
|
|
24
|
+
return null;
|
|
25
|
+
const id = requireUuid(value, 'assigneeId');
|
|
26
|
+
this.access.requireProjectMember(projectId, id);
|
|
27
|
+
return id;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=project-access.policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-access.policy.js","sourceRoot":"","sources":["../../src/projects/project-access.policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAIpD,MAAM,UAAU,QAAQ,CAAC,OAAgB,EAAE,IAAY;IACrD,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,iBAAiB,CAAC,GAAG,EAAE,IAAI,EAAE,qBAAqB,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,OAAO,mBAAmB;IACM;IAApC,YAAoC,MAA+B;QAA/B,WAAM,GAAN,MAAM,CAAyB;IAAG,CAAC;IAEhE,SAAS,CAAC,MAAqB,EAAE,MAAM,GAAG,IAAI;QACnD,8EAA8E;QAC9E,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAA+B,EAAE,CAAC;YACpE,MAAM,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC;IAC5F,CAAC;IAEM,KAAK,CAAC,OAAgB;QAC3B,QAAQ,CAAC,OAAO,EAAE,wBAAwB,CAAC,CAAC;IAC9C,CAAC;IAEM,QAAQ,CAAC,SAAiB,EAAE,KAAgC;QACjE,IAAI,KAAK,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC;QAC/B,MAAM,EAAE,GAAG,WAAW,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAChD,OAAO,EAAE,CAAC;IACZ,CAAC;CACF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { SqliteDatabase } from '../db/connection.js';
|
|
2
|
+
import type { CommunityUserResponse } from '../users/user.types.js';
|
|
3
|
+
import type { ProjectAccessRecord } from './project-access.types.js';
|
|
4
|
+
export declare class ProjectAccessRepository {
|
|
5
|
+
private readonly accessStatement;
|
|
6
|
+
private readonly usersStatement;
|
|
7
|
+
constructor(database: SqliteDatabase);
|
|
8
|
+
requireAccess(projectId: string, userId: string, requireActive: boolean): ProjectAccessRecord;
|
|
9
|
+
loadUsers(userIds: Iterable<string | null>): Map<string, CommunityUserResponse>;
|
|
10
|
+
requireProjectMember(projectId: string, userId: string): void;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=project-access.repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-access.repository.d.ts","sourceRoot":"","sources":["../../src/projects/project-access.repository.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAarE,qBAAa,uBAAuB;IAClC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA0B;IAC1D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA0B;gBAEtC,QAAQ,EAAE,cAAc;IAiBpC,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,GAAG,mBAAmB;IAW7F,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC;IAO/E,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;CAMrE"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { CommunityApiError } from '../community/errors.js';
|
|
2
|
+
export class ProjectAccessRepository {
|
|
3
|
+
accessStatement;
|
|
4
|
+
usersStatement;
|
|
5
|
+
constructor(database) {
|
|
6
|
+
this.accessStatement = database.prepare(`
|
|
7
|
+
SELECT p.status_code AS projectStatusCode,
|
|
8
|
+
pm.role_code AS roleCode
|
|
9
|
+
FROM projects AS p
|
|
10
|
+
INNER JOIN project_members AS pm ON pm.project_id = p.project_id
|
|
11
|
+
WHERE p.project_id = ? AND pm.user_id = ?
|
|
12
|
+
`);
|
|
13
|
+
this.usersStatement = database.prepare(`
|
|
14
|
+
SELECT user_id AS id,
|
|
15
|
+
user_name AS userName,
|
|
16
|
+
profile_image_url AS profileImageUrl
|
|
17
|
+
FROM users
|
|
18
|
+
WHERE user_id IN (SELECT value FROM json_each(?))
|
|
19
|
+
`);
|
|
20
|
+
}
|
|
21
|
+
requireAccess(projectId, userId, requireActive) {
|
|
22
|
+
const row = this.accessStatement.get(projectId, userId);
|
|
23
|
+
if (row === undefined) {
|
|
24
|
+
throw new CommunityApiError(404, 'project-not-found', '프로젝트를 찾을 수 없습니다.');
|
|
25
|
+
}
|
|
26
|
+
if (requireActive && row.projectStatusCode !== 1) {
|
|
27
|
+
throw new CommunityApiError(409, 'project-archived', '보관된 프로젝트는 변경할 수 없습니다.');
|
|
28
|
+
}
|
|
29
|
+
return row;
|
|
30
|
+
}
|
|
31
|
+
loadUsers(userIds) {
|
|
32
|
+
const ids = [...new Set([...userIds].filter((id) => id !== null))];
|
|
33
|
+
if (ids.length === 0)
|
|
34
|
+
return new Map();
|
|
35
|
+
const rows = this.usersStatement.all(JSON.stringify(ids));
|
|
36
|
+
return new Map(rows.map((row) => [row.id, row]));
|
|
37
|
+
}
|
|
38
|
+
requireProjectMember(projectId, userId) {
|
|
39
|
+
const row = this.accessStatement.get(projectId, userId);
|
|
40
|
+
if (row === undefined) {
|
|
41
|
+
throw new CommunityApiError(404, 'project-member-not-found', '프로젝트 멤버를 찾을 수 없습니다.');
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=project-access.repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-access.repository.js","sourceRoot":"","sources":["../../src/projects/project-access.repository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAgB3D,MAAM,OAAO,uBAAuB;IACjB,eAAe,CAA0B;IACzC,cAAc,CAA0B;IAEzD,YAAmB,QAAwB;QACzC,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAC,OAAO,CAAC;;;;;;KAMvC,CAAC,CAAC;QACH,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC;;;;;;KAMtC,CAAC,CAAC;IACL,CAAC;IAEM,aAAa,CAAC,SAAiB,EAAE,MAAc,EAAE,aAAsB;QAC5E,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAA0B,CAAC;QACjF,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,MAAM,IAAI,iBAAiB,CAAC,GAAG,EAAE,mBAAmB,EAAE,kBAAkB,CAAC,CAAC;QAC5E,CAAC;QACD,IAAI,aAAa,IAAI,GAAG,CAAC,iBAAiB,KAAK,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,iBAAiB,CAAC,GAAG,EAAE,kBAAkB,EAAE,uBAAuB,CAAC,CAAC;QAChF,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAEM,SAAS,CAAC,OAAgC;QAC/C,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAgB,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC;QACjF,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,GAAG,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAc,CAAC;QACvE,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC;IAEM,oBAAoB,CAAC,SAAiB,EAAE,MAAc;QAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAA0B,CAAC;QACjF,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,MAAM,IAAI,iBAAiB,CAAC,GAAG,EAAE,0BAA0B,EAAE,qBAAqB,CAAC,CAAC;QACtF,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-access.types.d.ts","sourceRoot":"","sources":["../../src/projects/project-access.types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAAG,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-access.types.js","sourceRoot":"","sources":["../../src/projects/project-access.types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { TransactionRunner } from '../db/transaction.js';
|
|
2
|
+
import type { ProjectAccessPolicy } from './project-access.policy.js';
|
|
3
|
+
import type { ProjectTarget } from './project-access.types.js';
|
|
4
|
+
import type { ProjectRepository } from './project.repository.js';
|
|
5
|
+
import type { ProjectService } from './project.service.js';
|
|
6
|
+
export declare class ProjectMutationService {
|
|
7
|
+
private readonly transactions;
|
|
8
|
+
private readonly policy;
|
|
9
|
+
private readonly repository;
|
|
10
|
+
private readonly projects;
|
|
11
|
+
constructor(transactions: TransactionRunner, policy: ProjectAccessPolicy, repository: ProjectRepository, projects: ProjectService);
|
|
12
|
+
renameProject(target: ProjectTarget, version: number, name: string): import("./project.service.js").ProjectResponse;
|
|
13
|
+
setProjectStatus(target: ProjectTarget, version: number, value: string): import("./project.service.js").ProjectResponse;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=project-mutation.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-mutation.service.d.ts","sourceRoot":"","sources":["../../src/projects/project-mutation.service.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,qBAAa,sBAAsB;IAE/B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAHR,YAAY,EAAE,iBAAiB,EAC/B,MAAM,EAAE,mBAAmB,EAC3B,UAAU,EAAE,iBAAiB,EAC7B,QAAQ,EAAE,cAAc;IAGpC,aAAa,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAUlE,gBAAgB,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;CAa9E"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { CommunityApiError } from '../community/errors.js';
|
|
2
|
+
import { verifyVersion } from '../community/etag.js';
|
|
3
|
+
import { normalizeRequired } from '../community/input.js';
|
|
4
|
+
import { storageTimestamp } from '../storage/values.js';
|
|
5
|
+
export class ProjectMutationService {
|
|
6
|
+
transactions;
|
|
7
|
+
policy;
|
|
8
|
+
repository;
|
|
9
|
+
projects;
|
|
10
|
+
constructor(transactions, policy, repository, projects) {
|
|
11
|
+
this.transactions = transactions;
|
|
12
|
+
this.policy = policy;
|
|
13
|
+
this.repository = repository;
|
|
14
|
+
this.projects = projects;
|
|
15
|
+
}
|
|
16
|
+
renameProject(target, version, name) {
|
|
17
|
+
return this.transactions.write(() => {
|
|
18
|
+
this.policy.owner(this.policy.authorize(target));
|
|
19
|
+
const project = this.projects.get(target.actorId, target.projectId);
|
|
20
|
+
verifyVersion(project.version, version);
|
|
21
|
+
this.repository.renameProject(target.projectId, normalizeRequired(name, 100, 'projectName'), storageTimestamp(new Date()));
|
|
22
|
+
return this.projects.get(target.actorId, target.projectId);
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
setProjectStatus(target, version, value) {
|
|
26
|
+
return this.transactions.write(() => {
|
|
27
|
+
this.policy.owner(this.policy.authorize(target, false));
|
|
28
|
+
const project = this.projects.get(target.actorId, target.projectId);
|
|
29
|
+
verifyVersion(project.version, version);
|
|
30
|
+
const status = value.trim().toUpperCase();
|
|
31
|
+
if (status !== 'ACTIVE' && status !== 'ARCHIVED') {
|
|
32
|
+
throw new CommunityApiError(400, 'invalid-project-status', '프로젝트 상태는 ACTIVE 또는 ARCHIVED여야 합니다.');
|
|
33
|
+
}
|
|
34
|
+
this.repository.setProjectStatus(target.projectId, status === 'ACTIVE' ? 1 : 2, storageTimestamp(new Date()));
|
|
35
|
+
return this.projects.get(target.actorId, target.projectId);
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=project-mutation.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-mutation.service.js","sourceRoot":"","sources":["../../src/projects/project-mutation.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAMxD,MAAM,OAAO,sBAAsB;IAEd;IACA;IACA;IACA;IAJnB,YACmB,YAA+B,EAC/B,MAA2B,EAC3B,UAA6B,EAC7B,QAAwB;QAHxB,iBAAY,GAAZ,YAAY,CAAmB;QAC/B,WAAM,GAAN,MAAM,CAAqB;QAC3B,eAAU,GAAV,UAAU,CAAmB;QAC7B,aAAQ,GAAR,QAAQ,CAAgB;IACxC,CAAC;IAEG,aAAa,CAAC,MAAqB,EAAE,OAAe,EAAE,IAAY;QACvE,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,EAAE;YAClC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;YACjD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;YACpE,aAAa,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACxC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,MAAM,CAAC,SAAS,EAAE,iBAAiB,CAAC,IAAI,EAAE,GAAG,EAAE,aAAa,CAAC,EAAE,gBAAgB,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;YAC3H,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,gBAAgB,CAAC,MAAqB,EAAE,OAAe,EAAE,KAAa;QAC3E,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,EAAE;YAClC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;YACxD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;YACpE,aAAa,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACxC,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC1C,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;gBACjD,MAAM,IAAI,iBAAiB,CAAC,GAAG,EAAE,wBAAwB,EAAE,oCAAoC,CAAC,CAAC;YACnG,CAAC;YACD,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,gBAAgB,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;YAC9G,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { SqliteDatabase } from '../db/connection.js';
|
|
2
|
+
export interface NewProjectRecord {
|
|
3
|
+
addedBy: string;
|
|
4
|
+
createdAt: string;
|
|
5
|
+
creatorId: string;
|
|
6
|
+
id: string;
|
|
7
|
+
joinedAt: string;
|
|
8
|
+
name: string;
|
|
9
|
+
roleCode: number;
|
|
10
|
+
statusCode: number;
|
|
11
|
+
updatedAt: string;
|
|
12
|
+
}
|
|
13
|
+
export interface ProjectRecord {
|
|
14
|
+
createdAt: string;
|
|
15
|
+
creatorId: string;
|
|
16
|
+
id: string;
|
|
17
|
+
lockVersion: number;
|
|
18
|
+
name: string;
|
|
19
|
+
statusCode: number;
|
|
20
|
+
updatedAt: string;
|
|
21
|
+
}
|
|
22
|
+
export interface ProjectListRecord extends ProjectRecord {
|
|
23
|
+
roleCode: number;
|
|
24
|
+
}
|
|
25
|
+
export interface ProjectPageRecords {
|
|
26
|
+
items: ProjectListRecord[];
|
|
27
|
+
totalCount: number;
|
|
28
|
+
}
|
|
29
|
+
export interface ProjectListFilter {
|
|
30
|
+
limit: number;
|
|
31
|
+
namePattern?: string;
|
|
32
|
+
offset: number;
|
|
33
|
+
statusCode?: number;
|
|
34
|
+
userId: string;
|
|
35
|
+
}
|
|
36
|
+
export declare class ProjectRepository {
|
|
37
|
+
private readonly database;
|
|
38
|
+
constructor(database: SqliteDatabase);
|
|
39
|
+
createWithOwner(project: NewProjectRecord): ProjectRecord;
|
|
40
|
+
listForUser(filter: ProjectListFilter): ProjectPageRecords;
|
|
41
|
+
findForMember(projectId: string, userId: string): ProjectRecord | undefined;
|
|
42
|
+
private listAll;
|
|
43
|
+
private listByName;
|
|
44
|
+
private listByStatus;
|
|
45
|
+
private listByNameAndStatus;
|
|
46
|
+
renameProject(id: string, name: string, now: string): void;
|
|
47
|
+
setProjectStatus(id: string, status: number, now: string): void;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=project.repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.repository.d.ts","sourceRoot":"","sources":["../../src/projects/project.repository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAG1D,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAkB,SAAQ,aAAa;IACtD,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB;AAkBD,qBAAa,iBAAiB;IACT,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,cAAc;IAErD,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,aAAa;IA4CzD,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,kBAAkB;IAa1D,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAWlF,OAAO,CAAC,OAAO;IAkBf,OAAO,CAAC,UAAU;IAoBlB,OAAO,CAAC,YAAY;IAoBpB,OAAO,CAAC,mBAAmB;IAgCpB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAO1D,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;CAMvE"}
|