images
This commit is contained in:
Generated
+11
@@ -36,6 +36,7 @@
|
||||
"@types/bcryptjs": "^2.4.6",
|
||||
"@types/express": "^4.17.17",
|
||||
"@types/jest": "^29.5.2",
|
||||
"@types/multer": "^1.4.11",
|
||||
"@types/node": "^20.14.2",
|
||||
"@types/passport-jwt": "^4.0.1",
|
||||
"@types/supertest": "^6.0.0",
|
||||
@@ -2392,6 +2393,16 @@
|
||||
"integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/@types/multer": {
|
||||
"version": "1.4.11",
|
||||
"resolved": "https://registry.npmjs.org/@types/multer/-/multer-1.4.11.tgz",
|
||||
"integrity": "sha512-svK240gr6LVWvv3YGyhLlA+6LRRWA4mnGIU7RcNmgjBYFl6665wcXrRfxGp5tEPVHUNm5FMcmq7too9bxCwX/w==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@types/express": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/node": {
|
||||
"version": "20.14.2",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.2.tgz",
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
"@types/bcryptjs": "^2.4.6",
|
||||
"@types/express": "^4.17.17",
|
||||
"@types/jest": "^29.5.2",
|
||||
"@types/multer": "^1.4.11",
|
||||
"@types/node": "^20.14.2",
|
||||
"@types/passport-jwt": "^4.0.1",
|
||||
"@types/supertest": "^6.0.0",
|
||||
|
||||
@@ -101,13 +101,13 @@ export class Profesor {
|
||||
@JoinColumn({ name: 'id_usuario' })
|
||||
user: User;
|
||||
|
||||
@OneToMany(() => DatosAcademicos, datosAcademicos => datosAcademicos.profesor)
|
||||
@OneToMany(() => DatosAcademicos, datosAcademicos => datosAcademicos.profesor,{ cascade: true })
|
||||
datosAcademicos: DatosAcademicos[];
|
||||
|
||||
@OneToMany(() => LineasInvestigacion, linea => linea.profesor)
|
||||
@OneToMany(() => LineasInvestigacion, linea => linea.profesor,{ cascade: true })
|
||||
lineasInvestigacion: LineasInvestigacion[];
|
||||
|
||||
@OneToMany(() => ProyectosAcademicos, proyecto => proyecto.profesor)
|
||||
@OneToMany(() => ProyectosAcademicos, proyecto => proyecto.profesor,{ cascade: true })
|
||||
proyectosAcademicos: ProyectosAcademicos[];
|
||||
|
||||
}
|
||||
|
||||
@@ -9,6 +9,8 @@ import { profesorDto } from './dto/profesorDto.dto';
|
||||
import { ProyectosAcademicos } from '../proyectos_academicos/entities/proyectos_academicos.entity';
|
||||
import { DatosAcademicos } from '../datos_academicos/entities/datos_academicos.entity'
|
||||
import { LineasInvestigacion } from '../lineas_investigacion/entities/lineas_investigacion.entity'
|
||||
import * as fs from 'fs';
|
||||
import * as path from 'path';
|
||||
|
||||
@Injectable()
|
||||
export class ProfesorService {
|
||||
@@ -18,29 +20,44 @@ export class ProfesorService {
|
||||
private readonly datosAcademicosService: DatosAcademicosService,
|
||||
private readonly lineasInvestigacionService: LineasInvestigacionService,
|
||||
private readonly proyectosAcademicosService: ProyectosAcademicosService,
|
||||
@InjectRepository(ProyectosAcademicos)
|
||||
private readonly proyectosAcademicosRepository: Repository<ProyectosAcademicos>,
|
||||
@InjectRepository(DatosAcademicos)
|
||||
private readonly datosAcademicosRepository: Repository<DatosAcademicos>,
|
||||
@InjectRepository(LineasInvestigacion)
|
||||
private readonly lineasInvestigacionRepository: Repository<LineasInvestigacion>,
|
||||
@InjectRepository(ProyectosAcademicos)
|
||||
private readonly proyectosAcademicosRepository: Repository<ProyectosAcademicos>,
|
||||
) {}
|
||||
|
||||
//register teacher
|
||||
async register(data: profesorDto) {
|
||||
const {num_trabajador,rfc,proyectosAcademicos, datosAcademicos, lineasInvestigacion } = data;
|
||||
async register(data: profesorDto, file: Express.Multer.File) {
|
||||
const { num_trabajador, rfc, proyectosAcademicos, datosAcademicos, lineasInvestigacion, nombre } = data;
|
||||
|
||||
const existrfc = await this.profesorRepository.findOne({where:{rfc}});
|
||||
if(existrfc){
|
||||
const existrfc = await this.profesorRepository.findOne({ where: { rfc } });
|
||||
if (existrfc) {
|
||||
throw new HttpException('rfc already exist', 403);
|
||||
}
|
||||
|
||||
const existnumber = await this.profesorRepository.findOne({where:{num_trabajador}});
|
||||
if(existnumber){
|
||||
const existnumber = await this.profesorRepository.findOne({ where: { num_trabajador } });
|
||||
if (existnumber) {
|
||||
throw new HttpException('number of worker already exist', 403);
|
||||
}
|
||||
|
||||
const newProfesor = this.profesorRepository.create(data);
|
||||
let imageUrl = '';
|
||||
if (file) {
|
||||
const profesorName = nombre.toLowerCase().replace(/ /g, '_');
|
||||
const fileExtName = path.extname(file.originalname);
|
||||
const fileName = `${profesorName}${fileExtName}`;
|
||||
const filePath = path.join(__dirname, '..', 'imagenes', fileName);
|
||||
|
||||
// Save the image
|
||||
fs.writeFileSync(filePath, file.buffer);
|
||||
imageUrl = `/imagenes/${fileName}`;
|
||||
}
|
||||
|
||||
const newProfesor = this.profesorRepository.create({
|
||||
...data,
|
||||
fotografia: imageUrl,
|
||||
});
|
||||
const savedProfesor = await this.profesorRepository.save(newProfesor);
|
||||
|
||||
if (proyectosAcademicos && proyectosAcademicos.length > 0) {
|
||||
@@ -92,7 +109,7 @@ export class ProfesorService {
|
||||
}
|
||||
|
||||
//modify teacher
|
||||
async modify(id_profesor: number, data: profesorDto) {
|
||||
async modify(id_profesor: number, data: profesorDto, file?: Express.Multer.File) {
|
||||
const profesor = await this.profesorRepository.findOne({ where: { id_profesor } });
|
||||
if (!profesor) {
|
||||
throw new HttpException('Profesor not found', 404);
|
||||
@@ -100,6 +117,17 @@ export class ProfesorService {
|
||||
|
||||
const { proyectosAcademicos, datosAcademicos, lineasInvestigacion, ...profesorData } = data;
|
||||
Object.assign(profesor, profesorData);
|
||||
|
||||
if (file) {
|
||||
const profesorName = profesor.nombre.toLowerCase().replace(/ /g, '_');
|
||||
const fileExtName = path.extname(file.originalname);
|
||||
const fileName = `${profesorName}${fileExtName}`;
|
||||
const filePath = path.join(__dirname, '..', 'imagenes', fileName);
|
||||
|
||||
fs.writeFileSync(filePath, file.buffer);
|
||||
profesor.fotografia = `/imagenes/${fileName}`;
|
||||
}
|
||||
|
||||
const savedProfesor = await this.profesorRepository.save(profesor);
|
||||
|
||||
if (proyectosAcademicos) {
|
||||
@@ -238,4 +266,12 @@ export class ProfesorService {
|
||||
return { profesores, total, totalPages };
|
||||
}
|
||||
|
||||
async updateImageURL(id_profesor: number, imageUrl: string): Promise<void> {
|
||||
const profesor = await this.profesorRepository.findOne({where:{id_profesor}});
|
||||
if (!profesor) {
|
||||
throw new Error('Profesor not found');
|
||||
}
|
||||
profesor.fotografia = imageUrl;
|
||||
await this.profesorRepository.save(profesor);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
import { extname } from 'path';
|
||||
|
||||
export const renameImage = (req, file, callback) => {
|
||||
const profesorName = req.body.nombre.toLowerCase().replace(/ /g, '_');
|
||||
const fileExtName = extname(file.originalname);
|
||||
const fileName = `${profesorName}${fileExtName}`;
|
||||
callback(null, fileName);
|
||||
};
|
||||
|
||||
export const fileFilter = (req, file, callback) => {
|
||||
if (!file.originalname.match(/\.(jpg|jpeg|png)$/)) {
|
||||
return callback(new Error('Invalid format type'), false);
|
||||
}
|
||||
callback(null, true);
|
||||
};
|
||||
@@ -0,0 +1,53 @@
|
||||
import { Controller, Post, UploadedFile, UseInterceptors, Body, BadRequestException, Put, Param } from '@nestjs/common';
|
||||
import { FileInterceptor } from '@nestjs/platform-express';
|
||||
import { diskStorage } from 'multer';
|
||||
import { renameImage, fileFilter } from './helpers/images.helper';
|
||||
import { ProfesorService } from '../Profesor/profesor.service';
|
||||
|
||||
@Controller('images')
|
||||
export class ImagesController {
|
||||
constructor(private readonly profesorService: ProfesorService) {}
|
||||
|
||||
@Post()
|
||||
@UseInterceptors(FileInterceptor('file', {
|
||||
storage: diskStorage({
|
||||
destination: './imagenes',
|
||||
filename: renameImage,
|
||||
}),
|
||||
fileFilter: fileFilter,
|
||||
}))
|
||||
async upload(@UploadedFile() file: Express.Multer.File, @Body() body) {
|
||||
if (!file) {
|
||||
throw new BadRequestException('No file uploaded');
|
||||
}
|
||||
|
||||
const { id_profesor } = body;
|
||||
const imageUrl = `/imagenes/${file.filename}`;
|
||||
|
||||
// Update the professor's image URL in the database
|
||||
await this.profesorService.updateImageURL(id_profesor, imageUrl);
|
||||
|
||||
return { message: 'File uploaded successfully', imageUrl };
|
||||
}
|
||||
|
||||
@Put(':id_profesor')
|
||||
@UseInterceptors(FileInterceptor('file', {
|
||||
storage: diskStorage({
|
||||
destination: './imagenes',
|
||||
filename: renameImage,
|
||||
}),
|
||||
fileFilter: fileFilter,
|
||||
}))
|
||||
async modify(@Param('id_profesor') id_profesor: number, @UploadedFile() file: Express.Multer.File, @Body() body) {
|
||||
if (!file) {
|
||||
throw new BadRequestException('No file uploaded');
|
||||
}
|
||||
|
||||
const imageUrl = `/imagenes/${file.filename}`;
|
||||
|
||||
// Update the professor's image URL in the database
|
||||
await this.profesorService.updateImageURL(id_profesor, imageUrl);
|
||||
|
||||
return { message: 'File uploaded successfully', imageUrl };
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user