This commit is contained in:
David Arranz 2024-05-27 14:01:52 +02:00
parent 27717cc9b8
commit 8e13fa18ae
7 changed files with 82 additions and 65 deletions

View File

@ -1,9 +1,7 @@
module.exports = {
jwt: {
secret_key:
"9d6c903873c341816995a8be0355c6f0d6d471fc6aedacf50790e9b1e49c45b3",
refresh_secret_key:
"3972dc40c69327b65352ed097419213b0b75561169dba562410b85660bb1f305",
secret_key: "9d6c903873c341816995a8be0355c6f0d6d471fc6aedacf50790e9b1e49c45b3",
refresh_secret_key: "3972dc40c69327b65352ed097419213b0b75561169dba562410b85660bb1f305",
token_expiration: "7d",
refresh_token_expiration: "30d",
},
@ -38,12 +36,14 @@ module.exports = {
public_url: "",
},
admin: {
name: "Administrador",
email: "darranz@rodax-software.com",
password: "123456",
},
uploads: {
imports:
process.env.UPLOAD_PATH ||
"/home/rodax/Documentos/BBDD/server/uploads/imports",
documents:
process.env.UPLOAD_PATH ||
"/home/rodax/Documentos/BBDD/server/uploads/documents",
imports: process.env.UPLOAD_PATH || "/home/rodax/Documentos/BBDD/server/uploads/imports",
documents: process.env.UPLOAD_PATH || "/home/rodax/Documentos/BBDD/server/uploads/documents",
},
};

View File

@ -1,11 +1,12 @@
import { IAdapter, RepositoryBuilder } from "@/contexts/common/domain";
import { config } from "@/config";
import { IAdapter, Password, RepositoryBuilder } from "@/contexts/common/domain";
import { Email, Name, UniqueID } from "@shared/contexts";
import { IUserRepository, User } from "../domain";
import { IUserRepository, User, UserRole } from "../domain";
export const existsUserByID = async (
id: UniqueID,
adapter: IAdapter,
repository: RepositoryBuilder<IUserRepository>,
repository: RepositoryBuilder<IUserRepository>
): Promise<boolean> => {
return await adapter
.startTransaction()
@ -15,19 +16,17 @@ export const existsUserByID = async (
export const existsUserByName = async (
name: Name,
adapter: IAdapter,
repository: RepositoryBuilder<IUserRepository>,
repository: RepositoryBuilder<IUserRepository>
): Promise<boolean> => {
return await adapter
.startTransaction()
.complete(async (t) =>
repository({ transaction: t }).existsUserWithName(name),
);
.complete(async (t) => repository({ transaction: t }).existsUserWithName(name));
};
export const findUserByID = async (
id: UniqueID,
adapter: IAdapter,
repository: RepositoryBuilder<IUserRepository>,
repository: RepositoryBuilder<IUserRepository>
): Promise<User | null> => {
return await adapter
.startTransaction()
@ -37,23 +36,42 @@ export const findUserByID = async (
export const existsUserByEmail = async (
email: Email,
adapter: IAdapter,
repository: RepositoryBuilder<IUserRepository>,
repository: RepositoryBuilder<IUserRepository>
): Promise<boolean> => {
return await adapter
.startTransaction()
.complete(async (t) =>
repository({ transaction: t }).existsUserWithEmail(email),
);
.complete(async (t) => repository({ transaction: t }).existsUserWithEmail(email));
};
export const findUserByEmail = async (
email: Email,
adapter: IAdapter,
repository: RepositoryBuilder<IUserRepository>,
repository: RepositoryBuilder<IUserRepository>
): Promise<User | null> => {
return await adapter
.startTransaction()
.complete(async (t) =>
repository({ transaction: t }).findUserByEmail(email),
);
.complete(async (t) => repository({ transaction: t }).findUserByEmail(email));
};
export const initializeAdmin = async (
adapter: IAdapter,
repository: RepositoryBuilder<IUserRepository>
) => {
return await adapter.startTransaction().complete(async (t) => {
const adminExists = await repository({ transaction: t }).existsAdminUser();
if (!adminExists) {
const admin = User.create(
{
name: Name.create(config.admin.name).object,
email: Email.create(config.admin.email).object,
password: Password.createFromPlainTextPassword(config.admin.password).object,
roles: [UserRole.ROLE_ADMIN],
},
UniqueID.generateNewID().object
).object;
await repository({ transaction: t }).create(admin);
console.log("Usuario administrador creado");
}
});
};

View File

@ -1,11 +1,5 @@
import { IRepository } from "@/contexts/common/domain";
import {
Email,
ICollection,
IQueryCriteria,
Name,
UniqueID,
} from "@shared/contexts";
import { Email, ICollection, IQueryCriteria, Name, UniqueID } from "@shared/contexts";
import { User } from "../entities";
export interface IUserRepository extends IRepository<any> {
@ -18,6 +12,7 @@ export interface IUserRepository extends IRepository<any> {
removeById(id: UniqueID): Promise<void>;
existsAdminUser(): Promise<boolean>;
existsUserWithId(id: UniqueID): Promise<boolean>;
existsUserWithName(name: Name): Promise<boolean>;
existsUserWithEmail(email: Email): Promise<boolean>;

View File

@ -1,15 +1,6 @@
import {
ISequelizeAdapter,
SequelizeRepository,
} from "@/contexts/common/infrastructure/sequelize";
import {
Email,
ICollection,
IQueryCriteria,
Name,
UniqueID,
} from "@shared/contexts";
import { Transaction } from "sequelize";
import { ISequelizeAdapter, SequelizeRepository } from "@/contexts/common/infrastructure/sequelize";
import { Email, ICollection, IQueryCriteria, Name, UniqueID } from "@shared/contexts";
import { Op, Transaction } from "sequelize";
import { User } from "../domain";
import { IUserRepository } from "../domain/repository";
import { IUserContext } from "./User.context";
@ -20,10 +11,7 @@ export type QueryParams = {
filters: Record<string, any>;
};
export class UserRepository
extends SequelizeRepository<User>
implements IUserRepository
{
export class UserRepository extends SequelizeRepository<User> implements IUserRepository {
protected mapper: IUserMapper;
public constructor(props: {
@ -60,11 +48,7 @@ export class UserRepository
}
public async findUserByEmail(email: Email): Promise<User | null> {
const rawUser: any = await this._getBy(
"User_Model",
"email",
email.toPrimitive(),
);
const rawUser: any = await this._getBy("User_Model", "email", email.toPrimitive());
if (!rawUser === true) {
return null;
@ -73,12 +57,10 @@ export class UserRepository
return this.mapper.mapToDomain(rawUser);
}
public async findAll(
queryCriteria?: IQueryCriteria,
): Promise<ICollection<any>> {
public async findAll(queryCriteria?: IQueryCriteria): Promise<ICollection<any>> {
const { rows, count } = await this._findAll(
"User_Model",
queryCriteria,
queryCriteria
/*{
include: [], // esto es para quitar las asociaciones al hacer la consulta
}*/
@ -91,6 +73,18 @@ export class UserRepository
return this._removeById("User_Model", id);
}
public async existsAdminUser(): Promise<boolean> {
const _model = this._adapter.getModel("User_Model");
// Verificar si el usuario administrador existe
const count: number = await _model.count({
where: { roles: { [Op.like]: ["%ROLE_ADMIN%"] } },
transaction: this._transaction,
});
return Promise.resolve(Boolean(count !== 0));
}
public async existsUserWithId(id: UniqueID): Promise<boolean> {
return this._exists("User_Model", "id", id.toPrimitive());
}

View File

@ -1,8 +1,3 @@
import { RepositoryManager } from "@/contexts/common/domain";
import { createSequelizeAdapter } from "@/contexts/common/infrastructure/sequelize";
import { UserContext } from "@/contexts/users/infrastructure/User.context";
export const createContextMiddleware = () => ({
adapter: createSequelizeAdapter(),
repositoryManager: RepositoryManager.getInstance(),
services: {},
});
export const createContextMiddleware = () => UserContext.getInstance();

View File

@ -9,6 +9,7 @@ import { trace } from "console";
import { config } from "../../config";
import { app } from "../express/app";
import { initLogger } from "../logger";
import { initializeAdminUser } from "../sequelize/initializeAdminUser";
process.env.TZ = "UTC";
Settings.defaultLocale = "es-ES";
@ -106,6 +107,10 @@ const server: http.Server = http
try {
//firebirdConn.sync().then(() => {
sequelizeConn.sync({ force: false, alter: true }).then(() => {
//
initializeAdminUser();
// Launch server
server.listen(currentState.server.port, () => {
const now = DateTime.now();

View File

@ -0,0 +1,10 @@
import { initializeAdmin } from "@/contexts/users/application/userServices";
import { UserContext } from "@/contexts/users/infrastructure/User.context";
import { registerUserRepository } from "@/contexts/users/infrastructure/User.repository";
export const initializeAdminUser = () => {
const context = UserContext.getInstance();
registerUserRepository(context);
initializeAdmin(context.adapter, context.repositoryManager.getRepository("User"));
};