From a0f5c3dab6c32081941ca12d86bea08de4590043 Mon Sep 17 00:00:00 2001 From: Mathis Date: Tue, 8 Oct 2024 12:07:03 +0200 Subject: [PATCH] Refactor file saving logic and enhance logging Revised the file saving process to include better logging and error management. Added groupId to file saving parameters and enhanced verification checks. Updated .gitignore to exclude assets directory. --- .gitignore | 1 + apps/backend/src/app/db/schema.ts | 7 +- .../backend/src/app/files/files.controller.ts | 34 +++- apps/backend/src/app/files/files.service.ts | 162 +++++++++--------- .../src/app/storage/storage.service.ts | 1 + 5 files changed, 116 insertions(+), 89 deletions(-) diff --git a/.gitignore b/.gitignore index 8647ed5..ac093a1 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ drizzle # compiled output dist +assets/* tmp /out-tsc diff --git a/apps/backend/src/app/db/schema.ts b/apps/backend/src/app/db/schema.ts index 55b9956..1db1433 100644 --- a/apps/backend/src/app/db/schema.ts +++ b/apps/backend/src/app/db/schema.ts @@ -73,7 +73,10 @@ export const FilesTable = pgTable("files", { }) .notNull(), - groupId: p.uuid("group_id").references(() => FilesGroupTable.uuid), + groupId: p + .uuid("group_id") + .notNull() + .references(() => FilesGroupTable.uuid), fileSize: p.integer("file_size").notNull(), @@ -153,7 +156,7 @@ export const MachinesTable = pgTable("machines", { //TODO Many to Many table betwen File en Machine export const FilesForMachinesTable = pgTable("files_for_machines", { - id: p.uuid('id').primaryKey().notNull().defaultRandom(), + id: p.uuid("id").primaryKey().notNull().defaultRandom(), fileId: p .uuid("file_id") diff --git a/apps/backend/src/app/files/files.controller.ts b/apps/backend/src/app/files/files.controller.ts index 2190868..8c08111 100644 --- a/apps/backend/src/app/files/files.controller.ts +++ b/apps/backend/src/app/files/files.controller.ts @@ -43,23 +43,32 @@ export class FilesController { const _isDocumentation = req.headers["is_documentation"] as string; const _isRestricted = req.headers["is_restricted"] as string; const _isAdmin = Boolean(req.headers["is_admin"] as string | boolean); - console.log(_fileName, _groupId, _uploadedBy, _machineId, _isDocumentation, _isRestricted, _isAdmin); + console.log( + _fileName, + _groupId, + _uploadedBy, + _machineId, + _isDocumentation, + _isRestricted, + _isAdmin, + ); // Vérifier que les en-têtes nécessaires sont présents if (!_fileName || !_groupId || !_machineId) { throw new BadRequestException("Header(s) manquant(s)"); } + console.log("Header found !"); const machineId = Array(_machineId); const Params = new Map() .set("fileName", _fileName.toString()) - .set("groupId", Array(JSON.parse(_groupId.toString()))) + .set("groupId", _groupId.toString()) .set("uploadedBy", _uploadedBy.toString()) .set("machineId", Array(JSON.parse(machineId.toString()))) .set("isDocumentation", false) .set("isRestricted", false); - console.log(Params); + console.log("Current params :\n", Params); //TODO Integrate a verification if the source is an admin, if that the case then it can define isDocumentation and isRestricted else throw in case of presence of those parameters. if (_isAdmin) { @@ -67,16 +76,25 @@ export class FilesController { Params.set("isRestricted", Boolean(_isRestricted)); } - return await this.filesService.save(fileBuffer, Params); + console.log("Executing save procedure..."); + return res + // @ts-ignore + .status(HttpStatus.CREATED) + .send(await this.filesService.save(fileBuffer, Params)); } catch (err) { - // @ts-ignore - return res.status(err.status || HttpStatus.INTERNAL_SERVER_ERROR).send(err) + console.error(err); + return res + // @ts-ignore + .status(err.status || HttpStatus.INTERNAL_SERVER_ERROR) + .send(err); } }); req.on("error", (err) => { - // @ts-ignore - return res.status(err.status || HttpStatus.INTERNAL_SERVER_ERROR).send(err) + return res + // @ts-ignore + .status(err.status || HttpStatus.INTERNAL_SERVER_ERROR) + .send(err); }); return; diff --git a/apps/backend/src/app/files/files.service.ts b/apps/backend/src/app/files/files.service.ts index 5ac4783..3e4e288 100644 --- a/apps/backend/src/app/files/files.service.ts +++ b/apps/backend/src/app/files/files.service.ts @@ -9,9 +9,10 @@ import { FilesForMachinesTable, FilesGroupTable, FilesTable, - FilesTypeForMachine, FilesTypesTable, - MachinesTable -} from 'apps/backend/src/app/db/schema'; + FilesTypeForMachine, + FilesTypesTable, + MachinesTable, +} from "apps/backend/src/app/db/schema"; import { StorageService } from "apps/backend/src/app/storage/storage.service"; import { data } from "autoprefixer"; import { eq, ilike } from "drizzle-orm"; @@ -81,88 +82,91 @@ export class FilesService { //TODO save a file public async save(file: Buffer, data: Map) { - try { - const _machineIds = data.get("machineId").toString().split(","); + const _machineIds = data.get("machineId").toString().split(","); - const machinesIds = new Set(); - for (const machineId of _machineIds) { - console.log( - `Checking if machine with ID ${machineId} exist in the database...`, - ); - const machineExists = await this.database - .use() - .select({ - uuid: MachinesTable.id, - }) - .from(MachinesTable) - .where(eq(MachinesTable.id, machineId)) - .prepare("checkMachineExists") - .execute(); - - if (machineExists.length === 0) { - throw new NotFoundException(`Machine with ID "${machineId}" not found`); - } - - machinesIds.add(machineExists[0].uuid); - } - - const _group = data.get("groupId") as string; - // verify that the group exist in the database - const groupExists = await this.database + const machinesIds = new Set(); + for (const machineId of _machineIds) { + console.log( + `Checking if machine with ID ${machineId} exist in the database...`, + ); + const machineExists = await this.database .use() - .select() - .from(FilesGroupTable) - .where(eq(FilesGroupTable.uuid, _group)) - .prepare("checkGroupExists") + .select({ + uuid: MachinesTable.id, + }) + .from(MachinesTable) + .where(eq(MachinesTable.id, machineId)) + .prepare("checkMachineExists") .execute(); - if (groupExists.length === 0) { - throw new NotFoundException(`Group with ID "${_group}" not found`); + if (machineExists.length === 0) { + throw new NotFoundException(`Machine with ID "${machineId}" not found`); } - const saveResult = await this.storage.new( - data.get("fileName") as string, - file, - _machineIds, - Boolean(data.get("isDocumentation")), - ); - console.log(saveResult); - const mimeId = await this.database.use() - .select() - .from(FilesTypesTable) - .where(eq(FilesTypesTable.mime, saveResult.fileType.mime)) - - - const inserted = await this.database - .use() - .insert(FilesTable) - .values({ - fileName: data.get("fileName") as string, - checksum: saveResult.fileChecksum, - extension: saveResult.fileType.extension, - fileSize: saveResult.fileSize, - fileType: mimeId[0].id, - isRestricted: Boolean(data.get("isRestricted")), - isDocumentation: Boolean(data.get("isDocumentation")), - uploadedBy: data.get("uploadedBy") as string, - }) - .returning(); - console.log(inserted); - - for (const machineId of machinesIds) { - //TODO insert a link betwen fileId and MachineIds[] - const linkRow = await this.database - .use() - .insert(FilesForMachinesTable) - .values({ - fileId: inserted[0].uuid, - machineId: machineId, - }); - } - - return inserted[0]; - } catch (err) { - throw err; + machinesIds.add(machineExists[0].uuid); } + + const _group = data.get("groupId") as string; + console.log("Linking to group :\n", _group); + if (!_group) { + throw new NotFoundException(`Group with ID "${_group}" not found`); + } + // verify that the group exist in the database + const groupExists = await this.database + .use() + .select() + .from(FilesGroupTable) + .where(eq(FilesGroupTable.uuid, _group)) + .prepare("checkGroupExists") + .execute(); + + if (groupExists.length === 0) { + throw new NotFoundException(`Group with ID "${_group}" not found`); + } + + const saveResult = await this.storage.new( + data.get("fileName") as string, + file, + _machineIds, + Boolean(data.get("isDocumentation")), + ); + console.log(saveResult); + const mimeId = await this.database + .use() + .select() + .from(FilesTypesTable) + .where(eq(FilesTypesTable.mime, saveResult.fileType.mime)); + + const inserted = await this.database + .use() + .insert(FilesTable) + .values({ + fileName: data.get("fileName") as string, + groupId: groupExists[0].uuid, + checksum: saveResult.fileChecksum, + extension: saveResult.fileType.extension, + fileSize: saveResult.fileSize, + fileType: mimeId[0].id, + isRestricted: Boolean(data.get("isRestricted")), + isDocumentation: Boolean(data.get("isDocumentation")), + uploadedBy: data.get("uploadedBy") as string, + }) + .returning(); + console.log(inserted); + + for (const machineId of machinesIds) { + //TODO insert a link betwen fileId and MachineIds[] + console.log( + `Append file ${inserted[0].fileName} for machine : "${machineId}"`, + ); + const linkRow = await this.database + .use() + .insert(FilesForMachinesTable) + .values({ + fileId: inserted[0].uuid, + machineId: machineId, + }); + } + return inserted[0]; } } diff --git a/apps/backend/src/app/storage/storage.service.ts b/apps/backend/src/app/storage/storage.service.ts index e2baeee..6dceecb 100644 --- a/apps/backend/src/app/storage/storage.service.ts +++ b/apps/backend/src/app/storage/storage.service.ts @@ -35,6 +35,7 @@ export class StorageService { private async saveFile(fileName: string, file: Buffer): Promise { try { await writeFile(join(process.cwd(), "assets/", fileName), file, "utf8"); + console.log(`File "${fileName}" saved.`); } catch (err) { console.error(err); throw new InternalServerErrorException("File save failed !");