import { ConflictException, 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 { InstitucionService } from '../institucion/institucion.service'; @Injectable() export class ModuloService { constructor( @InjectRepository(Modulo) private repository: Repository, private institucionService: InstitucionService, ) {} async create(id_institucion: number, modulo: string) { const institucion = await this.institucionService.findById(id_institucion); return this.existeModulo(institucion, modulo) .then(() => this.repository.save( this.repository.create({ institucion, modulo, }), ), ) .then((_) => ({ message: 'Se creó correctamente un nuevo módulo.', })); } async existeModulo(id_institucion: number | Institucion, modulo: string) { const institucion = typeof id_institucion === 'number' ? await this.institucionService.findById(id_institucion) : id_institucion; return this.repository .findOne({ institucion, modulo }) .then((existeModulo) => { if (existeModulo) throw new ConflictException( 'Ya existe un módulo en esta institución con este nombre, intente con otro nombre.', ); }); } findAllByIdInstitucion(id_institucion: number, activos = false) { return this.institucionService .findById(id_institucion) .then((institucion) => { const query = this.repository .createQueryBuilder('m') .innerJoinAndSelect( 'm.institucion', 'i', 'i.id_institucion = :id_institucion', { id_institucion: institucion.id_institucion }, ) .orderBy('i.institucion') .orderBy('m.modulo'); if (activos) query.andWhere('m.activo = 1'); return query.getMany(); }); } findById(id_modulo: number) { return this.repository.findOne({ id_modulo }).then((modulo) => { if (!modulo) throw new NotFoundException('No existe este id módulo.'); return modulo; }); } async findModulo( id_institucion: number | Institucion, modulo: string, validarNoExiste = true, ) { const institucion = typeof id_institucion === 'number' ? await this.institucionService.findById(id_institucion) : id_institucion; return this.repository.findOne({ institucion, modulo }).then((modulo) => { if (validarNoExiste && !modulo) throw new ConflictException('No existe este módulo.'); return modulo; }); } update(attrs: Partial) { return this.findById(attrs.id_modulo) .then(async (modulo) => { if (attrs.modulo) await this.existeModulo(modulo.institucion, attrs.modulo); Object.assign(modulo, attrs); return this.repository.save(modulo); }) .then((_) => ({ message: 'Se guardaron los cambios correctamente.', })); } }