@shohaghinfo/aerojs 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AEROJS.md +12 -0
- package/AGENTS.md +709 -0
- package/LICENSE +21 -0
- package/README.md +1186 -0
- package/bin/aero.js +24 -0
- package/dist/application.d.ts +251 -0
- package/dist/application.d.ts.map +1 -0
- package/dist/application.js +658 -0
- package/dist/application.js.map +1 -0
- package/dist/audit/audit-trail.d.ts +122 -0
- package/dist/audit/audit-trail.d.ts.map +1 -0
- package/dist/audit/audit-trail.js +154 -0
- package/dist/audit/audit-trail.js.map +1 -0
- package/dist/auth/auth-manager.d.ts +95 -0
- package/dist/auth/auth-manager.d.ts.map +1 -0
- package/dist/auth/auth-manager.js +130 -0
- package/dist/auth/auth-manager.js.map +1 -0
- package/dist/auth/bouncer.d.ts +143 -0
- package/dist/auth/bouncer.d.ts.map +1 -0
- package/dist/auth/bouncer.js +243 -0
- package/dist/auth/bouncer.js.map +1 -0
- package/dist/auth/guards/api-token-guard.d.ts +68 -0
- package/dist/auth/guards/api-token-guard.d.ts.map +1 -0
- package/dist/auth/guards/api-token-guard.js +107 -0
- package/dist/auth/guards/api-token-guard.js.map +1 -0
- package/dist/auth/guards/guard.d.ts +35 -0
- package/dist/auth/guards/guard.d.ts.map +1 -0
- package/dist/auth/guards/guard.js +7 -0
- package/dist/auth/guards/guard.js.map +1 -0
- package/dist/auth/guards/jwt-guard.d.ts +64 -0
- package/dist/auth/guards/jwt-guard.d.ts.map +1 -0
- package/dist/auth/guards/jwt-guard.js +104 -0
- package/dist/auth/guards/jwt-guard.js.map +1 -0
- package/dist/auth/guards/session-guard.d.ts +57 -0
- package/dist/auth/guards/session-guard.d.ts.map +1 -0
- package/dist/auth/guards/session-guard.js +101 -0
- package/dist/auth/guards/session-guard.js.map +1 -0
- package/dist/auth/index.d.ts +2 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +2 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/policy.d.ts +20 -0
- package/dist/auth/policy.d.ts.map +1 -0
- package/dist/auth/policy.js +49 -0
- package/dist/auth/policy.js.map +1 -0
- package/dist/body-parser.d.ts +40 -0
- package/dist/body-parser.d.ts.map +1 -0
- package/dist/body-parser.js +99 -0
- package/dist/body-parser.js.map +1 -0
- package/dist/cache/cache-driver.d.ts +43 -0
- package/dist/cache/cache-driver.d.ts.map +1 -0
- package/dist/cache/cache-driver.js +6 -0
- package/dist/cache/cache-driver.js.map +1 -0
- package/dist/cache/cache-manager.d.ts +44 -0
- package/dist/cache/cache-manager.d.ts.map +1 -0
- package/dist/cache/cache-manager.js +160 -0
- package/dist/cache/cache-manager.js.map +1 -0
- package/dist/cache/drivers/database-cache-driver.d.ts +18 -0
- package/dist/cache/drivers/database-cache-driver.d.ts.map +1 -0
- package/dist/cache/drivers/database-cache-driver.js +77 -0
- package/dist/cache/drivers/database-cache-driver.js.map +1 -0
- package/dist/cache/drivers/file-cache-driver.d.ts +21 -0
- package/dist/cache/drivers/file-cache-driver.d.ts.map +1 -0
- package/dist/cache/drivers/file-cache-driver.js +95 -0
- package/dist/cache/drivers/file-cache-driver.js.map +1 -0
- package/dist/cache/drivers/memory-cache-driver.d.ts +21 -0
- package/dist/cache/drivers/memory-cache-driver.d.ts.map +1 -0
- package/dist/cache/drivers/memory-cache-driver.js +82 -0
- package/dist/cache/drivers/memory-cache-driver.js.map +1 -0
- package/dist/cache/drivers/redis-cache-driver.d.ts +18 -0
- package/dist/cache/drivers/redis-cache-driver.d.ts.map +1 -0
- package/dist/cache/drivers/redis-cache-driver.js +95 -0
- package/dist/cache/drivers/redis-cache-driver.js.map +1 -0
- package/dist/cache/index.d.ts +7 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +7 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cli/commands/init.d.ts +10 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +471 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/make.d.ts +16 -0
- package/dist/cli/commands/make.d.ts.map +1 -0
- package/dist/cli/commands/make.js +157 -0
- package/dist/cli/commands/make.js.map +1 -0
- package/dist/cli/commands/new.d.ts +7 -0
- package/dist/cli/commands/new.d.ts.map +1 -0
- package/dist/cli/commands/new.js +175 -0
- package/dist/cli/commands/new.js.map +1 -0
- package/dist/cli/commands/vault.d.ts +7 -0
- package/dist/cli/commands/vault.d.ts.map +1 -0
- package/dist/cli/commands/vault.js +39 -0
- package/dist/cli/commands/vault.js.map +1 -0
- package/dist/cli/index.d.ts +8 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +8 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/runner.d.ts +10 -0
- package/dist/cli/runner.d.ts.map +1 -0
- package/dist/cli/runner.js +207 -0
- package/dist/cli/runner.js.map +1 -0
- package/dist/cli/templates/ecommerce-erp.d.ts +6 -0
- package/dist/cli/templates/ecommerce-erp.d.ts.map +1 -0
- package/dist/cli/templates/ecommerce-erp.js +1760 -0
- package/dist/cli/templates/ecommerce-erp.js.map +1 -0
- package/dist/cli/templates/fullstack-templates.d.ts +17 -0
- package/dist/cli/templates/fullstack-templates.d.ts.map +1 -0
- package/dist/cli/templates/fullstack-templates.js +17 -0
- package/dist/cli/templates/fullstack-templates.js.map +1 -0
- package/dist/config/config.d.ts +25 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +53 -0
- package/dist/config/config.js.map +1 -0
- package/dist/config/env-schema.d.ts +62 -0
- package/dist/config/env-schema.d.ts.map +1 -0
- package/dist/config/env-schema.js +203 -0
- package/dist/config/env-schema.js.map +1 -0
- package/dist/config/env.d.ts +31 -0
- package/dist/config/env.d.ts.map +1 -0
- package/dist/config/env.js +153 -0
- package/dist/config/env.js.map +1 -0
- package/dist/context.d.ts +181 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +277 -0
- package/dist/context.js.map +1 -0
- package/dist/core/application-core.d.ts +79 -0
- package/dist/core/application-core.d.ts.map +1 -0
- package/dist/core/application-core.js +560 -0
- package/dist/core/application-core.js.map +1 -0
- package/dist/core/application.d.ts +121 -0
- package/dist/core/application.d.ts.map +1 -0
- package/dist/core/application.js +179 -0
- package/dist/core/application.js.map +1 -0
- package/dist/core/body-parser.d.ts +12 -0
- package/dist/core/body-parser.d.ts.map +1 -0
- package/dist/core/body-parser.js +85 -0
- package/dist/core/body-parser.js.map +1 -0
- package/dist/core/context.d.ts +94 -0
- package/dist/core/context.d.ts.map +1 -0
- package/dist/core/context.js +278 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/error-dashboard.d.ts +35 -0
- package/dist/core/error-dashboard.d.ts.map +1 -0
- package/dist/core/error-dashboard.js +481 -0
- package/dist/core/error-dashboard.js.map +1 -0
- package/dist/core/errors.d.ts +83 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +117 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/hooks.d.ts +39 -0
- package/dist/core/hooks.d.ts.map +1 -0
- package/dist/core/hooks.js +65 -0
- package/dist/core/hooks.js.map +1 -0
- package/dist/core/middleware.d.ts +15 -0
- package/dist/core/middleware.d.ts.map +1 -0
- package/dist/core/middleware.js +45 -0
- package/dist/core/middleware.js.map +1 -0
- package/dist/core/request.d.ts +50 -0
- package/dist/core/request.d.ts.map +1 -0
- package/dist/core/request.js +94 -0
- package/dist/core/request.js.map +1 -0
- package/dist/core/response.d.ts +49 -0
- package/dist/core/response.d.ts.map +1 -0
- package/dist/core/response.js +302 -0
- package/dist/core/response.js.map +1 -0
- package/dist/core/router.d.ts +58 -0
- package/dist/core/router.d.ts.map +1 -0
- package/dist/core/router.js +298 -0
- package/dist/core/router.js.map +1 -0
- package/dist/core/types.d.ts +70 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +6 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/utils.d.ts +36 -0
- package/dist/core/utils.d.ts.map +1 -0
- package/dist/core/utils.js +108 -0
- package/dist/core/utils.js.map +1 -0
- package/dist/database/connection.d.ts +97 -0
- package/dist/database/connection.d.ts.map +1 -0
- package/dist/database/connection.js +251 -0
- package/dist/database/connection.js.map +1 -0
- package/dist/database/drizzle.d.ts +10 -0
- package/dist/database/drizzle.d.ts.map +1 -0
- package/dist/database/drizzle.js +13 -0
- package/dist/database/drizzle.js.map +1 -0
- package/dist/database/factory.d.ts +39 -0
- package/dist/database/factory.d.ts.map +1 -0
- package/dist/database/factory.js +74 -0
- package/dist/database/factory.js.map +1 -0
- package/dist/database/index.d.ts +16 -0
- package/dist/database/index.d.ts.map +1 -0
- package/dist/database/index.js +16 -0
- package/dist/database/index.js.map +1 -0
- package/dist/database/knex.d.ts +33 -0
- package/dist/database/knex.d.ts.map +1 -0
- package/dist/database/knex.js +123 -0
- package/dist/database/knex.js.map +1 -0
- package/dist/database/migrator.d.ts +29 -0
- package/dist/database/migrator.d.ts.map +1 -0
- package/dist/database/migrator.js +83 -0
- package/dist/database/migrator.js.map +1 -0
- package/dist/database/model-hooks.d.ts +61 -0
- package/dist/database/model-hooks.d.ts.map +1 -0
- package/dist/database/model-hooks.js +126 -0
- package/dist/database/model-hooks.js.map +1 -0
- package/dist/database/model.d.ts +279 -0
- package/dist/database/model.d.ts.map +1 -0
- package/dist/database/model.js +960 -0
- package/dist/database/model.js.map +1 -0
- package/dist/database/prisma.d.ts +13 -0
- package/dist/database/prisma.d.ts.map +1 -0
- package/dist/database/prisma.js +28 -0
- package/dist/database/prisma.js.map +1 -0
- package/dist/database/query-builder.d.ts +178 -0
- package/dist/database/query-builder.d.ts.map +1 -0
- package/dist/database/query-builder.js +607 -0
- package/dist/database/query-builder.js.map +1 -0
- package/dist/database/schema.d.ts +38 -0
- package/dist/database/schema.d.ts.map +1 -0
- package/dist/database/schema.js +134 -0
- package/dist/database/schema.js.map +1 -0
- package/dist/database/seeder.d.ts +24 -0
- package/dist/database/seeder.d.ts.map +1 -0
- package/dist/database/seeder.js +27 -0
- package/dist/database/seeder.js.map +1 -0
- package/dist/di/container.d.ts +52 -0
- package/dist/di/container.d.ts.map +1 -0
- package/dist/di/container.js +124 -0
- package/dist/di/container.js.map +1 -0
- package/dist/di/decorators.d.ts +17 -0
- package/dist/di/decorators.d.ts.map +1 -0
- package/dist/di/decorators.js +63 -0
- package/dist/di/decorators.js.map +1 -0
- package/dist/di/inject.d.ts +11 -0
- package/dist/di/inject.d.ts.map +1 -0
- package/dist/di/inject.js +30 -0
- package/dist/di/inject.js.map +1 -0
- package/dist/di/provider.d.ts +32 -0
- package/dist/di/provider.d.ts.map +1 -0
- package/dist/di/provider.js +30 -0
- package/dist/di/provider.js.map +1 -0
- package/dist/diagnostics/diagnostics-plugin.d.ts +9 -0
- package/dist/diagnostics/diagnostics-plugin.d.ts.map +1 -0
- package/dist/diagnostics/diagnostics-plugin.js +49 -0
- package/dist/diagnostics/diagnostics-plugin.js.map +1 -0
- package/dist/diagnostics/health-check.d.ts +51 -0
- package/dist/diagnostics/health-check.d.ts.map +1 -0
- package/dist/diagnostics/health-check.js +122 -0
- package/dist/diagnostics/health-check.js.map +1 -0
- package/dist/diagnostics/index.d.ts +4 -0
- package/dist/diagnostics/index.d.ts.map +1 -0
- package/dist/diagnostics/index.js +4 -0
- package/dist/diagnostics/index.js.map +1 -0
- package/dist/diagnostics/prometheus.d.ts +19 -0
- package/dist/diagnostics/prometheus.d.ts.map +1 -0
- package/dist/diagnostics/prometheus.js +99 -0
- package/dist/diagnostics/prometheus.js.map +1 -0
- package/dist/errors.d.ts +139 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +173 -0
- package/dist/errors.js.map +1 -0
- package/dist/events/event-bus.d.ts +178 -0
- package/dist/events/event-bus.d.ts.map +1 -0
- package/dist/events/event-bus.js +182 -0
- package/dist/events/event-bus.js.map +1 -0
- package/dist/graphql/adapter.d.ts +48 -0
- package/dist/graphql/adapter.d.ts.map +1 -0
- package/dist/graphql/adapter.js +109 -0
- package/dist/graphql/adapter.js.map +1 -0
- package/dist/graphql/executor.d.ts +24 -0
- package/dist/graphql/executor.d.ts.map +1 -0
- package/dist/graphql/executor.js +124 -0
- package/dist/graphql/executor.js.map +1 -0
- package/dist/graphql/index.d.ts +8 -0
- package/dist/graphql/index.d.ts.map +1 -0
- package/dist/graphql/index.js +8 -0
- package/dist/graphql/index.js.map +1 -0
- package/dist/graphql/lexer.d.ts +52 -0
- package/dist/graphql/lexer.d.ts.map +1 -0
- package/dist/graphql/lexer.js +188 -0
- package/dist/graphql/lexer.js.map +1 -0
- package/dist/graphql/parser.d.ts +29 -0
- package/dist/graphql/parser.d.ts.map +1 -0
- package/dist/graphql/parser.js +206 -0
- package/dist/graphql/parser.js.map +1 -0
- package/dist/graphql/plugin.d.ts +13 -0
- package/dist/graphql/plugin.d.ts.map +1 -0
- package/dist/graphql/plugin.js +103 -0
- package/dist/graphql/plugin.js.map +1 -0
- package/dist/graphql/schema.d.ts +15 -0
- package/dist/graphql/schema.d.ts.map +1 -0
- package/dist/graphql/schema.js +17 -0
- package/dist/graphql/schema.js.map +1 -0
- package/dist/graphql/types.d.ts +65 -0
- package/dist/graphql/types.d.ts.map +1 -0
- package/dist/graphql/types.js +74 -0
- package/dist/graphql/types.js.map +1 -0
- package/dist/hooks.d.ts +67 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +115 -0
- package/dist/hooks.js.map +1 -0
- package/dist/i18n/i18n.d.ts +42 -0
- package/dist/i18n/i18n.d.ts.map +1 -0
- package/dist/i18n/i18n.js +158 -0
- package/dist/i18n/i18n.js.map +1 -0
- package/dist/i18n/index.d.ts +2 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +2 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/index.d.ts +75 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +87 -0
- package/dist/index.js.map +1 -0
- package/dist/inertia/inertia.d.ts +62 -0
- package/dist/inertia/inertia.d.ts.map +1 -0
- package/dist/inertia/inertia.js +159 -0
- package/dist/inertia/inertia.js.map +1 -0
- package/dist/logging/index.d.ts +7 -0
- package/dist/logging/index.d.ts.map +1 -0
- package/dist/logging/index.js +7 -0
- package/dist/logging/index.js.map +1 -0
- package/dist/logging/logger.d.ts +62 -0
- package/dist/logging/logger.d.ts.map +1 -0
- package/dist/logging/logger.js +197 -0
- package/dist/logging/logger.js.map +1 -0
- package/dist/logging/request-context.d.ts +29 -0
- package/dist/logging/request-context.d.ts.map +1 -0
- package/dist/logging/request-context.js +29 -0
- package/dist/logging/request-context.js.map +1 -0
- package/dist/mail/drivers/log-mail-driver.d.ts +11 -0
- package/dist/mail/drivers/log-mail-driver.d.ts.map +1 -0
- package/dist/mail/drivers/log-mail-driver.js +23 -0
- package/dist/mail/drivers/log-mail-driver.js.map +1 -0
- package/dist/mail/drivers/mail-driver.d.ts +14 -0
- package/dist/mail/drivers/mail-driver.d.ts.map +1 -0
- package/dist/mail/drivers/mail-driver.js +6 -0
- package/dist/mail/drivers/mail-driver.js.map +1 -0
- package/dist/mail/drivers/memory-mail-driver.d.ts +14 -0
- package/dist/mail/drivers/memory-mail-driver.d.ts.map +1 -0
- package/dist/mail/drivers/memory-mail-driver.js +24 -0
- package/dist/mail/drivers/memory-mail-driver.js.map +1 -0
- package/dist/mail/index.d.ts +10 -0
- package/dist/mail/index.d.ts.map +1 -0
- package/dist/mail/index.js +10 -0
- package/dist/mail/index.js.map +1 -0
- package/dist/mail/mailer.d.ts +48 -0
- package/dist/mail/mailer.d.ts.map +1 -0
- package/dist/mail/mailer.js +111 -0
- package/dist/mail/mailer.js.map +1 -0
- package/dist/mail/message.d.ts +30 -0
- package/dist/mail/message.d.ts.map +1 -0
- package/dist/mail/message.js +77 -0
- package/dist/mail/message.js.map +1 -0
- package/dist/middleware/cors.d.ts +16 -0
- package/dist/middleware/cors.d.ts.map +1 -0
- package/dist/middleware/cors.js +76 -0
- package/dist/middleware/cors.js.map +1 -0
- package/dist/middleware.d.ts +26 -0
- package/dist/middleware.d.ts.map +1 -0
- package/dist/middleware.js +45 -0
- package/dist/middleware.js.map +1 -0
- package/dist/pdf/index.d.ts +2 -0
- package/dist/pdf/index.d.ts.map +1 -0
- package/dist/pdf/index.js +2 -0
- package/dist/pdf/index.js.map +1 -0
- package/dist/pdf/pdf.d.ts +86 -0
- package/dist/pdf/pdf.d.ts.map +1 -0
- package/dist/pdf/pdf.js +237 -0
- package/dist/pdf/pdf.js.map +1 -0
- package/dist/plugins/plugin.d.ts +25 -0
- package/dist/plugins/plugin.d.ts.map +1 -0
- package/dist/plugins/plugin.js +17 -0
- package/dist/plugins/plugin.js.map +1 -0
- package/dist/queue/drivers/database-queue-driver.d.ts +21 -0
- package/dist/queue/drivers/database-queue-driver.d.ts.map +1 -0
- package/dist/queue/drivers/database-queue-driver.js +84 -0
- package/dist/queue/drivers/database-queue-driver.js.map +1 -0
- package/dist/queue/drivers/memory-queue-driver.d.ts +17 -0
- package/dist/queue/drivers/memory-queue-driver.d.ts.map +1 -0
- package/dist/queue/drivers/memory-queue-driver.js +71 -0
- package/dist/queue/drivers/memory-queue-driver.js.map +1 -0
- package/dist/queue/drivers/queue-driver.d.ts +44 -0
- package/dist/queue/drivers/queue-driver.d.ts.map +1 -0
- package/dist/queue/drivers/queue-driver.js +6 -0
- package/dist/queue/drivers/queue-driver.js.map +1 -0
- package/dist/queue/drivers/redis-queue-driver.d.ts +16 -0
- package/dist/queue/drivers/redis-queue-driver.d.ts.map +1 -0
- package/dist/queue/drivers/redis-queue-driver.js +92 -0
- package/dist/queue/drivers/redis-queue-driver.js.map +1 -0
- package/dist/queue/index.d.ts +12 -0
- package/dist/queue/index.d.ts.map +1 -0
- package/dist/queue/index.js +12 -0
- package/dist/queue/index.js.map +1 -0
- package/dist/queue/job.d.ts +20 -0
- package/dist/queue/job.d.ts.map +1 -0
- package/dist/queue/job.js +19 -0
- package/dist/queue/job.js.map +1 -0
- package/dist/queue/queue-manager.d.ts +41 -0
- package/dist/queue/queue-manager.d.ts.map +1 -0
- package/dist/queue/queue-manager.js +98 -0
- package/dist/queue/queue-manager.js.map +1 -0
- package/dist/queue/worker.d.ts +57 -0
- package/dist/queue/worker.d.ts.map +1 -0
- package/dist/queue/worker.js +156 -0
- package/dist/queue/worker.js.map +1 -0
- package/dist/redis/index.d.ts +5 -0
- package/dist/redis/index.d.ts.map +1 -0
- package/dist/redis/index.js +5 -0
- package/dist/redis/index.js.map +1 -0
- package/dist/redis/redis-client.d.ts +44 -0
- package/dist/redis/redis-client.d.ts.map +1 -0
- package/dist/redis/redis-client.js +131 -0
- package/dist/redis/redis-client.js.map +1 -0
- package/dist/redis/redis-connection.d.ts +32 -0
- package/dist/redis/redis-connection.d.ts.map +1 -0
- package/dist/redis/redis-connection.js +151 -0
- package/dist/redis/redis-connection.js.map +1 -0
- package/dist/redis/redis-manager.d.ts +28 -0
- package/dist/redis/redis-manager.d.ts.map +1 -0
- package/dist/redis/redis-manager.js +68 -0
- package/dist/redis/redis-manager.js.map +1 -0
- package/dist/redis/resp-parser.d.ts +29 -0
- package/dist/redis/resp-parser.d.ts.map +1 -0
- package/dist/redis/resp-parser.js +113 -0
- package/dist/redis/resp-parser.js.map +1 -0
- package/dist/request.d.ts +122 -0
- package/dist/request.d.ts.map +1 -0
- package/dist/request.js +171 -0
- package/dist/request.js.map +1 -0
- package/dist/response.d.ts +208 -0
- package/dist/response.d.ts.map +1 -0
- package/dist/response.js +375 -0
- package/dist/response.js.map +1 -0
- package/dist/router.d.ts +146 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.js +341 -0
- package/dist/router.js.map +1 -0
- package/dist/routing/controller.d.ts +18 -0
- package/dist/routing/controller.d.ts.map +1 -0
- package/dist/routing/controller.js +49 -0
- package/dist/routing/controller.js.map +1 -0
- package/dist/routing/named-middleware.d.ts +27 -0
- package/dist/routing/named-middleware.d.ts.map +1 -0
- package/dist/routing/named-middleware.js +41 -0
- package/dist/routing/named-middleware.js.map +1 -0
- package/dist/routing/route-builder.d.ts +54 -0
- package/dist/routing/route-builder.d.ts.map +1 -0
- package/dist/routing/route-builder.js +95 -0
- package/dist/routing/route-builder.js.map +1 -0
- package/dist/routing/route-group.d.ts +39 -0
- package/dist/routing/route-group.d.ts.map +1 -0
- package/dist/routing/route-group.js +79 -0
- package/dist/routing/route-group.js.map +1 -0
- package/dist/scheduler/scheduler.d.ts +85 -0
- package/dist/scheduler/scheduler.d.ts.map +1 -0
- package/dist/scheduler/scheduler.js +216 -0
- package/dist/scheduler/scheduler.js.map +1 -0
- package/dist/security/csrf.d.ts +19 -0
- package/dist/security/csrf.d.ts.map +1 -0
- package/dist/security/csrf.js +69 -0
- package/dist/security/csrf.js.map +1 -0
- package/dist/security/hash.d.ts +30 -0
- package/dist/security/hash.d.ts.map +1 -0
- package/dist/security/hash.js +86 -0
- package/dist/security/hash.js.map +1 -0
- package/dist/security/headers.d.ts +56 -0
- package/dist/security/headers.d.ts.map +1 -0
- package/dist/security/headers.js +81 -0
- package/dist/security/headers.js.map +1 -0
- package/dist/security/index.d.ts +13 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +13 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/jwt.d.ts +96 -0
- package/dist/security/jwt.d.ts.map +1 -0
- package/dist/security/jwt.js +308 -0
- package/dist/security/jwt.js.map +1 -0
- package/dist/security/rate-limiter.d.ts +80 -0
- package/dist/security/rate-limiter.d.ts.map +1 -0
- package/dist/security/rate-limiter.js +127 -0
- package/dist/security/rate-limiter.js.map +1 -0
- package/dist/security/totp.d.ts +43 -0
- package/dist/security/totp.d.ts.map +1 -0
- package/dist/security/totp.js +122 -0
- package/dist/security/totp.js.map +1 -0
- package/dist/security/vault.d.ts +28 -0
- package/dist/security/vault.d.ts.map +1 -0
- package/dist/security/vault.js +73 -0
- package/dist/security/vault.js.map +1 -0
- package/dist/session/session-driver.d.ts +53 -0
- package/dist/session/session-driver.d.ts.map +1 -0
- package/dist/session/session-driver.js +132 -0
- package/dist/session/session-driver.js.map +1 -0
- package/dist/session/session-manager.d.ts +100 -0
- package/dist/session/session-manager.d.ts.map +1 -0
- package/dist/session/session-manager.js +186 -0
- package/dist/session/session-manager.js.map +1 -0
- package/dist/sse/index.d.ts +2 -0
- package/dist/sse/index.d.ts.map +1 -0
- package/dist/sse/index.js +2 -0
- package/dist/sse/index.js.map +1 -0
- package/dist/sse/sse.d.ts +32 -0
- package/dist/sse/sse.d.ts.map +1 -0
- package/dist/sse/sse.js +87 -0
- package/dist/sse/sse.js.map +1 -0
- package/dist/ssr/engine.d.ts +58 -0
- package/dist/ssr/engine.d.ts.map +1 -0
- package/dist/ssr/engine.js +121 -0
- package/dist/ssr/engine.js.map +1 -0
- package/dist/ssr/index.d.ts +6 -0
- package/dist/ssr/index.d.ts.map +1 -0
- package/dist/ssr/index.js +6 -0
- package/dist/ssr/index.js.map +1 -0
- package/dist/static/static.d.ts +22 -0
- package/dist/static/static.d.ts.map +1 -0
- package/dist/static/static.js +134 -0
- package/dist/static/static.js.map +1 -0
- package/dist/storage/chunked-uploader.d.ts +53 -0
- package/dist/storage/chunked-uploader.d.ts.map +1 -0
- package/dist/storage/chunked-uploader.js +135 -0
- package/dist/storage/chunked-uploader.js.map +1 -0
- package/dist/storage/drivers/local-driver.d.ts +25 -0
- package/dist/storage/drivers/local-driver.d.ts.map +1 -0
- package/dist/storage/drivers/local-driver.js +75 -0
- package/dist/storage/drivers/local-driver.js.map +1 -0
- package/dist/storage/drivers/memory-driver.d.ts +23 -0
- package/dist/storage/drivers/memory-driver.d.ts.map +1 -0
- package/dist/storage/drivers/memory-driver.js +55 -0
- package/dist/storage/drivers/memory-driver.js.map +1 -0
- package/dist/storage/drivers/s3-driver.d.ts +34 -0
- package/dist/storage/drivers/s3-driver.d.ts.map +1 -0
- package/dist/storage/drivers/s3-driver.js +186 -0
- package/dist/storage/drivers/s3-driver.js.map +1 -0
- package/dist/storage/drivers/storage-driver.d.ts +40 -0
- package/dist/storage/drivers/storage-driver.d.ts.map +1 -0
- package/dist/storage/drivers/storage-driver.js +6 -0
- package/dist/storage/drivers/storage-driver.js.map +1 -0
- package/dist/storage/index.d.ts +13 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +13 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/multipart.d.ts +12 -0
- package/dist/storage/multipart.d.ts.map +1 -0
- package/dist/storage/multipart.js +79 -0
- package/dist/storage/multipart.js.map +1 -0
- package/dist/storage/storage-manager.d.ts +48 -0
- package/dist/storage/storage-manager.d.ts.map +1 -0
- package/dist/storage/storage-manager.js +106 -0
- package/dist/storage/storage-manager.js.map +1 -0
- package/dist/storage/uploaded-file.d.ts +40 -0
- package/dist/storage/uploaded-file.d.ts.map +1 -0
- package/dist/storage/uploaded-file.js +73 -0
- package/dist/storage/uploaded-file.js.map +1 -0
- package/dist/swagger/generator.d.ts +44 -0
- package/dist/swagger/generator.d.ts.map +1 -0
- package/dist/swagger/generator.js +117 -0
- package/dist/swagger/generator.js.map +1 -0
- package/dist/swagger/index.d.ts +8 -0
- package/dist/swagger/index.d.ts.map +1 -0
- package/dist/swagger/index.js +8 -0
- package/dist/swagger/index.js.map +1 -0
- package/dist/swagger/swagger.d.ts +9 -0
- package/dist/swagger/swagger.d.ts.map +1 -0
- package/dist/swagger/swagger.js +32 -0
- package/dist/swagger/swagger.js.map +1 -0
- package/dist/swagger/ui.d.ts +11 -0
- package/dist/swagger/ui.d.ts.map +1 -0
- package/dist/swagger/ui.js +93 -0
- package/dist/swagger/ui.js.map +1 -0
- package/dist/tcp/hl7.d.ts +19 -0
- package/dist/tcp/hl7.d.ts.map +1 -0
- package/dist/tcp/hl7.js +42 -0
- package/dist/tcp/hl7.js.map +1 -0
- package/dist/tcp/index.d.ts +4 -0
- package/dist/tcp/index.d.ts.map +1 -0
- package/dist/tcp/index.js +4 -0
- package/dist/tcp/index.js.map +1 -0
- package/dist/tcp/mllp.d.ts +22 -0
- package/dist/tcp/mllp.d.ts.map +1 -0
- package/dist/tcp/mllp.js +44 -0
- package/dist/tcp/mllp.js.map +1 -0
- package/dist/tcp/tcp-server.d.ts +20 -0
- package/dist/tcp/tcp-server.d.ts.map +1 -0
- package/dist/tcp/tcp-server.js +59 -0
- package/dist/tcp/tcp-server.js.map +1 -0
- package/dist/tenancy/index.d.ts +2 -0
- package/dist/tenancy/index.d.ts.map +1 -0
- package/dist/tenancy/index.js +2 -0
- package/dist/tenancy/index.js.map +1 -0
- package/dist/tenancy/tenant.d.ts +22 -0
- package/dist/tenancy/tenant.d.ts.map +1 -0
- package/dist/tenancy/tenant.js +32 -0
- package/dist/tenancy/tenant.js.map +1 -0
- package/dist/testing/test-client.d.ts +36 -0
- package/dist/testing/test-client.d.ts.map +1 -0
- package/dist/testing/test-client.js +128 -0
- package/dist/testing/test-client.js.map +1 -0
- package/dist/validation/index.d.ts +10 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +10 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/rules-validator.d.ts +65 -0
- package/dist/validation/rules-validator.d.ts.map +1 -0
- package/dist/validation/rules-validator.js +301 -0
- package/dist/validation/rules-validator.js.map +1 -0
- package/dist/validation/schema.d.ts +34 -0
- package/dist/validation/schema.d.ts.map +1 -0
- package/dist/validation/schema.js +174 -0
- package/dist/validation/schema.js.map +1 -0
- package/dist/validation/vine.d.ts +23 -0
- package/dist/validation/vine.d.ts.map +1 -0
- package/dist/validation/vine.js +97 -0
- package/dist/validation/vine.js.map +1 -0
- package/dist/views/view.d.ts +51 -0
- package/dist/views/view.d.ts.map +1 -0
- package/dist/views/view.js +91 -0
- package/dist/views/view.js.map +1 -0
- package/dist/views/vite.d.ts +19 -0
- package/dist/views/vite.d.ts.map +1 -0
- package/dist/views/vite.js +60 -0
- package/dist/views/vite.js.map +1 -0
- package/dist/webhook/index.d.ts +2 -0
- package/dist/webhook/index.d.ts.map +1 -0
- package/dist/webhook/index.js +2 -0
- package/dist/webhook/index.js.map +1 -0
- package/dist/webhook/webhook.d.ts +30 -0
- package/dist/webhook/webhook.d.ts.map +1 -0
- package/dist/webhook/webhook.js +124 -0
- package/dist/webhook/webhook.js.map +1 -0
- package/dist/ws/broadcaster.d.ts +43 -0
- package/dist/ws/broadcaster.d.ts.map +1 -0
- package/dist/ws/broadcaster.js +81 -0
- package/dist/ws/broadcaster.js.map +1 -0
- package/dist/ws/channel.d.ts +23 -0
- package/dist/ws/channel.d.ts.map +1 -0
- package/dist/ws/channel.js +27 -0
- package/dist/ws/channel.js.map +1 -0
- package/dist/ws/index.d.ts +5 -0
- package/dist/ws/index.d.ts.map +1 -0
- package/dist/ws/index.js +5 -0
- package/dist/ws/index.js.map +1 -0
- package/dist/ws/websocket-hub.d.ts +52 -0
- package/dist/ws/websocket-hub.d.ts.map +1 -0
- package/dist/ws/websocket-hub.js +187 -0
- package/dist/ws/websocket-hub.js.map +1 -0
- package/dist/ws/websocket.d.ts +43 -0
- package/dist/ws/websocket.d.ts.map +1 -0
- package/dist/ws/websocket.js +214 -0
- package/dist/ws/websocket.js.map +1 -0
- package/package.json +141 -0
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file audit-trail.ts
|
|
3
|
+
* @description Immutable Audit Trail System for AeroJS.
|
|
4
|
+
*
|
|
5
|
+
* Hospital Architecture Section 38:
|
|
6
|
+
* "হাসপাতালের কোনো মেডিকেল ও ফিন্যান্সিয়াল ডাটা ডাটাবেস থেকে কখনো DELETE করা যাবে না।
|
|
7
|
+
* ভুল এন্ট্রি হলে তা STATUS = VOID বা CANCELLED হবে এবং রিভার্সাল এন্ট্রি পড়বে।"
|
|
8
|
+
*
|
|
9
|
+
* Stores: User ID, Table/Module, Record ID, Action, Old Value, New Value,
|
|
10
|
+
* IP Address, Timestamp, Cancellation Reason.
|
|
11
|
+
*/
|
|
12
|
+
export type AuditAction = 'CREATE' | 'UPDATE' | 'VOID' | 'APPROVE' | 'REJECT' | 'PRINT' | 'LOGIN' | 'LOGOUT' | 'LOCK' | 'RESTORE' | 'EXPORT';
|
|
13
|
+
export interface AuditLogEntry {
|
|
14
|
+
userId: string | number;
|
|
15
|
+
userRole?: string;
|
|
16
|
+
module: string;
|
|
17
|
+
tableName?: string;
|
|
18
|
+
recordId: string | number;
|
|
19
|
+
action: AuditAction;
|
|
20
|
+
oldValue?: Record<string, unknown> | null;
|
|
21
|
+
newValue?: Record<string, unknown> | null;
|
|
22
|
+
reason?: string;
|
|
23
|
+
ipAddress?: string;
|
|
24
|
+
userAgent?: string;
|
|
25
|
+
branchId?: string | number;
|
|
26
|
+
metadata?: Record<string, unknown>;
|
|
27
|
+
}
|
|
28
|
+
export interface AuditLogRecord extends AuditLogEntry {
|
|
29
|
+
id: number;
|
|
30
|
+
createdAt: Date;
|
|
31
|
+
}
|
|
32
|
+
export interface AuditDriver {
|
|
33
|
+
log(entry: AuditLogEntry): Promise<void>;
|
|
34
|
+
getHistory(tableName: string, recordId: string | number): Promise<AuditLogRecord[]>;
|
|
35
|
+
getUserActivity(userId: string | number, from?: Date, to?: Date): Promise<AuditLogRecord[]>;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Database-backed audit driver.
|
|
39
|
+
* Requires `audit_logs` table (see migration below).
|
|
40
|
+
*/
|
|
41
|
+
export declare class DatabaseAuditDriver implements AuditDriver {
|
|
42
|
+
private table;
|
|
43
|
+
constructor(table?: string);
|
|
44
|
+
log(entry: AuditLogEntry): Promise<void>;
|
|
45
|
+
getHistory(tableName: string, recordId: string | number): Promise<AuditLogRecord[]>;
|
|
46
|
+
getUserActivity(userId: string | number, from?: Date, to?: Date): Promise<AuditLogRecord[]>;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* In-memory audit driver (testing only).
|
|
50
|
+
*/
|
|
51
|
+
export declare class MemoryAuditDriver implements AuditDriver {
|
|
52
|
+
logs: (AuditLogEntry & {
|
|
53
|
+
id: number;
|
|
54
|
+
createdAt: Date;
|
|
55
|
+
})[];
|
|
56
|
+
private counter;
|
|
57
|
+
log(entry: AuditLogEntry): Promise<void>;
|
|
58
|
+
getHistory(tableName: string, recordId: string | number): Promise<AuditLogRecord[]>;
|
|
59
|
+
getUserActivity(userId: string | number): Promise<AuditLogRecord[]>;
|
|
60
|
+
}
|
|
61
|
+
export declare class AuditTrailManager {
|
|
62
|
+
private driver;
|
|
63
|
+
configure(driver: AuditDriver): this;
|
|
64
|
+
/**
|
|
65
|
+
* Log an audit event.
|
|
66
|
+
*
|
|
67
|
+
* @example
|
|
68
|
+
* await AuditTrail.log({
|
|
69
|
+
* userId: ctx.auth.user()!.id,
|
|
70
|
+
* module: 'billing',
|
|
71
|
+
* tableName: 'invoices',
|
|
72
|
+
* recordId: invoice.id,
|
|
73
|
+
* action: 'VOID',
|
|
74
|
+
* oldValue: { status: 'paid', amount: 5000 },
|
|
75
|
+
* newValue: { status: 'void', amount: 5000 },
|
|
76
|
+
* reason: 'Duplicate bill entry',
|
|
77
|
+
* ipAddress: ctx.req.ip,
|
|
78
|
+
* });
|
|
79
|
+
*/
|
|
80
|
+
log(entry: AuditLogEntry): Promise<void>;
|
|
81
|
+
/**
|
|
82
|
+
* Get full history of changes for a specific record.
|
|
83
|
+
* Hospital use: "Who changed this invoice? Show all modifications."
|
|
84
|
+
*/
|
|
85
|
+
getHistory(tableName: string, recordId: string | number): Promise<AuditLogRecord[]>;
|
|
86
|
+
/**
|
|
87
|
+
* Get all activity by a specific user in a time range.
|
|
88
|
+
* Hospital use: "What did cashier #42 do during the night shift?"
|
|
89
|
+
*/
|
|
90
|
+
getUserActivity(userId: string | number, from?: Date, to?: Date): Promise<AuditLogRecord[]>;
|
|
91
|
+
}
|
|
92
|
+
export declare const AuditTrail: AuditTrailManager;
|
|
93
|
+
/**
|
|
94
|
+
* Migration SQL for audit_logs table.
|
|
95
|
+
*
|
|
96
|
+
* @example
|
|
97
|
+
* // In database/migrations/YYYY_create_audit_logs_table.ts:
|
|
98
|
+
* await Schema.create('audit_logs', (table) => {
|
|
99
|
+
* table.increments('id');
|
|
100
|
+
* table.string('user_id', 50).notNull();
|
|
101
|
+
* table.string('user_role', 50).nullable();
|
|
102
|
+
* table.string('module', 100).notNull();
|
|
103
|
+
* table.string('table_name', 100).nullable();
|
|
104
|
+
* table.string('record_id', 100).notNull();
|
|
105
|
+
* table.string('action', 30).notNull(); // CREATE, UPDATE, VOID, APPROVE...
|
|
106
|
+
* table.text('old_value').nullable(); // JSON serialized
|
|
107
|
+
* table.text('new_value').nullable(); // JSON serialized
|
|
108
|
+
* table.text('reason').nullable();
|
|
109
|
+
* table.string('ip_address', 45).nullable();
|
|
110
|
+
* table.string('user_agent', 500).nullable();
|
|
111
|
+
* table.string('branch_id', 50).nullable();
|
|
112
|
+
* table.text('metadata').nullable(); // JSON serialized
|
|
113
|
+
* table.timestamp('created_at').notNull(); // IMMUTABLE — no updated_at
|
|
114
|
+
* });
|
|
115
|
+
*
|
|
116
|
+
* // Add indexes for fast lookups:
|
|
117
|
+
* // CREATE INDEX idx_audit_table_record ON audit_logs (table_name, record_id);
|
|
118
|
+
* // CREATE INDEX idx_audit_user ON audit_logs (user_id, created_at);
|
|
119
|
+
* // CREATE INDEX idx_audit_module ON audit_logs (module, created_at);
|
|
120
|
+
*/
|
|
121
|
+
export declare const AUDIT_LOGS_MIGRATION_HINT = "See JSDoc comment above for audit_logs table DDL";
|
|
122
|
+
//# sourceMappingURL=audit-trail.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-trail.d.ts","sourceRoot":"","sources":["../../src/audit/audit-trail.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file audit-trail.ts
|
|
3
|
+
* @description Immutable Audit Trail System for AeroJS.
|
|
4
|
+
*
|
|
5
|
+
* Hospital Architecture Section 38:
|
|
6
|
+
* "হাসপাতালের কোনো মেডিকেল ও ফিন্যান্সিয়াল ডাটা ডাটাবেস থেকে কখনো DELETE করা যাবে না।
|
|
7
|
+
* ভুল এন্ট্রি হলে তা STATUS = VOID বা CANCELLED হবে এবং রিভার্সাল এন্ট্রি পড়বে।"
|
|
8
|
+
*
|
|
9
|
+
* Stores: User ID, Table/Module, Record ID, Action, Old Value, New Value,
|
|
10
|
+
* IP Address, Timestamp, Cancellation Reason.
|
|
11
|
+
*/
|
|
12
|
+
import { DB } from '../database/connection.js';
|
|
13
|
+
/**
|
|
14
|
+
* Database-backed audit driver.
|
|
15
|
+
* Requires `audit_logs` table (see migration below).
|
|
16
|
+
*/
|
|
17
|
+
export class DatabaseAuditDriver {
|
|
18
|
+
table;
|
|
19
|
+
constructor(table = 'audit_logs') {
|
|
20
|
+
this.table = table;
|
|
21
|
+
}
|
|
22
|
+
async log(entry) {
|
|
23
|
+
await DB.table(this.table).insert({
|
|
24
|
+
user_id: entry.userId,
|
|
25
|
+
user_role: entry.userRole ?? null,
|
|
26
|
+
module: entry.module,
|
|
27
|
+
table_name: entry.tableName ?? null,
|
|
28
|
+
record_id: String(entry.recordId),
|
|
29
|
+
action: entry.action,
|
|
30
|
+
old_value: entry.oldValue ? JSON.stringify(entry.oldValue) : null,
|
|
31
|
+
new_value: entry.newValue ? JSON.stringify(entry.newValue) : null,
|
|
32
|
+
reason: entry.reason ?? null,
|
|
33
|
+
ip_address: entry.ipAddress ?? null,
|
|
34
|
+
user_agent: entry.userAgent ?? null,
|
|
35
|
+
branch_id: entry.branchId ?? null,
|
|
36
|
+
metadata: entry.metadata ? JSON.stringify(entry.metadata) : null,
|
|
37
|
+
created_at: new Date(),
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
async getHistory(tableName, recordId) {
|
|
41
|
+
return await DB.table(this.table)
|
|
42
|
+
.where('table_name', tableName)
|
|
43
|
+
.where('record_id', String(recordId))
|
|
44
|
+
.orderBy('created_at', 'DESC')
|
|
45
|
+
.get();
|
|
46
|
+
}
|
|
47
|
+
async getUserActivity(userId, from, to) {
|
|
48
|
+
let qb = DB.table(this.table).where('user_id', userId);
|
|
49
|
+
if (from)
|
|
50
|
+
qb = qb.where('created_at', '>=', from);
|
|
51
|
+
if (to)
|
|
52
|
+
qb = qb.where('created_at', '<=', to);
|
|
53
|
+
return await qb.orderBy('created_at', 'DESC').get();
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* In-memory audit driver (testing only).
|
|
58
|
+
*/
|
|
59
|
+
export class MemoryAuditDriver {
|
|
60
|
+
logs = [];
|
|
61
|
+
counter = 0;
|
|
62
|
+
async log(entry) {
|
|
63
|
+
this.logs.push({ ...entry, id: ++this.counter, createdAt: new Date() });
|
|
64
|
+
}
|
|
65
|
+
async getHistory(tableName, recordId) {
|
|
66
|
+
return this.logs
|
|
67
|
+
.filter((l) => l.tableName === tableName && String(l.recordId) === String(recordId))
|
|
68
|
+
.reverse();
|
|
69
|
+
}
|
|
70
|
+
async getUserActivity(userId) {
|
|
71
|
+
return this.logs
|
|
72
|
+
.filter((l) => String(l.userId) === String(userId))
|
|
73
|
+
.reverse();
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// ─── AuditTrail Facade ────────────────────────────────────────────────────────
|
|
77
|
+
export class AuditTrailManager {
|
|
78
|
+
driver = new MemoryAuditDriver();
|
|
79
|
+
configure(driver) {
|
|
80
|
+
this.driver = driver;
|
|
81
|
+
return this;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Log an audit event.
|
|
85
|
+
*
|
|
86
|
+
* @example
|
|
87
|
+
* await AuditTrail.log({
|
|
88
|
+
* userId: ctx.auth.user()!.id,
|
|
89
|
+
* module: 'billing',
|
|
90
|
+
* tableName: 'invoices',
|
|
91
|
+
* recordId: invoice.id,
|
|
92
|
+
* action: 'VOID',
|
|
93
|
+
* oldValue: { status: 'paid', amount: 5000 },
|
|
94
|
+
* newValue: { status: 'void', amount: 5000 },
|
|
95
|
+
* reason: 'Duplicate bill entry',
|
|
96
|
+
* ipAddress: ctx.req.ip,
|
|
97
|
+
* });
|
|
98
|
+
*/
|
|
99
|
+
async log(entry) {
|
|
100
|
+
try {
|
|
101
|
+
await this.driver.log(entry);
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
// Audit failures should NEVER crash the application
|
|
105
|
+
console.error('[AeroJS AuditTrail] Failed to write audit log:', err);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Get full history of changes for a specific record.
|
|
110
|
+
* Hospital use: "Who changed this invoice? Show all modifications."
|
|
111
|
+
*/
|
|
112
|
+
async getHistory(tableName, recordId) {
|
|
113
|
+
return await this.driver.getHistory(tableName, recordId);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Get all activity by a specific user in a time range.
|
|
117
|
+
* Hospital use: "What did cashier #42 do during the night shift?"
|
|
118
|
+
*/
|
|
119
|
+
async getUserActivity(userId, from, to) {
|
|
120
|
+
return await this.driver.getUserActivity(userId, from, to);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
export const AuditTrail = new AuditTrailManager();
|
|
124
|
+
// ─── Auditable Model Mixin ────────────────────────────────────────────────────
|
|
125
|
+
/**
|
|
126
|
+
* Migration SQL for audit_logs table.
|
|
127
|
+
*
|
|
128
|
+
* @example
|
|
129
|
+
* // In database/migrations/YYYY_create_audit_logs_table.ts:
|
|
130
|
+
* await Schema.create('audit_logs', (table) => {
|
|
131
|
+
* table.increments('id');
|
|
132
|
+
* table.string('user_id', 50).notNull();
|
|
133
|
+
* table.string('user_role', 50).nullable();
|
|
134
|
+
* table.string('module', 100).notNull();
|
|
135
|
+
* table.string('table_name', 100).nullable();
|
|
136
|
+
* table.string('record_id', 100).notNull();
|
|
137
|
+
* table.string('action', 30).notNull(); // CREATE, UPDATE, VOID, APPROVE...
|
|
138
|
+
* table.text('old_value').nullable(); // JSON serialized
|
|
139
|
+
* table.text('new_value').nullable(); // JSON serialized
|
|
140
|
+
* table.text('reason').nullable();
|
|
141
|
+
* table.string('ip_address', 45).nullable();
|
|
142
|
+
* table.string('user_agent', 500).nullable();
|
|
143
|
+
* table.string('branch_id', 50).nullable();
|
|
144
|
+
* table.text('metadata').nullable(); // JSON serialized
|
|
145
|
+
* table.timestamp('created_at').notNull(); // IMMUTABLE — no updated_at
|
|
146
|
+
* });
|
|
147
|
+
*
|
|
148
|
+
* // Add indexes for fast lookups:
|
|
149
|
+
* // CREATE INDEX idx_audit_table_record ON audit_logs (table_name, record_id);
|
|
150
|
+
* // CREATE INDEX idx_audit_user ON audit_logs (user_id, created_at);
|
|
151
|
+
* // CREATE INDEX idx_audit_module ON audit_logs (module, created_at);
|
|
152
|
+
*/
|
|
153
|
+
export const AUDIT_LOGS_MIGRATION_HINT = 'See JSDoc comment above for audit_logs table DDL';
|
|
154
|
+
//# sourceMappingURL=audit-trail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-trail.js","sourceRoot":"","sources":["../../src/audit/audit-trail.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file auth-manager.ts
|
|
3
|
+
* @description Central Auth Manager for AeroJS.
|
|
4
|
+
* Manages multiple named guards (session, jwt, api) and exposes ctx.auth.use('guard').
|
|
5
|
+
* Hospital use: ctx.auth.use('session') for cashiers, ctx.auth.use('jwt') for doctors.
|
|
6
|
+
*/
|
|
7
|
+
import type { AeroContext } from '../core/context.js';
|
|
8
|
+
import type { AuthUser } from './guards/guard.js';
|
|
9
|
+
import { type SessionGuardConfig } from './guards/session-guard.js';
|
|
10
|
+
import { type JwtGuardConfig } from './guards/jwt-guard.js';
|
|
11
|
+
import { type ApiTokenGuardConfig } from './guards/api-token-guard.js';
|
|
12
|
+
import type { SessionManager } from '../session/session-manager.js';
|
|
13
|
+
import type { Middleware } from '../core/types.js';
|
|
14
|
+
export type GuardDriverName = 'session' | 'jwt' | 'api';
|
|
15
|
+
export type GuardDriverConfig = {
|
|
16
|
+
driver: 'session';
|
|
17
|
+
config: SessionGuardConfig;
|
|
18
|
+
} | {
|
|
19
|
+
driver: 'jwt';
|
|
20
|
+
config: JwtGuardConfig;
|
|
21
|
+
} | {
|
|
22
|
+
driver: 'api';
|
|
23
|
+
config: ApiTokenGuardConfig;
|
|
24
|
+
};
|
|
25
|
+
export interface AuthConfig {
|
|
26
|
+
/**
|
|
27
|
+
* Default guard to use when calling ctx.auth.use() with no arguments.
|
|
28
|
+
*/
|
|
29
|
+
default?: string;
|
|
30
|
+
/**
|
|
31
|
+
* Named guard definitions.
|
|
32
|
+
*/
|
|
33
|
+
guards: Record<string, GuardDriverConfig>;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Per-request Auth Manager — attached to ctx.auth by authPlugin.
|
|
37
|
+
*/
|
|
38
|
+
export declare class Auth {
|
|
39
|
+
private guards;
|
|
40
|
+
private defaultGuardName;
|
|
41
|
+
private config;
|
|
42
|
+
private ctx;
|
|
43
|
+
private sessionManager?;
|
|
44
|
+
constructor(ctx: AeroContext, config: AuthConfig, sessionManager?: SessionManager);
|
|
45
|
+
/**
|
|
46
|
+
* Returns the named guard instance (or default if name is omitted).
|
|
47
|
+
* Guards are lazily instantiated per request.
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* // Cashier session auth
|
|
51
|
+
* await ctx.auth.use('session').authenticate();
|
|
52
|
+
*
|
|
53
|
+
* // Doctor JWT auth
|
|
54
|
+
* const user = await ctx.auth.use('jwt').authenticate();
|
|
55
|
+
*/
|
|
56
|
+
use(name?: string): any;
|
|
57
|
+
/**
|
|
58
|
+
* Returns the authenticated user from the default guard, or null.
|
|
59
|
+
*/
|
|
60
|
+
user(): AuthUser | null;
|
|
61
|
+
/**
|
|
62
|
+
* Checks if the current user is authenticated on the default guard.
|
|
63
|
+
*/
|
|
64
|
+
check(): boolean;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Global Auth Manager — stores config for the application lifetime.
|
|
68
|
+
*/
|
|
69
|
+
export declare class AuthManager {
|
|
70
|
+
private config;
|
|
71
|
+
configure(config: AuthConfig): this;
|
|
72
|
+
/**
|
|
73
|
+
* Creates a per-request Auth instance bound to the given context.
|
|
74
|
+
*/
|
|
75
|
+
forContext(ctx: AeroContext, sessionManager?: SessionManager): Auth;
|
|
76
|
+
}
|
|
77
|
+
export declare const authManager: AuthManager;
|
|
78
|
+
/**
|
|
79
|
+
* Middleware factory that attaches ctx.auth to every request.
|
|
80
|
+
* Must be registered early in the middleware chain.
|
|
81
|
+
*
|
|
82
|
+
* @example
|
|
83
|
+
* app.use(authPlugin(authManager, sessionManager));
|
|
84
|
+
*/
|
|
85
|
+
export declare function authPlugin(manager: AuthManager, sessionManager?: SessionManager): Middleware;
|
|
86
|
+
/**
|
|
87
|
+
* Route-level middleware factory — protects a route for a specific guard.
|
|
88
|
+
* Throws UnauthorizedError if not authenticated.
|
|
89
|
+
*
|
|
90
|
+
* @example
|
|
91
|
+
* router.get('/cashier/dashboard', handler).middleware(auth('session'));
|
|
92
|
+
* router.get('/api/doctor/patients', handler).middleware(auth('jwt'));
|
|
93
|
+
*/
|
|
94
|
+
export declare function auth(guardName?: string): Middleware;
|
|
95
|
+
//# sourceMappingURL=auth-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-manager.d.ts","sourceRoot":"","sources":["../../src/auth/auth-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAiB,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAgB,KAAK,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAClF,OAAO,EAAY,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAiB,KAAK,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACtF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGnD,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,KAAK,GAAG,KAAK,CAAC;AAExD,MAAM,MAAM,iBAAiB,GACzB;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,kBAAkB,CAAA;CAAE,GACjD;IAAE,MAAM,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,cAAc,CAAA;CAAE,GACzC;IAAE,MAAM,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,mBAAmB,CAAA;CAAE,CAAC;AAEnD,MAAM,WAAW,UAAU;IACzB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;CAC3C;AAED;;GAEG;AACH,qBAAa,IAAI;IACf,OAAO,CAAC,MAAM,CAAoC;IAClD,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,GAAG,CAAc;IACzB,OAAO,CAAC,cAAc,CAAC,CAAiB;gBAE5B,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,cAAc,CAAC,EAAE,cAAc;IAOjF;;;;;;;;;;OAUG;IACI,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,GAAG;IAuC9B;;OAEG;IACI,IAAI,IAAI,QAAQ,GAAG,IAAI;IAI9B;;OAEG;IACI,KAAK,IAAI,OAAO;CAGxB;AAED;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAA8B;IAErC,SAAS,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAK1C;;OAEG;IACI,UAAU,CAAC,GAAG,EAAE,WAAW,EAAE,cAAc,CAAC,EAAE,cAAc,GAAG,IAAI;CAG3E;AAED,eAAO,MAAM,WAAW,aAAoB,CAAC;AAE7C;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,cAAc,CAAC,EAAE,cAAc,GAAG,UAAU,CAK5F;AAED;;;;;;;GAOG;AACH,wBAAgB,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,UAAU,CAQnD"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file auth-manager.ts
|
|
3
|
+
* @description Central Auth Manager for AeroJS.
|
|
4
|
+
* Manages multiple named guards (session, jwt, api) and exposes ctx.auth.use('guard').
|
|
5
|
+
* Hospital use: ctx.auth.use('session') for cashiers, ctx.auth.use('jwt') for doctors.
|
|
6
|
+
*/
|
|
7
|
+
import { SessionGuard } from './guards/session-guard.js';
|
|
8
|
+
import { JwtGuard } from './guards/jwt-guard.js';
|
|
9
|
+
import { ApiTokenGuard } from './guards/api-token-guard.js';
|
|
10
|
+
import { UnauthorizedError, ForbiddenError } from '../core/errors.js';
|
|
11
|
+
/**
|
|
12
|
+
* Per-request Auth Manager — attached to ctx.auth by authPlugin.
|
|
13
|
+
*/
|
|
14
|
+
export class Auth {
|
|
15
|
+
guards = new Map();
|
|
16
|
+
defaultGuardName;
|
|
17
|
+
config;
|
|
18
|
+
ctx;
|
|
19
|
+
sessionManager;
|
|
20
|
+
constructor(ctx, config, sessionManager) {
|
|
21
|
+
this.ctx = ctx;
|
|
22
|
+
this.config = config;
|
|
23
|
+
this.defaultGuardName = config.default ?? Object.keys(config.guards)[0] ?? 'session';
|
|
24
|
+
this.sessionManager = sessionManager;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Returns the named guard instance (or default if name is omitted).
|
|
28
|
+
* Guards are lazily instantiated per request.
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* // Cashier session auth
|
|
32
|
+
* await ctx.auth.use('session').authenticate();
|
|
33
|
+
*
|
|
34
|
+
* // Doctor JWT auth
|
|
35
|
+
* const user = await ctx.auth.use('jwt').authenticate();
|
|
36
|
+
*/
|
|
37
|
+
use(name) {
|
|
38
|
+
const guardName = name ?? this.defaultGuardName;
|
|
39
|
+
if (this.guards.has(guardName)) {
|
|
40
|
+
return this.guards.get(guardName);
|
|
41
|
+
}
|
|
42
|
+
const guardDef = this.config.guards[guardName];
|
|
43
|
+
if (!guardDef) {
|
|
44
|
+
throw new Error(`[AeroJS Auth] Guard "${guardName}" is not configured.`);
|
|
45
|
+
}
|
|
46
|
+
let guard;
|
|
47
|
+
switch (guardDef.driver) {
|
|
48
|
+
case 'session': {
|
|
49
|
+
if (!this.sessionManager) {
|
|
50
|
+
throw new Error('[AeroJS Auth] Session guard requires a SessionManager. Did you call app.useSession()?');
|
|
51
|
+
}
|
|
52
|
+
guard = new SessionGuard(this.ctx, this.sessionManager, guardDef.config);
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
case 'jwt': {
|
|
56
|
+
guard = new JwtGuard(this.ctx, guardDef.config);
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
case 'api': {
|
|
60
|
+
guard = new ApiTokenGuard(this.ctx, guardDef.config);
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
default: {
|
|
64
|
+
throw new Error(`[AeroJS Auth] Unknown guard driver: ${guardDef.driver}`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
this.guards.set(guardName, guard);
|
|
68
|
+
return guard;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Returns the authenticated user from the default guard, or null.
|
|
72
|
+
*/
|
|
73
|
+
user() {
|
|
74
|
+
return this.use().user();
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Checks if the current user is authenticated on the default guard.
|
|
78
|
+
*/
|
|
79
|
+
check() {
|
|
80
|
+
return this.use().check();
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Global Auth Manager — stores config for the application lifetime.
|
|
85
|
+
*/
|
|
86
|
+
export class AuthManager {
|
|
87
|
+
config = { guards: {} };
|
|
88
|
+
configure(config) {
|
|
89
|
+
this.config = config;
|
|
90
|
+
return this;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Creates a per-request Auth instance bound to the given context.
|
|
94
|
+
*/
|
|
95
|
+
forContext(ctx, sessionManager) {
|
|
96
|
+
return new Auth(ctx, this.config, sessionManager);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
export const authManager = new AuthManager();
|
|
100
|
+
/**
|
|
101
|
+
* Middleware factory that attaches ctx.auth to every request.
|
|
102
|
+
* Must be registered early in the middleware chain.
|
|
103
|
+
*
|
|
104
|
+
* @example
|
|
105
|
+
* app.use(authPlugin(authManager, sessionManager));
|
|
106
|
+
*/
|
|
107
|
+
export function authPlugin(manager, sessionManager) {
|
|
108
|
+
return async (ctx, next) => {
|
|
109
|
+
ctx.auth = manager.forContext(ctx, sessionManager);
|
|
110
|
+
await next();
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Route-level middleware factory — protects a route for a specific guard.
|
|
115
|
+
* Throws UnauthorizedError if not authenticated.
|
|
116
|
+
*
|
|
117
|
+
* @example
|
|
118
|
+
* router.get('/cashier/dashboard', handler).middleware(auth('session'));
|
|
119
|
+
* router.get('/api/doctor/patients', handler).middleware(auth('jwt'));
|
|
120
|
+
*/
|
|
121
|
+
export function auth(guardName) {
|
|
122
|
+
return async (ctx, next) => {
|
|
123
|
+
const authCtx = ctx.auth;
|
|
124
|
+
if (!authCtx)
|
|
125
|
+
throw new Error('[AeroJS Auth] authPlugin middleware is not mounted. Add app.use(authPlugin(...))');
|
|
126
|
+
await authCtx.use(guardName).authenticate();
|
|
127
|
+
await next();
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=auth-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-manager.js","sourceRoot":"","sources":["../../src/auth/auth-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file bouncer.ts
|
|
3
|
+
* @description RBAC Authorization Engine (Bouncer Pattern) for AeroJS.
|
|
4
|
+
*
|
|
5
|
+
* Supports:
|
|
6
|
+
* - Role-based checks: ctx.bouncer.is('admin')
|
|
7
|
+
* - Ability checks: ctx.bouncer.can('billing:approve-discount')
|
|
8
|
+
* - Policy-based authorization: ctx.bouncer.authorize(DiscountPolicy, 'approve', discount)
|
|
9
|
+
* - Data-scoped checks: enforcing branch-level data isolation
|
|
10
|
+
*
|
|
11
|
+
* Hospital use:
|
|
12
|
+
* - Section 22: Discount approval matrix (cashier 0%, supervisor 5%, MS 15%, CEO any)
|
|
13
|
+
* - Section 37: Maker-Checker dual control for refunds, POs, supplier payments
|
|
14
|
+
* - Section 25: Branch-scoped data access (operator sees only own branch)
|
|
15
|
+
*/
|
|
16
|
+
import type { AuthUser } from '../auth/guards/guard.js';
|
|
17
|
+
import type { Middleware } from '../core/types.js';
|
|
18
|
+
export interface PolicyContract {
|
|
19
|
+
[action: string]: (user: AuthUser, ...args: any[]) => Promise<boolean> | boolean;
|
|
20
|
+
}
|
|
21
|
+
export type PolicyConstructor = new () => PolicyContract;
|
|
22
|
+
export interface PermissionStore {
|
|
23
|
+
/**
|
|
24
|
+
* Returns all roles for a given user ID.
|
|
25
|
+
* Example: ['cashier', 'ipd_operator']
|
|
26
|
+
*/
|
|
27
|
+
getRoles(userId: string | number): Promise<string[]>;
|
|
28
|
+
/**
|
|
29
|
+
* Returns all permission strings for a given user ID.
|
|
30
|
+
* Example: ['billing:view', 'billing:create', 'discount:approve:5']
|
|
31
|
+
*/
|
|
32
|
+
getPermissions(userId: string | number): Promise<string[]>;
|
|
33
|
+
}
|
|
34
|
+
export declare class Bouncer {
|
|
35
|
+
private user;
|
|
36
|
+
private _roles;
|
|
37
|
+
private _permissions;
|
|
38
|
+
private store?;
|
|
39
|
+
private policies;
|
|
40
|
+
constructor(user: AuthUser | null, store?: PermissionStore);
|
|
41
|
+
/**
|
|
42
|
+
* Lazily loads roles from the permission store.
|
|
43
|
+
*/
|
|
44
|
+
private loadRoles;
|
|
45
|
+
/**
|
|
46
|
+
* Lazily loads permissions from the permission store.
|
|
47
|
+
*/
|
|
48
|
+
private loadPermissions;
|
|
49
|
+
/**
|
|
50
|
+
* Check if the authenticated user has a specific role.
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* if (await ctx.bouncer.is('supervisor')) { ... }
|
|
54
|
+
*/
|
|
55
|
+
is(role: string): Promise<boolean>;
|
|
56
|
+
/**
|
|
57
|
+
* Check if the user has any of the given roles.
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* if (await ctx.bouncer.isAny(['ms', 'director', 'ceo'])) { ... }
|
|
61
|
+
*/
|
|
62
|
+
isAny(roles: string[]): Promise<boolean>;
|
|
63
|
+
/**
|
|
64
|
+
* Check if the user has a specific permission.
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* if (await ctx.bouncer.can('billing:refund')) { ... }
|
|
68
|
+
*/
|
|
69
|
+
can(permission: string): Promise<boolean>;
|
|
70
|
+
/**
|
|
71
|
+
* Check if the user CANNOT perform an action.
|
|
72
|
+
*/
|
|
73
|
+
cannot(permission: string): Promise<boolean>;
|
|
74
|
+
/**
|
|
75
|
+
* Hospital-specific: Check discount approval authority.
|
|
76
|
+
*
|
|
77
|
+
* Rules (Section 22):
|
|
78
|
+
* cashier → 0%
|
|
79
|
+
* supervisor → up to 5%
|
|
80
|
+
* ms → up to 15%
|
|
81
|
+
* director/ceo → unlimited
|
|
82
|
+
*
|
|
83
|
+
* @example
|
|
84
|
+
* if (!await ctx.bouncer.canApproveDiscount(12.5)) {
|
|
85
|
+
* ctx.throw(403, 'Discount exceeds your authority');
|
|
86
|
+
* }
|
|
87
|
+
*/
|
|
88
|
+
canApproveDiscount(percent: number): Promise<boolean>;
|
|
89
|
+
/**
|
|
90
|
+
* Hospital-specific: Check if user belongs to a specific branch.
|
|
91
|
+
* Enforces Section 25 — branch data scoping.
|
|
92
|
+
*
|
|
93
|
+
* @example
|
|
94
|
+
* await ctx.bouncer.assertBranch(patient.branchId);
|
|
95
|
+
*/
|
|
96
|
+
assertBranch(resourceBranchId: string | number): Promise<void>;
|
|
97
|
+
/**
|
|
98
|
+
* Policy-based authorization.
|
|
99
|
+
* Instantiates the policy class and calls the named action method.
|
|
100
|
+
*
|
|
101
|
+
* @example
|
|
102
|
+
* await ctx.bouncer.authorize(DiscountPolicy, 'approve', discount);
|
|
103
|
+
* await ctx.bouncer.authorize(RefundPolicy, 'check', invoice);
|
|
104
|
+
*/
|
|
105
|
+
authorize(PolicyClass: PolicyConstructor, action: string, ...args: any[]): Promise<void>;
|
|
106
|
+
/**
|
|
107
|
+
* Throws ForbiddenError if the user does NOT have the given role.
|
|
108
|
+
*/
|
|
109
|
+
assertIs(role: string): Promise<void>;
|
|
110
|
+
/**
|
|
111
|
+
* Throws ForbiddenError if the user does NOT have the given permission.
|
|
112
|
+
*/
|
|
113
|
+
assertCan(permission: string): Promise<void>;
|
|
114
|
+
}
|
|
115
|
+
export declare class BouncerManager {
|
|
116
|
+
private store?;
|
|
117
|
+
configure(store: PermissionStore): this;
|
|
118
|
+
forUser(user: AuthUser | null): Bouncer;
|
|
119
|
+
}
|
|
120
|
+
export declare const bouncerManager: BouncerManager;
|
|
121
|
+
/**
|
|
122
|
+
* Middleware that attaches ctx.bouncer to every request.
|
|
123
|
+
* Should be placed AFTER authPlugin so ctx.auth is available.
|
|
124
|
+
*
|
|
125
|
+
* @example
|
|
126
|
+
* app.use(bouncerPlugin(bouncerManager));
|
|
127
|
+
*/
|
|
128
|
+
export declare function bouncerPlugin(manager: BouncerManager): Middleware;
|
|
129
|
+
/**
|
|
130
|
+
* Route-level middleware to require a specific role.
|
|
131
|
+
*
|
|
132
|
+
* @example
|
|
133
|
+
* router.delete('/invoices/:id', handler).middleware(requireRole('supervisor'));
|
|
134
|
+
*/
|
|
135
|
+
export declare function requireRole(...roles: string[]): Middleware;
|
|
136
|
+
/**
|
|
137
|
+
* Route-level middleware to require a specific permission.
|
|
138
|
+
*
|
|
139
|
+
* @example
|
|
140
|
+
* router.post('/billing/refund', handler).middleware(requirePermission('billing:refund'));
|
|
141
|
+
*/
|
|
142
|
+
export declare function requirePermission(permission: string): Middleware;
|
|
143
|
+
//# sourceMappingURL=bouncer.d.ts.map
|