listo logo peronalizado

This commit is contained in:
lemuel 2023-01-10 17:25:23 -06:00
parent b4fe7b2074
commit 40618970a5
11 changed files with 58 additions and 81 deletions

1
.gitignore vendored
View File

@ -2,6 +2,7 @@
.env .env
pcpuma_unam.sql pcpuma_unam.sql
/upload/* /upload/*
/public/*
# compiled output # compiled output
/dist /dist

View File

@ -40,9 +40,10 @@ export class AuthService {
}; };
// Los super admin y sistema no tienen institución // Los super admin y sistema no tienen institución
if (JwtPayload.Operador.tipoUsuario.id_tipo_usuario > 2) if (JwtPayload.Operador.tipoUsuario.id_tipo_usuario === 3)
JwtPayload.Operador.institucion = { JwtPayload.Operador.institucion = {
id_institucion: admin.institucion.id_institucion, id_institucion: admin.institucion.id_institucion,
logo: admin.institucion.logo,
}; };
return { token: this.jwtService.sign(JwtPayload) }; // "Firmamos"/creamos el token return { token: this.jwtService.sign(JwtPayload) }; // "Firmamos"/creamos el token
}); });
@ -69,6 +70,7 @@ export class AuthService {
nombre: operador.nombre, nombre: operador.nombre,
institucion: { institucion: {
id_institucion: operador.institucion.id_institucion, id_institucion: operador.institucion.id_institucion,
logo: operador.institucion.logo,
}, },
tipoUsuario: { tipoUsuario: {
id_tipo_usuario: operador.tipoUsuario.id_tipo_usuario, id_tipo_usuario: operador.tipoUsuario.id_tipo_usuario,
@ -76,6 +78,7 @@ export class AuthService {
}, },
Modulo: { id_modulo: modulo.id_modulo }, Modulo: { id_modulo: modulo.id_modulo },
}; };
return { token: this.jwtService.sign(JwtPayload) }; // "Firmamos"/creamos el token return { token: this.jwtService.sign(JwtPayload) }; // "Firmamos"/creamos el token
}); });
} }

View File

@ -3,7 +3,7 @@ export interface JwtPayloadAdmin {
id_operador: number; id_operador: number;
nombre: string; nombre: string;
operador: string; operador: string;
institucion?: { id_institucion: number }; institucion?: { id_institucion: number; logo: string };
tipoUsuario: { id_tipo_usuario: number }; tipoUsuario: { id_tipo_usuario: number };
}; };
} }

View File

@ -3,7 +3,7 @@ export interface JwtPayloadOperador {
id_operador: number; id_operador: number;
nombre: string; nombre: string;
operador: string; operador: string;
institucion: { id_institucion: number }; institucion: { id_institucion: number; logo: string };
tipoUsuario: { id_tipo_usuario: number }; tipoUsuario: { id_tipo_usuario: number };
}; };
Modulo: { id_modulo: number }; Modulo: { id_modulo: number };

View File

@ -20,9 +20,9 @@ export class InstitucionService {
@InjectRepository(Institucion) private repository: Repository<Institucion>, @InjectRepository(Institucion) private repository: Repository<Institucion>,
) {} ) {}
crearInstitucion(id_institucion: number): Institucion { // crearInstitucion(id_institucion: number): Institucion {
return this.repository.create({ id_institucion }); // return this.repository.create({ id_institucion });
} // }
findAll(): Promise<Institucion[]> { findAll(): Promise<Institucion[]> {
return this.repository.find({ select: ['id_institucion'] }); return this.repository.find({ select: ['id_institucion'] });

View File

@ -1,10 +1,12 @@
import { join } from 'path';
import { NestFactory } from '@nestjs/core'; import { NestFactory } from '@nestjs/core';
import { NestExpressApplication } from '@nestjs/platform-express';
import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger'; import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';
import { ValidationPipe } from '@nestjs/common'; import { ValidationPipe } from '@nestjs/common';
import { AppModule } from './app.module'; import { AppModule } from './app.module';
async function bootstrap() { async function bootstrap() {
const app = await NestFactory.create(AppModule) const app = await NestFactory.create<NestExpressApplication>(AppModule);
// const config = new DocumentBuilder() // const config = new DocumentBuilder()
// .setTitle('pcpuma_unam_api') // .setTitle('pcpuma_unam_api')
// .setDescription('Api de Pc puma') // .setDescription('Api de Pc puma')
@ -16,6 +18,9 @@ async function bootstrap() {
// SwaggerModule.setup('/api', app, document); // SwaggerModule.setup('/api', app, document);
app.useGlobalPipes(new ValidationPipe({ whitelist: true })); app.useGlobalPipes(new ValidationPipe({ whitelist: true }));
app.enableCors(); app.enableCors();
app.useStaticAssets(join(__dirname, '..', 'public'), {
prefix: '/public/',
});
await app.listen(process.env.API_PORT); await app.listen(process.env.API_PORT);
} }
bootstrap(); bootstrap();

View File

@ -40,7 +40,9 @@ export class Operador {
@Column({ type: Number, nullable: true }) @Column({ type: Number, nullable: true })
id_tipo_usuario: number; id_tipo_usuario: number;
@ManyToOne(() => Institucion, (institucion) => institucion.operadores) @ManyToOne(() => Institucion, (institucion) => institucion.operadores, {
eager: true,
})
@JoinColumn({ name: 'id_institucion' }) @JoinColumn({ name: 'id_institucion' })
institucion: Institucion; institucion: Institucion;

View File

@ -16,6 +16,7 @@ import { TipoUsuario } from '../../../tipo-usuario/entity/tipo-usuario.entity';
.addSelect('o.operador', 'operador') .addSelect('o.operador', 'operador')
.addSelect('o.password', 'password') .addSelect('o.password', 'password')
.addSelect('i.institucion', 'institucion') .addSelect('i.institucion', 'institucion')
.addSelect('i.logo', 'logo')
.addSelect('tu.tipo_usuario', 'tipo_usuario') .addSelect('tu.tipo_usuario', 'tipo_usuario')
.from(Operador, 'o') .from(Operador, 'o')
.innerJoin(Institucion, 'i', 'i.id_institucion = o.id_institucion') .innerJoin(Institucion, 'i', 'i.id_institucion = o.id_institucion')
@ -31,6 +32,9 @@ export class FullInformacionOperadorView {
@ViewColumn() @ViewColumn()
activo: number; activo: number;
@ViewColumn()
correo: string;
@ViewColumn() @ViewColumn()
id_institucion: number; id_institucion: number;
@ -41,7 +45,7 @@ export class FullInformacionOperadorView {
institucion: string; institucion: string;
@ViewColumn() @ViewColumn()
correo: string; logo: string;
@ViewColumn() @ViewColumn()
nombre: string; nombre: string;

View File

@ -93,14 +93,9 @@ export class OperadorService {
} }
findAdmin(admin: string): Promise<Operador> { findAdmin(admin: string): Promise<Operador> {
return this.repository return this.fullInformacionOperadorView
.findOne({ .findOne({ where: { operador: admin, id_tipo_usuario: Between(2, 3) } })
where: { .then((infoOperador) => this.fullViewToOperador(infoOperador));
operador: admin,
tipoUsuario: { id_tipo_usuario: Between(2, 3) },
},
})
.then((admin) => this.llenarIds(admin));
} }
async findAll( async findAll(
@ -140,23 +135,7 @@ export class OperadorService {
const operadores: Operador[] = []; const operadores: Operador[] = [];
for (let i = 0; i < infoOperadores[0].length; i++) for (let i = 0; i < infoOperadores[0].length; i++)
operadores.push( operadores.push(this.fullViewToOperador(infoOperadores[0][i]));
this.repository.create({
id_operador: infoOperadores[0][i].id_operador,
activo: infoOperadores[0][i].activo === 1,
correo: infoOperadores[0][i].correo,
nombre: infoOperadores[0][i].nombre,
operador: infoOperadores[0][i].operador,
institucion: {
id_institucion: infoOperadores[0][i].id_operador,
institucion: infoOperadores[0][i].institucion,
},
tipoUsuario: {
id_tipo_usuario: infoOperadores[0][i].id_tipo_usuario,
tipo_usuario: infoOperadores[0][i].tipo_usuario,
},
}),
);
return [operadores, infoOperadores[1]]; return [operadores, infoOperadores[1]];
}); });
} }
@ -185,29 +164,43 @@ export class OperadorService {
.then((operador) => { .then((operador) => {
if (!operador) if (!operador)
throw new NotFoundException('No existe este id operador.'); throw new NotFoundException('No existe este id operador.');
return this.llenarIds(operador); operador.tipoUsuario = this.tipoUsuarioService.crearTipoUsuario(
operador.id_tipo_usuario,
);
return operador;
}); });
} }
findOperador(institucion: Institucion, operador: string): Promise<Operador> { findOperador(institucion: Institucion, operador: string): Promise<Operador> {
return this.repository return this.fullInformacionOperadorView
.findOne({ .findOne({
where: { operador, institucion, tipoUsuario: { id_tipo_usuario: 4 } }, where: {
id_institucion: institucion.id_institucion,
id_tipo_usuario: 4,
operador,
},
}) })
.then((operador) => this.llenarIds(operador)); .then((infoOperador) => this.fullViewToOperador(infoOperador));
} }
llenarIds(operador: Operador): Operador { fullViewToOperador(infoOperador: FullInformacionOperadorView): Operador {
if (operador) { return this.repository.create({
operador.tipoUsuario = this.tipoUsuarioService.crearTipoUsuario( id_operador: infoOperador.id_operador,
operador.id_tipo_usuario, activo: infoOperador.activo === 1,
); correo: infoOperador.correo,
if (operador.id_institucion) nombre: infoOperador.nombre,
operador.institucion = this.institucionService.crearInstitucion( operador: infoOperador.operador,
operador.id_institucion, password: infoOperador.password,
); institucion: {
} id_institucion: infoOperador.id_institucion,
return operador; institucion: infoOperador.institucion,
logo: infoOperador.logo,
},
tipoUsuario: {
id_tipo_usuario: infoOperador.id_tipo_usuario,
tipo_usuario: infoOperador.tipo_usuario,
},
});
} }
passwordReset( passwordReset(

View File

@ -75,37 +75,12 @@ export class UploadFileController {
return this.uploadFileService.createUsuarios(path, admin); return this.uploadFileService.createUsuarios(path, admin);
} }
@Get('download-logo')
@UseGuards(AuthGuard('jwt'))
@ApiBearerAuth('jwt')
downloadLogo(@Request() req, @Response() res) {
const operador: Operador = req.user.operador;
this.validarUsuarioService.validarAdminOperador(operador);
return this.uploadFileService.downloadLogo(operador).then((logo) => {
if (logo) res.download(logo);
else return false;
});
}
@Serealize(MessageOutputDto) @Serealize(MessageOutputDto)
@Post('upload-logo') @Post('upload-logo')
@UseGuards(AuthGuard('jwt')) @UseGuards(AuthGuard('jwt'))
@UseInterceptors( @UseInterceptors(
FileInterceptor('logo', { FileInterceptor('logo', {
storage: multer.diskStorage({ storage: multer.diskStorage({ destination: './public' }),
destination: './upload',
filename: (req: any, file, cb) => {
cb(
null,
`${
req.user.operador.institucion.id_institucion
}${Date.now()}${Math.round(
Math.random() * 1e9,
)}${file.originalname.slice(-4)}`,
);
},
}),
}), }),
) )
@ApiBearerAuth('jwt') @ApiBearerAuth('jwt')

View File

@ -106,12 +106,6 @@ export class UploadFileService {
return { message: 'Se subió y cargó correctamente tu archivo csv.' }; return { message: 'Se subió y cargó correctamente tu archivo csv.' };
} }
downloadLogo(operador: Operador): Promise<string> {
return this.institucionService
.findById(operador.institucion.id_institucion)
.then((institucion) => institucion.logo);
}
errorBase(index): string { errorBase(index): string {
return `Se saltó la linea ${ return `Se saltó la linea ${
index + 2 index + 2