From e7c3c84b8018622bc3ca40e5e7af2397050dbed1 Mon Sep 17 00:00:00 2001 From: Eddi3_As Date: Mon, 24 Feb 2025 20:26:30 -0500 Subject: [PATCH] UC38 - gestion images backend fin --- server/__tests__/image.test.js | 36 ++++++++++++++++++++++++++++++++-- server/controllers/images.js | 11 ++++++----- server/models/images.js | 21 ++++---------------- server/routers/images.js | 1 + 4 files changed, 45 insertions(+), 24 deletions(-) diff --git a/server/__tests__/image.test.js b/server/__tests__/image.test.js index b220e2c..8230b61 100644 --- a/server/__tests__/image.test.js +++ b/server/__tests__/image.test.js @@ -77,7 +77,8 @@ describe('Images', () => { beforeEach(() => { mockImagesCollection = { insertOne: jest.fn().mockResolvedValue({ insertedId: 'image123' }), - findOne: jest.fn() + findOne: jest.fn(), + find: jest.fn().mockReturnValue({ sort: jest.fn().mockReturnValue([]) }) }; dbConn = { @@ -145,5 +146,36 @@ describe('Images', () => { expect(result).toBeNull(); }); }); -}); + describe('getAll', () => { + it('should retrieve a paginated list of images', async () => { + const mockImages = [ + { id: '1', file_name: 'image1.png', file_content: Buffer.from('data1').toString('base64'), mime_type: 'image/png' }, + { id: '2', file_name: 'image2.png', file_content: Buffer.from('data2').toString('base64'), mime_type: 'image/png' } + ]; + mockImagesCollection.find.mockReturnValue({ sort: jest.fn().mockReturnValue(mockImages) }); + + const result = await images.getAll(1, 10); + + expect(db.connect).toHaveBeenCalled(); + expect(db.getConnection).toHaveBeenCalled(); + expect(dbConn.collection).toHaveBeenCalledWith('images'); + expect(mockImagesCollection.find).toHaveBeenCalledWith({}); + expect(result.length).toEqual(mockImages.length); + expect(result).toEqual([ + { id: '1', file_name: 'image1.png', file_content: Buffer.from('data1'), mime_type: 'image/png' }, + { id: '2', file_name: 'image2.png', file_content: Buffer.from('data2'), mime_type: 'image/png' } + ]); + }); + + it('should return null if not images is not found', async () => { + mockImagesCollection.find.mockReturnValue({ sort: jest.fn().mockReturnValue(undefined) }); + const result = await images.getAll(1, 10); + expect(db.connect).toHaveBeenCalled(); + expect(db.getConnection).toHaveBeenCalled(); + expect(dbConn.collection).toHaveBeenCalledWith('images'); + expect(mockImagesCollection.find).toHaveBeenCalledWith({}); + expect(result).toEqual(null); + }); + }); +}); \ No newline at end of file diff --git a/server/controllers/images.js b/server/controllers/images.js index ff41d5c..877eb7d 100644 --- a/server/controllers/images.js +++ b/server/controllers/images.js @@ -50,18 +50,19 @@ class ImagesController { } }; - //TODO TEST - getAll = async (req, res, next) => { + getImages = async (req, res, next) => { try { + const page = parseInt(req.query.page) || 1; + const limit = parseInt(req.query.limit) || 10; - const images = await this.images.getAll(); + const imagesBit = await this.images.getImages(page, limit); - if (!images || images.length === 0) { + if (!imagesBit || imagesBit.length === 0) { throw new AppError(IMAGE_NOT_FOUND); } res.setHeader('Content-Type', 'application/json'); - return res.status(200).json(imagesName); + return res.status(200).json(imagesBit); } catch (error) { return next(error); } diff --git a/server/models/images.js b/server/models/images.js index 68c9380..66d6084 100644 --- a/server/models/images.js +++ b/server/models/images.js @@ -42,38 +42,25 @@ class Images { }; } - //TODO TEST - async getAll() { + async getImages(page, limit) { await this.db.connect() const conn = this.db.getConnection(); const imagesCollection = conn.collection('images'); - const result = await imagesCollection.find({}); + const result = await imagesCollection.find({}).sort({created_at: 1}); if (!result) return null; - //TODO latency issues -> images > 20 - // USE pagination - /* - app.get('/images', (req, res) => { - const page = parseInt(req.query.page) || 1; - const limit = parseInt(req.query.limit) || 10; - - const images = getImagesFromDatabase(page, limit); - res.json(images); - }); - */ - const imagesName = result.map(image => ({ + const objImages = result.slice((page - 1) * limit, page * limit).map(image => ({ id: image.id, file_name: image.file_name, file_content: Buffer.from(image.file_content, 'base64'), mime_type: image.mime_type })); - return imagesName; + return objImages; } - } module.exports = Images; diff --git a/server/routers/images.js b/server/routers/images.js index 06e2830..626e6e8 100644 --- a/server/routers/images.js +++ b/server/routers/images.js @@ -12,5 +12,6 @@ const upload = multer({ storage: storage }); router.post("/upload", jwt.authenticate, upload.single('image'), asyncHandler(images.upload)); router.get("/get/:id", asyncHandler(images.get)); +router.get("/getImages", asyncHandler(images.getImages)); module.exports = router;