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
pcpuma_unam.sql
/upload/*
/public/*
# compiled output
/dist

View File

@ -40,9 +40,10 @@ export class AuthService {
};
// 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 = {
id_institucion: admin.institucion.id_institucion,
logo: admin.institucion.logo,
};
return { token: this.jwtService.sign(JwtPayload) }; // "Firmamos"/creamos el token
});
@ -69,6 +70,7 @@ export class AuthService {
nombre: operador.nombre,
institucion: {
id_institucion: operador.institucion.id_institucion,
logo: operador.institucion.logo,
},
tipoUsuario: {
id_tipo_usuario: operador.tipoUsuario.id_tipo_usuario,
@ -76,6 +78,7 @@ export class AuthService {
},
Modulo: { id_modulo: modulo.id_modulo },
};
return { token: this.jwtService.sign(JwtPayload) }; // "Firmamos"/creamos el token
});
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -75,37 +75,12 @@ export class UploadFileController {
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)
@Post('upload-logo')
@UseGuards(AuthGuard('jwt'))
@UseInterceptors(
FileInterceptor('logo', {
storage: multer.diskStorage({
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)}`,
);
},
}),
storage: multer.diskStorage({ destination: './public' }),
}),
)
@ApiBearerAuth('jwt')

View File

@ -106,12 +106,6 @@ export class UploadFileService {
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 {
return `Se saltó la linea ${
index + 2