import { ConflictException, forwardRef, Inject, Injectable, NotFoundException, } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { Institucion } from '../institucion/entity/institucion.entity'; import { Modulo } from './entity/modulo.entity'; import { Operador } from '../operador/entity/operador.entity'; import { InformacionModuloView } from './entity/views/informacion-modulo.view'; import { FullInformacionModuloView } from './entity/views/full-informacion-modulo.view'; import { InstitucionService } from '../institucion/institucion.service'; import { ModuloMotivoService } from '../modulo-motivo/modulo-motivo.service'; @Injectable() export class ModuloService { constructor( @InjectRepository(Modulo) private repository: Repository, @InjectRepository(InformacionModuloView) private informacionModuloView: Repository, @InjectRepository(FullInformacionModuloView) private fullInformacionModuloView: Repository, private institucionService: InstitucionService, @Inject(forwardRef(() => ModuloMotivoService)) private moduloMotivoService: ModuloMotivoService, ) {} create(admin: Operador, modulo: string): Promise<{ message: string }> { // Buscamos un registro con ese nombre en la institución del admin return this.findModulo(admin.institucion, modulo, true) .then((_) => // Creamos y guardamos un registro this.repository.save( this.repository.create({ institucion: admin.institucion, modulo, }), ), ) .then((_) => ({ message: 'Se creó correctamente un nuevo módulo.' })); } findAllActivo(id_institucion: number): Promise { return this.institucionService .findById(id_institucion) .then((institucion) => this.fullInformacionModuloView.find({ where: { activo_modulo: 1, id_institucion: institucion.id_institucion, }, }), ) .then((infoModulos) => { const modulos: Modulo[] = []; for (let i = 0; i < infoModulos.length; i++) modulos.push(this.fullViewToModulo(infoModulos[i])); return modulos; }); } findAllAdmin(operador: Operador): Promise { return this.fullInformacionModuloView .find({ where: { id_institucion: operador.institucion.id_institucion } }) .then((infoModulos) => { const modulos: Modulo[] = []; for (let i = 0; i < infoModulos.length; i++) modulos.push(this.fullViewToModulo(infoModulos[i])); return modulos; }); } findById(id_modulo: number): Promise { return this.informacionModuloView .findOne({ where: { id_modulo } }) .then((infoModulo) => { if (!infoModulo) throw new NotFoundException('No existe este id módulo.'); return this.repository.create({ id_modulo: infoModulo.id_modulo, institucion: { id_institucion: infoModulo.id_institucion }, }); }); } findFullInfoById(id_modulo: number): Promise { return this.repository.findOne({ where: { id_modulo } }).then((modulo) => { if (!modulo) throw new NotFoundException('No existe este id módulo.'); return modulo; }); } findMinInfoById(id_modulo: number): Promise { return this.fullInformacionModuloView .findOne({ where: { id_modulo } }) .then((infoModulo) => { if (!infoModulo) throw new NotFoundException('No existe este id módulo.'); return this.fullViewToModulo(infoModulo); }); } findModulo( institucion: Institucion, modulo: string, validarExiste = false, ): Promise { return this.fullInformacionModuloView .findOne({ where: { id_institucion: institucion.id_institucion, modulo }, }) .then((infoModulo) => { if (infoModulo && validarExiste) throw new ConflictException( 'Ya existe un módulo en esta institución con este nombre, intente con otro.', ); return this.fullViewToModulo(infoModulo); }); } private fullViewToModulo(infoModulo: FullInformacionModuloView): Modulo { if (!infoModulo) return null; return this.repository.create({ id_modulo: infoModulo.id_modulo, activo: infoModulo.activo_modulo === 1, modulo: infoModulo.modulo, institucion: { id_institucion: infoModulo.id_institucion, institucion: infoModulo.institucion, }, }); } update( admin: Operador, attrs: Partial, motivo?: string, numero_alumnos?: number, fecha_creacion?: string, ): Promise<{ message: string }> { // Validamos que si se manda uno solo de esos campos, se deba mandar todos los demas if ( (motivo || numero_alumnos || fecha_creacion) && (!motivo || !numero_alumnos || !fecha_creacion) ) throw new ConflictException('No se mandó toda la información necesaria.'); return this.findById(attrs.id_modulo) .then(async (modulo) => { // Validamos que el módulo pertenezca a la institución del admin if ( admin.institucion.id_institucion != modulo.institucion.id_institucion ) throw new ConflictException( 'No puedes modificar la información este módulo porque no pertenece a tu institución.', ); // Si se quiere cambiar el nombre del módulo validamos que no exista uno con el mismo nombre if (attrs.modulo) await this.findModulo(modulo.institucion, attrs.modulo, true); // Asignamos valores enviados al objeto Object.assign(modulo, attrs); // Se crea un registro del cambio de status de este módulo if (motivo) await this.moduloMotivoService.create( admin, modulo, motivo, numero_alumnos, fecha_creacion, ); // Guardamos cambios return this.repository.save(modulo); }) .then((_) => ({ message: 'Se guardaron los cambios correctamente.' })); } }