Compare commits
1
Commits
06f4fd06ff
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8a278281ce |
Vendored
+36
@@ -10,6 +10,12 @@ exports.AppModule = void 0;
|
|||||||
const common_1 = require("@nestjs/common");
|
const common_1 = require("@nestjs/common");
|
||||||
const config_1 = require("@nestjs/config");
|
const config_1 = require("@nestjs/config");
|
||||||
const identity_module_1 = require("./modules/identity/identity.module");
|
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 {
|
let AppModule = class AppModule {
|
||||||
};
|
};
|
||||||
exports.AppModule = AppModule;
|
exports.AppModule = AppModule;
|
||||||
@@ -18,8 +24,38 @@ exports.AppModule = AppModule = __decorate([
|
|||||||
imports: [
|
imports: [
|
||||||
config_1.ConfigModule.forRoot({
|
config_1.ConfigModule.forRoot({
|
||||||
isGlobal: true,
|
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,
|
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);
|
], AppModule);
|
||||||
|
|||||||
Vendored
+1
-1
@@ -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"}
|
{"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"}
|
||||||
+96
-14
@@ -1,38 +1,120 @@
|
|||||||
"use strict";
|
"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 __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;
|
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);
|
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;
|
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;
|
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) {
|
var __metadata = (this && this.__metadata) || function (k, v) {
|
||||||
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
||||||
};
|
};
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
exports.JwtAuthGuard = void 0;
|
exports.JwtAuthGuard = void 0;
|
||||||
const common_1 = require("@nestjs/common");
|
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 {
|
let JwtAuthGuard = class JwtAuthGuard {
|
||||||
jwtService;
|
jwks = null;
|
||||||
constructor(jwtService) {
|
logger = new common_1.Logger('JwtAuthGuard');
|
||||||
this.jwtService = jwtService;
|
constructor() { }
|
||||||
}
|
|
||||||
async canActivate(context) {
|
async canActivate(context) {
|
||||||
const request = context.switchToHttp().getRequest();
|
const request = context.switchToHttp().getRequest();
|
||||||
|
let token;
|
||||||
const authHeader = request.headers.authorization;
|
const authHeader = request.headers.authorization;
|
||||||
if (!authHeader) {
|
if (authHeader) {
|
||||||
throw new common_1.UnauthorizedException('Authorization header is missing.');
|
const [type, t] = authHeader.split(' ');
|
||||||
|
if (type === 'Bearer' && t)
|
||||||
|
token = t;
|
||||||
}
|
}
|
||||||
const [type, token] = authHeader.split(' ');
|
// fallback to cookie if no Authorization header
|
||||||
if (type !== 'Bearer' || !token) {
|
if (!token) {
|
||||||
throw new common_1.UnauthorizedException('Invalid authorization header.');
|
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 {
|
try {
|
||||||
const payload = await this.jwtService.verifyAsync(token);
|
const payload = jwt.verify(token, secret);
|
||||||
request['user'] = payload;
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
catch {
|
catch (err) {
|
||||||
|
this.logger.debug(`Internal token verification failed: ${err.message}`);
|
||||||
throw new common_1.UnauthorizedException('Invalid or expired token.');
|
throw new common_1.UnauthorizedException('Invalid or expired token.');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -40,6 +122,6 @@ let JwtAuthGuard = class JwtAuthGuard {
|
|||||||
exports.JwtAuthGuard = JwtAuthGuard;
|
exports.JwtAuthGuard = JwtAuthGuard;
|
||||||
exports.JwtAuthGuard = JwtAuthGuard = __decorate([
|
exports.JwtAuthGuard = JwtAuthGuard = __decorate([
|
||||||
(0, common_1.Injectable)(),
|
(0, common_1.Injectable)(),
|
||||||
__metadata("design:paramtypes", [jwt_1.JwtService])
|
__metadata("design:paramtypes", [])
|
||||||
], JwtAuthGuard);
|
], JwtAuthGuard);
|
||||||
//# sourceMappingURL=jwt-auth.guard.js.map
|
//# sourceMappingURL=jwt-auth.guard.js.map
|
||||||
+1
-1
@@ -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"}
|
{"version":3,"file":"jwt-auth.guard.js","sourceRoot":"","sources":["../../../../src/core/auth/guards/jwt-auth.guard.ts"],"names":[],"mappings":"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"}
|
||||||
Vendored
+32
-4
@@ -1,6 +1,10 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||||
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||||
|
};
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
const common_1 = require("@nestjs/common");
|
const common_1 = require("@nestjs/common");
|
||||||
|
const cookie_parser_1 = __importDefault(require("cookie-parser"));
|
||||||
const core_1 = require("@nestjs/core");
|
const core_1 = require("@nestjs/core");
|
||||||
const config_1 = require("@nestjs/config");
|
const config_1 = require("@nestjs/config");
|
||||||
const swagger_1 = require("@nestjs/swagger");
|
const swagger_1 = require("@nestjs/swagger");
|
||||||
@@ -8,13 +12,35 @@ const app_module_1 = require("./app.module");
|
|||||||
async function bootstrap() {
|
async function bootstrap() {
|
||||||
const app = await core_1.NestFactory.create(app_module_1.AppModule);
|
const app = await core_1.NestFactory.create(app_module_1.AppModule);
|
||||||
const config = app.get(config_1.ConfigService);
|
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({
|
app.useGlobalPipes(new common_1.ValidationPipe({
|
||||||
whitelist: true,
|
whitelist: true,
|
||||||
transform: true,
|
transform: true,
|
||||||
forbidNonWhitelisted: 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';
|
const swaggerEnabled = config.get('SWAGGER_ENABLED') === 'true';
|
||||||
if (swaggerEnabled) {
|
if (swaggerEnabled) {
|
||||||
const swaggerConfig = new swagger_1.DocumentBuilder()
|
const swaggerConfig = new swagger_1.DocumentBuilder()
|
||||||
@@ -24,11 +50,13 @@ async function bootstrap() {
|
|||||||
.addBearerAuth()
|
.addBearerAuth()
|
||||||
.build();
|
.build();
|
||||||
const document = swagger_1.SwaggerModule.createDocument(app, swaggerConfig);
|
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;
|
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);
|
await app.listen(port);
|
||||||
console.log(`Server running on http://localhost:${port}`);
|
logger.log(`Server running on http://localhost:${port}`);
|
||||||
}
|
}
|
||||||
bootstrap();
|
bootstrap();
|
||||||
//# sourceMappingURL=main.js.map
|
//# sourceMappingURL=main.js.map
|
||||||
Vendored
+1
-1
@@ -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"}
|
{"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"}
|
||||||
@@ -26,8 +26,16 @@ let PermissionGuard = class PermissionGuard {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
const request = context.switchToHttp().getRequest();
|
const request = context.switchToHttp().getRequest();
|
||||||
const user = request.user;
|
const user = request.currentUser;
|
||||||
return permissions.every(permission => user.permissions.includes(permission));
|
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;
|
exports.PermissionGuard = PermissionGuard;
|
||||||
|
|||||||
@@ -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"}
|
{"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"}
|
||||||
@@ -1,79 +1,26 @@
|
|||||||
"use strict";
|
"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 __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;
|
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);
|
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;
|
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;
|
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) {
|
var __metadata = (this && this.__metadata) || function (k, v) {
|
||||||
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
||||||
};
|
};
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
exports.CreateUserHandler = void 0;
|
exports.CreateUserHandler = void 0;
|
||||||
const common_1 = require("@nestjs/common");
|
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 {
|
let CreateUserHandler = class CreateUserHandler {
|
||||||
userRepository;
|
constructor() { }
|
||||||
constructor(userRepository) {
|
|
||||||
this.userRepository = userRepository;
|
|
||||||
}
|
|
||||||
async execute(dto) {
|
async execute(dto) {
|
||||||
const exists = await this.userRepository.existsByEmail(dto.email);
|
// Legacy handler - creation via this path is deprecated. Use the new handlers under application/handlers/user.
|
||||||
if (exists) {
|
throw new common_1.BadRequestException('Deprecated handler. User creation via this endpoint is not supported.');
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
exports.CreateUserHandler = CreateUserHandler;
|
exports.CreateUserHandler = CreateUserHandler;
|
||||||
exports.CreateUserHandler = CreateUserHandler = __decorate([
|
exports.CreateUserHandler = CreateUserHandler = __decorate([
|
||||||
(0, common_1.Injectable)(),
|
(0, common_1.Injectable)(),
|
||||||
__metadata("design:paramtypes", [user_repository_interface_1.UserRepository])
|
__metadata("design:paramtypes", [])
|
||||||
], CreateUserHandler);
|
], CreateUserHandler);
|
||||||
//# sourceMappingURL=create-user.handler.js.map
|
//# sourceMappingURL=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"}
|
{"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"}
|
||||||
@@ -1,84 +1,26 @@
|
|||||||
"use strict";
|
"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 __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;
|
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);
|
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;
|
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;
|
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) {
|
var __metadata = (this && this.__metadata) || function (k, v) {
|
||||||
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
||||||
};
|
};
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
exports.UpdateUserHandler = void 0;
|
exports.UpdateUserHandler = void 0;
|
||||||
const common_1 = require("@nestjs/common");
|
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 {
|
let UpdateUserHandler = class UpdateUserHandler {
|
||||||
userRepository;
|
constructor() { }
|
||||||
constructor(userRepository) {
|
|
||||||
this.userRepository = userRepository;
|
|
||||||
}
|
|
||||||
async execute(id, dto) {
|
async execute(id, dto) {
|
||||||
const user = await this.userRepository.findById(id);
|
// Legacy handler - deprecated. Use new handlers under application/handlers/user.
|
||||||
if (!user) {
|
throw new common_1.BadRequestException('Deprecated handler.');
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
exports.UpdateUserHandler = UpdateUserHandler;
|
exports.UpdateUserHandler = UpdateUserHandler;
|
||||||
exports.UpdateUserHandler = UpdateUserHandler = __decorate([
|
exports.UpdateUserHandler = UpdateUserHandler = __decorate([
|
||||||
(0, common_1.Injectable)(),
|
(0, common_1.Injectable)(),
|
||||||
__metadata("design:paramtypes", [user_repository_interface_1.UserRepository])
|
__metadata("design:paramtypes", [])
|
||||||
], UpdateUserHandler);
|
], UpdateUserHandler);
|
||||||
//# sourceMappingURL=update-user.handler.js.map
|
//# sourceMappingURL=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"}
|
{"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"}
|
||||||
+77
-1
@@ -1,6 +1,6 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
exports.User = void 0;
|
exports.UserData = exports.User = void 0;
|
||||||
class User {
|
class User {
|
||||||
id;
|
id;
|
||||||
name;
|
name;
|
||||||
@@ -34,4 +34,80 @@ class User {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
exports.User = 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
|
//# sourceMappingURL=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"}
|
{"version":3,"file":"user.entity.js","sourceRoot":"","sources":["../../../../../src/modules/identity/domain/entities/user.entity.ts"],"names":[],"mappings":"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"}
|
||||||
@@ -3,11 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||||||
exports.UserCreatedEvent = void 0;
|
exports.UserCreatedEvent = void 0;
|
||||||
class UserCreatedEvent {
|
class UserCreatedEvent {
|
||||||
payload;
|
payload;
|
||||||
occurredAt;
|
|
||||||
name = 'UserCreated';
|
name = 'UserCreated';
|
||||||
constructor(payload, occurredAt = new Date()) {
|
occurredAt = new Date();
|
||||||
|
constructor(payload) {
|
||||||
this.payload = payload;
|
this.payload = payload;
|
||||||
this.occurredAt = occurredAt;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
exports.UserCreatedEvent = UserCreatedEvent;
|
exports.UserCreatedEvent = UserCreatedEvent;
|
||||||
|
|||||||
@@ -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"}
|
{"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"}
|
||||||
+9
-9
@@ -11,15 +11,15 @@ const common_1 = require("@nestjs/common");
|
|||||||
const users_controller_1 = require("./presentation/controllers/users.controller");
|
const users_controller_1 = require("./presentation/controllers/users.controller");
|
||||||
const prisma_service_1 = require("../../shared/prisma.service");
|
const prisma_service_1 = require("../../shared/prisma.service");
|
||||||
const prisma_user_repository_1 = require("./infrastructure/repositories/prisma-user.repository");
|
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 event_dispatcher_1 = require("../../core/events/event-dispatcher");
|
||||||
const jwt_auth_guard_1 = require("../../core/auth/guards/jwt-auth.guard");
|
const jwt_auth_guard_1 = require("../../core/auth/guards/jwt-auth.guard");
|
||||||
const jwt_1 = require("@nestjs/jwt");
|
const jwt_1 = require("@nestjs/jwt");
|
||||||
const create_user_handler_1 = require("./application/handlers/create-user.handler");
|
const create_user_handler_1 = require("./application/handlers/user/create-user.handler");
|
||||||
const find_user_handler_1 = require("./application/handlers/find-user.handler");
|
const get_user_handler_1 = require("./application/handlers/user/get-user.handler");
|
||||||
const delete_user_handler_1 = require("./application/handlers/delete-user.handler");
|
const delete_user_handler_1 = require("./application/handlers/user/delete-user.handler");
|
||||||
const find_users_handler_1 = require("./application/handlers/find-users.handler");
|
const get_users_handler_1 = require("./application/handlers/user/get-users.handler");
|
||||||
const update_user_handler_1 = require("./application/handlers/update-user.handler");
|
const update_user_handler_1 = require("./application/handlers/user/update-user.handler");
|
||||||
const permission_guard_1 = require("../authorization/presentation/guards/permission.guard");
|
const permission_guard_1 = require("../authorization/presentation/guards/permission.guard");
|
||||||
const core_1 = require("@nestjs/core");
|
const core_1 = require("@nestjs/core");
|
||||||
const login_handler_1 = require("./application/handlers/login.handler");
|
const login_handler_1 = require("./application/handlers/login.handler");
|
||||||
@@ -44,8 +44,8 @@ exports.IdentityModule = IdentityModule = __decorate([
|
|||||||
providers: [
|
providers: [
|
||||||
//#region User
|
//#region User
|
||||||
create_user_handler_1.CreateUserHandler,
|
create_user_handler_1.CreateUserHandler,
|
||||||
find_user_handler_1.FindUserHandler,
|
get_user_handler_1.GetUserHandler,
|
||||||
find_users_handler_1.FindUsersHandler,
|
get_users_handler_1.GetUsersHandler,
|
||||||
update_user_handler_1.UpdateUserHandler,
|
update_user_handler_1.UpdateUserHandler,
|
||||||
delete_user_handler_1.DeleteUserHandler,
|
delete_user_handler_1.DeleteUserHandler,
|
||||||
login_handler_1.LoginHandler,
|
login_handler_1.LoginHandler,
|
||||||
@@ -58,7 +58,7 @@ exports.IdentityModule = IdentityModule = __decorate([
|
|||||||
prisma_user_repository_1.PrismaUserRepository,
|
prisma_user_repository_1.PrismaUserRepository,
|
||||||
prisma_service_account_repository_1.PrismaServiceAccountRepository,
|
prisma_service_account_repository_1.PrismaServiceAccountRepository,
|
||||||
{
|
{
|
||||||
provide: user_repository_interface_1.UserRepository,
|
provide: user_interface_1.IUser,
|
||||||
useClass: prisma_user_repository_1.PrismaUserRepository,
|
useClass: prisma_user_repository_1.PrismaUserRepository,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
+1
-1
@@ -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"}
|
{"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"}
|
||||||
@@ -2,26 +2,64 @@
|
|||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
exports.PrismaUserMapper = void 0;
|
exports.PrismaUserMapper = void 0;
|
||||||
const user_entity_1 = require("../../domain/entities/user.entity");
|
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 {
|
class PrismaUserMapper {
|
||||||
static toDomain(model) {
|
static toDomain(model) {
|
||||||
if (!model) {
|
const roles = (model.userRoles || model.roles || []).map((ur) => {
|
||||||
return null;
|
const r = ur.role || ur.role;
|
||||||
}
|
const permissions = (r?.permissions || []).map((rp) => permission_entity_1.PermissionData.restore({
|
||||||
return user_entity_1.User.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,
|
id: model.id,
|
||||||
name: model.name,
|
authentikId: model.authentikUserId || model.authentikId || null,
|
||||||
|
username: model.username || model.name || model.username,
|
||||||
email: model.email,
|
email: model.email,
|
||||||
password: model.password,
|
roles,
|
||||||
metadata: model.metadata,
|
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 {
|
return {
|
||||||
id: user.id,
|
id: userData.id,
|
||||||
name: user.name,
|
authentikUserId: userData.authentikUserId || userData.authentikId,
|
||||||
email: user.email,
|
authentikId: userData.authentikId,
|
||||||
password: user.password,
|
username: userData.username,
|
||||||
metadata: user.metadata ?? {},
|
email: userData.email,
|
||||||
|
isActive: userData.isActive,
|
||||||
|
deletedAt: userData.deletedAt,
|
||||||
|
lastSeenAt: userData.lastSeenAt,
|
||||||
|
lastSyncedAt: userData.lastSyncedAt,
|
||||||
|
syncStatus: userData.syncStatus,
|
||||||
|
storageQuota: userData.storageQuota,
|
||||||
|
storageUsed: userData.storageUsed,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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"}
|
{"version":3,"file":"prisma-user.mapper.js","sourceRoot":"","sources":["../../../../../src/modules/identity/infrastructure/mappers/prisma-user.mapper.ts"],"names":[],"mappings":"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"}
|
||||||
+70
-41
@@ -18,54 +18,83 @@ let PrismaUserRepository = class PrismaUserRepository {
|
|||||||
constructor(prisma) {
|
constructor(prisma) {
|
||||||
this.prisma = 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) {
|
async create(user) {
|
||||||
const created = await this.prisma.user.create({
|
const created = await this.prisma.user.create({ data: prisma_user_mapper_1.PrismaUserMapper.toPersistence(user) });
|
||||||
data: prisma_user_mapper_1.PrismaUserMapper.toPersistence(user),
|
|
||||||
});
|
|
||||||
return prisma_user_mapper_1.PrismaUserMapper.toDomain(created);
|
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) {
|
async update(user) {
|
||||||
const updated = await this.prisma.user.update({
|
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 } } } });
|
||||||
where: {
|
|
||||||
id: user.id,
|
|
||||||
},
|
|
||||||
data: prisma_user_mapper_1.PrismaUserMapper.toPersistence(user),
|
|
||||||
});
|
|
||||||
return prisma_user_mapper_1.PrismaUserMapper.toDomain(updated);
|
return prisma_user_mapper_1.PrismaUserMapper.toDomain(updated);
|
||||||
}
|
}
|
||||||
async delete(id) {
|
async find(params) {
|
||||||
const user = await this.prisma.user.update({
|
const page = params.page && params.page > 0 ? params.page : 1;
|
||||||
where: { id },
|
const limit = params.limit && params.limit > 0 ? params.limit : 25;
|
||||||
data: { deleted_at: new Date() },
|
const where = {};
|
||||||
});
|
if (params.search) {
|
||||||
return prisma_user_mapper_1.PrismaUserMapper.toDomain(user);
|
where.OR = [
|
||||||
}
|
{ username: { contains: params.search, mode: 'insensitive' } },
|
||||||
async existsByEmail(email, excludeId) {
|
{ name: { contains: params.search, mode: 'insensitive' } },
|
||||||
const where = { email };
|
{ email: { contains: params.search, mode: 'insensitive' } },
|
||||||
if (excludeId) {
|
];
|
||||||
where.id = { not: excludeId };
|
|
||||||
}
|
}
|
||||||
const user = await this.prisma.user.findFirst({ where });
|
if (params.isActive !== undefined && params.isActive !== null) {
|
||||||
return !!user;
|
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;
|
exports.PrismaUserRepository = PrismaUserRepository;
|
||||||
|
|||||||
+1
-1
File diff suppressed because one or more lines are too long
@@ -18,11 +18,11 @@ const swagger_1 = require("@nestjs/swagger");
|
|||||||
const jwt_auth_guard_1 = require("../../../../core/auth/guards/jwt-auth.guard");
|
const jwt_auth_guard_1 = require("../../../../core/auth/guards/jwt-auth.guard");
|
||||||
const permission_guard_1 = require("../../../authorization/presentation/guards/permission.guard");
|
const permission_guard_1 = require("../../../authorization/presentation/guards/permission.guard");
|
||||||
const permission_decorator_1 = require("../../../authorization/presentation/decorators/permission.decorator");
|
const permission_decorator_1 = require("../../../authorization/presentation/decorators/permission.decorator");
|
||||||
const find_user_handler_1 = require("../../application/handlers/find-user.handler");
|
const get_user_handler_1 = require("../../application/handlers/user/get-user.handler");
|
||||||
const find_users_handler_1 = require("../../application/handlers/find-users.handler");
|
const get_users_handler_1 = require("../../application/handlers/user/get-users.handler");
|
||||||
const create_user_handler_1 = require("../../application/handlers/create-user.handler");
|
const create_user_handler_1 = require("../../application/handlers/user/create-user.handler");
|
||||||
const update_user_handler_1 = require("../../application/handlers/update-user.handler");
|
const update_user_handler_1 = require("../../application/handlers/user/update-user.handler");
|
||||||
const delete_user_handler_1 = require("../../application/handlers/delete-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 create_user_dto_1 = require("../dto/create-user.dto");
|
||||||
const update_user_dto_1 = require("../dto/update-user.dto");
|
const update_user_dto_1 = require("../dto/update-user.dto");
|
||||||
let UsersController = class UsersController {
|
let UsersController = class UsersController {
|
||||||
@@ -67,7 +67,7 @@ let UsersController = class UsersController {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
async getAll() {
|
async getAll() {
|
||||||
const data = await this.findUsersHandler.execute();
|
const data = await this.findUsersHandler.execute({});
|
||||||
return {
|
return {
|
||||||
success: true,
|
success: true,
|
||||||
data: this.sanitizeUser(data),
|
data: this.sanitizeUser(data),
|
||||||
@@ -142,8 +142,8 @@ exports.UsersController = UsersController = __decorate([
|
|||||||
(0, common_1.Controller)('api/v1/users'),
|
(0, common_1.Controller)('api/v1/users'),
|
||||||
(0, common_1.UseGuards)(jwt_auth_guard_1.JwtAuthGuard, permission_guard_1.PermissionGuard),
|
(0, common_1.UseGuards)(jwt_auth_guard_1.JwtAuthGuard, permission_guard_1.PermissionGuard),
|
||||||
__metadata("design:paramtypes", [create_user_handler_1.CreateUserHandler,
|
__metadata("design:paramtypes", [create_user_handler_1.CreateUserHandler,
|
||||||
find_user_handler_1.FindUserHandler,
|
get_user_handler_1.GetUserHandler,
|
||||||
find_users_handler_1.FindUsersHandler,
|
get_users_handler_1.GetUsersHandler,
|
||||||
update_user_handler_1.UpdateUserHandler,
|
update_user_handler_1.UpdateUserHandler,
|
||||||
delete_user_handler_1.DeleteUserHandler])
|
delete_user_handler_1.DeleteUserHandler])
|
||||||
], UsersController);
|
], UsersController);
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"users.controller.js","sourceRoot":"","sources":["../../../../../src/modules/identity/presentation/controllers/users.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CASwB;AACxB,6CAAwD;AAExD,gFAA2E;AAC3E,kGAA8F;AAC9F,8GAAkG;AAElG,oFAA+E;AAC/E,sFAAiF;AACjF,wFAAmF;AACnF,wFAAmF;AACnF,wFAAmF;AACnF,4DAAuD;AACvD,4DAAuD;AAKhD,IAAM,eAAe,GAArB,MAAM,eAAe;IAEP;IACA;IACA;IACA;IACA;IALnB,YACmB,iBAAoC,EACpC,eAAgC,EAChC,gBAAkC,EAClC,iBAAoC,EACpC,iBAAoC;QAJpC,sBAAiB,GAAjB,iBAAiB,CAAmB;QACpC,oBAAe,GAAf,eAAe,CAAiB;QAChC,qBAAgB,GAAhB,gBAAgB,CAAkB;QAClC,sBAAiB,GAAjB,iBAAiB,CAAmB;QACpC,sBAAiB,GAAjB,iBAAiB,CAAmB;IACpD,CAAC;IAEI,YAAY,CAAC,IAAS;QAC5B,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QACvB,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;gBAClB,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,CAAQ,CAAC;gBACvC,OAAO,IAAI,CAAC;YACd,CAAC,CAAC,CAAC;QACL,CAAC;QACD,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,IAAW,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAKK,AAAN,KAAK,CAAC,MAAM,CAAS,GAAkB;QACrC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAEvD,OAAO;YACL,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;YAC7B,IAAI,EAAE,EAAE;SACT,CAAA;IACH,CAAC;IAKK,AAAN,KAAK,CAAC,OAAO,CAAc,EAAU;QACnC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAEpD,OAAO;YACL,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;YAC7B,IAAI,EAAE,EAAE;SACT,CAAC;IACJ,CAAC;IAKK,AAAN,KAAK,CAAC,MAAM;QACV,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC;QAEnD,OAAO;YACL,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;YAC7B,IAAI,EAAE,EAAE;SACT,CAAC;IACJ,CAAC;IAKK,AAAN,KAAK,CAAC,MAAM,CAAc,EAAS,EAAU,GAAiB;QAC5D,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAE3D,OAAO;YACL,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;YAC7B,IAAI,EAAE,EAAE;SACT,CAAA;IACH,CAAC;IAKK,AAAN,KAAK,CAAC,MAAM,CAAc,EAAU;QAClC,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAEzC,OAAO;YACL,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,EAAE;SACT,CAAC;IACJ,CAAC;CACF,CAAA;AArFY,0CAAe;AAwBpB;IAHL,IAAA,aAAI,GAAE;IACN,IAAA,kCAAW,EAAC,aAAa,CAAC;IAC1B,IAAA,sBAAY,EAAC,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;IAC3B,WAAA,IAAA,aAAI,GAAE,CAAA;;qCAAM,+BAAa;;6CAQtC;AAKK;IAHL,IAAA,YAAG,EAAC,KAAK,CAAC;IACV,IAAA,kCAAW,EAAC,WAAW,CAAC;IACxB,IAAA,sBAAY,EAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC7B,WAAA,IAAA,cAAK,EAAC,IAAI,CAAC,CAAA;;;;8CAQzB;AAKK;IAHL,IAAA,YAAG,GAAE;IACL,IAAA,kCAAW,EAAC,iBAAiB,CAAC;IAC9B,IAAA,sBAAY,EAAC,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC;;;;6CASzC;AAKK;IAHL,IAAA,cAAK,EAAC,KAAK,CAAC;IACZ,IAAA,kCAAW,EAAC,aAAa,CAAC;IAC1B,IAAA,sBAAY,EAAC,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;IAC3B,WAAA,IAAA,cAAK,EAAC,IAAI,CAAC,CAAA;IAAa,WAAA,IAAA,aAAI,GAAE,CAAA;;6CAAK,+BAAa;;6CAQ7D;AAKK;IAHL,IAAA,eAAM,EAAC,KAAK,CAAC;IACb,IAAA,kCAAW,EAAC,aAAa,CAAC;IAC1B,IAAA,sBAAY,EAAC,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC;IACjC,WAAA,IAAA,cAAK,EAAC,IAAI,CAAC,CAAA;;;;6CAQxB;0BApFU,eAAe;IAH3B,IAAA,iBAAO,EAAC,OAAO,CAAC;IAChB,IAAA,mBAAU,EAAC,cAAc,CAAC;IAC1B,IAAA,kBAAS,EAAC,6BAAY,EAAE,kCAAe,CAAC;qCAGD,uCAAiB;QACnB,mCAAe;QACd,qCAAgB;QACf,uCAAiB;QACjB,uCAAiB;GAN5C,eAAe,CAqF3B"}
|
{"version":3,"file":"users.controller.js","sourceRoot":"","sources":["../../../../../src/modules/identity/presentation/controllers/users.controller.ts"],"names":[],"mappings":"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"}
|
||||||
+16
-12
@@ -13,10 +13,10 @@ exports.CreateUserDto = void 0;
|
|||||||
const class_validator_1 = require("class-validator");
|
const class_validator_1 = require("class-validator");
|
||||||
const swagger_1 = require("@nestjs/swagger");
|
const swagger_1 = require("@nestjs/swagger");
|
||||||
class CreateUserDto {
|
class CreateUserDto {
|
||||||
name;
|
username;
|
||||||
email;
|
email;
|
||||||
password;
|
storageQuota;
|
||||||
metadata;
|
storageUsed;
|
||||||
}
|
}
|
||||||
exports.CreateUserDto = CreateUserDto;
|
exports.CreateUserDto = CreateUserDto;
|
||||||
__decorate([
|
__decorate([
|
||||||
@@ -24,20 +24,24 @@ __decorate([
|
|||||||
(0, class_validator_1.IsString)(),
|
(0, class_validator_1.IsString)(),
|
||||||
(0, class_validator_1.IsNotEmpty)(),
|
(0, class_validator_1.IsNotEmpty)(),
|
||||||
__metadata("design:type", String)
|
__metadata("design:type", String)
|
||||||
], CreateUserDto.prototype, "name", void 0);
|
], CreateUserDto.prototype, "username", void 0);
|
||||||
__decorate([
|
__decorate([
|
||||||
(0, swagger_1.ApiProperty)({ example: 'user@example.com' }),
|
(0, swagger_1.ApiProperty)({ example: 'user@example.com' }),
|
||||||
(0, class_validator_1.IsEmail)(),
|
(0, class_validator_1.IsEmail)(),
|
||||||
__metadata("design:type", String)
|
__metadata("design:type", String)
|
||||||
], CreateUserDto.prototype, "email", void 0);
|
], CreateUserDto.prototype, "email", void 0);
|
||||||
__decorate([
|
__decorate([
|
||||||
(0, swagger_1.ApiProperty)({ example: 'strongpassword' }),
|
(0, swagger_1.ApiPropertyOptional)({ example: 10737418240 }),
|
||||||
(0, class_validator_1.IsString)(),
|
(0, class_validator_1.IsOptional)(),
|
||||||
(0, class_validator_1.Length)(8, 128),
|
(0, class_validator_1.IsInt)(),
|
||||||
__metadata("design:type", String)
|
(0, class_validator_1.Min)(0),
|
||||||
], CreateUserDto.prototype, "password", void 0);
|
__metadata("design:type", Number)
|
||||||
|
], CreateUserDto.prototype, "storageQuota", void 0);
|
||||||
__decorate([
|
__decorate([
|
||||||
(0, swagger_1.ApiProperty)({ required: false }),
|
(0, swagger_1.ApiPropertyOptional)({ example: 0 }),
|
||||||
__metadata("design:type", Object)
|
(0, class_validator_1.IsOptional)(),
|
||||||
], CreateUserDto.prototype, "metadata", void 0);
|
(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
|
//# sourceMappingURL=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"}
|
{"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"}
|
||||||
+16
-7
@@ -17,8 +17,9 @@ const class_validator_1 = require("class-validator");
|
|||||||
class UpdateUserDto extends (0, mapped_types_1.PartialType)(create_user_dto_1.CreateUserDto) {
|
class UpdateUserDto extends (0, mapped_types_1.PartialType)(create_user_dto_1.CreateUserDto) {
|
||||||
name;
|
name;
|
||||||
email;
|
email;
|
||||||
password;
|
|
||||||
metadata;
|
metadata;
|
||||||
|
storageQuota;
|
||||||
|
storageUsed;
|
||||||
}
|
}
|
||||||
exports.UpdateUserDto = UpdateUserDto;
|
exports.UpdateUserDto = UpdateUserDto;
|
||||||
__decorate([
|
__decorate([
|
||||||
@@ -33,15 +34,23 @@ __decorate([
|
|||||||
(0, class_validator_1.IsEmail)(),
|
(0, class_validator_1.IsEmail)(),
|
||||||
__metadata("design:type", String)
|
__metadata("design:type", String)
|
||||||
], UpdateUserDto.prototype, "email", void 0);
|
], 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([
|
__decorate([
|
||||||
(0, swagger_1.ApiPropertyOptional)(),
|
(0, swagger_1.ApiPropertyOptional)(),
|
||||||
(0, class_validator_1.IsOptional)(),
|
(0, class_validator_1.IsOptional)(),
|
||||||
__metadata("design:type", Object)
|
__metadata("design:type", Object)
|
||||||
], UpdateUserDto.prototype, "metadata", void 0);
|
], 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
|
//# sourceMappingURL=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"}
|
{"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"}
|
||||||
Generated
-1
@@ -4644,7 +4644,6 @@
|
|||||||
"version": "2.3.3",
|
"version": "2.3.3",
|
||||||
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
|
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
|
||||||
"integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
|
"integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
|
||||||
"dev": true,
|
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
|
|||||||
+237
-13
@@ -1,6 +1,3 @@
|
|||||||
// Prisma schema
|
|
||||||
// Basic User model for RayLab Core
|
|
||||||
|
|
||||||
generator client {
|
generator client {
|
||||||
provider = "prisma-client-js"
|
provider = "prisma-client-js"
|
||||||
}
|
}
|
||||||
@@ -10,16 +7,38 @@ datasource db {
|
|||||||
url = env("DATABASE_URL")
|
url = env("DATABASE_URL")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum UserRoleSource {
|
||||||
|
AUTHENTIK
|
||||||
|
SYSTEM
|
||||||
|
}
|
||||||
|
|
||||||
model User {
|
model User {
|
||||||
id String @id @default(uuid())
|
id String @id @default(uuid())
|
||||||
name String
|
authentikId String? @unique
|
||||||
email String @unique
|
authentikUserId String? @unique
|
||||||
password String
|
authentikSubject String? @unique
|
||||||
status String @default("ACTIVE")
|
username String? @unique
|
||||||
metadata Json?
|
email String? @unique
|
||||||
created_at DateTime @default(now())
|
name String?
|
||||||
updated_at DateTime @updatedAt
|
picture String?
|
||||||
deleted_at DateTime?
|
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 {
|
model ServiceAccount {
|
||||||
@@ -32,6 +51,211 @@ model ServiceAccount {
|
|||||||
status String @default("ACTIVE")
|
status String @default("ACTIVE")
|
||||||
metadata Json?
|
metadata Json?
|
||||||
created_at DateTime @default(now())
|
created_at DateTime @default(now())
|
||||||
updated_at DateTime @updatedAt
|
updated_at DateTime @default(now())
|
||||||
deleted_at DateTime?
|
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])
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,41 +1,12 @@
|
|||||||
import {
|
import { Injectable, BadRequestException } from '@nestjs/common';
|
||||||
Injectable,
|
|
||||||
ConflictException,
|
|
||||||
} from '@nestjs/common';
|
|
||||||
|
|
||||||
import * as bcrypt from 'bcrypt';
|
|
||||||
import { CreateUserDto } from '../../presentation/dto/create-user.dto';
|
import { CreateUserDto } from '../../presentation/dto/create-user.dto';
|
||||||
import { User } from '../../domain/entities/user.entity';
|
|
||||||
import { UserRepository } from '../../domain/repositories/user.repository.interface';
|
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class CreateUserHandler {
|
export class CreateUserHandler {
|
||||||
constructor(
|
constructor() {}
|
||||||
private readonly userRepository: UserRepository,
|
|
||||||
) {}
|
|
||||||
|
|
||||||
async execute(dto: CreateUserDto): Promise<User> {
|
async execute(dto: CreateUserDto): Promise<any> {
|
||||||
const exists = await this.userRepository.existsByEmail(dto.email);
|
// 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.');
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,58 +1,12 @@
|
|||||||
import {
|
import { Injectable, BadRequestException } from '@nestjs/common';
|
||||||
Injectable,
|
|
||||||
ConflictException,
|
|
||||||
NotFoundException,
|
|
||||||
} from '@nestjs/common';
|
|
||||||
|
|
||||||
import * as bcrypt from 'bcrypt';
|
|
||||||
import { UpdateUserDto } from '../../presentation/dto/update-user.dto';
|
import { UpdateUserDto } from '../../presentation/dto/update-user.dto';
|
||||||
import { UserRepository } from '../../domain/repositories/user.repository.interface';
|
|
||||||
import { User } from '../../domain/entities/user.entity';
|
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class UpdateUserHandler {
|
export class UpdateUserHandler {
|
||||||
constructor(
|
constructor() {}
|
||||||
private readonly userRepository: UserRepository,
|
|
||||||
) {}
|
|
||||||
|
|
||||||
async execute(
|
async execute(id: string, dto: UpdateUserDto): Promise<any> {
|
||||||
id: string,
|
// Legacy handler - deprecated. Use new handlers under application/handlers/user.
|
||||||
dto: UpdateUserDto,
|
throw new BadRequestException('Deprecated handler.');
|
||||||
): Promise<User> {
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -54,3 +54,124 @@ export class User {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,15 +2,15 @@ import { Module } from '@nestjs/common';
|
|||||||
import { UsersController } from './presentation/controllers/users.controller';
|
import { UsersController } from './presentation/controllers/users.controller';
|
||||||
import { PrismaService } from '../../shared/prisma.service';
|
import { PrismaService } from '../../shared/prisma.service';
|
||||||
import { PrismaUserRepository } from './infrastructure/repositories/prisma-user.repository';
|
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 { EventDispatcher } from '../../core/events/event-dispatcher';
|
||||||
import { JwtAuthGuard } from '../../core/auth/guards/jwt-auth.guard';
|
import { JwtAuthGuard } from '../../core/auth/guards/jwt-auth.guard';
|
||||||
import { JwtModule } from '@nestjs/jwt';
|
import { JwtModule } from '@nestjs/jwt';
|
||||||
import { CreateUserHandler } from './application/handlers/create-user.handler';
|
import { CreateUserHandler } from './application/handlers/user/create-user.handler';
|
||||||
import { FindUserHandler } from './application/handlers/find-user.handler';
|
import { GetUserHandler as FindUserHandler } from './application/handlers/user/get-user.handler';
|
||||||
import { DeleteUserHandler } from './application/handlers/delete-user.handler';
|
import { DeleteUserHandler } from './application/handlers/user/delete-user.handler';
|
||||||
import { FindUsersHandler } from './application/handlers/find-users.handler';
|
import { GetUsersHandler as FindUsersHandler } from './application/handlers/user/get-users.handler';
|
||||||
import { UpdateUserHandler } from './application/handlers/update-user.handler';
|
import { UpdateUserHandler } from './application/handlers/user/update-user.handler';
|
||||||
import { PermissionGuard } from '../authorization/presentation/guards/permission.guard';
|
import { PermissionGuard } from '../authorization/presentation/guards/permission.guard';
|
||||||
import { Reflector } from '@nestjs/core';
|
import { Reflector } from '@nestjs/core';
|
||||||
import { LoginHandler } from './application/handlers/login.handler';
|
import { LoginHandler } from './application/handlers/login.handler';
|
||||||
@@ -44,11 +44,11 @@ import { ServiceAccountRepository } from './domain/repositories/service-account.
|
|||||||
JwtAuthGuard,
|
JwtAuthGuard,
|
||||||
PermissionGuard,
|
PermissionGuard,
|
||||||
Reflector,
|
Reflector,
|
||||||
PrismaService,
|
PrismaService,
|
||||||
PrismaUserRepository,
|
PrismaUserRepository,
|
||||||
PrismaServiceAccountRepository,
|
PrismaServiceAccountRepository,
|
||||||
{
|
{
|
||||||
provide: UserRepository,
|
provide: IUser,
|
||||||
useClass: PrismaUserRepository,
|
useClass: PrismaUserRepository,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -3,9 +3,9 @@ import { RoleData } from '../../domain/entities/role.entity';
|
|||||||
import { PermissionData } from '../../domain/entities/permission.entity';
|
import { PermissionData } from '../../domain/entities/permission.entity';
|
||||||
|
|
||||||
export class PrismaUserMapper {
|
export class PrismaUserMapper {
|
||||||
static toDomain(model: any): UserData {
|
static toDomain(model: any): UserData {
|
||||||
const roles: RoleData[] = (model.roles || []).map((ur: any) => {
|
const roles: RoleData[] = (model.userRoles || model.roles || []).map((ur: any) => {
|
||||||
const r = ur.role;
|
const r = ur.role || ur.role;
|
||||||
const permissions: PermissionData[] = (r?.permissions || []).map((rp: any) =>
|
const permissions: PermissionData[] = (r?.permissions || []).map((rp: any) =>
|
||||||
PermissionData.restore({
|
PermissionData.restore({
|
||||||
id: rp.permission.id,
|
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({
|
PermissionData.restore({
|
||||||
id: up.permission.id,
|
id: up.permission?.id || up.id,
|
||||||
name: up.permission.name,
|
name: up.permission?.name || up.name,
|
||||||
description: up.permission.description,
|
description: up.permission?.description || up.description,
|
||||||
createdAt: up.permission.createdAt,
|
createdAt: up.permission?.createdAt || up.createdAt,
|
||||||
updatedAt: up.permission.updatedAt,
|
updatedAt: up.permission?.updatedAt || up.updatedAt,
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
|
|
||||||
return UserData.restore({
|
return UserData.restore({
|
||||||
id: model.id,
|
id: model.id,
|
||||||
authentikId: model.authentikUserId || model.authentikId || null,
|
authentikId: model.authentikUserId || model.authentikId || null,
|
||||||
username: model.username || model.name || model.username,
|
username: model.username || model.name || model.username,
|
||||||
email: model.email,
|
email: model.email,
|
||||||
roles,
|
roles,
|
||||||
permissions,
|
permissions,
|
||||||
isActive: model.isActive ?? true,
|
isActive: model.isActive ?? true,
|
||||||
@@ -52,13 +52,13 @@ export class PrismaUserMapper {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
static toPersistence(userData: UserData) {
|
static toPersistence(userData: UserData) {
|
||||||
return {
|
return {
|
||||||
id: userData.id,
|
id: userData.id,
|
||||||
authentikUserId: (userData as any).authentikUserId || userData.authentikId,
|
authentikUserId: (userData as any).authentikUserId || userData.authentikId,
|
||||||
authentikId: userData.authentikId,
|
authentikId: userData.authentikId,
|
||||||
username: userData.username,
|
username: userData.username,
|
||||||
email: userData.email,
|
email: userData.email,
|
||||||
isActive: userData.isActive,
|
isActive: userData.isActive,
|
||||||
deletedAt: userData.deletedAt,
|
deletedAt: userData.deletedAt,
|
||||||
lastSeenAt: userData.lastSeenAt,
|
lastSeenAt: userData.lastSeenAt,
|
||||||
|
|||||||
@@ -1,72 +1,102 @@
|
|||||||
import { Injectable } from '@nestjs/common';
|
import { Injectable, NotFoundException } from '@nestjs/common';
|
||||||
import { PrismaService } from '../../../../shared/prisma.service';
|
import { PrismaService } from '../../../../shared/prisma.service';
|
||||||
import { UserRepository } from '../../domain/repositories/user.repository.interface';
|
import { IUser } from '../../domain/repositories/user.interface';
|
||||||
import { User } from '../../domain/entities/user.entity';
|
import { UserData } from '../../domain/entities/user.entity';
|
||||||
import { PrismaUserMapper } from '../mappers/prisma-user.mapper';
|
import { PrismaUserMapper } from '../mappers/prisma-user.mapper';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class PrismaUserRepository implements UserRepository {
|
export class PrismaUserRepository implements IUser {
|
||||||
constructor(private readonly prisma: PrismaService) {}
|
constructor(private readonly prisma: PrismaService) {}
|
||||||
|
|
||||||
async findById(id: string) {
|
async create(user: UserData): Promise<UserData> {
|
||||||
const user = await this.prisma.user.findUnique({
|
const created = await this.prisma.user.create({ data: PrismaUserMapper.toPersistence(user) as any });
|
||||||
where: { id },
|
|
||||||
});
|
|
||||||
|
|
||||||
return PrismaUserMapper.toDomain(user);
|
|
||||||
}
|
|
||||||
|
|
||||||
async findByEmail(email: string): Promise<User | null> {
|
|
||||||
const user = await this.prisma.user.findUnique({
|
|
||||||
where: { email },
|
|
||||||
});
|
|
||||||
|
|
||||||
return PrismaUserMapper.toDomain(user);
|
|
||||||
}
|
|
||||||
|
|
||||||
async findAll(): Promise<User[]> {
|
|
||||||
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<User> {
|
|
||||||
const created = await this.prisma.user.create({
|
|
||||||
data: PrismaUserMapper.toPersistence(user),
|
|
||||||
});
|
|
||||||
|
|
||||||
return PrismaUserMapper.toDomain(created)!;
|
return PrismaUserMapper.toDomain(created)!;
|
||||||
}
|
}
|
||||||
|
|
||||||
async update(user: User): Promise<User> {
|
async existsById(userId: string): Promise<boolean> {
|
||||||
const updated = await this.prisma.user.update({
|
const cnt = await this.prisma.user.count({ where: { id: userId } });
|
||||||
where: {
|
return cnt > 0;
|
||||||
id: user.id,
|
}
|
||||||
},
|
|
||||||
data: PrismaUserMapper.toPersistence(user),
|
|
||||||
});
|
|
||||||
|
|
||||||
|
async existByEmail(userEmail: string): Promise<boolean> {
|
||||||
|
const u = await this.prisma.user.findFirst({ where: { email: userEmail } });
|
||||||
|
return !!u;
|
||||||
|
}
|
||||||
|
|
||||||
|
async getById(userId: string): Promise<UserData> {
|
||||||
|
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<UserData> {
|
||||||
|
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<UserData | null> {
|
||||||
|
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<UserData> {
|
||||||
|
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)!;
|
return PrismaUserMapper.toDomain(updated)!;
|
||||||
}
|
}
|
||||||
|
|
||||||
async delete(id: string) {
|
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 user = await this.prisma.user.update({
|
const page = params.page && params.page > 0 ? params.page : 1;
|
||||||
where: { id },
|
const limit = params.limit && params.limit > 0 ? params.limit : 25;
|
||||||
data: { deleted_at: new Date() },
|
|
||||||
});
|
|
||||||
return PrismaUserMapper.toDomain(user);
|
|
||||||
}
|
|
||||||
|
|
||||||
async existsByEmail(email: string, excludeId?: string | null) {
|
const where: any = {};
|
||||||
const where: any = { email };
|
if (params.search) {
|
||||||
if (excludeId) {
|
where.OR = [
|
||||||
where.id = { not: excludeId };
|
{ 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 });
|
if (params.isActive !== undefined && params.isActive !== null) {
|
||||||
return !!user;
|
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<void> {
|
||||||
|
await this.prisma.user.update({ where: { id: userId }, data: { deletedAt: new Date() } });
|
||||||
|
}
|
||||||
|
|
||||||
|
async restore(userId: string): Promise<UserData> {
|
||||||
|
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<UserData> {
|
||||||
|
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<UserData> {
|
||||||
|
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)!;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -14,11 +14,11 @@ import { JwtAuthGuard } from '../../../../core/auth/guards/jwt-auth.guard';
|
|||||||
import { PermissionGuard } from '../../../authorization/presentation/guards/permission.guard';
|
import { PermissionGuard } from '../../../authorization/presentation/guards/permission.guard';
|
||||||
import { Permissions } from '../../../authorization/presentation/decorators/permission.decorator';
|
import { Permissions } from '../../../authorization/presentation/decorators/permission.decorator';
|
||||||
|
|
||||||
import { FindUserHandler } from '../../application/handlers/find-user.handler';
|
import { GetUserHandler as FindUserHandler } from '../../application/handlers/user/get-user.handler';
|
||||||
import { FindUsersHandler } from '../../application/handlers/find-users.handler';
|
import { GetUsersHandler as FindUsersHandler } from '../../application/handlers/user/get-users.handler';
|
||||||
import { CreateUserHandler } from '../../application/handlers/create-user.handler';
|
import { CreateUserHandler } from '../../application/handlers/user/create-user.handler';
|
||||||
import { UpdateUserHandler } from '../../application/handlers/update-user.handler';
|
import { UpdateUserHandler } from '../../application/handlers/user/update-user.handler';
|
||||||
import { DeleteUserHandler } from '../../application/handlers/delete-user.handler';
|
import { DeleteUserHandler } from '../../application/handlers/user/delete-user.handler';
|
||||||
import { CreateUserDto } from '../dto/create-user.dto';
|
import { CreateUserDto } from '../dto/create-user.dto';
|
||||||
import { UpdateUserDto } from '../dto/update-user.dto';
|
import { UpdateUserDto } from '../dto/update-user.dto';
|
||||||
|
|
||||||
@@ -76,7 +76,7 @@ export class UsersController {
|
|||||||
@Permissions('USER_READ_ADMIN')
|
@Permissions('USER_READ_ADMIN')
|
||||||
@ApiOperation({ summary: 'Get All User' })
|
@ApiOperation({ summary: 'Get All User' })
|
||||||
async getAll() {
|
async getAll() {
|
||||||
const data = await this.findUsersHandler.execute();
|
const data = await this.findUsersHandler.execute({});
|
||||||
|
|
||||||
return {
|
return {
|
||||||
success: true,
|
success: true,
|
||||||
|
|||||||
Vendored
+3
@@ -0,0 +1,3 @@
|
|||||||
|
declare module 'jose';
|
||||||
|
declare module 'ioredis';
|
||||||
|
declare module 'cookie-parser';
|
||||||
Reference in New Issue
Block a user