@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
JavaScript
;
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