Files
pcpuma_unam_api/src/modulo/modulo.service.ts
T
2022-07-19 08:25:58 -05:00

109 lines
3.2 KiB
TypeScript

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<Modulo>,
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<Modulo>) {
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.',
}));
}
}