UNPKG

@bitwild/rockets-auth

Version:

Rockets Auth - Complete authentication and authorization solution for NestJS with JWT, OAuth, OTP, role-based access control, and more

282 lines 14.7 kB
"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; var __param = (this && this.__param) || function (paramIndex, decorator) { return function (target, key) { decorator(target, key, paramIndex); } }; var __rest = (this && this.__rest) || function (s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var RocketsAuthSignUpModule_1; Object.defineProperty(exports, "__esModule", { value: true }); exports.RocketsAuthSignUpModule = void 0; const nestjs_crud_1 = require("@concepta/nestjs-crud"); const nestjs_password_1 = require("@concepta/nestjs-password"); const common_1 = require("@nestjs/common"); const swagger_1 = require("@nestjs/swagger"); const rockets_auth_constants_1 = require("../../../shared/constants/rockets-auth.constants"); const rockets_auth_user_create_dto_1 = require("../dto/rockets-auth-user-create.dto"); const rockets_auth_user_dto_1 = require("../dto/rockets-auth-user.dto"); const error_logging_helper_1 = require("../../../shared/utils/error-logging.helper"); const crud_relations_decorator_1 = require("@concepta/nestjs-crud/dist/crud/decorators/routes/crud-relations.decorator"); const nestjs_authentication_1 = require("@concepta/nestjs-authentication"); const nestjs_common_1 = require("@concepta/nestjs-common"); const nestjs_user_1 = require("@concepta/nestjs-user"); const user_metadata_constants_1 = require("../constants/user-metadata.constants"); const rockets_auth_user_metadata_dto_1 = require("../dto/rockets-auth-user-metadata.dto"); const rockets_auth_user_metadata_model_service_1 = require("../services/rockets-auth-user-metadata.model.service"); const nestjs_typeorm_ext_1 = require("@concepta/nestjs-typeorm-ext"); const nestjs_role_1 = require("@concepta/nestjs-role"); let RocketsAuthSignUpModule = RocketsAuthSignUpModule_1 = class RocketsAuthSignUpModule { static register(admin) { var _a; const ModelDto = admin.model || rockets_auth_user_dto_1.RocketsAuthUserDto; const CreateDto = ((_a = admin.dto) === null || _a === void 0 ? void 0 : _a.createOne) || rockets_auth_user_create_dto_1.RocketsAuthUserCreateDto; let UserMetadataCrudService = class UserMetadataCrudService extends nestjs_crud_1.CrudService { constructor(metadataAdapter) { super(metadataAdapter); } }; UserMetadataCrudService = __decorate([ (0, common_1.Injectable)(), __param(0, (0, common_1.Inject)(rockets_auth_constants_1.ROCKETS_SIGNUP_USER_METADATA_ADAPTER)), __metadata("design:paramtypes", [nestjs_crud_1.CrudAdapter]) ], UserMetadataCrudService); const builder = new nestjs_crud_1.ConfigurableCrudBuilder({ service: { adapter: admin.adapter, injectionToken: rockets_auth_constants_1.SIGNUP_USER_CRUD_SERVICE_TOKEN, }, controller: { path: admin.path || 'signup', model: { type: ModelDto, }, extraDecorators: [ (0, swagger_1.ApiTags)('auth'), (0, crud_relations_decorator_1.CrudRelations)({ rootKey: 'id', relations: [ { join: 'LEFT', cardinality: 'one', service: UserMetadataCrudService, property: 'userMetadata', primaryKey: 'id', foreignKey: 'userId', }, ], }), ], }, createOne: { dto: CreateDto, }, }); const { ConfigurableControllerClass, CrudCreateOne } = builder.build(); let SignupCrudService = class SignupCrudService extends nestjs_crud_1.CrudService { constructor(crudAdapter, relationRegistry, userModelService, passwordCreationService, metadataService, roleModelService, roleService, settings) { super(crudAdapter, relationRegistry); this.crudAdapter = crudAdapter; this.relationRegistry = relationRegistry; this.userModelService = userModelService; this.passwordCreationService = passwordCreationService; this.metadataService = metadataService; this.roleModelService = roleModelService; this.roleService = roleService; this.settings = settings; } async createOne(req, dto) { const typedDto = dto; if (typedDto.username || typedDto.email) { const existingUser = await this.userModelService.find({ where: [ ...(typedDto.username ? [{ username: typedDto.username }] : []), ...(typedDto.email ? [{ email: typedDto.email }] : []), ], }); if (existingUser === null || existingUser === void 0 ? void 0 : existingUser.length) { throw new common_1.BadRequestException('User with this username or email already exists'); } } let passwordHash = {}; if (typedDto.password) { passwordHash = await this.passwordCreationService.create(typedDto.password); } const { userMetadata: nested } = typedDto, rootDto = __rest(typedDto, ["userMetadata"]); const created = await super.createOne(req, Object.assign(Object.assign({}, rootDto), passwordHash)); if (nested) { try { await this.metadataService.createOrUpdate(created.id, nested); } catch (metadataError) { console.warn('Failed to create user metadata during signup:', metadataError); } } if (this.settings.role.defaultUserRoleName) { try { const defaultRoles = await this.roleModelService.find({ where: { name: this.settings.role.defaultUserRoleName }, }); if (defaultRoles && defaultRoles.length > 0) { await this.roleService.assignRole({ assignment: 'user', assignee: { id: created.id }, role: { id: defaultRoles[0].id }, }); } } catch (error) { const { errorMessage } = (0, error_logging_helper_1.getErrorDetails)(error); console.warn(`Failed to assign default role: ${errorMessage}`); } } return created; } }; SignupCrudService = __decorate([ __param(0, (0, common_1.Inject)(admin.adapter)), __param(1, (0, common_1.Inject)((0, common_1.forwardRef)(() => rockets_auth_constants_1.ROCKETS_SIGNUP_USER_RELATION_REGISTRY))), __param(2, (0, common_1.Inject)(nestjs_user_1.UserModelService)), __param(3, (0, common_1.Inject)(nestjs_password_1.PasswordCreationService)), __param(4, (0, common_1.Inject)(user_metadata_constants_1.AuthUserMetadataModelService)), __param(5, (0, common_1.Inject)(nestjs_role_1.RoleModelService)), __param(6, (0, common_1.Inject)(nestjs_role_1.RoleService)), __param(7, (0, common_1.Inject)(rockets_auth_constants_1.ROCKETS_AUTH_MODULE_OPTIONS_DEFAULT_SETTINGS_TOKEN)), __metadata("design:paramtypes", [nestjs_crud_1.CrudAdapter, nestjs_crud_1.CrudRelationRegistry, nestjs_user_1.UserModelService, nestjs_password_1.PasswordCreationService, rockets_auth_user_metadata_model_service_1.GenericUserMetadataModelService, nestjs_role_1.RoleModelService, nestjs_role_1.RoleService, Object]) ], SignupCrudService); class SignupCrudController extends ConfigurableControllerClass { async createOne(crudRequest, dto) { const pipe = new common_1.ValidationPipe({ transform: true, forbidUnknownValues: true, }); await pipe.transform(dto, { type: 'body', metatype: CreateDto }); return await super.createOne(crudRequest, dto); } } __decorate([ (0, nestjs_authentication_1.AuthPublic)(), (0, swagger_1.ApiOperation)({ summary: 'Create a new user account', description: 'Registers a new user in the system with email, username, password and optional metadata', }), (0, swagger_1.ApiBody)({ type: CreateDto, description: 'User registration information', examples: { standard: { value: { email: 'user@example.com', username: 'user@example.com', password: 'StrongP@ssw0rd', active: true, }, summary: 'Standard user registration', }, withMetadata: { value: { email: 'user@example.com', username: 'user@example.com', password: 'StrongP@ssw0rd', active: true, userMetadata: { firstName: 'John', lastName: 'Doe', phone: '+1234567890', }, }, summary: 'User registration with metadata', }, }, }), (0, swagger_1.ApiCreatedResponse)({ description: 'User created successfully', type: ModelDto, }), CrudCreateOne, __metadata("design:type", Function), __metadata("design:paramtypes", [Object, void 0]), __metadata("design:returntype", Promise) ], SignupCrudController.prototype, "createOne", null); return { module: RocketsAuthSignUpModule_1, imports: [ ...(admin.imports || []), ...(admin.userMetadataConfig.entity ? [ nestjs_typeorm_ext_1.TypeOrmExtModule.forFeature({ [user_metadata_constants_1.AUTH_USER_METADATA_MODULE_ENTITY_KEY]: { entity: admin.userMetadataConfig.entity, }, }), ] : []), ], controllers: [SignupCrudController], providers: [ admin.adapter, admin.userMetadataConfig.adapter, { provide: rockets_auth_constants_1.ROCKETS_SIGNUP_USER_METADATA_ADAPTER, useExisting: admin.userMetadataConfig.adapter, }, { provide: user_metadata_constants_1.AuthUserMetadataModelService, useFactory: (repo) => { const { createDto, updateDto } = admin.userMetadataConfig || { createDto: rockets_auth_user_metadata_dto_1.RocketsAuthUserMetadataDto, updateDto: rockets_auth_user_metadata_dto_1.RocketsAuthUserMetadataDto, }; return new rockets_auth_user_metadata_model_service_1.GenericUserMetadataModelService(repo, createDto, updateDto); }, inject: [ (0, nestjs_common_1.getDynamicRepositoryToken)(user_metadata_constants_1.AUTH_USER_METADATA_MODULE_ENTITY_KEY), ], }, UserMetadataCrudService, { provide: rockets_auth_constants_1.ROCKETS_SIGNUP_USER_RELATION_REGISTRY, inject: [UserMetadataCrudService], useFactory: (userMetadataCrudService) => { const registry = new nestjs_crud_1.CrudRelationRegistry(); registry.register(userMetadataCrudService); return registry; }, }, SignupCrudService, { provide: rockets_auth_constants_1.SIGNUP_USER_CRUD_SERVICE_TOKEN, useClass: SignupCrudService, }, ], exports: [SignupCrudService, admin.adapter], }; } }; exports.RocketsAuthSignUpModule = RocketsAuthSignUpModule; exports.RocketsAuthSignUpModule = RocketsAuthSignUpModule = RocketsAuthSignUpModule_1 = __decorate([ (0, common_1.Module)({}) ], RocketsAuthSignUpModule); //# sourceMappingURL=rockets-auth-signup.module.js.map