From 8a278281ceed0977ce0641b17585cc51c7045c3b Mon Sep 17 00:00:00 2001 From: Rayyan Syahbani Hermanto <60314224+RayyanHermanto@users.noreply.github.com> Date: Mon, 7 Sep 2026 23:44:40 +0700 Subject: [PATCH] Fix Build Error --- dist/app.module.js | 36 +++ dist/app.module.js.map | 2 +- dist/core/auth/guards/jwt-auth.guard.js | 110 +++++++- dist/core/auth/guards/jwt-auth.guard.js.map | 2 +- dist/main.js | 36 ++- dist/main.js.map | 2 +- .../presentation/guards/permission.guard.js | 12 +- .../guards/permission.guard.js.map | 2 +- .../handlers/create-user.handler.js | 61 +---- .../handlers/create-user.handler.js.map | 2 +- .../handlers/update-user.handler.js | 66 +---- .../handlers/update-user.handler.js.map | 2 +- .../identity/domain/entities/user.entity.js | 78 +++++- .../domain/entities/user.entity.js.map | 2 +- .../domain/events/user-created.event.js | 5 +- .../domain/events/user-created.event.js.map | 2 +- dist/modules/identity/identity.module.js | 18 +- dist/modules/identity/identity.module.js.map | 2 +- .../mappers/prisma-user.mapper.js | 64 ++++- .../mappers/prisma-user.mapper.js.map | 2 +- .../repositories/prisma-user.repository.js | 111 +++++--- .../prisma-user.repository.js.map | 2 +- .../controllers/users.controller.js | 16 +- .../controllers/users.controller.js.map | 2 +- .../presentation/dto/create-user.dto.js | 28 +- .../presentation/dto/create-user.dto.js.map | 2 +- .../presentation/dto/update-user.dto.js | 23 +- .../presentation/dto/update-user.dto.js.map | 2 +- package-lock.json | 1 - prisma/schema.prisma | 250 +++++++++++++++++- .../handlers/create-user.handler.ts | 39 +-- .../handlers/update-user.handler.ts | 56 +--- .../identity/domain/entities/user.entity.ts | 121 +++++++++ src/modules/identity/identity.module.ts | 16 +- .../mappers/prisma-user.mapper.ts | 26 +- .../repositories/prisma-user.repository.ts | 138 ++++++---- .../controllers/users.controller.ts | 12 +- src/types/custom.d.ts | 3 + 38 files changed, 927 insertions(+), 427 deletions(-) create mode 100644 src/types/custom.d.ts diff --git a/dist/app.module.js b/dist/app.module.js index 758d604..1f939a8 100644 --- a/dist/app.module.js +++ b/dist/app.module.js @@ -10,6 +10,12 @@ exports.AppModule = void 0; const common_1 = require("@nestjs/common"); const config_1 = require("@nestjs/config"); const identity_module_1 = require("./modules/identity/identity.module"); +const auth_module_1 = require("./modules/auth/auth.module"); +const health_module_1 = require("./modules/health/health.module"); +const authorization_module_1 = require("./modules/authorization/authorization.module"); +const audit_module_1 = require("./modules/audit/audit.module"); +const application_module_1 = require("./modules/application/application.module"); +const debt_module_1 = require("./modules/bot-debt/debt.module"); let AppModule = class AppModule { }; exports.AppModule = AppModule; @@ -18,8 +24,38 @@ exports.AppModule = AppModule = __decorate([ imports: [ config_1.ConfigModule.forRoot({ isGlobal: true, + // Load .env files depending on NODE_ENV. Default to development .env + envFilePath: process.env.NODE_ENV === 'production' ? '.env.production' : '.env', + // Basic validation: ensure expected frontend URLs and OIDC settings are present + validate: (env) => { + const errors = []; + const nodeEnv = env.NODE_ENV || process.env.NODE_ENV || 'development'; + if (!env.FRONTEND_URL) + errors.push('FRONTEND_URL is not set'); + if (nodeEnv === 'production' && !env.PRODUCTION_FRONTEND_URL) + errors.push('PRODUCTION_FRONTEND_URL is not set'); + // OIDC required settings + if (!env.AUTHENTIK_ISSUER) + errors.push('AUTHENTIK_ISSUER is not set'); + if (!env.AUTHENTIK_CLIENT_ID) + errors.push('AUTHENTIK_CLIENT_ID is not set'); + if (!env.AUTHENTIK_CLIENT_SECRET) + errors.push('AUTHENTIK_CLIENT_SECRET is not set'); + if (!env.AUTHENTIK_REDIRECT_URI) + errors.push('AUTHENTIK_REDIRECT_URI is not set'); + if (errors.length > 0) + throw new Error('Environment validation error: ' + errors.join('; ')); + return env; + }, }), identity_module_1.IdentityModule, + auth_module_1.AuthModule, + health_module_1.HealthModule, + // Authorization module provides permission checks and cache + authorization_module_1.AuthorizationModule, + audit_module_1.AuditModule, + application_module_1.ApplicationModule, + debt_module_1.DebtModule, ], }) ], AppModule); diff --git a/dist/app.module.js.map b/dist/app.module.js.map index fe24986..30049ef 100644 --- a/dist/app.module.js.map +++ b/dist/app.module.js.map @@ -1 +1 @@ -{"version":3,"file":"app.module.js","sourceRoot":"","sources":["../src/app.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,2CAA8C;AAE9C,wEAAoE;AAW7D,IAAM,SAAS,GAAf,MAAM,SAAS;CAAG,CAAA;AAAZ,8BAAS;oBAAT,SAAS;IATrB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,qBAAY,CAAC,OAAO,CAAC;gBACnB,QAAQ,EAAE,IAAI;aACf,CAAC;YAEF,gCAAc;SACf;KACF,CAAC;GACW,SAAS,CAAG"} \ No newline at end of file +{"version":3,"file":"app.module.js","sourceRoot":"","sources":["../src/app.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,2CAA8C;AAE9C,wEAAoE;AACpE,4DAAwD;AACxD,kEAA8D;AAC9D,uFAAmF;AACnF,+DAA2D;AAC3D,iFAA6E;AAC7E,gEAA4D;AAwCrD,IAAM,SAAS,GAAf,MAAM,SAAS;CAAG,CAAA;AAAZ,8BAAS;oBAAT,SAAS;IArCrB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,qBAAY,CAAC,OAAO,CAAC;gBAEf,QAAQ,EAAE,IAAI;gBACd,qEAAqE;gBACrE,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,MAAM;gBAC/E,gFAAgF;gBAChF,QAAQ,EAAE,CAAC,GAAwB,EAAE,EAAE;oBACrC,MAAM,MAAM,GAAa,EAAE,CAAC;oBAC5B,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,aAAa,CAAC;oBAEtE,IAAI,CAAC,GAAG,CAAC,YAAY;wBAAE,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;oBAC9D,IAAI,OAAO,KAAK,YAAY,IAAI,CAAC,GAAG,CAAC,uBAAuB;wBAAE,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;oBAEhH,yBAAyB;oBACzB,IAAI,CAAC,GAAG,CAAC,gBAAgB;wBAAE,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;oBACtE,IAAI,CAAC,GAAG,CAAC,mBAAmB;wBAAE,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;oBAC5E,IAAI,CAAC,GAAG,CAAC,uBAAuB;wBAAE,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;oBACpF,IAAI,CAAC,GAAG,CAAC,sBAAsB;wBAAE,MAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;oBAElF,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;wBAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;oBAC7F,OAAO,GAAG,CAAC;gBACb,CAAC;aACF,CAAC;YAEF,gCAAc;YACd,wBAAU;YACV,4BAAY;YACZ,4DAA4D;YACpD,0CAAmB;YACnB,0BAAW;YACX,sCAAiB;YACjB,wBAAU;SAEvB;KACF,CAAC;GACW,SAAS,CAAG"} \ No newline at end of file diff --git a/dist/core/auth/guards/jwt-auth.guard.js b/dist/core/auth/guards/jwt-auth.guard.js index 4311bb8..611c2cc 100644 --- a/dist/core/auth/guards/jwt-auth.guard.js +++ b/dist/core/auth/guards/jwt-auth.guard.js @@ -1,38 +1,120 @@ "use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.JwtAuthGuard = void 0; const common_1 = require("@nestjs/common"); -const jwt_1 = require("@nestjs/jwt"); +const jose_1 = require("jose"); +const identity_data_1 = require("../interfaces/identity-data"); +const jwt = __importStar(require("jsonwebtoken")); +/** + * JwtAuthGuard verifies JWTs issued by the external Identity Provider (Authentik) + * using JWKS (RS256). It also accepts internal RayLab JWTs signed with a local secret. + */ let JwtAuthGuard = class JwtAuthGuard { - jwtService; - constructor(jwtService) { - this.jwtService = jwtService; - } + jwks = null; + logger = new common_1.Logger('JwtAuthGuard'); + constructor() { } async canActivate(context) { const request = context.switchToHttp().getRequest(); + let token; const authHeader = request.headers.authorization; - if (!authHeader) { - throw new common_1.UnauthorizedException('Authorization header is missing.'); + if (authHeader) { + const [type, t] = authHeader.split(' '); + if (type === 'Bearer' && t) + token = t; } - const [type, token] = authHeader.split(' '); - if (type !== 'Bearer' || !token) { - throw new common_1.UnauthorizedException('Invalid authorization header.'); + // fallback to cookie if no Authorization header + if (!token) { + token = request.cookies?.raylab_jwt; + this.logger.debug(`No Authorization header. Trying cookie. cookiePresent=${!!request.cookies} tokenFromCookie=${!!token}`); + } + else { + this.logger.debug('Authorization header found. Using Bearer token.'); + } + if (!token) { + this.logger.debug('No token found in Authorization header or cookie.'); + throw new common_1.UnauthorizedException('Authorization token is missing.'); + } + const jwksUri = process.env.AUTHENTIK_JWKS_URI; + // First try verifying with external JWKS (Authentik) + if (jwksUri) { + try { + if (!this.jwks) + this.jwks = (0, jose_1.createRemoteJWKSet)(new URL(jwksUri)); + const { payload } = await (0, jose_1.jwtVerify)(token, this.jwks, { + issuer: process.env.AUTHENTIK_ISSUER, + audience: process.env.AUTHENTIK_AUDIENCE, + }); + const identity = new identity_data_1.IdentityData(payload.sub, payload.preferred_username, payload.email, payload); + request.identity = identity; + // mark as external (verified by Authentik JWKS) + request.identitySource = 'external'; + this.logger.debug(`Verified token using external JWKS. sub=${payload.sub}`); + return true; + } + catch (err) { + this.logger.debug(`External JWKS verification failed: ${err.message}`); + // ignore and try internal verification + } + } + // Fallback: verify with internal symmetric secret + const secret = process.env.RAYLAB_JWT_SECRET; + if (!secret) { + this.logger.error('RAYLAB_JWT_SECRET is not configured.'); + throw new common_1.UnauthorizedException('Invalid or expired token.'); } try { - const payload = await this.jwtService.verifyAsync(token); - request['user'] = payload; + const payload = jwt.verify(token, secret); + const identity = new identity_data_1.IdentityData(payload.sub, payload.preferred_username, payload.email, payload); + request.identity = identity; + // mark as internal (verified by RayLab internal secret) + request.identitySource = 'internal'; + this.logger.debug(`Verified token using internal secret. sub=${payload.sub}`); return true; } - catch { + catch (err) { + this.logger.debug(`Internal token verification failed: ${err.message}`); throw new common_1.UnauthorizedException('Invalid or expired token.'); } } @@ -40,6 +122,6 @@ let JwtAuthGuard = class JwtAuthGuard { exports.JwtAuthGuard = JwtAuthGuard; exports.JwtAuthGuard = JwtAuthGuard = __decorate([ (0, common_1.Injectable)(), - __metadata("design:paramtypes", [jwt_1.JwtService]) + __metadata("design:paramtypes", []) ], JwtAuthGuard); //# sourceMappingURL=jwt-auth.guard.js.map \ No newline at end of file diff --git a/dist/core/auth/guards/jwt-auth.guard.js.map b/dist/core/auth/guards/jwt-auth.guard.js.map index 7bdb14c..d754534 100644 --- a/dist/core/auth/guards/jwt-auth.guard.js.map +++ b/dist/core/auth/guards/jwt-auth.guard.js.map @@ -1 +1 @@ -{"version":3,"file":"jwt-auth.guard.js","sourceRoot":"","sources":["../../../../src/core/auth/guards/jwt-auth.guard.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAKwB;AACxB,qCAAyC;AAIlC,IAAM,YAAY,GAAlB,MAAM,YAAY;IAEJ;IADnB,YACmB,UAAsB;QAAtB,eAAU,GAAV,UAAU,CAAY;IACtC,CAAC;IAEJ,KAAK,CAAC,WAAW,CAAC,OAAyB;QACzC,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAW,CAAC;QAE7D,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;QAEjD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,8BAAqB,CAAC,kCAAkC,CAAC,CAAC;QACtE,CAAC;QAED,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAE5C,IAAI,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,EAAE,CAAC;YAChC,MAAM,IAAI,8BAAqB,CAAC,+BAA+B,CAAC,CAAC;QACnE,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YAEzD,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC;YAE1B,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,8BAAqB,CAAC,2BAA2B,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;CACF,CAAA;AA9BY,oCAAY;uBAAZ,YAAY;IADxB,IAAA,mBAAU,GAAE;qCAGoB,gBAAU;GAF9B,YAAY,CA8BxB"} \ No newline at end of file +{"version":3,"file":"jwt-auth.guard.js","sourceRoot":"","sources":["../../../../src/core/auth/guards/jwt-auth.guard.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/main.js b/dist/main.js index 283e71b..5ed7f86 100644 --- a/dist/main.js +++ b/dist/main.js @@ -1,6 +1,10 @@ "use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; Object.defineProperty(exports, "__esModule", { value: true }); const common_1 = require("@nestjs/common"); +const cookie_parser_1 = __importDefault(require("cookie-parser")); const core_1 = require("@nestjs/core"); const config_1 = require("@nestjs/config"); const swagger_1 = require("@nestjs/swagger"); @@ -8,13 +12,35 @@ const app_module_1 = require("./app.module"); async function bootstrap() { const app = await core_1.NestFactory.create(app_module_1.AppModule); const config = app.get(config_1.ConfigService); - app.setGlobalPrefix('api'); + const logger = new common_1.Logger('Bootstrap'); + // enable cookie parser so req.cookies is populated + app.use((0, cookie_parser_1.default)()); + app.setGlobalPrefix(''); app.useGlobalPipes(new common_1.ValidationPipe({ whitelist: true, transform: true, forbidNonWhitelisted: true, })); - app.enableCors(); + // CORS configuration: only allow configured frontend origins and enable credentials + const allowedOrigins = []; + const frontend = config.get('FRONTEND_URL'); + const prodFrontend = config.get('PRODUCTION_FRONTEND_URL'); + if (frontend) + allowedOrigins.push(frontend); + if (prodFrontend) + allowedOrigins.push(prodFrontend); + app.enableCors({ + origin: allowedOrigins, + credentials: true, + methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'], + allowedHeaders: [ + 'Content-Type', + 'Authorization', + 'Accept', + 'Origin', + 'X-Requested-With', + ], + }); const swaggerEnabled = config.get('SWAGGER_ENABLED') === 'true'; if (swaggerEnabled) { const swaggerConfig = new swagger_1.DocumentBuilder() @@ -24,11 +50,13 @@ async function bootstrap() { .addBearerAuth() .build(); const document = swagger_1.SwaggerModule.createDocument(app, swaggerConfig); - swagger_1.SwaggerModule.setup('docs', app, document); + swagger_1.SwaggerModule.setup('ApiList', app, document); } const port = config.get('PORT') || 3000; + logger.log(`Allowed CORS origins: ${JSON.stringify(allowedOrigins)}`); + logger.log(`Server listening on port ${port}`); await app.listen(port); - console.log(`Server running on http://localhost:${port}`); + logger.log(`Server running on http://localhost:${port}`); } bootstrap(); //# sourceMappingURL=main.js.map \ No newline at end of file diff --git a/dist/main.js.map b/dist/main.js.map index 5c78d80..5cd4dc2 100644 --- a/dist/main.js.map +++ b/dist/main.js.map @@ -1 +1 @@ -{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";;AAAA,2CAAgD;AAChD,uCAA2C;AAC3C,2CAA+C;AAC/C,6CAAiE;AAEjE,6CAAyC;AAEzC,KAAK,UAAU,SAAS;IACtB,MAAM,GAAG,GAAG,MAAM,kBAAW,CAAC,MAAM,CAAC,sBAAS,CAAC,CAAC;IAEhD,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,sBAAa,CAAC,CAAC;IAEtC,GAAG,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAE3B,GAAG,CAAC,cAAc,CAChB,IAAI,uBAAc,CAAC;QACjB,SAAS,EAAE,IAAI;QACf,SAAS,EAAE,IAAI;QACf,oBAAoB,EAAE,IAAI;KAC3B,CAAC,CACH,CAAC;IAEF,GAAG,CAAC,UAAU,EAAE,CAAC;IAEjB,MAAM,cAAc,GAClB,MAAM,CAAC,GAAG,CAAS,iBAAiB,CAAC,KAAK,MAAM,CAAC;IAEnD,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,aAAa,GAAG,IAAI,yBAAe,EAAE;aACxC,QAAQ,CAAC,iBAAiB,CAAC;aAC3B,cAAc,CAAC,sBAAsB,CAAC;aACtC,UAAU,CAAC,OAAO,CAAC;aACnB,aAAa,EAAE;aACf,KAAK,EAAE,CAAC;QAEX,MAAM,QAAQ,GAAG,uBAAa,CAAC,cAAc,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;QAElE,uBAAa,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAS,MAAM,CAAC,IAAI,IAAI,CAAC;IAEhD,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAEvB,OAAO,CAAC,GAAG,CAAC,sCAAsC,IAAI,EAAE,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,EAAE,CAAC"} \ No newline at end of file +{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";;;;;AAAA,2CAAwD;AACxD,kEAAyC;AACzC,uCAA2C;AAC3C,2CAA+C;AAC/C,6CAAiE;AAEjE,6CAAyC;AAEzC,KAAK,UAAU,SAAS;IACtB,MAAM,GAAG,GAAG,MAAM,kBAAW,CAAC,MAAM,CAAC,sBAAS,CAAC,CAAC;IAEhD,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,sBAAa,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,IAAI,eAAM,CAAC,WAAW,CAAC,CAAC;IAEvC,mDAAmD;IACnD,GAAG,CAAC,GAAG,CAAC,IAAA,uBAAY,GAAE,CAAC,CAAC;IAExB,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;IAExB,GAAG,CAAC,cAAc,CAChB,IAAI,uBAAc,CAAC;QACjB,SAAS,EAAE,IAAI;QACf,SAAS,EAAE,IAAI;QACf,oBAAoB,EAAE,IAAI;KAC3B,CAAC,CACH,CAAC;IAEF,oFAAoF;IACpF,MAAM,cAAc,GAAa,EAAE,CAAC;IACpC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAS,cAAc,CAAC,CAAC;IACpD,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAS,yBAAyB,CAAC,CAAC;IACnE,IAAI,QAAQ;QAAE,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAI,YAAY;QAAE,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAEpD,GAAG,CAAC,UAAU,CAAC;QACb,MAAM,EAAE,cAAc;QACtB,WAAW,EAAE,IAAI;QACjB,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC;QAC7D,cAAc,EAAE;YACd,cAAc;YACd,eAAe;YACf,QAAQ;YACR,QAAQ;YACR,kBAAkB;SACnB;KACF,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,MAAM,CAAC,GAAG,CAAS,iBAAiB,CAAC,KAAK,MAAM,CAAC;IAExE,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,aAAa,GAAG,IAAI,yBAAe,EAAE;aACxC,QAAQ,CAAC,iBAAiB,CAAC;aAC3B,cAAc,CAAC,sBAAsB,CAAC;aACtC,UAAU,CAAC,OAAO,CAAC;aACnB,aAAa,EAAE;aACf,KAAK,EAAE,CAAC;QAEX,MAAM,QAAQ,GAAG,uBAAa,CAAC,cAAc,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;QAElE,uBAAa,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;IAChD,CAAC;IAEC,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAS,MAAM,CAAC,IAAI,IAAI,CAAC;IAElD,MAAM,CAAC,GAAG,CAAC,yBAAyB,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;IACtE,MAAM,CAAC,GAAG,CAAC,4BAA4B,IAAI,EAAE,CAAC,CAAC;IAE/C,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAEvB,MAAM,CAAC,GAAG,CAAC,sCAAsC,IAAI,EAAE,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,EAAE,CAAC"} \ No newline at end of file diff --git a/dist/modules/authorization/presentation/guards/permission.guard.js b/dist/modules/authorization/presentation/guards/permission.guard.js index 9073bb8..4fb2446 100644 --- a/dist/modules/authorization/presentation/guards/permission.guard.js +++ b/dist/modules/authorization/presentation/guards/permission.guard.js @@ -26,8 +26,16 @@ let PermissionGuard = class PermissionGuard { return true; } const request = context.switchToHttp().getRequest(); - const user = request.user; - return permissions.every(permission => user.permissions.includes(permission)); + const user = request.currentUser; + if (!user) { + throw new common_1.UnauthorizedException('Current user is missing.'); + } + const hasAll = permissions.every((permission) => { + return user.hasPermission(permission); + }); + if (!hasAll) + throw new common_1.ForbiddenException('Insufficient permissions.'); + return true; } }; exports.PermissionGuard = PermissionGuard; diff --git a/dist/modules/authorization/presentation/guards/permission.guard.js.map b/dist/modules/authorization/presentation/guards/permission.guard.js.map index c7d4e76..f868731 100644 --- a/dist/modules/authorization/presentation/guards/permission.guard.js.map +++ b/dist/modules/authorization/presentation/guards/permission.guard.js.map @@ -1 +1 @@ -{"version":3,"file":"permission.guard.js","sourceRoot":"","sources":["../../../../../src/modules/authorization/presentation/guards/permission.guard.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAIwB;AACxB,uCAAyC;AAGlC,IAAM,eAAe,GAArB,MAAM,eAAe;IAEP;IADnB,YACmB,SAAoB;QAApB,cAAS,GAAT,SAAS,CAAW;IACpC,CAAC;IAEJ,WAAW,CAAC,OAAyB;QACnC,MAAM,WAAW,GACf,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAC9B,aAAa,EACb;YACE,OAAO,CAAC,UAAU,EAAE;YACpB,OAAO,CAAC,QAAQ,EAAE;SACnB,CACF,CAAC;QAEJ,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;QAEpD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QAE1B,OAAO,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CACpC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,CACtC,CAAC;IACJ,CAAC;CACF,CAAA;AA3BY,0CAAe;0BAAf,eAAe;IAD3B,IAAA,mBAAU,GAAE;qCAGmB,gBAAS;GAF5B,eAAe,CA2B3B"} \ No newline at end of file +{"version":3,"file":"permission.guard.js","sourceRoot":"","sources":["../../../../../src/modules/authorization/presentation/guards/permission.guard.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAMwB;AACxB,uCAAyC;AAGlC,IAAM,eAAe,GAArB,MAAM,eAAe;IAEP;IADnB,YACmB,SAAoB;QAApB,cAAS,GAAT,SAAS,CAAW;IACpC,CAAC;IAEJ,WAAW,CAAC,OAAyB;QACnC,MAAM,WAAW,GACf,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAC9B,aAAa,EACb;YACE,OAAO,CAAC,UAAU,EAAE;YACpB,OAAO,CAAC,QAAQ,EAAE;SACnB,CACF,CAAC;QAEJ,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAS,CAAC;QAE3D,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC;QAEjC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,8BAAqB,CAAC,0BAA0B,CAAC,CAAC;QAC9D,CAAC;QAEG,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,UAAU,EAAE,EAAE;YAClD,OAAO,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,2BAAkB,CAAC,2BAA2B,CAAC,CAAC;QAEvE,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAA;AAnCY,0CAAe;0BAAf,eAAe;IAD3B,IAAA,mBAAU,GAAE;qCAGmB,gBAAS;GAF5B,eAAe,CAmC3B"} \ No newline at end of file diff --git a/dist/modules/identity/application/handlers/create-user.handler.js b/dist/modules/identity/application/handlers/create-user.handler.js index 6fbb464..14dcf21 100644 --- a/dist/modules/identity/application/handlers/create-user.handler.js +++ b/dist/modules/identity/application/handlers/create-user.handler.js @@ -1,79 +1,26 @@ "use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; -var __importStar = (this && this.__importStar) || (function () { - var ownKeys = function(o) { - ownKeys = Object.getOwnPropertyNames || function (o) { - var ar = []; - for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; - return ar; - }; - return ownKeys(o); - }; - return function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); - __setModuleDefault(result, mod); - return result; - }; -})(); var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.CreateUserHandler = void 0; const common_1 = require("@nestjs/common"); -const bcrypt = __importStar(require("bcrypt")); -const user_entity_1 = require("../../domain/entities/user.entity"); -const user_repository_interface_1 = require("../../domain/repositories/user.repository.interface"); let CreateUserHandler = class CreateUserHandler { - userRepository; - constructor(userRepository) { - this.userRepository = userRepository; - } + constructor() { } async execute(dto) { - const exists = await this.userRepository.existsByEmail(dto.email); - if (exists) { - throw new common_1.ConflictException('Email already exists.'); - } - const saltRounds = parseInt(process.env.BCRYPT_SALT_ROUNDS ?? '10', 10); - const hashedPassword = await bcrypt.hash(dto.password, saltRounds); - const user = user_entity_1.User.create({ - name: dto.name, - email: dto.email, - password: hashedPassword, - metadata: dto.metadata, - }); - await this.userRepository.create(user); - // TODO: - // this.eventDispatcher.publish(new UserCreatedEvent(user)); - return user; + // Legacy handler - creation via this path is deprecated. Use the new handlers under application/handlers/user. + throw new common_1.BadRequestException('Deprecated handler. User creation via this endpoint is not supported.'); } }; exports.CreateUserHandler = CreateUserHandler; exports.CreateUserHandler = CreateUserHandler = __decorate([ (0, common_1.Injectable)(), - __metadata("design:paramtypes", [user_repository_interface_1.UserRepository]) + __metadata("design:paramtypes", []) ], CreateUserHandler); //# sourceMappingURL=create-user.handler.js.map \ No newline at end of file diff --git a/dist/modules/identity/application/handlers/create-user.handler.js.map b/dist/modules/identity/application/handlers/create-user.handler.js.map index e40acde..1620272 100644 --- a/dist/modules/identity/application/handlers/create-user.handler.js.map +++ b/dist/modules/identity/application/handlers/create-user.handler.js.map @@ -1 +1 @@ -{"version":3,"file":"create-user.handler.js","sourceRoot":"","sources":["../../../../../src/modules/identity/application/handlers/create-user.handler.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAGwB;AAExB,+CAAiC;AAEjC,mEAAyD;AACzD,mGAAqF;AAG9E,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;IAET;IADnB,YACmB,cAA8B;QAA9B,mBAAc,GAAd,cAAc,CAAgB;IAC9C,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,GAAkB;QAC9B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAElE,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,IAAI,0BAAiB,CAAC,uBAAuB,CAAC,CAAC;QACvD,CAAC;QAED,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;QACxE,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAEnE,MAAM,IAAI,GAAG,kBAAI,CAAC,MAAM,CAAC;YACvB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,QAAQ,EAAE,cAAc;YACxB,QAAQ,EAAE,GAAG,CAAC,QAAQ;SACvB,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAEvC,QAAQ;QACR,4DAA4D;QAE5D,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAA;AA7BY,8CAAiB;4BAAjB,iBAAiB;IAD7B,IAAA,mBAAU,GAAE;qCAGwB,0CAAc;GAFtC,iBAAiB,CA6B7B"} \ No newline at end of file +{"version":3,"file":"create-user.handler.js","sourceRoot":"","sources":["../../../../../src/modules/identity/application/handlers/create-user.handler.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAAiE;AAI1D,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;IAC5B,gBAAe,CAAC;IAEhB,KAAK,CAAC,OAAO,CAAC,GAAkB;QAC9B,+GAA+G;QAC/G,MAAM,IAAI,4BAAmB,CAAC,uEAAuE,CAAC,CAAC;IACzG,CAAC;CACF,CAAA;AAPY,8CAAiB;4BAAjB,iBAAiB;IAD7B,IAAA,mBAAU,GAAE;;GACA,iBAAiB,CAO7B"} \ No newline at end of file diff --git a/dist/modules/identity/application/handlers/update-user.handler.js b/dist/modules/identity/application/handlers/update-user.handler.js index 573e0d3..8732ed0 100644 --- a/dist/modules/identity/application/handlers/update-user.handler.js +++ b/dist/modules/identity/application/handlers/update-user.handler.js @@ -1,84 +1,26 @@ "use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; -var __importStar = (this && this.__importStar) || (function () { - var ownKeys = function(o) { - ownKeys = Object.getOwnPropertyNames || function (o) { - var ar = []; - for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; - return ar; - }; - return ownKeys(o); - }; - return function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); - __setModuleDefault(result, mod); - return result; - }; -})(); var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.UpdateUserHandler = void 0; const common_1 = require("@nestjs/common"); -const bcrypt = __importStar(require("bcrypt")); -const user_repository_interface_1 = require("../../domain/repositories/user.repository.interface"); let UpdateUserHandler = class UpdateUserHandler { - userRepository; - constructor(userRepository) { - this.userRepository = userRepository; - } + constructor() { } async execute(id, dto) { - const user = await this.userRepository.findById(id); - if (!user) { - throw new common_1.NotFoundException('User not found.'); - } - if (dto.email && - dto.email !== user.email) { - const exists = await this.userRepository.existsByEmail(dto.email); - if (exists) { - throw new common_1.ConflictException('Email already exists.'); - } - user.changeEmail(dto.email); - } - if (dto.name) { - user.changeName(dto.name); - } - if (dto.password) { - const saltRounds = parseInt(process.env.BCRYPT_SALT_ROUNDS ?? '10', 10); - const hashedPassword = await bcrypt.hash(dto.password, saltRounds); - user.changePassword(hashedPassword); - } - await this.userRepository.update(user); - return user; + // Legacy handler - deprecated. Use new handlers under application/handlers/user. + throw new common_1.BadRequestException('Deprecated handler.'); } }; exports.UpdateUserHandler = UpdateUserHandler; exports.UpdateUserHandler = UpdateUserHandler = __decorate([ (0, common_1.Injectable)(), - __metadata("design:paramtypes", [user_repository_interface_1.UserRepository]) + __metadata("design:paramtypes", []) ], UpdateUserHandler); //# sourceMappingURL=update-user.handler.js.map \ No newline at end of file diff --git a/dist/modules/identity/application/handlers/update-user.handler.js.map b/dist/modules/identity/application/handlers/update-user.handler.js.map index a82601e..8cdbabd 100644 --- a/dist/modules/identity/application/handlers/update-user.handler.js.map +++ b/dist/modules/identity/application/handlers/update-user.handler.js.map @@ -1 +1 @@ -{"version":3,"file":"update-user.handler.js","sourceRoot":"","sources":["../../../../../src/modules/identity/application/handlers/update-user.handler.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAIwB;AAExB,+CAAiC;AAEjC,mGAAqF;AAI9E,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;IAET;IADnB,YACmB,cAA8B;QAA9B,mBAAc,GAAd,cAAc,CAAgB;IAC9C,CAAC;IAEJ,KAAK,CAAC,OAAO,CACX,EAAU,EACV,GAAkB;QAElB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAEpD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,0BAAiB,CAAC,iBAAiB,CAAC,CAAC;QACjD,CAAC;QAED,IACE,GAAG,CAAC,KAAK;YACT,GAAG,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,EACxB,CAAC;YACD,MAAM,MAAM,GACV,MAAM,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAErD,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,IAAI,0BAAiB,CACzB,uBAAuB,CACxB,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;QAED,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;YACb,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;QAED,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;YACjB,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;YACxE,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YACnE,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;QACtC,CAAC;QAED,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAEvC,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAA;AA7CY,8CAAiB;4BAAjB,iBAAiB;IAD7B,IAAA,mBAAU,GAAE;qCAGwB,0CAAc;GAFtC,iBAAiB,CA6C7B"} \ No newline at end of file +{"version":3,"file":"update-user.handler.js","sourceRoot":"","sources":["../../../../../src/modules/identity/application/handlers/update-user.handler.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAAiE;AAI1D,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;IAC5B,gBAAe,CAAC;IAEhB,KAAK,CAAC,OAAO,CAAC,EAAU,EAAE,GAAkB;QAC1C,iFAAiF;QACjF,MAAM,IAAI,4BAAmB,CAAC,qBAAqB,CAAC,CAAC;IACvD,CAAC;CACF,CAAA;AAPY,8CAAiB;4BAAjB,iBAAiB;IAD7B,IAAA,mBAAU,GAAE;;GACA,iBAAiB,CAO7B"} \ No newline at end of file diff --git a/dist/modules/identity/domain/entities/user.entity.js b/dist/modules/identity/domain/entities/user.entity.js index babebff..71c9685 100644 --- a/dist/modules/identity/domain/entities/user.entity.js +++ b/dist/modules/identity/domain/entities/user.entity.js @@ -1,6 +1,6 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports.User = void 0; +exports.UserData = exports.User = void 0; class User { id; name; @@ -34,4 +34,80 @@ class User { } } exports.User = User; +class UserData { + id; + authentikId; + username; + email; + name; + roles; + permissions; + isActive; + deletedAt; + lastSeenAt; + lastSyncedAt; + syncStatus; + storageQuota; + storageUsed; + constructor(id, authentikId, username, email, name, roles, permissions, isActive, deletedAt, lastSeenAt, lastSyncedAt, syncStatus, storageQuota, storageUsed) { + this.id = id; + this.authentikId = authentikId; + this.username = username; + this.email = email; + this.name = name; + this.roles = roles; + this.permissions = permissions; + this.isActive = isActive; + this.deletedAt = deletedAt; + this.lastSeenAt = lastSeenAt; + this.lastSyncedAt = lastSyncedAt; + this.syncStatus = syncStatus; + this.storageQuota = storageQuota; + this.storageUsed = storageUsed; + } + static create(data) { + return new UserData(crypto.randomUUID(), data.authentikId ?? null, data.username, data.email ?? '', data.name ?? data.username, [], [], true, null, null, null, null, data.storageQuota ?? null, data.storageUsed ?? null); + } + static restore(props) { + return new UserData(props.id, props.authentikId ?? null, props.username, props.email, props.name ?? props.username, props.roles || [], props.permissions || [], props.isActive ?? true, props.deletedAt ?? null, props.lastSeenAt ?? null, props.lastSyncedAt ?? null, props.syncStatus ?? null, props.storageQuota ?? null, props.storageUsed ?? null); + } + assignRole(role) { + if (this.roles.some(r => r.id && r.id === role.id)) + return; + this.roles.push(role); + } + removeRole(roleId) { + const idx = this.roles.findIndex(r => r.id === roleId); + if (idx === -1) + return; + this.roles.splice(idx, 1); + } + assignPermission(permission) { + if (this.permissions.some(p => p.id && p.id === permission.id)) + return; + this.permissions.push(permission); + } + removePermission(permissionId) { + const idx = this.permissions.findIndex(p => p.id === permissionId); + if (idx === -1) + return; + this.permissions.splice(idx, 1); + } + changeEmail(email) { + this.email = email; + } + changeUsername(username) { + this.username = username; + } + touchLastSeen() { + this.lastSeenAt = new Date(); + } + setStorageQuota(q) { + this.storageQuota = q; + } + setStorageUsed(u) { + this.storageUsed = u; + } +} +exports.UserData = UserData; //# sourceMappingURL=user.entity.js.map \ No newline at end of file diff --git a/dist/modules/identity/domain/entities/user.entity.js.map b/dist/modules/identity/domain/entities/user.entity.js.map index 13c863e..e301d52 100644 --- a/dist/modules/identity/domain/entities/user.entity.js.map +++ b/dist/modules/identity/domain/entities/user.entity.js.map @@ -1 +1 @@ -{"version":3,"file":"user.entity.js","sourceRoot":"","sources":["../../../../../src/modules/identity/domain/entities/user.entity.ts"],"names":[],"mappings":";;;AAAA,MAAa,IAAI;IAEG;IACT;IACA;IACA;IACA;IALT,YACkB,EAAU,EACnB,IAAY,EACZ,KAAa,EACb,QAAgB,EAChB,QAA8B;QAJrB,OAAE,GAAF,EAAE,CAAQ;QACnB,SAAI,GAAJ,IAAI,CAAQ;QACZ,UAAK,GAAL,KAAK,CAAQ;QACb,aAAQ,GAAR,QAAQ,CAAQ;QAChB,aAAQ,GAAR,QAAQ,CAAsB;IACpC,CAAC;IAEJ,MAAM,CAAC,MAAM,CAAC,IAKb;QACC,OAAO,IAAI,IAAI,CACb,MAAM,CAAC,UAAU,EAAE,EACnB,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,QAAQ,CACd,CAAC;IACJ,CAAC;IAED,MAAM;QACJ,gBAAgB;IAClB,CAAC;IAED,WAAW,CAAC,KAAa;QACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,UAAU,CAAC,IAAY;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,cAAc,CAAC,WAAmB;QAChC,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC;IAC9B,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,IAMd;QACC,OAAO,IAAI,IAAI,CACb,IAAI,CAAC,EAAE,EACP,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,QAAQ,CACd,CAAC;IACJ,CAAC;CACF;AAvDD,oBAuDC"} \ No newline at end of file +{"version":3,"file":"user.entity.js","sourceRoot":"","sources":["../../../../../src/modules/identity/domain/entities/user.entity.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/modules/identity/domain/events/user-created.event.js b/dist/modules/identity/domain/events/user-created.event.js index 854e0bc..f9edf2c 100644 --- a/dist/modules/identity/domain/events/user-created.event.js +++ b/dist/modules/identity/domain/events/user-created.event.js @@ -3,11 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.UserCreatedEvent = void 0; class UserCreatedEvent { payload; - occurredAt; name = 'UserCreated'; - constructor(payload, occurredAt = new Date()) { + occurredAt = new Date(); + constructor(payload) { this.payload = payload; - this.occurredAt = occurredAt; } } exports.UserCreatedEvent = UserCreatedEvent; diff --git a/dist/modules/identity/domain/events/user-created.event.js.map b/dist/modules/identity/domain/events/user-created.event.js.map index cc198b4..32401a7 100644 --- a/dist/modules/identity/domain/events/user-created.event.js.map +++ b/dist/modules/identity/domain/events/user-created.event.js.map @@ -1 +1 @@ -{"version":3,"file":"user-created.event.js","sourceRoot":"","sources":["../../../../../src/modules/identity/domain/events/user-created.event.ts"],"names":[],"mappings":";;;AAEA,MAAa,gBAAgB;IAEC;IAA8B;IADjD,IAAI,GAAG,aAAa,CAAC;IAC9B,YAA4B,OAAY,EAAkB,aAAmB,IAAI,IAAI,EAAE;QAA3D,YAAO,GAAP,OAAO,CAAK;QAAkB,eAAU,GAAV,UAAU,CAAmB;IAAG,CAAC;CAC5F;AAHD,4CAGC"} \ No newline at end of file +{"version":3,"file":"user-created.event.js","sourceRoot":"","sources":["../../../../../src/modules/identity/domain/events/user-created.event.ts"],"names":[],"mappings":";;;AAEA,MAAa,gBAAgB;IAGC;IAFnB,IAAI,GAAG,aAAa,CAAC;IACrB,UAAU,GAAS,IAAI,IAAI,EAAE,CAAC;IACvC,YAA4B,OAAiF;QAAjF,YAAO,GAAP,OAAO,CAA0E;IAAG,CAAC;CAClH;AAJD,4CAIC"} \ No newline at end of file diff --git a/dist/modules/identity/identity.module.js b/dist/modules/identity/identity.module.js index 20e24fd..9496c03 100644 --- a/dist/modules/identity/identity.module.js +++ b/dist/modules/identity/identity.module.js @@ -11,15 +11,15 @@ const common_1 = require("@nestjs/common"); const users_controller_1 = require("./presentation/controllers/users.controller"); const prisma_service_1 = require("../../shared/prisma.service"); const prisma_user_repository_1 = require("./infrastructure/repositories/prisma-user.repository"); -const user_repository_interface_1 = require("./domain/repositories/user.repository.interface"); +const user_interface_1 = require("./domain/repositories/user.interface"); const event_dispatcher_1 = require("../../core/events/event-dispatcher"); const jwt_auth_guard_1 = require("../../core/auth/guards/jwt-auth.guard"); const jwt_1 = require("@nestjs/jwt"); -const create_user_handler_1 = require("./application/handlers/create-user.handler"); -const find_user_handler_1 = require("./application/handlers/find-user.handler"); -const delete_user_handler_1 = require("./application/handlers/delete-user.handler"); -const find_users_handler_1 = require("./application/handlers/find-users.handler"); -const update_user_handler_1 = require("./application/handlers/update-user.handler"); +const create_user_handler_1 = require("./application/handlers/user/create-user.handler"); +const get_user_handler_1 = require("./application/handlers/user/get-user.handler"); +const delete_user_handler_1 = require("./application/handlers/user/delete-user.handler"); +const get_users_handler_1 = require("./application/handlers/user/get-users.handler"); +const update_user_handler_1 = require("./application/handlers/user/update-user.handler"); const permission_guard_1 = require("../authorization/presentation/guards/permission.guard"); const core_1 = require("@nestjs/core"); const login_handler_1 = require("./application/handlers/login.handler"); @@ -44,8 +44,8 @@ exports.IdentityModule = IdentityModule = __decorate([ providers: [ //#region User create_user_handler_1.CreateUserHandler, - find_user_handler_1.FindUserHandler, - find_users_handler_1.FindUsersHandler, + get_user_handler_1.GetUserHandler, + get_users_handler_1.GetUsersHandler, update_user_handler_1.UpdateUserHandler, delete_user_handler_1.DeleteUserHandler, login_handler_1.LoginHandler, @@ -58,7 +58,7 @@ exports.IdentityModule = IdentityModule = __decorate([ prisma_user_repository_1.PrismaUserRepository, prisma_service_account_repository_1.PrismaServiceAccountRepository, { - provide: user_repository_interface_1.UserRepository, + provide: user_interface_1.IUser, useClass: prisma_user_repository_1.PrismaUserRepository, }, { diff --git a/dist/modules/identity/identity.module.js.map b/dist/modules/identity/identity.module.js.map index 24cc48a..64416a5 100644 --- a/dist/modules/identity/identity.module.js.map +++ b/dist/modules/identity/identity.module.js.map @@ -1 +1 @@ -{"version":3,"file":"identity.module.js","sourceRoot":"","sources":["../../../src/modules/identity/identity.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,kFAA8E;AAC9E,gEAA4D;AAC5D,iGAA4F;AAC5F,+FAAiF;AACjF,yEAAqE;AACrE,0EAAqE;AACrE,qCAAwC;AACxC,oFAA+E;AAC/E,gFAA2E;AAC3E,oFAA+E;AAC/E,kFAA6E;AAC7E,oFAA+E;AAC/E,4FAAwF;AACxF,uCAAyC;AACzC,wEAAoE;AACpE,gFAA4E;AAC5E,wEAAoE;AACpE,uHAAiH;AACjH,qHAAsG;AA4C/F,IAAM,cAAc,GAApB,MAAM,cAAc;CAAG,CAAA;AAAjB,wCAAc;yBAAd,cAAc;IAzC1B,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,eAAS,CAAC,QAAQ,CAAC;gBACjB,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU;gBAC9B,WAAW,EAAE;oBACX,SAAS,EAAE,IAAI;iBAChB;aACF,CAAC;SACH;QACD,WAAW,EAAE,CAAC,kCAAe,EAAE,gCAAc,CAAC;QAC9C,SAAS,EAAE;YACT,eAAe;YACf,uCAAiB;YACjB,mCAAe;YACf,qCAAgB;YAChB,uCAAiB;YACjB,uCAAiB;YACjB,4BAAY;YACZ,4BAAY;YACZ,YAAY;YAEZ,6BAAY;YACZ,kCAAe;YACf,gBAAS;YACT,8BAAa;YACb,6CAAoB;YACpB,kEAA8B;YAC9B;gBACE,OAAO,EAAE,0CAAc;gBACvB,QAAQ,EAAE,6CAAoB;aAC/B;YACD;gBACE,OAAO,EAAE,+DAAwB;gBACjC,QAAQ,EAAE,kEAA8B;aACzC;YACD;gBACE,OAAO,EAAE,kBAAkB;gBAC3B,QAAQ,EAAE,IAAI,kCAAe,EAAE;aAChC;SACF;KACF,CAAC;GACW,cAAc,CAAG"} \ No newline at end of file +{"version":3,"file":"identity.module.js","sourceRoot":"","sources":["../../../src/modules/identity/identity.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,kFAA8E;AAC9E,gEAA4D;AAC5D,iGAA4F;AAC5F,yEAA6D;AAC7D,yEAAqE;AACrE,0EAAqE;AACrE,qCAAwC;AACxC,yFAAoF;AACpF,mFAAiG;AACjG,yFAAoF;AACpF,qFAAoG;AACpG,yFAAoF;AACpF,4FAAwF;AACxF,uCAAyC;AACzC,wEAAoE;AACpE,gFAA4E;AAC5E,wEAAoE;AACpE,uHAAiH;AACjH,qHAAsG;AA4C/F,IAAM,cAAc,GAApB,MAAM,cAAc;CAAG,CAAA;AAAjB,wCAAc;yBAAd,cAAc;IAzC1B,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,eAAS,CAAC,QAAQ,CAAC;gBACjB,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU;gBAC9B,WAAW,EAAE;oBACX,SAAS,EAAE,IAAI;iBAChB;aACF,CAAC;SACH;QACD,WAAW,EAAE,CAAC,kCAAe,EAAE,gCAAc,CAAC;QAC9C,SAAS,EAAE;YACT,eAAe;YACf,uCAAiB;YACjB,iCAAe;YACf,mCAAgB;YAChB,uCAAiB;YACjB,uCAAiB;YACjB,4BAAY;YACZ,4BAAY;YACZ,YAAY;YAEZ,6BAAY;YACZ,kCAAe;YACf,gBAAS;YACL,8BAAa;YACjB,6CAAoB;YACpB,kEAA8B;YAC9B;gBACE,OAAO,EAAE,sBAAK;gBACd,QAAQ,EAAE,6CAAoB;aAC/B;YACD;gBACE,OAAO,EAAE,+DAAwB;gBACjC,QAAQ,EAAE,kEAA8B;aACzC;YACD;gBACE,OAAO,EAAE,kBAAkB;gBAC3B,QAAQ,EAAE,IAAI,kCAAe,EAAE;aAChC;SACF;KACF,CAAC;GACW,cAAc,CAAG"} \ No newline at end of file diff --git a/dist/modules/identity/infrastructure/mappers/prisma-user.mapper.js b/dist/modules/identity/infrastructure/mappers/prisma-user.mapper.js index 3fa0451..00a1458 100644 --- a/dist/modules/identity/infrastructure/mappers/prisma-user.mapper.js +++ b/dist/modules/identity/infrastructure/mappers/prisma-user.mapper.js @@ -2,26 +2,64 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.PrismaUserMapper = void 0; const user_entity_1 = require("../../domain/entities/user.entity"); +const role_entity_1 = require("../../domain/entities/role.entity"); +const permission_entity_1 = require("../../domain/entities/permission.entity"); class PrismaUserMapper { static toDomain(model) { - if (!model) { - return null; - } - return user_entity_1.User.restore({ + const roles = (model.userRoles || model.roles || []).map((ur) => { + const r = ur.role || ur.role; + const permissions = (r?.permissions || []).map((rp) => permission_entity_1.PermissionData.restore({ + id: rp.permission.id, + name: rp.permission.name, + description: rp.permission.description, + createdAt: rp.permission.createdAt, + updatedAt: rp.permission.updatedAt, + })); + return role_entity_1.RoleData.restore({ + id: r.id, + code: r.code, + name: r.name, + description: r.description, + permissions, + createdAt: r.createdAt, + updatedAt: r.updatedAt, + }); + }); + const permissions = (model.userPermissions || model.permissions || []).map((up) => permission_entity_1.PermissionData.restore({ + id: up.permission?.id || up.id, + name: up.permission?.name || up.name, + description: up.permission?.description || up.description, + createdAt: up.permission?.createdAt || up.createdAt, + updatedAt: up.permission?.updatedAt || up.updatedAt, + })); + return user_entity_1.UserData.restore({ id: model.id, - name: model.name, + authentikId: model.authentikUserId || model.authentikId || null, + username: model.username || model.name || model.username, email: model.email, - password: model.password, - metadata: model.metadata, + roles, + permissions, + isActive: model.isActive ?? true, + deletedAt: model.deletedAt || null, + lastSeenAt: model.lastSeenAt || null, + storageQuota: model.storageQuota !== undefined && model.storageQuota !== null ? Number(model.storageQuota) : undefined, + storageUsed: model.storageUsed !== undefined && model.storageUsed !== null ? Number(model.storageUsed) : undefined, }); } - static toPersistence(user) { + static toPersistence(userData) { return { - id: user.id, - name: user.name, - email: user.email, - password: user.password, - metadata: user.metadata ?? {}, + id: userData.id, + authentikUserId: userData.authentikUserId || userData.authentikId, + authentikId: userData.authentikId, + username: userData.username, + email: userData.email, + isActive: userData.isActive, + deletedAt: userData.deletedAt, + lastSeenAt: userData.lastSeenAt, + lastSyncedAt: userData.lastSyncedAt, + syncStatus: userData.syncStatus, + storageQuota: userData.storageQuota, + storageUsed: userData.storageUsed, }; } } diff --git a/dist/modules/identity/infrastructure/mappers/prisma-user.mapper.js.map b/dist/modules/identity/infrastructure/mappers/prisma-user.mapper.js.map index 40c94a8..b61b6ea 100644 --- a/dist/modules/identity/infrastructure/mappers/prisma-user.mapper.js.map +++ b/dist/modules/identity/infrastructure/mappers/prisma-user.mapper.js.map @@ -1 +1 @@ -{"version":3,"file":"prisma-user.mapper.js","sourceRoot":"","sources":["../../../../../src/modules/identity/infrastructure/mappers/prisma-user.mapper.ts"],"names":[],"mappings":";;;AAAA,mEAAyD;AAEzD,MAAa,gBAAgB;IAC3B,MAAM,CAAC,QAAQ,CAAC,KAAU;QACxB,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,kBAAI,CAAC,OAAO,CAAC;YAClB,EAAE,EAAE,KAAK,CAAC,EAAE;YACZ,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;SACzB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,aAAa,CAAC,IAAU;QAC7B,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE;SAC9B,CAAC;IACJ,CAAC;CACF;AAxBD,4CAwBC"} \ No newline at end of file +{"version":3,"file":"prisma-user.mapper.js","sourceRoot":"","sources":["../../../../../src/modules/identity/infrastructure/mappers/prisma-user.mapper.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/modules/identity/infrastructure/repositories/prisma-user.repository.js b/dist/modules/identity/infrastructure/repositories/prisma-user.repository.js index 0e94d6e..17d2518 100644 --- a/dist/modules/identity/infrastructure/repositories/prisma-user.repository.js +++ b/dist/modules/identity/infrastructure/repositories/prisma-user.repository.js @@ -18,54 +18,83 @@ let PrismaUserRepository = class PrismaUserRepository { constructor(prisma) { this.prisma = prisma; } - async findById(id) { - const user = await this.prisma.user.findUnique({ - where: { id }, - }); - return prisma_user_mapper_1.PrismaUserMapper.toDomain(user); - } - async findByEmail(email) { - const user = await this.prisma.user.findUnique({ - where: { email }, - }); - return prisma_user_mapper_1.PrismaUserMapper.toDomain(user); - } - async findAll() { - const users = await this.prisma.user.findMany({ - where: { deleted_at: null }, - orderBy: { created_at: 'desc' }, - }); - return users.map(u => prisma_user_mapper_1.PrismaUserMapper.toDomain(u)); - } async create(user) { - const created = await this.prisma.user.create({ - data: prisma_user_mapper_1.PrismaUserMapper.toPersistence(user), - }); + const created = await this.prisma.user.create({ data: prisma_user_mapper_1.PrismaUserMapper.toPersistence(user) }); return prisma_user_mapper_1.PrismaUserMapper.toDomain(created); } + async existsById(userId) { + const cnt = await this.prisma.user.count({ where: { id: userId } }); + return cnt > 0; + } + async existByEmail(userEmail) { + const u = await this.prisma.user.findFirst({ where: { email: userEmail } }); + return !!u; + } + async getById(userId) { + const row = await this.prisma.user.findUnique({ where: { id: userId }, include: { userRoles: { include: { role: { include: { permissions: { include: { permission: true } } } } } }, userPermissions: { include: { permission: true } } } }); + if (!row) + throw new common_1.NotFoundException('User not found.'); + return prisma_user_mapper_1.PrismaUserMapper.toDomain(row); + } + async getByEmail(userEmail) { + const row = await this.prisma.user.findUnique({ where: { email: userEmail }, include: { userRoles: { include: { role: { include: { permissions: { include: { permission: true } } } } } }, userPermissions: { include: { permission: true } } } }); + if (!row) + throw new common_1.NotFoundException('User not found.'); + return prisma_user_mapper_1.PrismaUserMapper.toDomain(row); + } + async findByAuthentikId(authentikId) { + const row = await this.prisma.user.findFirst({ where: { OR: [{ authentikId }, { authentikUserId: authentikId }] }, include: { userRoles: { include: { role: { include: { permissions: { include: { permission: true } } } } } }, userPermissions: { include: { permission: true } } } }); + if (!row) + return null; + return prisma_user_mapper_1.PrismaUserMapper.toDomain(row); + } async update(user) { - const updated = await this.prisma.user.update({ - where: { - id: user.id, - }, - data: prisma_user_mapper_1.PrismaUserMapper.toPersistence(user), - }); + const updated = await this.prisma.user.update({ where: { id: user.id }, data: prisma_user_mapper_1.PrismaUserMapper.toPersistence(user), include: { userRoles: { include: { role: { include: { permissions: { include: { permission: true } } } } } }, userPermissions: { include: { permission: true } } } }); return prisma_user_mapper_1.PrismaUserMapper.toDomain(updated); } - async delete(id) { - const user = await this.prisma.user.update({ - where: { id }, - data: { deleted_at: new Date() }, - }); - return prisma_user_mapper_1.PrismaUserMapper.toDomain(user); - } - async existsByEmail(email, excludeId) { - const where = { email }; - if (excludeId) { - where.id = { not: excludeId }; + async find(params) { + const page = params.page && params.page > 0 ? params.page : 1; + const limit = params.limit && params.limit > 0 ? params.limit : 25; + const where = {}; + if (params.search) { + where.OR = [ + { username: { contains: params.search, mode: 'insensitive' } }, + { name: { contains: params.search, mode: 'insensitive' } }, + { email: { contains: params.search, mode: 'insensitive' } }, + ]; } - const user = await this.prisma.user.findFirst({ where }); - return !!user; + if (params.isActive !== undefined && params.isActive !== null) { + where.isActive = params.isActive; + } + if (params.deleted !== undefined && params.deleted !== null) { + if (params.deleted) + where.deletedAt = { not: null }; + else + where.deletedAt = null; + } + if (params.roleId) { + where.userRoles = { some: { roleId: params.roleId } }; + } + const [total, items] = await Promise.all([ + this.prisma.user.count({ where }), + this.prisma.user.findMany({ where, skip: (page - 1) * limit, take: limit, orderBy: { createdAt: 'desc' }, include: { userRoles: { include: { role: { include: { permissions: { include: { permission: true } } } } } }, userPermissions: { include: { permission: true } } } }), + ]); + return { data: items.map(i => prisma_user_mapper_1.PrismaUserMapper.toDomain(i)), total }; + } + async softDelete(userId) { + await this.prisma.user.update({ where: { id: userId }, data: { deletedAt: new Date() } }); + } + async restore(userId) { + const updated = await this.prisma.user.update({ where: { id: userId }, data: { deletedAt: null }, include: { userRoles: { include: { role: { include: { permissions: { include: { permission: true } } } } } }, userPermissions: { include: { permission: true } } } }); + return prisma_user_mapper_1.PrismaUserMapper.toDomain(updated); + } + async enable(userId) { + const updated = await this.prisma.user.update({ where: { id: userId }, data: { isActive: true }, include: { userRoles: { include: { role: { include: { permissions: { include: { permission: true } } } } } }, userPermissions: { include: { permission: true } } } }); + return prisma_user_mapper_1.PrismaUserMapper.toDomain(updated); + } + async disable(userId) { + const updated = await this.prisma.user.update({ where: { id: userId }, data: { isActive: false }, include: { userRoles: { include: { role: { include: { permissions: { include: { permission: true } } } } } }, userPermissions: { include: { permission: true } } } }); + return prisma_user_mapper_1.PrismaUserMapper.toDomain(updated); } }; exports.PrismaUserRepository = PrismaUserRepository; diff --git a/dist/modules/identity/infrastructure/repositories/prisma-user.repository.js.map b/dist/modules/identity/infrastructure/repositories/prisma-user.repository.js.map index acbe756..bbfb927 100644 --- a/dist/modules/identity/infrastructure/repositories/prisma-user.repository.js.map +++ b/dist/modules/identity/infrastructure/repositories/prisma-user.repository.js.map @@ -1 +1 @@ -{"version":3,"file":"prisma-user.repository.js","sourceRoot":"","sources":["../../../../../src/modules/identity/infrastructure/repositories/prisma-user.repository.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,sEAAkE;AAGlE,sEAAiE;AAG1D,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;IACF;IAA7B,YAA6B,MAAqB;QAArB,WAAM,GAAN,MAAM,CAAe;IAAG,CAAC;IAEtD,KAAK,CAAC,QAAQ,CAAC,EAAU;QACvB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;YAC7C,KAAK,EAAE,EAAE,EAAE,EAAE;SACd,CAAC,CAAC;QAEH,OAAO,qCAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,KAAa;QAC7B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;YAC7C,KAAK,EAAE,EAAE,KAAK,EAAE;SACjB,CAAC,CAAC;QAEH,OAAO,qCAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC5C,KAAK,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE;YAC3B,OAAO,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE;SAChC,CAAC,CAAC;QAEH,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,qCAAgB,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAU;QACrB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;YAC5C,IAAI,EAAE,qCAAgB,CAAC,aAAa,CAAC,IAAI,CAAC;SAC3C,CAAC,CAAC;QAEH,OAAO,qCAAgB,CAAC,QAAQ,CAAC,OAAO,CAAE,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAU;QACrB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;YAC5C,KAAK,EAAE;gBACL,EAAE,EAAE,IAAI,CAAC,EAAE;aACZ;YACD,IAAI,EAAE,qCAAgB,CAAC,aAAa,CAAC,IAAI,CAAC;SAC3C,CAAC,CAAC;QAEH,OAAO,qCAAgB,CAAC,QAAQ,CAAC,OAAO,CAAE,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;YACzC,KAAK,EAAE,EAAE,EAAE,EAAE;YACb,IAAI,EAAE,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,EAAE;SACjC,CAAC,CAAC;QACH,OAAO,qCAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,KAAa,EAAE,SAAyB;QAC1D,MAAM,KAAK,GAAQ,EAAE,KAAK,EAAE,CAAC;QAC7B,IAAI,SAAS,EAAE,CAAC;YACd,KAAK,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;QAChC,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACzD,OAAO,CAAC,CAAC,IAAI,CAAC;IAChB,CAAC;CACF,CAAA;AAhEY,oDAAoB;+BAApB,oBAAoB;IADhC,IAAA,mBAAU,GAAE;qCAE0B,8BAAa;GADvC,oBAAoB,CAgEhC"} \ No newline at end of file +{"version":3,"file":"prisma-user.repository.js","sourceRoot":"","sources":["../../../../../src/modules/identity/infrastructure/repositories/prisma-user.repository.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA+D;AAC/D,sEAAkE;AAGlE,sEAAiE;AAG1D,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;IACF;IAA7B,YAA6B,MAAqB;QAArB,WAAM,GAAN,MAAM,CAAe;IAAG,CAAC;IAEtD,KAAK,CAAC,MAAM,CAAC,IAAc;QACzB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,qCAAgB,CAAC,aAAa,CAAC,IAAI,CAAQ,EAAE,CAAC,CAAC;QACrG,OAAO,qCAAgB,CAAC,QAAQ,CAAC,OAAO,CAAE,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAc;QAC7B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QACpE,OAAO,GAAG,GAAG,CAAC,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,SAAiB;QAClC,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;QAC5E,OAAO,CAAC,CAAC,CAAC,CAAC;IACb,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAc;QAC1B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QAC7O,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,0BAAiB,CAAC,iBAAiB,CAAC,CAAC;QACzD,OAAO,qCAAgB,CAAC,QAAQ,CAAC,GAAG,CAAE,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,SAAiB;QAChC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QACnP,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,0BAAiB,CAAC,iBAAiB,CAAC,CAAC;QACzD,OAAO,qCAAgB,CAAC,QAAQ,CAAC,GAAG,CAAE,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,WAAmB;QACzC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,eAAe,EAAE,WAAW,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QACzR,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,OAAO,qCAAgB,CAAC,QAAQ,CAAC,GAAG,CAAE,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAc;QACzB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,qCAAgB,CAAC,aAAa,CAAC,IAAI,CAAQ,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QACjS,OAAO,qCAAgB,CAAC,QAAQ,CAAC,OAAO,CAAE,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAA+I;QACxJ,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9D,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAEnE,MAAM,KAAK,GAAQ,EAAE,CAAC;QACtB,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,KAAK,CAAC,EAAE,GAAG;gBACT,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE;gBAC9D,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE;gBAC1D,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE;aAC5D,CAAC;QACJ,CAAC;QAED,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;YAC9D,KAAK,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QACnC,CAAC;QAED,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YAC5D,IAAI,MAAM,CAAC,OAAO;gBAAE,KAAK,CAAC,SAAS,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;;gBAC/C,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;QAC9B,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,KAAK,CAAC,SAAS,GAAG,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;QACxD,CAAC;QAED,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACvC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC;YACjC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC;SAChR,CAAC,CAAC;QAEH,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,qCAAgB,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,EAAE,KAAK,EAAE,CAAC;IACxE,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAc;QAC7B,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAc;QAC1B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QACxQ,OAAO,qCAAgB,CAAC,QAAQ,CAAC,OAAO,CAAE,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAc;QACzB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QACvQ,OAAO,qCAAgB,CAAC,QAAQ,CAAC,OAAO,CAAE,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAc;QAC1B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QACxQ,OAAO,qCAAgB,CAAC,QAAQ,CAAC,OAAO,CAAE,CAAC;IAC7C,CAAC;CACF,CAAA;AA7FY,oDAAoB;+BAApB,oBAAoB;IADhC,IAAA,mBAAU,GAAE;qCAE0B,8BAAa;GADvC,oBAAoB,CA6FhC"} \ No newline at end of file diff --git a/dist/modules/identity/presentation/controllers/users.controller.js b/dist/modules/identity/presentation/controllers/users.controller.js index 9ce27b3..3778964 100644 --- a/dist/modules/identity/presentation/controllers/users.controller.js +++ b/dist/modules/identity/presentation/controllers/users.controller.js @@ -18,11 +18,11 @@ const swagger_1 = require("@nestjs/swagger"); const jwt_auth_guard_1 = require("../../../../core/auth/guards/jwt-auth.guard"); const permission_guard_1 = require("../../../authorization/presentation/guards/permission.guard"); const permission_decorator_1 = require("../../../authorization/presentation/decorators/permission.decorator"); -const find_user_handler_1 = require("../../application/handlers/find-user.handler"); -const find_users_handler_1 = require("../../application/handlers/find-users.handler"); -const create_user_handler_1 = require("../../application/handlers/create-user.handler"); -const update_user_handler_1 = require("../../application/handlers/update-user.handler"); -const delete_user_handler_1 = require("../../application/handlers/delete-user.handler"); +const get_user_handler_1 = require("../../application/handlers/user/get-user.handler"); +const get_users_handler_1 = require("../../application/handlers/user/get-users.handler"); +const create_user_handler_1 = require("../../application/handlers/user/create-user.handler"); +const update_user_handler_1 = require("../../application/handlers/user/update-user.handler"); +const delete_user_handler_1 = require("../../application/handlers/user/delete-user.handler"); const create_user_dto_1 = require("../dto/create-user.dto"); const update_user_dto_1 = require("../dto/update-user.dto"); let UsersController = class UsersController { @@ -67,7 +67,7 @@ let UsersController = class UsersController { }; } async getAll() { - const data = await this.findUsersHandler.execute(); + const data = await this.findUsersHandler.execute({}); return { success: true, data: this.sanitizeUser(data), @@ -142,8 +142,8 @@ exports.UsersController = UsersController = __decorate([ (0, common_1.Controller)('api/v1/users'), (0, common_1.UseGuards)(jwt_auth_guard_1.JwtAuthGuard, permission_guard_1.PermissionGuard), __metadata("design:paramtypes", [create_user_handler_1.CreateUserHandler, - find_user_handler_1.FindUserHandler, - find_users_handler_1.FindUsersHandler, + get_user_handler_1.GetUserHandler, + get_users_handler_1.GetUsersHandler, update_user_handler_1.UpdateUserHandler, delete_user_handler_1.DeleteUserHandler]) ], UsersController); diff --git a/dist/modules/identity/presentation/controllers/users.controller.js.map b/dist/modules/identity/presentation/controllers/users.controller.js.map index 2a2a606..648da4b 100644 --- a/dist/modules/identity/presentation/controllers/users.controller.js.map +++ b/dist/modules/identity/presentation/controllers/users.controller.js.map @@ -1 +1 @@ -{"version":3,"file":"users.controller.js","sourceRoot":"","sources":["../../../../../src/modules/identity/presentation/controllers/users.controller.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"users.controller.js","sourceRoot":"","sources":["../../../../../src/modules/identity/presentation/controllers/users.controller.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/modules/identity/presentation/dto/create-user.dto.js b/dist/modules/identity/presentation/dto/create-user.dto.js index 0c3486e..1dffc65 100644 --- a/dist/modules/identity/presentation/dto/create-user.dto.js +++ b/dist/modules/identity/presentation/dto/create-user.dto.js @@ -13,10 +13,10 @@ exports.CreateUserDto = void 0; const class_validator_1 = require("class-validator"); const swagger_1 = require("@nestjs/swagger"); class CreateUserDto { - name; + username; email; - password; - metadata; + storageQuota; + storageUsed; } exports.CreateUserDto = CreateUserDto; __decorate([ @@ -24,20 +24,24 @@ __decorate([ (0, class_validator_1.IsString)(), (0, class_validator_1.IsNotEmpty)(), __metadata("design:type", String) -], CreateUserDto.prototype, "name", void 0); +], CreateUserDto.prototype, "username", void 0); __decorate([ (0, swagger_1.ApiProperty)({ example: 'user@example.com' }), (0, class_validator_1.IsEmail)(), __metadata("design:type", String) ], CreateUserDto.prototype, "email", void 0); __decorate([ - (0, swagger_1.ApiProperty)({ example: 'strongpassword' }), - (0, class_validator_1.IsString)(), - (0, class_validator_1.Length)(8, 128), - __metadata("design:type", String) -], CreateUserDto.prototype, "password", void 0); + (0, swagger_1.ApiPropertyOptional)({ example: 10737418240 }), + (0, class_validator_1.IsOptional)(), + (0, class_validator_1.IsInt)(), + (0, class_validator_1.Min)(0), + __metadata("design:type", Number) +], CreateUserDto.prototype, "storageQuota", void 0); __decorate([ - (0, swagger_1.ApiProperty)({ required: false }), - __metadata("design:type", Object) -], CreateUserDto.prototype, "metadata", void 0); + (0, swagger_1.ApiPropertyOptional)({ example: 0 }), + (0, class_validator_1.IsOptional)(), + (0, class_validator_1.IsInt)(), + (0, class_validator_1.Min)(0), + __metadata("design:type", Number) +], CreateUserDto.prototype, "storageUsed", void 0); //# sourceMappingURL=create-user.dto.js.map \ No newline at end of file diff --git a/dist/modules/identity/presentation/dto/create-user.dto.js.map b/dist/modules/identity/presentation/dto/create-user.dto.js.map index b6f5707..66cc07d 100644 --- a/dist/modules/identity/presentation/dto/create-user.dto.js.map +++ b/dist/modules/identity/presentation/dto/create-user.dto.js.map @@ -1 +1 @@ -{"version":3,"file":"create-user.dto.js","sourceRoot":"","sources":["../../../../../src/modules/identity/presentation/dto/create-user.dto.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qDAAwE;AACxE,6CAA8C;AAE9C,MAAa,aAAa;IAIxB,IAAI,CAAU;IAId,KAAK,CAAU;IAKf,QAAQ,CAAU;IAGlB,QAAQ,CAAuB;CAChC;AAjBD,sCAiBC;AAbC;IAHC,IAAA,qBAAW,EAAC,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;IACpC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;2CACC;AAId;IAFC,IAAA,qBAAW,EAAC,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC5C,IAAA,yBAAO,GAAE;;4CACK;AAKf;IAHC,IAAA,qBAAW,EAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC1C,IAAA,0BAAQ,GAAE;IACV,IAAA,wBAAM,EAAC,CAAC,EAAE,GAAG,CAAC;;+CACG;AAGlB;IADC,IAAA,qBAAW,EAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;;+CACF"} \ No newline at end of file +{"version":3,"file":"create-user.dto.js","sourceRoot":"","sources":["../../../../../src/modules/identity/presentation/dto/create-user.dto.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qDAAgG;AAChG,6CAAmE;AAEnE,MAAa,aAAa;IAIxB,QAAQ,CAAU;IAIlB,KAAK,CAAU;IAQf,YAAY,CAAU;IAMtB,WAAW,CAAU;CACtB;AAvBD,sCAuBC;AAnBC;IAHC,IAAA,qBAAW,EAAC,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;IACpC,IAAA,0BAAQ,GAAE;IACV,IAAA,4BAAU,GAAE;;+CACK;AAIlB;IAFC,IAAA,qBAAW,EAAC,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC5C,IAAA,yBAAO,GAAE;;4CACK;AAQf;IAJC,IAAA,6BAAmB,EAAC,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;IAC7C,IAAA,4BAAU,GAAE;IACZ,IAAA,uBAAK,GAAE;IACP,IAAA,qBAAG,EAAC,CAAC,CAAC;;mDACe;AAMtB;IAJC,IAAA,6BAAmB,EAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IACnC,IAAA,4BAAU,GAAE;IACZ,IAAA,uBAAK,GAAE;IACP,IAAA,qBAAG,EAAC,CAAC,CAAC;;kDACc"} \ No newline at end of file diff --git a/dist/modules/identity/presentation/dto/update-user.dto.js b/dist/modules/identity/presentation/dto/update-user.dto.js index 1a12e5c..93970ca 100644 --- a/dist/modules/identity/presentation/dto/update-user.dto.js +++ b/dist/modules/identity/presentation/dto/update-user.dto.js @@ -17,8 +17,9 @@ const class_validator_1 = require("class-validator"); class UpdateUserDto extends (0, mapped_types_1.PartialType)(create_user_dto_1.CreateUserDto) { name; email; - password; metadata; + storageQuota; + storageUsed; } exports.UpdateUserDto = UpdateUserDto; __decorate([ @@ -33,15 +34,23 @@ __decorate([ (0, class_validator_1.IsEmail)(), __metadata("design:type", String) ], UpdateUserDto.prototype, "email", void 0); -__decorate([ - (0, swagger_1.ApiPropertyOptional)(), - (0, class_validator_1.IsOptional)(), - (0, class_validator_1.Length)(8, 128), - __metadata("design:type", String) -], UpdateUserDto.prototype, "password", void 0); __decorate([ (0, swagger_1.ApiPropertyOptional)(), (0, class_validator_1.IsOptional)(), __metadata("design:type", Object) ], UpdateUserDto.prototype, "metadata", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ example: 10737418240 }), + (0, class_validator_1.IsOptional)(), + (0, class_validator_1.IsInt)(), + (0, class_validator_1.Min)(0), + __metadata("design:type", Number) +], UpdateUserDto.prototype, "storageQuota", void 0); +__decorate([ + (0, swagger_1.ApiPropertyOptional)({ example: 0 }), + (0, class_validator_1.IsOptional)(), + (0, class_validator_1.IsInt)(), + (0, class_validator_1.Min)(0), + __metadata("design:type", Number) +], UpdateUserDto.prototype, "storageUsed", void 0); //# sourceMappingURL=update-user.dto.js.map \ No newline at end of file diff --git a/dist/modules/identity/presentation/dto/update-user.dto.js.map b/dist/modules/identity/presentation/dto/update-user.dto.js.map index 1d3d581..5e8a806 100644 --- a/dist/modules/identity/presentation/dto/update-user.dto.js.map +++ b/dist/modules/identity/presentation/dto/update-user.dto.js.map @@ -1 +1 @@ -{"version":3,"file":"update-user.dto.js","sourceRoot":"","sources":["../../../../../src/modules/identity/presentation/dto/update-user.dto.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,uDAAmD;AACnD,uDAAkD;AAClD,6CAAsD;AACtD,qDAAwE;AAExE,MAAa,aAAc,SAAQ,IAAA,0BAAW,EAAC,+BAAa,CAAC;IAI3D,IAAI,CAAU;IAKd,KAAK,CAAU;IAKf,QAAQ,CAAU;IAIlB,QAAQ,CAAuB;CAChC;AAnBD,sCAmBC;AAfC;IAHC,IAAA,6BAAmB,GAAE;IACrB,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,GAAE;;2CACG;AAKd;IAHC,IAAA,6BAAmB,GAAE;IACrB,IAAA,4BAAU,GAAE;IACZ,IAAA,yBAAO,GAAE;;4CACK;AAKf;IAHC,IAAA,6BAAmB,GAAE;IACrB,IAAA,4BAAU,GAAE;IACZ,IAAA,wBAAM,EAAC,CAAC,EAAE,GAAG,CAAC;;+CACG;AAIlB;IAFC,IAAA,6BAAmB,GAAE;IACrB,IAAA,4BAAU,GAAE;;+CACkB"} \ No newline at end of file +{"version":3,"file":"update-user.dto.js","sourceRoot":"","sources":["../../../../../src/modules/identity/presentation/dto/update-user.dto.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,uDAAmD;AACnD,uDAAkD;AAClD,6CAAsD;AACtD,qDAAoF;AAEpF,MAAa,aAAc,SAAQ,IAAA,0BAAW,EAAC,+BAAa,CAAC;IAI3D,IAAI,CAAU;IAKd,KAAK,CAAU;IAMf,QAAQ,CAAuB;IAM/B,YAAY,CAAU;IAMtB,WAAW,CAAU;CACtB;AA5BD,sCA4BC;AAxBC;IAHC,IAAA,6BAAmB,GAAE;IACrB,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,GAAE;;2CACG;AAKd;IAHC,IAAA,6BAAmB,GAAE;IACrB,IAAA,4BAAU,GAAE;IACZ,IAAA,yBAAO,GAAE;;4CACK;AAMf;IAFC,IAAA,6BAAmB,GAAE;IACrB,IAAA,4BAAU,GAAE;;+CACkB;AAM/B;IAJC,IAAA,6BAAmB,EAAC,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;IAC7C,IAAA,4BAAU,GAAE;IACZ,IAAA,uBAAK,GAAE;IACP,IAAA,qBAAG,EAAC,CAAC,CAAC;;mDACe;AAMtB;IAJC,IAAA,6BAAmB,EAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IACnC,IAAA,4BAAU,GAAE;IACZ,IAAA,uBAAK,GAAE;IACP,IAAA,qBAAG,EAAC,CAAC,CAAC;;kDACc"} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 8a7bebd..fd77f61 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4644,7 +4644,6 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, "hasInstallScript": true, "optional": true, "os": [ diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 8483a28..84c1049 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -1,6 +1,3 @@ -// Prisma schema -// Basic User model for RayLab Core - generator client { provider = "prisma-client-js" } @@ -10,16 +7,38 @@ datasource db { url = env("DATABASE_URL") } +enum UserRoleSource { + AUTHENTIK + SYSTEM +} + model User { - id String @id @default(uuid()) - name String - email String @unique - password String - status String @default("ACTIVE") - metadata Json? - created_at DateTime @default(now()) - updated_at DateTime @updatedAt - deleted_at DateTime? + id String @id @default(uuid()) + authentikId String? @unique + authentikUserId String? @unique + authentikSubject String? @unique + username String? @unique + email String? @unique + name String? + picture String? + isActive Boolean @default(true) + deletedAt DateTime? + lastSeenAt DateTime? + lastSyncedAt DateTime? + syncStatus String? + storageQuota BigInt? @default(10737418240) + storageUsed BigInt? @default(0) + metadata Json? + lastGroupHash String? + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) + + userRoles UserRole[] + userPermissions UserPermission[] + mediaObjects MediaObject[] + auditLogs AuditLog[] @relation("AuditUser") + debtTransactionsCreated DebtTransaction[] @relation("createdBy") + debtGroupMemberships DebtGroupMember[] } model ServiceAccount { @@ -32,6 +51,211 @@ model ServiceAccount { status String @default("ACTIVE") metadata Json? created_at DateTime @default(now()) - updated_at DateTime @updatedAt + updated_at DateTime @default(now()) deleted_at DateTime? } + + +model Role { + id String @id @default(uuid()) + code String @unique + name String + displayName String? + description String? + isDefault Boolean @default(false) + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) + + permissions RolePermission[] + users UserRole[] + authGroupRoleMappings AuthGroupRoleMapping[] +} + +model Permission { + id String @id @default(uuid()) + code String @unique + name String + displayName String? + description String? + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) + + roles RolePermission[] + users UserPermission[] +} + +model RolePermission { + id String @id @default(uuid()) + roleId String + permissionId String + createdAt DateTime @default(now()) + + role Role @relation(fields: [roleId], references: [id]) + permission Permission @relation(fields: [permissionId], references: [id]) + + @@unique([roleId, permissionId]) + @@index([roleId]) + @@index([permissionId]) +} + +model UserPermission { + id String @id @default(uuid()) + userId String + permissionId String + assignedBy String? + createdAt DateTime @default(now()) + + user User @relation(fields: [userId], references: [id]) + permission Permission @relation(fields: [permissionId], references: [id]) + + @@unique([userId, permissionId]) + @@index([userId]) + @@index([permissionId]) +} + +model UserRole { + id String @id @default(uuid()) + userId String + roleId String + source UserRoleSource @default(AUTHENTIK) + syncedAt DateTime @default(now()) + createdAt DateTime @default(now()) + + user User @relation(fields: [userId], references: [id]) + role Role @relation(fields: [roleId], references: [id]) + + @@unique([userId, roleId]) + @@index([userId]) + @@index([roleId]) +} + +model AuthGroupRoleMapping { + id String @id @default(uuid()) + authGroup String + roleId String + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) + + role Role @relation(fields: [roleId], references: [id]) +} + +model AuditLog { + id String @id @default(uuid()) + userId String? + action String + resource String? + resourceId String? + details Json? + createdAt DateTime @default(now()) + + user User? @relation("AuditUser", fields: [userId], references: [id]) + + @@index([userId]) + @@index([action]) +} + +model ScheduledJob { + id String @id @default(uuid()) + name String + payload Json? + cron String? + runAt DateTime? + status String @default("pending") + attempts Int @default(0) + lastRunAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) +} + +model MediaObject { + id String @id @default(uuid()) + ownerUserId String? + storageKey String + filename String? + mimeType String? + size BigInt? + isPublic Boolean @default(false) + metadata Json? + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) + + owner User? @relation(fields: [ownerUserId], references: [id]) + + @@index([ownerUserId]) + @@index([storageKey]) +} + +model Application { + id String @id @default(uuid()) + code String @unique + name String + description String? + icon String? + url String? + applicationsClaim String @unique + isActive Boolean @default(true) + displayOrder Int @default(0) + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) +} + +// Debt models used by bot-debt module +model DebtGroup { + id String @id @default(uuid()) + name String + ownerId String + publicId String @unique + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) + + members DebtGroupMember[] + people DebtPerson[] + transactions DebtTransaction[] +} + +model DebtGroupMember { + id String @id @default(uuid()) + groupId String + userId String + createdAt DateTime @default(now()) + + group DebtGroup @relation(fields: [groupId], references: [id]) + user User @relation(fields: [userId], references: [id]) + + @@unique([groupId, userId], name: "groupId_userId") +} + +model DebtPerson { + id String @id @default(uuid()) + groupId String + name String + isDeleted Boolean @default(false) + createdAt DateTime @default(now()) + + group DebtGroup @relation(fields: [groupId], references: [id]) + fromTransactions DebtTransaction[] @relation("fromPerson") + toTransactions DebtTransaction[] @relation("toPerson") +} + +model DebtTransaction { + id String @id @default(uuid()) + groupId String + fromPersonId String + toPersonId String + amount BigInt + type String + description String? + transactionDate DateTime + createdByUserId String + requestId String? + createdAt DateTime @default(now()) + + group DebtGroup @relation(fields: [groupId], references: [id]) + fromPerson DebtPerson @relation("fromPerson", fields: [fromPersonId], references: [id]) + toPerson DebtPerson @relation("toPerson", fields: [toPersonId], references: [id]) + createdByUser User @relation("createdBy", fields: [createdByUserId], references: [id]) + + @@index([groupId]) + @@index([requestId]) +} + diff --git a/src/modules/identity/application/handlers/create-user.handler.ts b/src/modules/identity/application/handlers/create-user.handler.ts index b2eb623..7dcb00d 100644 --- a/src/modules/identity/application/handlers/create-user.handler.ts +++ b/src/modules/identity/application/handlers/create-user.handler.ts @@ -1,41 +1,12 @@ -import { - Injectable, - ConflictException, -} from '@nestjs/common'; - -import * as bcrypt from 'bcrypt'; +import { Injectable, BadRequestException } from '@nestjs/common'; import { CreateUserDto } from '../../presentation/dto/create-user.dto'; -import { User } from '../../domain/entities/user.entity'; -import { UserRepository } from '../../domain/repositories/user.repository.interface'; @Injectable() export class CreateUserHandler { - constructor( - private readonly userRepository: UserRepository, - ) {} + constructor() {} - async execute(dto: CreateUserDto): Promise { - const exists = await this.userRepository.existsByEmail(dto.email); - - if (exists) { - throw new ConflictException('Email already exists.'); - } - - const saltRounds = parseInt(process.env.BCRYPT_SALT_ROUNDS ?? '10', 10); - const hashedPassword = await bcrypt.hash(dto.password, saltRounds); - - const user = User.create({ - name: dto.name, - email: dto.email, - password: hashedPassword, - metadata: dto.metadata, - }); - - await this.userRepository.create(user); - - // TODO: - // this.eventDispatcher.publish(new UserCreatedEvent(user)); - - return user; + async execute(dto: CreateUserDto): Promise { + // Legacy handler - creation via this path is deprecated. Use the new handlers under application/handlers/user. + throw new BadRequestException('Deprecated handler. User creation via this endpoint is not supported.'); } } \ No newline at end of file diff --git a/src/modules/identity/application/handlers/update-user.handler.ts b/src/modules/identity/application/handlers/update-user.handler.ts index e29afb7..1299e57 100644 --- a/src/modules/identity/application/handlers/update-user.handler.ts +++ b/src/modules/identity/application/handlers/update-user.handler.ts @@ -1,58 +1,12 @@ -import { - Injectable, - ConflictException, - NotFoundException, -} from '@nestjs/common'; - -import * as bcrypt from 'bcrypt'; +import { Injectable, BadRequestException } from '@nestjs/common'; import { UpdateUserDto } from '../../presentation/dto/update-user.dto'; -import { UserRepository } from '../../domain/repositories/user.repository.interface'; -import { User } from '../../domain/entities/user.entity'; @Injectable() export class UpdateUserHandler { - constructor( - private readonly userRepository: UserRepository, - ) {} + constructor() {} - async execute( - id: string, - dto: UpdateUserDto, - ): Promise { - const user = await this.userRepository.findById(id); - - if (!user) { - throw new NotFoundException('User not found.'); - } - - if ( - dto.email && - dto.email !== user.email - ) { - const exists = - await this.userRepository.existsByEmail(dto.email); - - if (exists) { - throw new ConflictException( - 'Email already exists.', - ); - } - - user.changeEmail(dto.email); - } - - if (dto.name) { - user.changeName(dto.name); - } - - if (dto.password) { - const saltRounds = parseInt(process.env.BCRYPT_SALT_ROUNDS ?? '10', 10); - const hashedPassword = await bcrypt.hash(dto.password, saltRounds); - user.changePassword(hashedPassword); - } - - await this.userRepository.update(user); - - return user; + async execute(id: string, dto: UpdateUserDto): Promise { + // Legacy handler - deprecated. Use new handlers under application/handlers/user. + throw new BadRequestException('Deprecated handler.'); } } \ No newline at end of file diff --git a/src/modules/identity/domain/entities/user.entity.ts b/src/modules/identity/domain/entities/user.entity.ts index 4ee0de5..fdf6108 100644 --- a/src/modules/identity/domain/entities/user.entity.ts +++ b/src/modules/identity/domain/entities/user.entity.ts @@ -53,4 +53,125 @@ export class User { data.metadata, ); } +} + +export class UserData { + private constructor( + public readonly id: string, + public authentikId: string | null, + public username: string, + public email: string, + public name: string | null, + public roles: any[], + public permissions: any[], + public isActive: boolean, + public deletedAt: Date | null, + public lastSeenAt?: Date | null, + public lastSyncedAt?: Date | null, + public syncStatus?: string | null, + public storageQuota?: number | null, + public storageUsed?: number | null, + ) {} + + static create(data: { + username: string; + email?: string; + name?: string; + authentikId?: string | null; + storageQuota?: number | null; + storageUsed?: number | null; + }): UserData { + return new UserData( + crypto.randomUUID(), + data.authentikId ?? null, + data.username, + data.email ?? '', + data.name ?? data.username, + [], + [], + true, + null, + null, + null, + null, + data.storageQuota ?? null, + data.storageUsed ?? null, + ); + } + + static restore(props: { + id: string; + authentikId?: string | null; + username: string; + email: string; + name?: string | null; + roles?: any[]; + permissions?: any[]; + isActive?: boolean; + deletedAt?: Date | null; + lastSeenAt?: Date | null; + lastSyncedAt?: Date | null; + syncStatus?: string | null; + storageQuota?: number | null; + storageUsed?: number | null; + }): UserData { + return new UserData( + props.id, + props.authentikId ?? null, + props.username, + props.email, + props.name ?? props.username, + props.roles || [], + props.permissions || [], + props.isActive ?? true, + props.deletedAt ?? null, + props.lastSeenAt ?? null, + props.lastSyncedAt ?? null, + props.syncStatus ?? null, + props.storageQuota ?? null, + props.storageUsed ?? null, + ); + } + + assignRole(role: any) { + if (this.roles.some(r => r.id && r.id === role.id)) return; + this.roles.push(role); + } + + removeRole(roleId: string) { + const idx = this.roles.findIndex(r => r.id === roleId); + if (idx === -1) return; + this.roles.splice(idx, 1); + } + + assignPermission(permission: any) { + if (this.permissions.some(p => p.id && p.id === permission.id)) return; + this.permissions.push(permission); + } + + removePermission(permissionId: string) { + const idx = this.permissions.findIndex(p => p.id === permissionId); + if (idx === -1) return; + this.permissions.splice(idx, 1); + } + + changeEmail(email: string) { + this.email = email; + } + + changeUsername(username: string) { + this.username = username; + } + + touchLastSeen() { + this.lastSeenAt = new Date(); + } + + setStorageQuota(q: number) { + this.storageQuota = q; + } + + setStorageUsed(u: number) { + this.storageUsed = u; + } } \ No newline at end of file diff --git a/src/modules/identity/identity.module.ts b/src/modules/identity/identity.module.ts index d00633e..fff2293 100644 --- a/src/modules/identity/identity.module.ts +++ b/src/modules/identity/identity.module.ts @@ -2,15 +2,15 @@ import { Module } from '@nestjs/common'; import { UsersController } from './presentation/controllers/users.controller'; import { PrismaService } from '../../shared/prisma.service'; import { PrismaUserRepository } from './infrastructure/repositories/prisma-user.repository'; -import { UserRepository } from './domain/repositories/user.repository.interface'; +import { IUser } from './domain/repositories/user.interface'; import { EventDispatcher } from '../../core/events/event-dispatcher'; import { JwtAuthGuard } from '../../core/auth/guards/jwt-auth.guard'; import { JwtModule } from '@nestjs/jwt'; -import { CreateUserHandler } from './application/handlers/create-user.handler'; -import { FindUserHandler } from './application/handlers/find-user.handler'; -import { DeleteUserHandler } from './application/handlers/delete-user.handler'; -import { FindUsersHandler } from './application/handlers/find-users.handler'; -import { UpdateUserHandler } from './application/handlers/update-user.handler'; +import { CreateUserHandler } from './application/handlers/user/create-user.handler'; +import { GetUserHandler as FindUserHandler } from './application/handlers/user/get-user.handler'; +import { DeleteUserHandler } from './application/handlers/user/delete-user.handler'; +import { GetUsersHandler as FindUsersHandler } from './application/handlers/user/get-users.handler'; +import { UpdateUserHandler } from './application/handlers/user/update-user.handler'; import { PermissionGuard } from '../authorization/presentation/guards/permission.guard'; import { Reflector } from '@nestjs/core'; import { LoginHandler } from './application/handlers/login.handler'; @@ -44,11 +44,11 @@ import { ServiceAccountRepository } from './domain/repositories/service-account. JwtAuthGuard, PermissionGuard, Reflector, - PrismaService, + PrismaService, PrismaUserRepository, PrismaServiceAccountRepository, { - provide: UserRepository, + provide: IUser, useClass: PrismaUserRepository, }, { diff --git a/src/modules/identity/infrastructure/mappers/prisma-user.mapper.ts b/src/modules/identity/infrastructure/mappers/prisma-user.mapper.ts index 6c3cbc0..b2706bb 100644 --- a/src/modules/identity/infrastructure/mappers/prisma-user.mapper.ts +++ b/src/modules/identity/infrastructure/mappers/prisma-user.mapper.ts @@ -3,9 +3,9 @@ import { RoleData } from '../../domain/entities/role.entity'; import { PermissionData } from '../../domain/entities/permission.entity'; export class PrismaUserMapper { - static toDomain(model: any): UserData { - const roles: RoleData[] = (model.roles || []).map((ur: any) => { - const r = ur.role; + static toDomain(model: any): UserData { + const roles: RoleData[] = (model.userRoles || model.roles || []).map((ur: any) => { + const r = ur.role || ur.role; const permissions: PermissionData[] = (r?.permissions || []).map((rp: any) => PermissionData.restore({ id: rp.permission.id, @@ -27,21 +27,21 @@ export class PrismaUserMapper { }); }); - const permissions: PermissionData[] = (model.permissions || []).map((up: any) => + const permissions: PermissionData[] = (model.userPermissions || model.permissions || []).map((up: any) => PermissionData.restore({ - id: up.permission.id, - name: up.permission.name, - description: up.permission.description, - createdAt: up.permission.createdAt, - updatedAt: up.permission.updatedAt, + id: up.permission?.id || up.id, + name: up.permission?.name || up.name, + description: up.permission?.description || up.description, + createdAt: up.permission?.createdAt || up.createdAt, + updatedAt: up.permission?.updatedAt || up.updatedAt, }), ); - return UserData.restore({ + return UserData.restore({ id: model.id, authentikId: model.authentikUserId || model.authentikId || null, username: model.username || model.name || model.username, - email: model.email, + email: model.email, roles, permissions, isActive: model.isActive ?? true, @@ -52,13 +52,13 @@ export class PrismaUserMapper { }); } - static toPersistence(userData: UserData) { + static toPersistence(userData: UserData) { return { id: userData.id, authentikUserId: (userData as any).authentikUserId || userData.authentikId, authentikId: userData.authentikId, username: userData.username, - email: userData.email, + email: userData.email, isActive: userData.isActive, deletedAt: userData.deletedAt, lastSeenAt: userData.lastSeenAt, diff --git a/src/modules/identity/infrastructure/repositories/prisma-user.repository.ts b/src/modules/identity/infrastructure/repositories/prisma-user.repository.ts index d3e8a73..e15e1c4 100644 --- a/src/modules/identity/infrastructure/repositories/prisma-user.repository.ts +++ b/src/modules/identity/infrastructure/repositories/prisma-user.repository.ts @@ -1,72 +1,102 @@ -import { Injectable } from '@nestjs/common'; +import { Injectable, NotFoundException } from '@nestjs/common'; import { PrismaService } from '../../../../shared/prisma.service'; -import { UserRepository } from '../../domain/repositories/user.repository.interface'; -import { User } from '../../domain/entities/user.entity'; +import { IUser } from '../../domain/repositories/user.interface'; +import { UserData } from '../../domain/entities/user.entity'; import { PrismaUserMapper } from '../mappers/prisma-user.mapper'; @Injectable() -export class PrismaUserRepository implements UserRepository { +export class PrismaUserRepository implements IUser { constructor(private readonly prisma: PrismaService) {} - async findById(id: string) { - const user = await this.prisma.user.findUnique({ - where: { id }, - }); - - return PrismaUserMapper.toDomain(user); - } - - async findByEmail(email: string): Promise { - const user = await this.prisma.user.findUnique({ - where: { email }, - }); - - return PrismaUserMapper.toDomain(user); - } - - async findAll(): Promise { - const users = await this.prisma.user.findMany({ - where: { deleted_at: null }, - orderBy: { created_at: 'desc' }, - }); - - return users.map(u => PrismaUserMapper.toDomain(u)!); - } - - async create(user: User): Promise { - const created = await this.prisma.user.create({ - data: PrismaUserMapper.toPersistence(user), - }); - + async create(user: UserData): Promise { + const created = await this.prisma.user.create({ data: PrismaUserMapper.toPersistence(user) as any }); return PrismaUserMapper.toDomain(created)!; } - async update(user: User): Promise { - const updated = await this.prisma.user.update({ - where: { - id: user.id, - }, - data: PrismaUserMapper.toPersistence(user), - }); + async existsById(userId: string): Promise { + const cnt = await this.prisma.user.count({ where: { id: userId } }); + return cnt > 0; + } + async existByEmail(userEmail: string): Promise { + const u = await this.prisma.user.findFirst({ where: { email: userEmail } }); + return !!u; + } + + async getById(userId: string): Promise { + const row = await this.prisma.user.findUnique({ where: { id: userId }, include: { userRoles: { include: { role: { include: { permissions: { include: { permission: true } } } } } }, userPermissions: { include: { permission: true } } } }); + if (!row) throw new NotFoundException('User not found.'); + return PrismaUserMapper.toDomain(row)!; + } + + async getByEmail(userEmail: string): Promise { + const row = await this.prisma.user.findUnique({ where: { email: userEmail }, include: { userRoles: { include: { role: { include: { permissions: { include: { permission: true } } } } } }, userPermissions: { include: { permission: true } } } }); + if (!row) throw new NotFoundException('User not found.'); + return PrismaUserMapper.toDomain(row)!; + } + + async findByAuthentikId(authentikId: string): Promise { + const row = await this.prisma.user.findFirst({ where: { OR: [{ authentikId }, { authentikUserId: authentikId }] }, include: { userRoles: { include: { role: { include: { permissions: { include: { permission: true } } } } } }, userPermissions: { include: { permission: true } } } }); + if (!row) return null; + return PrismaUserMapper.toDomain(row)!; + } + + async update(user: UserData): Promise { + const updated = await this.prisma.user.update({ where: { id: user.id }, data: PrismaUserMapper.toPersistence(user) as any, include: { userRoles: { include: { role: { include: { permissions: { include: { permission: true } } } } } }, userPermissions: { include: { permission: true } } } }); return PrismaUserMapper.toDomain(updated)!; } - async delete(id: string) { - const user = await this.prisma.user.update({ - where: { id }, - data: { deleted_at: new Date() }, - }); - return PrismaUserMapper.toDomain(user); - } + async find(params: { page?: number; limit?: number; search?: string | null; isActive?: boolean | null; deleted?: boolean | null; roleId?: string | null; }): Promise<{ data: UserData[]; total: number }> { + const page = params.page && params.page > 0 ? params.page : 1; + const limit = params.limit && params.limit > 0 ? params.limit : 25; - async existsByEmail(email: string, excludeId?: string | null) { - const where: any = { email }; - if (excludeId) { - where.id = { not: excludeId }; + const where: any = {}; + if (params.search) { + where.OR = [ + { username: { contains: params.search, mode: 'insensitive' } }, + { name: { contains: params.search, mode: 'insensitive' } }, + { email: { contains: params.search, mode: 'insensitive' } }, + ]; } - const user = await this.prisma.user.findFirst({ where }); - return !!user; + if (params.isActive !== undefined && params.isActive !== null) { + where.isActive = params.isActive; + } + + if (params.deleted !== undefined && params.deleted !== null) { + if (params.deleted) where.deletedAt = { not: null }; + else where.deletedAt = null; + } + + if (params.roleId) { + where.userRoles = { some: { roleId: params.roleId } }; + } + + const [total, items] = await Promise.all([ + this.prisma.user.count({ where }), + this.prisma.user.findMany({ where, skip: (page - 1) * limit, take: limit, orderBy: { createdAt: 'desc' }, include: { userRoles: { include: { role: { include: { permissions: { include: { permission: true } } } } } }, userPermissions: { include: { permission: true } } } }), + ]); + + return { data: items.map(i => PrismaUserMapper.toDomain(i)!), total }; + } + + async softDelete(userId: string): Promise { + await this.prisma.user.update({ where: { id: userId }, data: { deletedAt: new Date() } }); + } + + async restore(userId: string): Promise { + const updated = await this.prisma.user.update({ where: { id: userId }, data: { deletedAt: null }, include: { userRoles: { include: { role: { include: { permissions: { include: { permission: true } } } } } }, userPermissions: { include: { permission: true } } } }); + return PrismaUserMapper.toDomain(updated)!; + } + + async enable(userId: string): Promise { + const updated = await this.prisma.user.update({ where: { id: userId }, data: { isActive: true }, include: { userRoles: { include: { role: { include: { permissions: { include: { permission: true } } } } } }, userPermissions: { include: { permission: true } } } }); + return PrismaUserMapper.toDomain(updated)!; + } + + async disable(userId: string): Promise { + const updated = await this.prisma.user.update({ where: { id: userId }, data: { isActive: false }, include: { userRoles: { include: { role: { include: { permissions: { include: { permission: true } } } } } }, userPermissions: { include: { permission: true } } } }); + return PrismaUserMapper.toDomain(updated)!; } } + diff --git a/src/modules/identity/presentation/controllers/users.controller.ts b/src/modules/identity/presentation/controllers/users.controller.ts index dd6d95c..2d91301 100644 --- a/src/modules/identity/presentation/controllers/users.controller.ts +++ b/src/modules/identity/presentation/controllers/users.controller.ts @@ -14,11 +14,11 @@ import { JwtAuthGuard } from '../../../../core/auth/guards/jwt-auth.guard'; import { PermissionGuard } from '../../../authorization/presentation/guards/permission.guard'; import { Permissions } from '../../../authorization/presentation/decorators/permission.decorator'; -import { FindUserHandler } from '../../application/handlers/find-user.handler'; -import { FindUsersHandler } from '../../application/handlers/find-users.handler'; -import { CreateUserHandler } from '../../application/handlers/create-user.handler'; -import { UpdateUserHandler } from '../../application/handlers/update-user.handler'; -import { DeleteUserHandler } from '../../application/handlers/delete-user.handler'; +import { GetUserHandler as FindUserHandler } from '../../application/handlers/user/get-user.handler'; +import { GetUsersHandler as FindUsersHandler } from '../../application/handlers/user/get-users.handler'; +import { CreateUserHandler } from '../../application/handlers/user/create-user.handler'; +import { UpdateUserHandler } from '../../application/handlers/user/update-user.handler'; +import { DeleteUserHandler } from '../../application/handlers/user/delete-user.handler'; import { CreateUserDto } from '../dto/create-user.dto'; import { UpdateUserDto } from '../dto/update-user.dto'; @@ -76,7 +76,7 @@ export class UsersController { @Permissions('USER_READ_ADMIN') @ApiOperation({ summary: 'Get All User' }) async getAll() { - const data = await this.findUsersHandler.execute(); + const data = await this.findUsersHandler.execute({}); return { success: true, diff --git a/src/types/custom.d.ts b/src/types/custom.d.ts new file mode 100644 index 0000000..7f7ea20 --- /dev/null +++ b/src/types/custom.d.ts @@ -0,0 +1,3 @@ +declare module 'jose'; +declare module 'ioredis'; +declare module 'cookie-parser';