diff --git a/backend/src/media/media.controller.spec.ts b/backend/src/media/media.controller.spec.ts index 359a512..84199b2 100644 --- a/backend/src/media/media.controller.spec.ts +++ b/backend/src/media/media.controller.spec.ts @@ -49,6 +49,13 @@ describe("MediaController", () => { expect(stream.pipe).toHaveBeenCalledWith(res); }); + it("should throw NotFoundException if path is missing", async () => { + const res = {} as unknown as Response; + await expect(controller.getFile("", res)).rejects.toThrow( + NotFoundException, + ); + }); + it("should throw NotFoundException if file is not found", async () => { mockS3Service.getFileInfo.mockRejectedValue(new Error("Not found")); const res = {} as unknown as Response; diff --git a/backend/src/media/media.controller.ts b/backend/src/media/media.controller.ts index 5f7e387..e4bf3b2 100644 --- a/backend/src/media/media.controller.ts +++ b/backend/src/media/media.controller.ts @@ -1,27 +1,47 @@ -import { Controller, Get, NotFoundException, Param, Res } from "@nestjs/common"; +import { + Controller, + Get, + Logger, + NotFoundException, + Query, + Res, +} from "@nestjs/common"; import type { Response } from "express"; import type { BucketItemStat } from "minio"; import { S3Service } from "../s3/s3.service"; @Controller("media") export class MediaController { + private readonly logger = new Logger(MediaController.name); + constructor(private readonly s3Service: S3Service) {} - @Get("*key") - async getFile(@Param("key") key: string, @Res() res: Response) { - try { - const stats = (await this.s3Service.getFileInfo(key)) as BucketItemStat; - const stream = await this.s3Service.getFile(key); + @Get() + async getFile(@Query("path") path: string, @Res() res: Response) { + if (!path) { + this.logger.warn("Tentative d'accès à un média sans paramètre 'path'"); + throw new NotFoundException("Paramètre 'path' manquant"); + } - const contentType = - stats.metaData?.["content-type"] || "application/octet-stream"; + try { + this.logger.log(`Récupération du fichier : ${path}`); + const stats = (await this.s3Service.getFileInfo(path)) as BucketItemStat; + const stream = await this.s3Service.getFile(path); + + const contentType: string = + stats.metaData?.["content-type"] || + stats.metaData?.["Content-Type"] || + "application/octet-stream"; res.setHeader("Content-Type", contentType); res.setHeader("Content-Length", stats.size); res.setHeader("Cache-Control", "public, max-age=31536000, immutable"); stream.pipe(res); - } catch (_error) { + } catch (error) { + this.logger.error( + `Erreur lors de la récupération du fichier ${path} : ${error.message}`, + ); throw new NotFoundException("Fichier non trouvé"); } }