@pcontext/api 0.0.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/README.md +151 -0
- package/dist/app.d.mts +44779 -0
- package/dist/app.d.mts.map +1 -0
- package/dist/app.mjs +37 -0
- package/dist/app.mjs.map +1 -0
- package/dist/client.d.mts +22428 -0
- package/dist/client.d.mts.map +1 -0
- package/dist/client.mjs +15 -0
- package/dist/client.mjs.map +1 -0
- package/dist/dev.d.mts +11 -0
- package/dist/dev.d.mts.map +1 -0
- package/dist/dev.mjs +16 -0
- package/dist/dev.mjs.map +1 -0
- package/dist/index.d.mts +3 -0
- package/dist/index.mjs +10 -0
- package/dist/index.mjs.map +1 -0
- package/dist/modules/doc/chat.route.d.mts +18 -0
- package/dist/modules/doc/chat.route.d.mts.map +1 -0
- package/dist/modules/doc/chat.route.mjs +20 -0
- package/dist/modules/doc/chat.route.mjs.map +1 -0
- package/dist/modules/doc/chat.service.d.mts +10 -0
- package/dist/modules/doc/chat.service.d.mts.map +1 -0
- package/dist/modules/doc/chat.service.mjs +29 -0
- package/dist/modules/doc/chat.service.mjs.map +1 -0
- package/dist/modules/doc/doc.dto.d.mts +67 -0
- package/dist/modules/doc/doc.dto.d.mts.map +1 -0
- package/dist/modules/doc/doc.dto.mjs +43 -0
- package/dist/modules/doc/doc.dto.mjs.map +1 -0
- package/dist/modules/doc/doc.entity.d.mts +19 -0
- package/dist/modules/doc/doc.entity.d.mts.map +1 -0
- package/dist/modules/doc/doc.entity.mjs +1 -0
- package/dist/modules/doc/doc.repo.interface.d.mts +28 -0
- package/dist/modules/doc/doc.repo.interface.d.mts.map +1 -0
- package/dist/modules/doc/doc.repo.interface.mjs +1 -0
- package/dist/modules/doc/doc.route.d.mts +14193 -0
- package/dist/modules/doc/doc.route.d.mts.map +1 -0
- package/dist/modules/doc/doc.route.mjs +100 -0
- package/dist/modules/doc/doc.route.mjs.map +1 -0
- package/dist/modules/doc/doc.service.d.mts +38 -0
- package/dist/modules/doc/doc.service.d.mts.map +1 -0
- package/dist/modules/doc/doc.service.mjs +134 -0
- package/dist/modules/doc/doc.service.mjs.map +1 -0
- package/dist/modules/doc/doc.vo.d.mts +17 -0
- package/dist/modules/doc/doc.vo.d.mts.map +1 -0
- package/dist/modules/doc/doc.vo.mjs +1 -0
- package/dist/modules/doc/infrastructure/agent/engine/chat.d.mts +21 -0
- package/dist/modules/doc/infrastructure/agent/engine/chat.d.mts.map +1 -0
- package/dist/modules/doc/infrastructure/agent/engine/chat.mjs +36 -0
- package/dist/modules/doc/infrastructure/agent/engine/chat.mjs.map +1 -0
- package/dist/modules/doc/infrastructure/agent/engine/generate.d.mts +28 -0
- package/dist/modules/doc/infrastructure/agent/engine/generate.d.mts.map +1 -0
- package/dist/modules/doc/infrastructure/agent/engine/generate.mjs +135 -0
- package/dist/modules/doc/infrastructure/agent/engine/generate.mjs.map +1 -0
- package/dist/modules/doc/infrastructure/agent/engine/query-filter.d.mts +7 -0
- package/dist/modules/doc/infrastructure/agent/engine/query-filter.d.mts.map +1 -0
- package/dist/modules/doc/infrastructure/agent/engine/query-filter.mjs +12 -0
- package/dist/modules/doc/infrastructure/agent/engine/query-filter.mjs.map +1 -0
- package/dist/modules/doc/infrastructure/agent/loaders/git-repository-reader.d.mts +54 -0
- package/dist/modules/doc/infrastructure/agent/loaders/git-repository-reader.d.mts.map +1 -0
- package/dist/modules/doc/infrastructure/agent/loaders/git-repository-reader.mjs +142 -0
- package/dist/modules/doc/infrastructure/agent/loaders/git-repository-reader.mjs.map +1 -0
- package/dist/modules/doc/infrastructure/agent/loaders/index.d.mts +3 -0
- package/dist/modules/doc/infrastructure/agent/loaders/index.mjs +4 -0
- package/dist/modules/doc/infrastructure/agent/loaders/website-crawl-reader.d.mts +42 -0
- package/dist/modules/doc/infrastructure/agent/loaders/website-crawl-reader.d.mts.map +1 -0
- package/dist/modules/doc/infrastructure/agent/loaders/website-crawl-reader.mjs +104 -0
- package/dist/modules/doc/infrastructure/agent/loaders/website-crawl-reader.mjs.map +1 -0
- package/dist/modules/doc/infrastructure/agent/settings.d.mts +5 -0
- package/dist/modules/doc/infrastructure/agent/settings.d.mts.map +1 -0
- package/dist/modules/doc/infrastructure/agent/settings.mjs +72 -0
- package/dist/modules/doc/infrastructure/agent/settings.mjs.map +1 -0
- package/dist/modules/doc/infrastructure/agent/storage/index.d.mts +7 -0
- package/dist/modules/doc/infrastructure/agent/storage/index.d.mts.map +1 -0
- package/dist/modules/doc/infrastructure/agent/storage/index.mjs +12 -0
- package/dist/modules/doc/infrastructure/agent/storage/index.mjs.map +1 -0
- package/dist/modules/doc/infrastructure/agent/storage/vector-store.d.mts +14 -0
- package/dist/modules/doc/infrastructure/agent/storage/vector-store.d.mts.map +1 -0
- package/dist/modules/doc/infrastructure/agent/storage/vector-store.mjs +35 -0
- package/dist/modules/doc/infrastructure/agent/storage/vector-store.mjs.map +1 -0
- package/dist/modules/doc/infrastructure/doc.po.d.mts +570 -0
- package/dist/modules/doc/infrastructure/doc.po.d.mts.map +1 -0
- package/dist/modules/doc/infrastructure/doc.po.mjs +54 -0
- package/dist/modules/doc/infrastructure/doc.po.mjs.map +1 -0
- package/dist/modules/doc/infrastructure/doc.repo.pg.d.mts +32 -0
- package/dist/modules/doc/infrastructure/doc.repo.pg.d.mts.map +1 -0
- package/dist/modules/doc/infrastructure/doc.repo.pg.mjs +157 -0
- package/dist/modules/doc/infrastructure/doc.repo.pg.mjs.map +1 -0
- package/dist/modules/doc/infrastructure/doc.repo.sqlite.d.mts +32 -0
- package/dist/modules/doc/infrastructure/doc.repo.sqlite.d.mts.map +1 -0
- package/dist/modules/doc/infrastructure/doc.repo.sqlite.mjs +153 -0
- package/dist/modules/doc/infrastructure/doc.repo.sqlite.mjs.map +1 -0
- package/dist/modules/doc/mcp.route.d.mts +18 -0
- package/dist/modules/doc/mcp.route.d.mts.map +1 -0
- package/dist/modules/doc/mcp.route.mjs +39 -0
- package/dist/modules/doc/mcp.route.mjs.map +1 -0
- package/dist/modules/doc/mcp.service.d.mts +22 -0
- package/dist/modules/doc/mcp.service.d.mts.map +1 -0
- package/dist/modules/doc/mcp.service.mjs +119 -0
- package/dist/modules/doc/mcp.service.mjs.map +1 -0
- package/dist/modules/rank/rank.dto.d.mts +10 -0
- package/dist/modules/rank/rank.dto.d.mts.map +1 -0
- package/dist/modules/rank/rank.dto.mjs +8 -0
- package/dist/modules/rank/rank.dto.mjs.map +1 -0
- package/dist/modules/rank/rank.route.d.mts +2033 -0
- package/dist/modules/rank/rank.route.d.mts.map +1 -0
- package/dist/modules/rank/rank.route.mjs +20 -0
- package/dist/modules/rank/rank.route.mjs.map +1 -0
- package/dist/modules/rank/rank.service.d.mts +32 -0
- package/dist/modules/rank/rank.service.d.mts.map +1 -0
- package/dist/modules/rank/rank.service.mjs +3 -0
- package/dist/modules/rank/rank.vo.d.mts +9 -0
- package/dist/modules/rank/rank.vo.d.mts.map +1 -0
- package/dist/modules/rank/rank.vo.mjs +1 -0
- package/dist/modules/task/infrastructure/mq/task-context.d.mts +29 -0
- package/dist/modules/task/infrastructure/mq/task-context.d.mts.map +1 -0
- package/dist/modules/task/infrastructure/mq/task-context.mjs +70 -0
- package/dist/modules/task/infrastructure/mq/task-context.mjs.map +1 -0
- package/dist/modules/task/infrastructure/mq/task-queue.d.mts +10 -0
- package/dist/modules/task/infrastructure/mq/task-queue.d.mts.map +1 -0
- package/dist/modules/task/infrastructure/mq/task-queue.mjs +12 -0
- package/dist/modules/task/infrastructure/mq/task-queue.mjs.map +1 -0
- package/dist/modules/task/infrastructure/mq/task-worker.d.mts +13 -0
- package/dist/modules/task/infrastructure/mq/task-worker.d.mts.map +1 -0
- package/dist/modules/task/infrastructure/mq/task-worker.mjs +35 -0
- package/dist/modules/task/infrastructure/mq/task-worker.mjs.map +1 -0
- package/dist/modules/task/infrastructure/task.po.d.mts +1147 -0
- package/dist/modules/task/infrastructure/task.po.d.mts.map +1 -0
- package/dist/modules/task/infrastructure/task.po.mjs +55 -0
- package/dist/modules/task/infrastructure/task.po.mjs.map +1 -0
- package/dist/modules/task/infrastructure/task.repo.pg.d.mts +21 -0
- package/dist/modules/task/infrastructure/task.repo.pg.d.mts.map +1 -0
- package/dist/modules/task/infrastructure/task.repo.pg.mjs +86 -0
- package/dist/modules/task/infrastructure/task.repo.pg.mjs.map +1 -0
- package/dist/modules/task/infrastructure/task.repo.sqlite.d.mts +21 -0
- package/dist/modules/task/infrastructure/task.repo.sqlite.d.mts.map +1 -0
- package/dist/modules/task/infrastructure/task.repo.sqlite.mjs +89 -0
- package/dist/modules/task/infrastructure/task.repo.sqlite.mjs.map +1 -0
- package/dist/modules/task/task.dto.d.mts +26 -0
- package/dist/modules/task/task.dto.d.mts.map +1 -0
- package/dist/modules/task/task.dto.mjs +25 -0
- package/dist/modules/task/task.dto.mjs.map +1 -0
- package/dist/modules/task/task.entity.d.mts +43 -0
- package/dist/modules/task/task.entity.d.mts.map +1 -0
- package/dist/modules/task/task.entity.mjs +1 -0
- package/dist/modules/task/task.repo.interface.d.mts +17 -0
- package/dist/modules/task/task.repo.interface.d.mts.map +1 -0
- package/dist/modules/task/task.repo.interface.mjs +1 -0
- package/dist/modules/task/task.route.d.mts +4087 -0
- package/dist/modules/task/task.route.d.mts.map +1 -0
- package/dist/modules/task/task.route.mjs +63 -0
- package/dist/modules/task/task.route.mjs.map +1 -0
- package/dist/modules/task/task.service.d.mts +28 -0
- package/dist/modules/task/task.service.d.mts.map +1 -0
- package/dist/modules/task/task.service.mjs +202 -0
- package/dist/modules/task/task.service.mjs.map +1 -0
- package/dist/modules/task/task.vo.d.mts +18 -0
- package/dist/modules/task/task.vo.d.mts.map +1 -0
- package/dist/modules/task/task.vo.mjs +1 -0
- package/dist/modules/user/application/user.service.d.mts +24 -0
- package/dist/modules/user/application/user.service.d.mts.map +1 -0
- package/dist/modules/user/application/user.service.mjs +153 -0
- package/dist/modules/user/application/user.service.mjs.map +1 -0
- package/dist/modules/user/domain/user.entity.d.mts +24 -0
- package/dist/modules/user/domain/user.entity.d.mts.map +1 -0
- package/dist/modules/user/domain/user.entity.mjs +35 -0
- package/dist/modules/user/domain/user.entity.mjs.map +1 -0
- package/dist/modules/user/domain/user.repo.interface.d.mts +27 -0
- package/dist/modules/user/domain/user.repo.interface.d.mts.map +1 -0
- package/dist/modules/user/domain/user.repo.interface.mjs +1 -0
- package/dist/modules/user/infrastructure/casbin/adapter.d.mts +7 -0
- package/dist/modules/user/infrastructure/casbin/adapter.d.mts.map +1 -0
- package/dist/modules/user/infrastructure/casbin/adapter.mjs +13 -0
- package/dist/modules/user/infrastructure/casbin/adapter.mjs.map +1 -0
- package/dist/modules/user/infrastructure/casbin/adapter.pg.d.mts +19 -0
- package/dist/modules/user/infrastructure/casbin/adapter.pg.d.mts.map +1 -0
- package/dist/modules/user/infrastructure/casbin/adapter.pg.mjs +129 -0
- package/dist/modules/user/infrastructure/casbin/adapter.pg.mjs.map +1 -0
- package/dist/modules/user/infrastructure/casbin/adapter.sqlite.d.mts +19 -0
- package/dist/modules/user/infrastructure/casbin/adapter.sqlite.d.mts.map +1 -0
- package/dist/modules/user/infrastructure/casbin/adapter.sqlite.mjs +129 -0
- package/dist/modules/user/infrastructure/casbin/adapter.sqlite.mjs.map +1 -0
- package/dist/modules/user/infrastructure/casbin/enforcer.d.mts +9 -0
- package/dist/modules/user/infrastructure/casbin/enforcer.d.mts.map +1 -0
- package/dist/modules/user/infrastructure/casbin/enforcer.mjs +150 -0
- package/dist/modules/user/infrastructure/casbin/enforcer.mjs.map +1 -0
- package/dist/modules/user/infrastructure/casbin-rule.po.d.mts +643 -0
- package/dist/modules/user/infrastructure/casbin-rule.po.d.mts.map +1 -0
- package/dist/modules/user/infrastructure/casbin-rule.po.mjs +30 -0
- package/dist/modules/user/infrastructure/casbin-rule.po.mjs.map +1 -0
- package/dist/modules/user/infrastructure/user.po.d.mts +392 -0
- package/dist/modules/user/infrastructure/user.po.d.mts.map +1 -0
- package/dist/modules/user/infrastructure/user.po.mjs +34 -0
- package/dist/modules/user/infrastructure/user.po.mjs.map +1 -0
- package/dist/modules/user/infrastructure/user.repo.pg.d.mts +24 -0
- package/dist/modules/user/infrastructure/user.repo.pg.d.mts.map +1 -0
- package/dist/modules/user/infrastructure/user.repo.pg.mjs +90 -0
- package/dist/modules/user/infrastructure/user.repo.pg.mjs.map +1 -0
- package/dist/modules/user/infrastructure/user.repo.sqlite.d.mts +24 -0
- package/dist/modules/user/infrastructure/user.repo.sqlite.d.mts.map +1 -0
- package/dist/modules/user/infrastructure/user.repo.sqlite.mjs +88 -0
- package/dist/modules/user/infrastructure/user.repo.sqlite.mjs.map +1 -0
- package/dist/modules/user/interfaces/admin.route.d.mts +8270 -0
- package/dist/modules/user/interfaces/admin.route.d.mts.map +1 -0
- package/dist/modules/user/interfaces/admin.route.mjs +74 -0
- package/dist/modules/user/interfaces/admin.route.mjs.map +1 -0
- package/dist/modules/user/interfaces/role.route.d.mts +102 -0
- package/dist/modules/user/interfaces/role.route.d.mts.map +1 -0
- package/dist/modules/user/interfaces/role.route.mjs +60 -0
- package/dist/modules/user/interfaces/role.route.mjs.map +1 -0
- package/dist/modules/user/interfaces/user.dto.d.mts +106 -0
- package/dist/modules/user/interfaces/user.dto.d.mts.map +1 -0
- package/dist/modules/user/interfaces/user.dto.mjs +32 -0
- package/dist/modules/user/interfaces/user.dto.mjs.map +1 -0
- package/dist/modules/user/interfaces/user.route.d.mts +2093 -0
- package/dist/modules/user/interfaces/user.route.d.mts.map +1 -0
- package/dist/modules/user/interfaces/user.route.mjs +69 -0
- package/dist/modules/user/interfaces/user.route.mjs.map +1 -0
- package/dist/modules/user/interfaces/user.vo.d.mts +28 -0
- package/dist/modules/user/interfaces/user.vo.d.mts.map +1 -0
- package/dist/modules/user/interfaces/user.vo.mjs +18 -0
- package/dist/modules/user/interfaces/user.vo.mjs.map +1 -0
- package/dist/rank.service-D2h-2iJA.mjs +109 -0
- package/dist/rank.service-D2h-2iJA.mjs.map +1 -0
- package/dist/settings.d.mts +12 -0
- package/dist/settings.d.mts.map +1 -0
- package/dist/settings.mjs +27 -0
- package/dist/settings.mjs.map +1 -0
- package/dist/shared/create-app.d.mts +13 -0
- package/dist/shared/create-app.d.mts.map +1 -0
- package/dist/shared/create-app.mjs +45 -0
- package/dist/shared/create-app.mjs.map +1 -0
- package/dist/shared/db/bootstrap.d.mts +5 -0
- package/dist/shared/db/bootstrap.d.mts.map +1 -0
- package/dist/shared/db/bootstrap.mjs +51 -0
- package/dist/shared/db/bootstrap.mjs.map +1 -0
- package/dist/shared/db/connection.d.mts +1567 -0
- package/dist/shared/db/connection.d.mts.map +1 -0
- package/dist/shared/db/connection.mjs +59 -0
- package/dist/shared/db/connection.mjs.map +1 -0
- package/dist/shared/db/migrations/pg/0000_init.sql +74 -0
- package/dist/shared/db/migrations/pg/0001_snippets & tokens.sql +6 -0
- package/dist/shared/db/migrations/pg/0002_change_task_id_to_uuid_v7.sql +3 -0
- package/dist/shared/db/migrations/pg/meta/0000_snapshot.json +498 -0
- package/dist/shared/db/migrations/pg/meta/0001_snapshot.json +513 -0
- package/dist/shared/db/migrations/pg/meta/0002_snapshot.json +514 -0
- package/dist/shared/db/migrations/pg/meta/_journal.json +27 -0
- package/dist/shared/db/migrations/sqlite/0000_init.sql +72 -0
- package/dist/shared/db/migrations/sqlite/0001_snippets & tokens.sql +2 -0
- package/dist/shared/db/migrations/sqlite/0002_change_task_id_to_uuid_v7.sql +35 -0
- package/dist/shared/db/migrations/sqlite/meta/0000_snapshot.json +493 -0
- package/dist/shared/db/migrations/sqlite/meta/0001_snapshot.json +509 -0
- package/dist/shared/db/migrations/sqlite/meta/0002_snapshot.json +509 -0
- package/dist/shared/db/migrations/sqlite/meta/_journal.json +27 -0
- package/dist/shared/db/seed.d.mts +5 -0
- package/dist/shared/db/seed.d.mts.map +1 -0
- package/dist/shared/db/seed.mjs +42 -0
- package/dist/shared/db/seed.mjs.map +1 -0
- package/dist/shared/deps.d.mts +28 -0
- package/dist/shared/deps.d.mts.map +1 -0
- package/dist/shared/deps.mjs +69 -0
- package/dist/shared/deps.mjs.map +1 -0
- package/dist/shared/dto/index.d.mts +11 -0
- package/dist/shared/dto/index.d.mts.map +1 -0
- package/dist/shared/dto/index.mjs +11 -0
- package/dist/shared/dto/index.mjs.map +1 -0
- package/dist/shared/logger.d.mts +14 -0
- package/dist/shared/logger.d.mts.map +1 -0
- package/dist/shared/logger.mjs +37 -0
- package/dist/shared/logger.mjs.map +1 -0
- package/dist/shared/mcp/createTool.d.mts +15 -0
- package/dist/shared/mcp/createTool.d.mts.map +1 -0
- package/dist/shared/mcp/createTool.mjs +8 -0
- package/dist/shared/mcp/createTool.mjs.map +1 -0
- package/dist/shared/middleware/authorization.d.mts +15 -0
- package/dist/shared/middleware/authorization.d.mts.map +1 -0
- package/dist/shared/middleware/authorization.mjs +46 -0
- package/dist/shared/middleware/authorization.mjs.map +1 -0
- package/dist/shared/middleware/http-logger.d.mts +7 -0
- package/dist/shared/middleware/http-logger.d.mts.map +1 -0
- package/dist/shared/middleware/http-logger.mjs +40 -0
- package/dist/shared/middleware/http-logger.mjs.map +1 -0
- package/dist/shared/middleware/jwt.d.mts +7 -0
- package/dist/shared/middleware/jwt.d.mts.map +1 -0
- package/dist/shared/middleware/jwt.mjs +34 -0
- package/dist/shared/middleware/jwt.mjs.map +1 -0
- package/dist/shared/middleware/limiter.d.mts +7 -0
- package/dist/shared/middleware/limiter.d.mts.map +1 -0
- package/dist/shared/middleware/limiter.mjs +10 -0
- package/dist/shared/middleware/limiter.mjs.map +1 -0
- package/dist/shared/middleware/services.d.mts +8 -0
- package/dist/shared/middleware/services.d.mts.map +1 -0
- package/dist/shared/middleware/services.mjs +19 -0
- package/dist/shared/middleware/services.mjs.map +1 -0
- package/dist/shared/redis/decorator.d.mts +113 -0
- package/dist/shared/redis/decorator.d.mts.map +1 -0
- package/dist/shared/redis/decorator.mjs +203 -0
- package/dist/shared/redis/decorator.mjs.map +1 -0
- package/dist/shared/redis/factory.d.mts +18 -0
- package/dist/shared/redis/factory.d.mts.map +1 -0
- package/dist/shared/redis/factory.mjs +41 -0
- package/dist/shared/redis/factory.mjs.map +1 -0
- package/dist/shared/redis/index.d.mts +12 -0
- package/dist/shared/redis/index.d.mts.map +1 -0
- package/dist/shared/redis/index.mjs +14 -0
- package/dist/shared/redis/index.mjs.map +1 -0
- package/dist/shared/types.d.mts +36 -0
- package/dist/shared/types.d.mts.map +1 -0
- package/dist/shared/types.mjs +1 -0
- package/dist/shared/utils/date.d.mts +1 -0
- package/dist/shared/utils/date.mjs +1 -0
- package/dist/shared/utils/error-handler.d.mts +7 -0
- package/dist/shared/utils/error-handler.d.mts.map +1 -0
- package/dist/shared/utils/error-handler.mjs +22 -0
- package/dist/shared/utils/error-handler.mjs.map +1 -0
- package/dist/shared/utils/format.d.mts +8 -0
- package/dist/shared/utils/format.d.mts.map +1 -0
- package/dist/shared/utils/format.mjs +24 -0
- package/dist/shared/utils/format.mjs.map +1 -0
- package/dist/shared/utils/pagination.d.mts +9 -0
- package/dist/shared/utils/pagination.d.mts.map +1 -0
- package/dist/shared/utils/pagination.mjs +12 -0
- package/dist/shared/utils/pagination.mjs.map +1 -0
- package/dist/shared/utils/response-template.d.mts +69 -0
- package/dist/shared/utils/response-template.d.mts.map +1 -0
- package/dist/shared/utils/response-template.mjs +96 -0
- package/dist/shared/utils/response-template.mjs.map +1 -0
- package/dist/shared/utils/url.d.mts +18 -0
- package/dist/shared/utils/url.d.mts.map +1 -0
- package/dist/shared/utils/url.mjs +39 -0
- package/dist/shared/utils/url.mjs.map +1 -0
- package/dist/shared/utils/user.d.mts +8 -0
- package/dist/shared/utils/user.d.mts.map +1 -0
- package/dist/shared/utils/user.mjs +11 -0
- package/dist/shared/utils/user.mjs.map +1 -0
- package/dist/shared/utils/validator.d.mts +5984 -0
- package/dist/shared/utils/validator.d.mts.map +1 -0
- package/dist/shared/utils/validator.mjs +34 -0
- package/dist/shared/utils/validator.mjs.map +1 -0
- package/dist/shared/vo/index.d.mts +11 -0
- package/dist/shared/vo/index.d.mts.map +1 -0
- package/dist/shared/vo/index.mjs +1 -0
- package/package.json +86 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { PaginationVO } from "../../../shared/vo/index.mjs";
|
|
2
|
+
import { CreateUserDTO, UpdateSelfDTO, UpdateUserDTO } from "../interfaces/user.dto.mjs";
|
|
3
|
+
import { UserEntity } from "./user.entity.mjs";
|
|
4
|
+
|
|
5
|
+
//#region src/modules/user/domain/user.repo.interface.d.ts
|
|
6
|
+
interface AuthUserRecord {
|
|
7
|
+
id: number;
|
|
8
|
+
username: string;
|
|
9
|
+
password: string;
|
|
10
|
+
role: UserEntity['role'];
|
|
11
|
+
status: UserEntity['status'];
|
|
12
|
+
}
|
|
13
|
+
interface IUserRepository {
|
|
14
|
+
findById: (id: number) => Promise<UserEntity | null>;
|
|
15
|
+
findByUsername: (username: string) => Promise<UserEntity | null>;
|
|
16
|
+
findByPhone: (phone: string) => Promise<UserEntity | null>;
|
|
17
|
+
findByEmail: (email: string) => Promise<UserEntity | null>;
|
|
18
|
+
list: (page: number, pageSize: number, filters?: {
|
|
19
|
+
name?: string;
|
|
20
|
+
}) => Promise<PaginationVO<UserEntity>>;
|
|
21
|
+
create: (input: CreateUserDTO) => Promise<UserEntity>;
|
|
22
|
+
updateById: (id: number, input: UpdateUserDTO) => Promise<UserEntity | null>;
|
|
23
|
+
updateSelf: (id: number, input: UpdateSelfDTO) => Promise<UserEntity | null>;
|
|
24
|
+
}
|
|
25
|
+
//#endregion
|
|
26
|
+
export { AuthUserRecord, IUserRepository };
|
|
27
|
+
//# sourceMappingURL=user.repo.interface.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user.repo.interface.d.mts","names":[],"sources":["../../../../src/modules/user/domain/user.repo.interface.ts"],"mappings":";;;;;UAIiB,cAAA;EACf,EAAA;EACA,QAAA;EACA,QAAA;EACA,IAAA,EAAM,UAAA;EACN,MAAA,EAAQ,UAAA;AAAA;AAAA,UAGO,eAAA;EACf,QAAA,GAAW,EAAA,aAAe,OAAA,CAAQ,UAAA;EAClC,cAAA,GAAiB,QAAA,aAAqB,OAAA,CAAQ,UAAA;EAC9C,WAAA,GAAc,KAAA,aAAkB,OAAA,CAAQ,UAAA;EACxC,WAAA,GAAc,KAAA,aAAkB,OAAA,CAAQ,UAAA;EACxC,IAAA,GAAO,IAAA,UAAc,QAAA,UAAkB,OAAA;IAAY,IAAA;EAAA,MAAoB,OAAA,CAAQ,YAAA,CAAa,UAAA;EAC5F,MAAA,GAAS,KAAA,EAAO,aAAA,KAAkB,OAAA,CAAQ,UAAA;EAC1C,UAAA,GAAa,EAAA,UAAY,KAAA,EAAO,aAAA,KAAkB,OAAA,CAAQ,UAAA;EAC1D,UAAA,GAAa,EAAA,UAAY,KAAA,EAAO,aAAA,KAAkB,OAAA,CAAQ,UAAA;AAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.d.mts","names":[],"sources":["../../../../../src/modules/user/infrastructure/casbin/adapter.ts"],"mappings":";;;iBAKgB,gBAAA,CAAA,GAAoB,gBAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { getDbProvider, getPgDb, getSqliteDb } from "../../../../shared/db/connection.mjs";
|
|
2
|
+
import { PgCasbinAdapter } from "./adapter.pg.mjs";
|
|
3
|
+
import { SqliteCasbinAdapter } from "./adapter.sqlite.mjs";
|
|
4
|
+
|
|
5
|
+
//#region src/modules/user/infrastructure/casbin/adapter.ts
|
|
6
|
+
function getCasbinAdapter() {
|
|
7
|
+
if (getDbProvider() === "postgresql") return new PgCasbinAdapter(getPgDb());
|
|
8
|
+
return new SqliteCasbinAdapter(getSqliteDb());
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
//#endregion
|
|
12
|
+
export { getCasbinAdapter };
|
|
13
|
+
//# sourceMappingURL=adapter.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.mjs","names":[],"sources":["../../../../../src/modules/user/infrastructure/casbin/adapter.ts"],"sourcesContent":["import type { UpdatableAdapter } from 'casbin'\nimport { getDbProvider, getPgDb, getSqliteDb } from '@/shared/db/connection'\nimport { PgCasbinAdapter } from './adapter.pg'\nimport { SqliteCasbinAdapter } from './adapter.sqlite'\n\nexport function getCasbinAdapter(): UpdatableAdapter {\n const provider = getDbProvider()\n if (provider === 'postgresql') {\n return new PgCasbinAdapter(getPgDb())\n }\n return new SqliteCasbinAdapter(getSqliteDb())\n}\n"],"mappings":";;;;;AAKA,SAAgB,mBAAqC;AAEnD,KADiB,eAAe,KACf,aACf,QAAO,IAAI,gBAAgB,SAAS,CAAC;AAEvC,QAAO,IAAI,oBAAoB,aAAa,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { PostgresqlDB } from "../../../../shared/db/connection.mjs";
|
|
2
|
+
import { Model, UpdatableAdapter } from "casbin";
|
|
3
|
+
|
|
4
|
+
//#region src/modules/user/infrastructure/casbin/adapter.pg.d.ts
|
|
5
|
+
declare class PgCasbinAdapter implements UpdatableAdapter {
|
|
6
|
+
private db;
|
|
7
|
+
constructor(db: PostgresqlDB);
|
|
8
|
+
loadPolicy(model: Model): Promise<void>;
|
|
9
|
+
savePolicy(model: Model): Promise<boolean>;
|
|
10
|
+
addPolicy(_sec: string, ptype: string, rule: string[]): Promise<void>;
|
|
11
|
+
removePolicy(_sec: string, ptype: string, rule: string[]): Promise<void>;
|
|
12
|
+
removeFilteredPolicy(_sec: string, ptype: string, fieldIndex: number, ...fieldValues: string[]): Promise<void>;
|
|
13
|
+
updatePolicy(_sec: string, ptype: string, oldRule: string[], newRule: string[]): Promise<void>;
|
|
14
|
+
updatePolicies(_sec: string, ptype: string, oldRules: string[][], newRules: string[][]): Promise<void>;
|
|
15
|
+
updateFilteredPolicies(_sec: string, ptype: string, newRules: string[][], fieldIndex: number, ...fieldValues: string[]): Promise<string[][]>;
|
|
16
|
+
}
|
|
17
|
+
//#endregion
|
|
18
|
+
export { PgCasbinAdapter };
|
|
19
|
+
//# sourceMappingURL=adapter.pg.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.pg.d.mts","names":[],"sources":["../../../../../src/modules/user/infrastructure/casbin/adapter.pg.ts"],"mappings":";;;;cAkDa,eAAA,YAA2B,gBAAA;EAAA,QAClB,EAAA;cAAA,EAAA,EAAI,YAAA;EAElB,UAAA,CAAW,KAAA,EAAO,KAAA,GAAQ,OAAA;EAK1B,UAAA,CAAW,KAAA,EAAO,KAAA,GAAQ,OAAA;EAmB1B,SAAA,CAAU,IAAA,UAAc,KAAA,UAAe,IAAA,aAAiB,OAAA;EAKxD,YAAA,CAAa,IAAA,UAAc,KAAA,UAAe,IAAA,aAAiB,OAAA;EAM3D,oBAAA,CAAqB,IAAA,UAAc,KAAA,UAAe,UAAA,aAAuB,WAAA,aAAwB,OAAA;EAoBjG,YAAA,CAAa,IAAA,UAAc,KAAA,UAAe,OAAA,YAAmB,OAAA,aAAoB,OAAA;EAOjF,cAAA,CAAe,IAAA,UAAc,KAAA,UAAe,QAAA,cAAsB,QAAA,eAAuB,OAAA;EAgBzF,sBAAA,CAAuB,IAAA,UAAc,KAAA,UAAe,QAAA,cAAsB,UAAA,aAAuB,WAAA,aAAwB,OAAA;AAAA"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { casbinRulePg } from "../casbin-rule.po.mjs";
|
|
2
|
+
import { Helper } from "casbin";
|
|
3
|
+
import { and, eq } from "drizzle-orm";
|
|
4
|
+
|
|
5
|
+
//#region src/modules/user/infrastructure/casbin/adapter.pg.ts
|
|
6
|
+
function toPolicyLine(line, model) {
|
|
7
|
+
const text = `${line.ptype || ""}, ${[
|
|
8
|
+
line.v0,
|
|
9
|
+
line.v1,
|
|
10
|
+
line.v2,
|
|
11
|
+
line.v3,
|
|
12
|
+
line.v4,
|
|
13
|
+
line.v5
|
|
14
|
+
].filter(Boolean).join(", ")}`;
|
|
15
|
+
Helper.loadPolicyLine(text, model);
|
|
16
|
+
}
|
|
17
|
+
function buildConditions(line) {
|
|
18
|
+
const conds = [];
|
|
19
|
+
if (line.ptype) conds.push(eq(casbinRulePg.ptype, line.ptype));
|
|
20
|
+
if (line.v0 !== void 0) conds.push(eq(casbinRulePg.v0, line.v0));
|
|
21
|
+
if (line.v1 !== void 0) conds.push(eq(casbinRulePg.v1, line.v1));
|
|
22
|
+
if (line.v2 !== void 0) conds.push(eq(casbinRulePg.v2, line.v2));
|
|
23
|
+
if (line.v3 !== void 0) conds.push(eq(casbinRulePg.v3, line.v3));
|
|
24
|
+
if (line.v4 !== void 0) conds.push(eq(casbinRulePg.v4, line.v4));
|
|
25
|
+
if (line.v5 !== void 0) conds.push(eq(casbinRulePg.v5, line.v5));
|
|
26
|
+
return conds.length ? and(...conds) : void 0;
|
|
27
|
+
}
|
|
28
|
+
function savePolicyLine(ptype, rule) {
|
|
29
|
+
const line = { ptype };
|
|
30
|
+
if (rule.length > 0) line.v0 = rule[0];
|
|
31
|
+
if (rule.length > 1) line.v1 = rule[1];
|
|
32
|
+
if (rule.length > 2) line.v2 = rule[2];
|
|
33
|
+
if (rule.length > 3) line.v3 = rule[3];
|
|
34
|
+
if (rule.length > 4) line.v4 = rule[4];
|
|
35
|
+
if (rule.length > 5) line.v5 = rule[5];
|
|
36
|
+
return line;
|
|
37
|
+
}
|
|
38
|
+
var PgCasbinAdapter = class {
|
|
39
|
+
constructor(db) {
|
|
40
|
+
this.db = db;
|
|
41
|
+
}
|
|
42
|
+
async loadPolicy(model) {
|
|
43
|
+
const rows = await this.db.select().from(casbinRulePg);
|
|
44
|
+
for (const r of rows) toPolicyLine(r, model);
|
|
45
|
+
}
|
|
46
|
+
async savePolicy(model) {
|
|
47
|
+
await this.db.delete(casbinRulePg);
|
|
48
|
+
let astMap = model.model.get("p");
|
|
49
|
+
for (const [ptype, ast] of astMap) for (const rule of ast.policy) {
|
|
50
|
+
const line = savePolicyLine(ptype, rule);
|
|
51
|
+
await this.db.insert(casbinRulePg).values(line);
|
|
52
|
+
}
|
|
53
|
+
astMap = model.model.get("g");
|
|
54
|
+
for (const [ptype, ast] of astMap) for (const rule of ast.policy) {
|
|
55
|
+
const line = savePolicyLine(ptype, rule);
|
|
56
|
+
await this.db.insert(casbinRulePg).values(line);
|
|
57
|
+
}
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
async addPolicy(_sec, ptype, rule) {
|
|
61
|
+
const line = savePolicyLine(ptype, rule);
|
|
62
|
+
await this.db.insert(casbinRulePg).values(line);
|
|
63
|
+
}
|
|
64
|
+
async removePolicy(_sec, ptype, rule) {
|
|
65
|
+
const where = buildConditions(savePolicyLine(ptype, rule));
|
|
66
|
+
if (where) await this.db.delete(casbinRulePg).where(where);
|
|
67
|
+
}
|
|
68
|
+
async removeFilteredPolicy(_sec, ptype, fieldIndex, ...fieldValues) {
|
|
69
|
+
const line = { ptype };
|
|
70
|
+
const idx = fieldIndex + fieldValues.length;
|
|
71
|
+
if (fieldIndex <= 0 && idx > 0) line.v0 = fieldValues[0 - fieldIndex];
|
|
72
|
+
if (fieldIndex <= 1 && idx > 1) line.v1 = fieldValues[1 - fieldIndex];
|
|
73
|
+
if (fieldIndex <= 2 && idx > 2) line.v2 = fieldValues[2 - fieldIndex];
|
|
74
|
+
if (fieldIndex <= 3 && idx > 3) line.v3 = fieldValues[3 - fieldIndex];
|
|
75
|
+
if (fieldIndex <= 4 && idx > 4) line.v4 = fieldValues[4 - fieldIndex];
|
|
76
|
+
if (fieldIndex <= 5 && idx > 5) line.v5 = fieldValues[5 - fieldIndex];
|
|
77
|
+
const where = buildConditions(line);
|
|
78
|
+
if (where) await this.db.delete(casbinRulePg).where(where);
|
|
79
|
+
}
|
|
80
|
+
async updatePolicy(_sec, ptype, oldRule, newRule) {
|
|
81
|
+
const where = buildConditions(savePolicyLine(ptype, oldRule));
|
|
82
|
+
const next = savePolicyLine(ptype, newRule);
|
|
83
|
+
if (where) await this.db.update(casbinRulePg).set(next).where(where);
|
|
84
|
+
}
|
|
85
|
+
async updatePolicies(_sec, ptype, oldRules, newRules) {
|
|
86
|
+
if (oldRules.length !== newRules.length) throw new Error("oldRules and newRules must have the same length");
|
|
87
|
+
await this.db.transaction(async (tx) => {
|
|
88
|
+
for (let i = 0; i < oldRules.length; i++) {
|
|
89
|
+
const where = buildConditions(savePolicyLine(ptype, oldRules[i]));
|
|
90
|
+
const next = savePolicyLine(ptype, newRules[i]);
|
|
91
|
+
if (where) await tx.update(casbinRulePg).set(next).where(where);
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
async updateFilteredPolicies(_sec, ptype, newRules, fieldIndex, ...fieldValues) {
|
|
96
|
+
const line = { ptype };
|
|
97
|
+
const idx = fieldIndex + fieldValues.length;
|
|
98
|
+
if (fieldIndex <= 0 && idx > 0) line.v0 = fieldValues[0 - fieldIndex];
|
|
99
|
+
if (fieldIndex <= 1 && idx > 1) line.v1 = fieldValues[1 - fieldIndex];
|
|
100
|
+
if (fieldIndex <= 2 && idx > 2) line.v2 = fieldValues[2 - fieldIndex];
|
|
101
|
+
if (fieldIndex <= 3 && idx > 3) line.v3 = fieldValues[3 - fieldIndex];
|
|
102
|
+
if (fieldIndex <= 4 && idx > 4) line.v4 = fieldValues[4 - fieldIndex];
|
|
103
|
+
if (fieldIndex <= 5 && idx > 5) line.v5 = fieldValues[5 - fieldIndex];
|
|
104
|
+
const where = buildConditions(line);
|
|
105
|
+
if (!where) return [];
|
|
106
|
+
const oldRules = (await this.db.select().from(casbinRulePg).where(where)).map((r) => {
|
|
107
|
+
const rule = [];
|
|
108
|
+
if (r.v0 != null) rule.push(r.v0);
|
|
109
|
+
if (r.v1 != null) rule.push(r.v1);
|
|
110
|
+
if (r.v2 != null) rule.push(r.v2);
|
|
111
|
+
if (r.v3 != null) rule.push(r.v3);
|
|
112
|
+
if (r.v4 != null) rule.push(r.v4);
|
|
113
|
+
if (r.v5 != null) rule.push(r.v5);
|
|
114
|
+
return rule;
|
|
115
|
+
});
|
|
116
|
+
await this.db.transaction(async (tx) => {
|
|
117
|
+
await tx.delete(casbinRulePg).where(where);
|
|
118
|
+
for (const rule of newRules) {
|
|
119
|
+
const next = savePolicyLine(ptype, rule);
|
|
120
|
+
await tx.insert(casbinRulePg).values(next);
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
return oldRules;
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
//#endregion
|
|
128
|
+
export { PgCasbinAdapter };
|
|
129
|
+
//# sourceMappingURL=adapter.pg.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.pg.mjs","names":[],"sources":["../../../../../src/modules/user/infrastructure/casbin/adapter.pg.ts"],"sourcesContent":["import type { Model, UpdatableAdapter } from 'casbin'\nimport type { PostgresqlDB } from '@/shared/db/connection'\nimport { Helper } from 'casbin'\nimport { and, eq } from 'drizzle-orm'\nimport { casbinRulePg } from '@/modules/user/infrastructure/casbin-rule.po'\n\ntype Row = typeof casbinRulePg.$inferSelect\ntype Create = typeof casbinRulePg.$inferInsert\n\nfunction toPolicyLine(line: Row, model: Model) {\n const text = `${line.ptype || ''}, ${[line.v0, line.v1, line.v2, line.v3, line.v4, line.v5].filter(Boolean).join(', ')}`\n Helper.loadPolicyLine(text, model)\n}\n\nfunction buildConditions(line: Partial<Create>) {\n const conds: any[] = []\n if (line.ptype)\n conds.push(eq(casbinRulePg.ptype, line.ptype))\n if (line.v0 !== undefined)\n conds.push(eq(casbinRulePg.v0, line.v0 as string))\n if (line.v1 !== undefined)\n conds.push(eq(casbinRulePg.v1, line.v1 as string))\n if (line.v2 !== undefined)\n conds.push(eq(casbinRulePg.v2, line.v2 as string))\n if (line.v3 !== undefined)\n conds.push(eq(casbinRulePg.v3, line.v3 as string))\n if (line.v4 !== undefined)\n conds.push(eq(casbinRulePg.v4, line.v4 as string))\n if (line.v5 !== undefined)\n conds.push(eq(casbinRulePg.v5, line.v5 as string))\n return conds.length ? and(...conds) : undefined\n}\n\nfunction savePolicyLine(ptype: string, rule: string[]): Create {\n const line: Create = { ptype }\n if (rule.length > 0)\n line.v0 = rule[0]\n if (rule.length > 1)\n line.v1 = rule[1]\n if (rule.length > 2)\n line.v2 = rule[2]\n if (rule.length > 3)\n line.v3 = rule[3]\n if (rule.length > 4)\n line.v4 = rule[4]\n if (rule.length > 5)\n line.v5 = rule[5]\n return line\n}\n\nexport class PgCasbinAdapter implements UpdatableAdapter {\n constructor(private db: PostgresqlDB) {}\n\n async loadPolicy(model: Model): Promise<void> {\n const rows = await this.db.select().from(casbinRulePg)\n for (const r of rows) toPolicyLine(r, model)\n }\n\n async savePolicy(model: Model): Promise<boolean> {\n await this.db.delete(casbinRulePg)\n let astMap = model.model.get('p')!\n for (const [ptype, ast] of astMap) {\n for (const rule of ast.policy) {\n const line = savePolicyLine(ptype, rule)\n await this.db.insert(casbinRulePg).values(line)\n }\n }\n astMap = model.model.get('g')!\n for (const [ptype, ast] of astMap) {\n for (const rule of ast.policy) {\n const line = savePolicyLine(ptype, rule)\n await this.db.insert(casbinRulePg).values(line)\n }\n }\n return true\n }\n\n async addPolicy(_sec: string, ptype: string, rule: string[]): Promise<void> {\n const line = savePolicyLine(ptype, rule)\n await this.db.insert(casbinRulePg).values(line)\n }\n\n async removePolicy(_sec: string, ptype: string, rule: string[]): Promise<void> {\n const where = buildConditions(savePolicyLine(ptype, rule))\n if (where)\n await this.db.delete(casbinRulePg).where(where)\n }\n\n async removeFilteredPolicy(_sec: string, ptype: string, fieldIndex: number, ...fieldValues: string[]): Promise<void> {\n const line: Partial<Create> = { ptype }\n const idx = fieldIndex + fieldValues.length\n if (fieldIndex <= 0 && idx > 0)\n line.v0 = fieldValues[0 - fieldIndex]\n if (fieldIndex <= 1 && idx > 1)\n line.v1 = fieldValues[1 - fieldIndex]\n if (fieldIndex <= 2 && idx > 2)\n line.v2 = fieldValues[2 - fieldIndex]\n if (fieldIndex <= 3 && idx > 3)\n line.v3 = fieldValues[3 - fieldIndex]\n if (fieldIndex <= 4 && idx > 4)\n line.v4 = fieldValues[4 - fieldIndex]\n if (fieldIndex <= 5 && idx > 5)\n line.v5 = fieldValues[5 - fieldIndex]\n const where = buildConditions(line)\n if (where)\n await this.db.delete(casbinRulePg).where(where)\n }\n\n async updatePolicy(_sec: string, ptype: string, oldRule: string[], newRule: string[]): Promise<void> {\n const where = buildConditions(savePolicyLine(ptype, oldRule))\n const next = savePolicyLine(ptype, newRule)\n if (where)\n await this.db.update(casbinRulePg).set(next).where(where)\n }\n\n async updatePolicies(_sec: string, ptype: string, oldRules: string[][], newRules: string[][]): Promise<void> {\n if (oldRules.length !== newRules.length) {\n throw new Error('oldRules and newRules must have the same length')\n }\n\n await this.db.transaction(async (tx) => {\n for (let i = 0; i < oldRules.length; i++) {\n const where = buildConditions(savePolicyLine(ptype, oldRules[i]))\n const next = savePolicyLine(ptype, newRules[i])\n if (where) {\n await tx.update(casbinRulePg).set(next).where(where)\n }\n }\n })\n }\n\n async updateFilteredPolicies(_sec: string, ptype: string, newRules: string[][], fieldIndex: number, ...fieldValues: string[]): Promise<string[][]> {\n const line: Partial<Create> = { ptype }\n const idx = fieldIndex + fieldValues.length\n if (fieldIndex <= 0 && idx > 0)\n line.v0 = fieldValues[0 - fieldIndex]\n if (fieldIndex <= 1 && idx > 1)\n line.v1 = fieldValues[1 - fieldIndex]\n if (fieldIndex <= 2 && idx > 2)\n line.v2 = fieldValues[2 - fieldIndex]\n if (fieldIndex <= 3 && idx > 3)\n line.v3 = fieldValues[3 - fieldIndex]\n if (fieldIndex <= 4 && idx > 4)\n line.v4 = fieldValues[4 - fieldIndex]\n if (fieldIndex <= 5 && idx > 5)\n line.v5 = fieldValues[5 - fieldIndex]\n const where = buildConditions(line)\n\n if (!where)\n return []\n\n const oldRows = await this.db.select().from(casbinRulePg).where(where)\n const oldRules: string[][] = oldRows.map((r) => {\n const rule: string[] = []\n if (r.v0 != null)\n rule.push(r.v0)\n if (r.v1 != null)\n rule.push(r.v1)\n if (r.v2 != null)\n rule.push(r.v2)\n if (r.v3 != null)\n rule.push(r.v3)\n if (r.v4 != null)\n rule.push(r.v4)\n if (r.v5 != null)\n rule.push(r.v5)\n return rule\n })\n\n await this.db.transaction(async (tx) => {\n await tx.delete(casbinRulePg).where(where)\n for (const rule of newRules) {\n const next = savePolicyLine(ptype, rule)\n await tx.insert(casbinRulePg).values(next)\n }\n })\n\n return oldRules\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { SqliteDB } from "../../../../shared/db/connection.mjs";
|
|
2
|
+
import { Model, UpdatableAdapter } from "casbin";
|
|
3
|
+
|
|
4
|
+
//#region src/modules/user/infrastructure/casbin/adapter.sqlite.d.ts
|
|
5
|
+
declare class SqliteCasbinAdapter implements UpdatableAdapter {
|
|
6
|
+
private db;
|
|
7
|
+
constructor(db: SqliteDB);
|
|
8
|
+
loadPolicy(model: Model): Promise<void>;
|
|
9
|
+
savePolicy(model: Model): Promise<boolean>;
|
|
10
|
+
addPolicy(_sec: string, ptype: string, rule: string[]): Promise<void>;
|
|
11
|
+
removePolicy(_sec: string, ptype: string, rule: string[]): Promise<void>;
|
|
12
|
+
removeFilteredPolicy(_sec: string, ptype: string, fieldIndex: number, ...fieldValues: string[]): Promise<void>;
|
|
13
|
+
updatePolicy(_sec: string, ptype: string, oldRule: string[], newRule: string[]): Promise<void>;
|
|
14
|
+
updatePolicies(_sec: string, ptype: string, oldRules: string[][], newRules: string[][]): Promise<void>;
|
|
15
|
+
updateFilteredPolicies(_sec: string, ptype: string, newRules: string[][], fieldIndex: number, ...fieldValues: string[]): Promise<string[][]>;
|
|
16
|
+
}
|
|
17
|
+
//#endregion
|
|
18
|
+
export { SqliteCasbinAdapter };
|
|
19
|
+
//# sourceMappingURL=adapter.sqlite.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.sqlite.d.mts","names":[],"sources":["../../../../../src/modules/user/infrastructure/casbin/adapter.sqlite.ts"],"mappings":";;;;cAkDa,mBAAA,YAA+B,gBAAA;EAAA,QACtB,EAAA;cAAA,EAAA,EAAI,QAAA;EAElB,UAAA,CAAW,KAAA,EAAO,KAAA,GAAQ,OAAA;EAK1B,UAAA,CAAW,KAAA,EAAO,KAAA,GAAQ,OAAA;EAmB1B,SAAA,CAAU,IAAA,UAAc,KAAA,UAAe,IAAA,aAAiB,OAAA;EAKxD,YAAA,CAAa,IAAA,UAAc,KAAA,UAAe,IAAA,aAAiB,OAAA;EAM3D,oBAAA,CAAqB,IAAA,UAAc,KAAA,UAAe,UAAA,aAAuB,WAAA,aAAwB,OAAA;EAoBjG,YAAA,CAAa,IAAA,UAAc,KAAA,UAAe,OAAA,YAAmB,OAAA,aAAoB,OAAA;EAOjF,cAAA,CAAe,IAAA,UAAc,KAAA,UAAe,QAAA,cAAsB,QAAA,eAAuB,OAAA;EAgBzF,sBAAA,CAAuB,IAAA,UAAc,KAAA,UAAe,QAAA,cAAsB,UAAA,aAAuB,WAAA,aAAwB,OAAA;AAAA"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { casbinRuleSqlite } from "../casbin-rule.po.mjs";
|
|
2
|
+
import { Helper } from "casbin";
|
|
3
|
+
import { and, eq } from "drizzle-orm";
|
|
4
|
+
|
|
5
|
+
//#region src/modules/user/infrastructure/casbin/adapter.sqlite.ts
|
|
6
|
+
function toPolicyLine(line, model) {
|
|
7
|
+
const text = `${line.ptype || ""}, ${[
|
|
8
|
+
line.v0,
|
|
9
|
+
line.v1,
|
|
10
|
+
line.v2,
|
|
11
|
+
line.v3,
|
|
12
|
+
line.v4,
|
|
13
|
+
line.v5
|
|
14
|
+
].filter(Boolean).join(", ")}`;
|
|
15
|
+
Helper.loadPolicyLine(text, model);
|
|
16
|
+
}
|
|
17
|
+
function buildConditions(line) {
|
|
18
|
+
const conds = [];
|
|
19
|
+
if (line.ptype) conds.push(eq(casbinRuleSqlite.ptype, line.ptype));
|
|
20
|
+
if (line.v0 !== void 0) conds.push(eq(casbinRuleSqlite.v0, line.v0));
|
|
21
|
+
if (line.v1 !== void 0) conds.push(eq(casbinRuleSqlite.v1, line.v1));
|
|
22
|
+
if (line.v2 !== void 0) conds.push(eq(casbinRuleSqlite.v2, line.v2));
|
|
23
|
+
if (line.v3 !== void 0) conds.push(eq(casbinRuleSqlite.v3, line.v3));
|
|
24
|
+
if (line.v4 !== void 0) conds.push(eq(casbinRuleSqlite.v4, line.v4));
|
|
25
|
+
if (line.v5 !== void 0) conds.push(eq(casbinRuleSqlite.v5, line.v5));
|
|
26
|
+
return conds.length ? and(...conds) : void 0;
|
|
27
|
+
}
|
|
28
|
+
function savePolicyLine(ptype, rule) {
|
|
29
|
+
const line = { ptype };
|
|
30
|
+
if (rule.length > 0) line.v0 = rule[0];
|
|
31
|
+
if (rule.length > 1) line.v1 = rule[1];
|
|
32
|
+
if (rule.length > 2) line.v2 = rule[2];
|
|
33
|
+
if (rule.length > 3) line.v3 = rule[3];
|
|
34
|
+
if (rule.length > 4) line.v4 = rule[4];
|
|
35
|
+
if (rule.length > 5) line.v5 = rule[5];
|
|
36
|
+
return line;
|
|
37
|
+
}
|
|
38
|
+
var SqliteCasbinAdapter = class {
|
|
39
|
+
constructor(db) {
|
|
40
|
+
this.db = db;
|
|
41
|
+
}
|
|
42
|
+
async loadPolicy(model) {
|
|
43
|
+
const rows = await this.db.select().from(casbinRuleSqlite);
|
|
44
|
+
for (const r of rows) toPolicyLine(r, model);
|
|
45
|
+
}
|
|
46
|
+
async savePolicy(model) {
|
|
47
|
+
await this.db.delete(casbinRuleSqlite);
|
|
48
|
+
let astMap = model.model.get("p");
|
|
49
|
+
for (const [ptype, ast] of astMap) for (const rule of ast.policy) {
|
|
50
|
+
const line = savePolicyLine(ptype, rule);
|
|
51
|
+
await this.db.insert(casbinRuleSqlite).values(line);
|
|
52
|
+
}
|
|
53
|
+
astMap = model.model.get("g");
|
|
54
|
+
for (const [ptype, ast] of astMap) for (const rule of ast.policy) {
|
|
55
|
+
const line = savePolicyLine(ptype, rule);
|
|
56
|
+
await this.db.insert(casbinRuleSqlite).values(line);
|
|
57
|
+
}
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
async addPolicy(_sec, ptype, rule) {
|
|
61
|
+
const line = savePolicyLine(ptype, rule);
|
|
62
|
+
await this.db.insert(casbinRuleSqlite).values(line);
|
|
63
|
+
}
|
|
64
|
+
async removePolicy(_sec, ptype, rule) {
|
|
65
|
+
const where = buildConditions(savePolicyLine(ptype, rule));
|
|
66
|
+
if (where) await this.db.delete(casbinRuleSqlite).where(where);
|
|
67
|
+
}
|
|
68
|
+
async removeFilteredPolicy(_sec, ptype, fieldIndex, ...fieldValues) {
|
|
69
|
+
const line = { ptype };
|
|
70
|
+
const idx = fieldIndex + fieldValues.length;
|
|
71
|
+
if (fieldIndex <= 0 && idx > 0) line.v0 = fieldValues[0 - fieldIndex];
|
|
72
|
+
if (fieldIndex <= 1 && idx > 1) line.v1 = fieldValues[1 - fieldIndex];
|
|
73
|
+
if (fieldIndex <= 2 && idx > 2) line.v2 = fieldValues[2 - fieldIndex];
|
|
74
|
+
if (fieldIndex <= 3 && idx > 3) line.v3 = fieldValues[3 - fieldIndex];
|
|
75
|
+
if (fieldIndex <= 4 && idx > 4) line.v4 = fieldValues[4 - fieldIndex];
|
|
76
|
+
if (fieldIndex <= 5 && idx > 5) line.v5 = fieldValues[5 - fieldIndex];
|
|
77
|
+
const where = buildConditions(line);
|
|
78
|
+
if (where) await this.db.delete(casbinRuleSqlite).where(where);
|
|
79
|
+
}
|
|
80
|
+
async updatePolicy(_sec, ptype, oldRule, newRule) {
|
|
81
|
+
const where = buildConditions(savePolicyLine(ptype, oldRule));
|
|
82
|
+
const next = savePolicyLine(ptype, newRule);
|
|
83
|
+
if (where) await this.db.update(casbinRuleSqlite).set(next).where(where);
|
|
84
|
+
}
|
|
85
|
+
async updatePolicies(_sec, ptype, oldRules, newRules) {
|
|
86
|
+
if (oldRules.length !== newRules.length) throw new Error("oldRules and newRules must have the same length");
|
|
87
|
+
await this.db.transaction(async (tx) => {
|
|
88
|
+
for (let i = 0; i < oldRules.length; i++) {
|
|
89
|
+
const where = buildConditions(savePolicyLine(ptype, oldRules[i]));
|
|
90
|
+
const next = savePolicyLine(ptype, newRules[i]);
|
|
91
|
+
if (where) await tx.update(casbinRuleSqlite).set(next).where(where);
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
async updateFilteredPolicies(_sec, ptype, newRules, fieldIndex, ...fieldValues) {
|
|
96
|
+
const line = { ptype };
|
|
97
|
+
const idx = fieldIndex + fieldValues.length;
|
|
98
|
+
if (fieldIndex <= 0 && idx > 0) line.v0 = fieldValues[0 - fieldIndex];
|
|
99
|
+
if (fieldIndex <= 1 && idx > 1) line.v1 = fieldValues[1 - fieldIndex];
|
|
100
|
+
if (fieldIndex <= 2 && idx > 2) line.v2 = fieldValues[2 - fieldIndex];
|
|
101
|
+
if (fieldIndex <= 3 && idx > 3) line.v3 = fieldValues[3 - fieldIndex];
|
|
102
|
+
if (fieldIndex <= 4 && idx > 4) line.v4 = fieldValues[4 - fieldIndex];
|
|
103
|
+
if (fieldIndex <= 5 && idx > 5) line.v5 = fieldValues[5 - fieldIndex];
|
|
104
|
+
const where = buildConditions(line);
|
|
105
|
+
if (!where) return [];
|
|
106
|
+
const oldRules = (await this.db.select().from(casbinRuleSqlite).where(where)).map((r) => {
|
|
107
|
+
const rule = [];
|
|
108
|
+
if (r.v0 != null) rule.push(r.v0);
|
|
109
|
+
if (r.v1 != null) rule.push(r.v1);
|
|
110
|
+
if (r.v2 != null) rule.push(r.v2);
|
|
111
|
+
if (r.v3 != null) rule.push(r.v3);
|
|
112
|
+
if (r.v4 != null) rule.push(r.v4);
|
|
113
|
+
if (r.v5 != null) rule.push(r.v5);
|
|
114
|
+
return rule;
|
|
115
|
+
});
|
|
116
|
+
await this.db.transaction(async (tx) => {
|
|
117
|
+
await tx.delete(casbinRuleSqlite).where(where);
|
|
118
|
+
for (const rule of newRules) {
|
|
119
|
+
const next = savePolicyLine(ptype, rule);
|
|
120
|
+
await tx.insert(casbinRuleSqlite).values(next);
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
return oldRules;
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
//#endregion
|
|
128
|
+
export { SqliteCasbinAdapter };
|
|
129
|
+
//# sourceMappingURL=adapter.sqlite.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.sqlite.mjs","names":[],"sources":["../../../../../src/modules/user/infrastructure/casbin/adapter.sqlite.ts"],"sourcesContent":["import type { Model, UpdatableAdapter } from 'casbin'\nimport type { SqliteDB } from '@/shared/db/connection'\nimport { Helper } from 'casbin'\nimport { and, eq } from 'drizzle-orm'\nimport { casbinRuleSqlite } from '@/modules/user/infrastructure/casbin-rule.po'\n\ntype Row = typeof casbinRuleSqlite.$inferSelect\ntype Create = typeof casbinRuleSqlite.$inferInsert\n\nfunction toPolicyLine(line: Row, model: Model) {\n const text = `${line.ptype || ''}, ${[line.v0, line.v1, line.v2, line.v3, line.v4, line.v5].filter(Boolean).join(', ')}`\n Helper.loadPolicyLine(text, model)\n}\n\nfunction buildConditions(line: Partial<Create>) {\n const conds: any[] = []\n if (line.ptype)\n conds.push(eq(casbinRuleSqlite.ptype, line.ptype))\n if (line.v0 !== undefined)\n conds.push(eq(casbinRuleSqlite.v0, line.v0 as string))\n if (line.v1 !== undefined)\n conds.push(eq(casbinRuleSqlite.v1, line.v1 as string))\n if (line.v2 !== undefined)\n conds.push(eq(casbinRuleSqlite.v2, line.v2 as string))\n if (line.v3 !== undefined)\n conds.push(eq(casbinRuleSqlite.v3, line.v3 as string))\n if (line.v4 !== undefined)\n conds.push(eq(casbinRuleSqlite.v4, line.v4 as string))\n if (line.v5 !== undefined)\n conds.push(eq(casbinRuleSqlite.v5, line.v5 as string))\n return conds.length ? and(...conds) : undefined\n}\n\nfunction savePolicyLine(ptype: string, rule: string[]): Create {\n const line: Create = { ptype }\n if (rule.length > 0)\n line.v0 = rule[0]\n if (rule.length > 1)\n line.v1 = rule[1]\n if (rule.length > 2)\n line.v2 = rule[2]\n if (rule.length > 3)\n line.v3 = rule[3]\n if (rule.length > 4)\n line.v4 = rule[4]\n if (rule.length > 5)\n line.v5 = rule[5]\n return line\n}\n\nexport class SqliteCasbinAdapter implements UpdatableAdapter {\n constructor(private db: SqliteDB) {}\n\n async loadPolicy(model: Model): Promise<void> {\n const rows = await this.db.select().from(casbinRuleSqlite)\n for (const r of rows) toPolicyLine(r, model)\n }\n\n async savePolicy(model: Model): Promise<boolean> {\n await this.db.delete(casbinRuleSqlite)\n let astMap = model.model.get('p')!\n for (const [ptype, ast] of astMap) {\n for (const rule of ast.policy) {\n const line = savePolicyLine(ptype, rule)\n await this.db.insert(casbinRuleSqlite).values(line)\n }\n }\n astMap = model.model.get('g')!\n for (const [ptype, ast] of astMap) {\n for (const rule of ast.policy) {\n const line = savePolicyLine(ptype, rule)\n await this.db.insert(casbinRuleSqlite).values(line)\n }\n }\n return true\n }\n\n async addPolicy(_sec: string, ptype: string, rule: string[]): Promise<void> {\n const line = savePolicyLine(ptype, rule)\n await this.db.insert(casbinRuleSqlite).values(line)\n }\n\n async removePolicy(_sec: string, ptype: string, rule: string[]): Promise<void> {\n const where = buildConditions(savePolicyLine(ptype, rule))\n if (where)\n await this.db.delete(casbinRuleSqlite).where(where)\n }\n\n async removeFilteredPolicy(_sec: string, ptype: string, fieldIndex: number, ...fieldValues: string[]): Promise<void> {\n const line: Partial<Create> = { ptype }\n const idx = fieldIndex + fieldValues.length\n if (fieldIndex <= 0 && idx > 0)\n line.v0 = fieldValues[0 - fieldIndex]\n if (fieldIndex <= 1 && idx > 1)\n line.v1 = fieldValues[1 - fieldIndex]\n if (fieldIndex <= 2 && idx > 2)\n line.v2 = fieldValues[2 - fieldIndex]\n if (fieldIndex <= 3 && idx > 3)\n line.v3 = fieldValues[3 - fieldIndex]\n if (fieldIndex <= 4 && idx > 4)\n line.v4 = fieldValues[4 - fieldIndex]\n if (fieldIndex <= 5 && idx > 5)\n line.v5 = fieldValues[5 - fieldIndex]\n const where = buildConditions(line)\n if (where)\n await this.db.delete(casbinRuleSqlite).where(where)\n }\n\n async updatePolicy(_sec: string, ptype: string, oldRule: string[], newRule: string[]): Promise<void> {\n const where = buildConditions(savePolicyLine(ptype, oldRule))\n const next = savePolicyLine(ptype, newRule)\n if (where)\n await this.db.update(casbinRuleSqlite).set(next).where(where)\n }\n\n async updatePolicies(_sec: string, ptype: string, oldRules: string[][], newRules: string[][]): Promise<void> {\n if (oldRules.length !== newRules.length) {\n throw new Error('oldRules and newRules must have the same length')\n }\n\n await this.db.transaction(async (tx) => {\n for (let i = 0; i < oldRules.length; i++) {\n const where = buildConditions(savePolicyLine(ptype, oldRules[i]))\n const next = savePolicyLine(ptype, newRules[i])\n if (where) {\n await tx.update(casbinRuleSqlite).set(next).where(where)\n }\n }\n })\n }\n\n async updateFilteredPolicies(_sec: string, ptype: string, newRules: string[][], fieldIndex: number, ...fieldValues: string[]): Promise<string[][]> {\n const line: Partial<Create> = { ptype }\n const idx = fieldIndex + fieldValues.length\n if (fieldIndex <= 0 && idx > 0)\n line.v0 = fieldValues[0 - fieldIndex]\n if (fieldIndex <= 1 && idx > 1)\n line.v1 = fieldValues[1 - fieldIndex]\n if (fieldIndex <= 2 && idx > 2)\n line.v2 = fieldValues[2 - fieldIndex]\n if (fieldIndex <= 3 && idx > 3)\n line.v3 = fieldValues[3 - fieldIndex]\n if (fieldIndex <= 4 && idx > 4)\n line.v4 = fieldValues[4 - fieldIndex]\n if (fieldIndex <= 5 && idx > 5)\n line.v5 = fieldValues[5 - fieldIndex]\n const where = buildConditions(line)\n\n if (!where)\n return []\n\n const oldRows = await this.db.select().from(casbinRuleSqlite).where(where)\n const oldRules: string[][] = oldRows.map((r) => {\n const rule: string[] = []\n if (r.v0 != null)\n rule.push(r.v0)\n if (r.v1 != null)\n rule.push(r.v1)\n if (r.v2 != null)\n rule.push(r.v2)\n if (r.v3 != null)\n rule.push(r.v3)\n if (r.v4 != null)\n rule.push(r.v4)\n if (r.v5 != null)\n rule.push(r.v5)\n return rule\n })\n\n await this.db.transaction(async (tx) => {\n await tx.delete(casbinRuleSqlite).where(where)\n for (const rule of newRules) {\n const next = savePolicyLine(ptype, rule)\n await tx.insert(casbinRuleSqlite).values(next)\n }\n })\n\n return oldRules\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import * as casbin from "casbin";
|
|
2
|
+
|
|
3
|
+
//#region src/modules/user/infrastructure/casbin/enforcer.d.ts
|
|
4
|
+
declare function initEnforcer(): Promise<casbin.Enforcer>;
|
|
5
|
+
declare function initEnforcer(adapter: casbin.Adapter): Promise<casbin.Enforcer>;
|
|
6
|
+
declare function getEnforcer(): casbin.Enforcer;
|
|
7
|
+
//#endregion
|
|
8
|
+
export { getEnforcer, initEnforcer };
|
|
9
|
+
//# sourceMappingURL=enforcer.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enforcer.d.mts","names":[],"sources":["../../../../../src/modules/user/infrastructure/casbin/enforcer.ts"],"mappings":";;;iBAsDgB,YAAA,CAAA,GAAgB,OAAA,CAAJ,MAAA,CAA6B,QAAA;AAAA,iBACzC,YAAA,CAAa,OAAA,EAAD,MAAA,CAA2B,OAAA,GAAU,OAAA,CAAH,MAAA,CAA4B,QAAA;AAAA,iBA4B1E,WAAA,CAAA,GAAW,MAAA,CAI8B,QAAA"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import AppSettings from "../../../../settings.mjs";
|
|
2
|
+
import { getCasbinAdapter } from "./adapter.mjs";
|
|
3
|
+
import { newEnforcer, newModelFromString } from "casbin";
|
|
4
|
+
|
|
5
|
+
//#region src/modules/user/infrastructure/casbin/enforcer.ts
|
|
6
|
+
const RBAC_MODEL = `
|
|
7
|
+
[request_definition]
|
|
8
|
+
r = sub, obj, act
|
|
9
|
+
|
|
10
|
+
[policy_definition]
|
|
11
|
+
p = sub, obj, act
|
|
12
|
+
|
|
13
|
+
[role_definition]
|
|
14
|
+
g = _, _
|
|
15
|
+
|
|
16
|
+
[policy_effect]
|
|
17
|
+
e = some(where (p.eft == allow))
|
|
18
|
+
|
|
19
|
+
[matchers]
|
|
20
|
+
m = (r.sub == p.sub || g(r.sub, p.sub)) && keyMatch2(r.obj, p.obj) && regexMatch(r.act, p.act)
|
|
21
|
+
`;
|
|
22
|
+
let enforcerPromise = null;
|
|
23
|
+
const SEED_POLICIES = [
|
|
24
|
+
[
|
|
25
|
+
"admin",
|
|
26
|
+
"/api/*",
|
|
27
|
+
".*"
|
|
28
|
+
],
|
|
29
|
+
[
|
|
30
|
+
"user",
|
|
31
|
+
"/api/health",
|
|
32
|
+
"GET"
|
|
33
|
+
],
|
|
34
|
+
[
|
|
35
|
+
"user",
|
|
36
|
+
"/api/users",
|
|
37
|
+
"GET"
|
|
38
|
+
],
|
|
39
|
+
[
|
|
40
|
+
"user",
|
|
41
|
+
"/api/docs",
|
|
42
|
+
"POST"
|
|
43
|
+
],
|
|
44
|
+
[
|
|
45
|
+
"user",
|
|
46
|
+
"/api/docs/*/favorite",
|
|
47
|
+
"POST"
|
|
48
|
+
],
|
|
49
|
+
[
|
|
50
|
+
"user",
|
|
51
|
+
"/api/users/login",
|
|
52
|
+
"POST"
|
|
53
|
+
],
|
|
54
|
+
[
|
|
55
|
+
"user",
|
|
56
|
+
"/api/users/logout",
|
|
57
|
+
"POST"
|
|
58
|
+
],
|
|
59
|
+
[
|
|
60
|
+
"user",
|
|
61
|
+
"/api/users/me",
|
|
62
|
+
"GET"
|
|
63
|
+
],
|
|
64
|
+
[
|
|
65
|
+
"user",
|
|
66
|
+
"/api/tasks/*",
|
|
67
|
+
"GET"
|
|
68
|
+
],
|
|
69
|
+
[
|
|
70
|
+
"user",
|
|
71
|
+
"/api/tasks/*/progress",
|
|
72
|
+
"GET"
|
|
73
|
+
],
|
|
74
|
+
[
|
|
75
|
+
"guest",
|
|
76
|
+
"/api/health",
|
|
77
|
+
"GET"
|
|
78
|
+
],
|
|
79
|
+
[
|
|
80
|
+
"guest",
|
|
81
|
+
"/api/docs",
|
|
82
|
+
"GET"
|
|
83
|
+
],
|
|
84
|
+
[
|
|
85
|
+
"guest",
|
|
86
|
+
"/api/docs/query",
|
|
87
|
+
"GET"
|
|
88
|
+
],
|
|
89
|
+
[
|
|
90
|
+
"guest",
|
|
91
|
+
"/api/docs/*/check",
|
|
92
|
+
"POST"
|
|
93
|
+
],
|
|
94
|
+
[
|
|
95
|
+
"guest",
|
|
96
|
+
"/api/chat",
|
|
97
|
+
"POST"
|
|
98
|
+
],
|
|
99
|
+
[
|
|
100
|
+
"guest",
|
|
101
|
+
"/api/ranking/docs",
|
|
102
|
+
"GET"
|
|
103
|
+
],
|
|
104
|
+
[
|
|
105
|
+
"guest",
|
|
106
|
+
"/api/mcp",
|
|
107
|
+
".*"
|
|
108
|
+
],
|
|
109
|
+
[
|
|
110
|
+
"guest",
|
|
111
|
+
"/api/users/login",
|
|
112
|
+
"POST"
|
|
113
|
+
],
|
|
114
|
+
[
|
|
115
|
+
"guest",
|
|
116
|
+
"/api/users/logout",
|
|
117
|
+
"POST"
|
|
118
|
+
],
|
|
119
|
+
[
|
|
120
|
+
"guest",
|
|
121
|
+
"/api/users/me",
|
|
122
|
+
"GET"
|
|
123
|
+
]
|
|
124
|
+
];
|
|
125
|
+
async function initEnforcer(adapter) {
|
|
126
|
+
if (AppSettings.global.enforcer) return Promise.resolve(AppSettings.global.enforcer);
|
|
127
|
+
if (!enforcerPromise) enforcerPromise = (async () => {
|
|
128
|
+
const e = await newEnforcer(newModelFromString(RBAC_MODEL), adapter ?? getCasbinAdapter());
|
|
129
|
+
const policies = await e.getPolicy();
|
|
130
|
+
const existing = new Set((policies ?? []).map((p) => p.join("|")));
|
|
131
|
+
const missing = SEED_POLICIES.filter((p) => !existing.has(p.join("|")));
|
|
132
|
+
if (missing.length > 0) {
|
|
133
|
+
e.enableAutoSave(false);
|
|
134
|
+
await e.addPolicies(missing);
|
|
135
|
+
await e.savePolicy();
|
|
136
|
+
e.enableAutoSave(true);
|
|
137
|
+
}
|
|
138
|
+
AppSettings.global.enforcer = e;
|
|
139
|
+
return e;
|
|
140
|
+
})();
|
|
141
|
+
return enforcerPromise;
|
|
142
|
+
}
|
|
143
|
+
function getEnforcer() {
|
|
144
|
+
if (!AppSettings.global.enforcer) throw new Error("Enforcer not initialized, call initEnforcer() at startup");
|
|
145
|
+
return AppSettings.global.enforcer;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
//#endregion
|
|
149
|
+
export { getEnforcer, initEnforcer };
|
|
150
|
+
//# sourceMappingURL=enforcer.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enforcer.mjs","names":[],"sources":["../../../../../src/modules/user/infrastructure/casbin/enforcer.ts"],"sourcesContent":["import { newEnforcer, newModelFromString } from 'casbin'\nimport AppSettings from '@/settings'\nimport { getCasbinAdapter } from './adapter'\n\nconst RBAC_MODEL = `\n[request_definition]\nr = sub, obj, act\n\n[policy_definition]\np = sub, obj, act\n\n[role_definition]\ng = _, _\n\n[policy_effect]\ne = some(where (p.eft == allow))\n\n[matchers]\nm = (r.sub == p.sub || g(r.sub, p.sub)) && keyMatch2(r.obj, p.obj) && regexMatch(r.act, p.act)\n`\n\nlet enforcerPromise: Promise<import('casbin').Enforcer> | null = null\n\nconst SEED_POLICIES: [string, string, string][] = [\n ['admin', '/api/*', '.*'],\n\n ['user', '/api/health', 'GET'],\n ['user', '/api/users', 'GET'],\n ['user', '/api/docs', 'POST'],\n ['user', '/api/docs/*/favorite', 'POST'],\n\n ['user', '/api/users/login', 'POST'],\n ['user', '/api/users/logout', 'POST'],\n ['user', '/api/users/me', 'GET'],\n ['user', '/api/tasks/*', 'GET'],\n ['user', '/api/tasks/*/progress', 'GET'],\n\n ['guest', '/api/health', 'GET'],\n ['guest', '/api/docs', 'GET'],\n ['guest', '/api/docs/query', 'GET'],\n ['guest', '/api/docs/*/check', 'POST'],\n ['guest', '/api/chat', 'POST'],\n ['guest', '/api/ranking/docs', 'GET'],\n ['guest', '/api/mcp', '.*'],\n\n ['guest', '/api/users/login', 'POST'],\n ['guest', '/api/users/logout', 'POST'],\n ['guest', '/api/users/me', 'GET'],\n]\n\n// TODO: 增加表配置前端权限\n// role, permissionCode\n// const SEED_FRONT_PERMISSIONS = []\n\nexport function initEnforcer(): Promise<import('casbin').Enforcer>\nexport function initEnforcer(adapter: import('casbin').Adapter): Promise<import('casbin').Enforcer>\nexport async function initEnforcer(adapter?: import('casbin').Adapter) {\n if (AppSettings.global.enforcer) {\n return Promise.resolve(AppSettings.global.enforcer as import('casbin').Enforcer)\n }\n if (!enforcerPromise) {\n enforcerPromise = (async () => {\n const model = newModelFromString(RBAC_MODEL)\n const actualAdapter = adapter ?? getCasbinAdapter()\n const e = await newEnforcer(model, actualAdapter)\n\n const policies = await e.getPolicy()\n const existing = new Set((policies ?? []).map(p => p.join('|')))\n const missing = SEED_POLICIES.filter(p => !existing.has(p.join('|')))\n if (missing.length > 0) {\n e.enableAutoSave(false)\n await e.addPolicies(missing)\n await e.savePolicy()\n e.enableAutoSave(true)\n }\n\n AppSettings.global.enforcer = e\n return e\n })()\n }\n return enforcerPromise as Promise<import('casbin').Enforcer>\n}\n\nexport function getEnforcer() {\n if (!AppSettings.global.enforcer) {\n throw new Error('Enforcer not initialized, call initEnforcer() at startup')\n }\n return AppSettings.global.enforcer as import('casbin').Enforcer\n}\n"],"mappings":";;;;;AAIA,MAAM,aAAa;;;;;;;;;;;;;;;;AAiBnB,IAAI,kBAA6D;AAEjE,MAAM,gBAA4C;CAChD;EAAC;EAAS;EAAU;EAAK;CAEzB;EAAC;EAAQ;EAAe;EAAM;CAC9B;EAAC;EAAQ;EAAc;EAAM;CAC7B;EAAC;EAAQ;EAAa;EAAO;CAC7B;EAAC;EAAQ;EAAwB;EAAO;CAExC;EAAC;EAAQ;EAAoB;EAAO;CACpC;EAAC;EAAQ;EAAqB;EAAO;CACrC;EAAC;EAAQ;EAAiB;EAAM;CAChC;EAAC;EAAQ;EAAgB;EAAM;CAC/B;EAAC;EAAQ;EAAyB;EAAM;CAExC;EAAC;EAAS;EAAe;EAAM;CAC/B;EAAC;EAAS;EAAa;EAAM;CAC7B;EAAC;EAAS;EAAmB;EAAM;CACnC;EAAC;EAAS;EAAqB;EAAO;CACtC;EAAC;EAAS;EAAa;EAAO;CAC9B;EAAC;EAAS;EAAqB;EAAM;CACrC;EAAC;EAAS;EAAY;EAAK;CAE3B;EAAC;EAAS;EAAoB;EAAO;CACrC;EAAC;EAAS;EAAqB;EAAO;CACtC;EAAC;EAAS;EAAiB;EAAM;CAClC;AAQD,eAAsB,aAAa,SAAoC;AACrE,KAAI,YAAY,OAAO,SACrB,QAAO,QAAQ,QAAQ,YAAY,OAAO,SAAsC;AAElF,KAAI,CAAC,gBACH,oBAAmB,YAAY;EAG7B,MAAM,IAAI,MAAM,YAFF,mBAAmB,WAAW,EACtB,WAAW,kBAAkB,CACF;EAEjD,MAAM,WAAW,MAAM,EAAE,WAAW;EACpC,MAAM,WAAW,IAAI,KAAK,YAAY,EAAE,EAAE,KAAI,MAAK,EAAE,KAAK,IAAI,CAAC,CAAC;EAChE,MAAM,UAAU,cAAc,QAAO,MAAK,CAAC,SAAS,IAAI,EAAE,KAAK,IAAI,CAAC,CAAC;AACrE,MAAI,QAAQ,SAAS,GAAG;AACtB,KAAE,eAAe,MAAM;AACvB,SAAM,EAAE,YAAY,QAAQ;AAC5B,SAAM,EAAE,YAAY;AACpB,KAAE,eAAe,KAAK;;AAGxB,cAAY,OAAO,WAAW;AAC9B,SAAO;KACL;AAEN,QAAO;;AAGT,SAAgB,cAAc;AAC5B,KAAI,CAAC,YAAY,OAAO,SACtB,OAAM,IAAI,MAAM,2DAA2D;AAE7E,QAAO,YAAY,OAAO"}
|