Files
pcpuma_unam_api/src/modulo/modulo.service.ts
T
2022-12-23 10:45:32 -06:00

181 lines
6.1 KiB
TypeScript

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<Modulo>,
@InjectRepository(InformacionModuloView)
private informacionModuloView: Repository<InformacionModuloView>,
@InjectRepository(FullInformacionModuloView)
private fullInformacionModuloView: Repository<FullInformacionModuloView>,
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<Modulo[]> {
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<Modulo[]> {
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<Modulo> {
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<Modulo> {
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<Modulo> {
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<Modulo> {
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<Modulo>,
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.' }));
}
}