Source

http/src/plugins/images.plugin.js

'use strict';

const { initImageService, ImageEntity } = require('../../../src/images');
const {
    list,
    getItem,
    createItem,
    patchItem,
    deleteItem,
} = require('../factory');
const schemas = require('../schemas/images');

/**
 * Images Plugin
 * Provides CRUD endpoints for managing images.
 * Routes:
 * - GET /image/:entityType/:entityId/:page/:pageSize
 * - GET /image/:page/:pageSize
 * - GET /image/:id
 * - POST /image
 * - PATCH /image/:id
 * - DELETE /image/:id
 * Each route supports appropriate query parameters and request bodies as defined in the schemas.
 * @name imagesPlugin
 * @param {FastifyInstance} fastify
 * @param {Object} opts
 * @returns {Promise<void>}
 */
const plugin = async (fastify, opts) => {
    const service = initImageService();

    const baseConfig = {
        service     : service,
        entityClass : ImageEntity,
        baseWhere   : {},
    }

    /**
     * GET /image/:entityType/:entityId/:page/:pageSize
     * Supports query param isDeleted
     * Returns paginated list of images by entityType and entityId
     */
    await list({
        route     : '/:entityType/:entityId/:page/:pageSize',
        service   : service,
        schema    : schemas.ImagePaginatedSchema,
        getWhere  : (req) => {
            const filters = {};
            if (req.query.isDeleted !== undefined) filters.isDeleted = req.query.isDeleted;
            if (req.params.entityType) filters.entityType = req.params.entityType;
            if (req.params.entityId) filters.entityId = Number(req.params.entityId);
            return filters;
        },
    })(fastify);

    /**
     * GET /image/:page/:pageSize
     * Supports query params: entityType, entityId, isDeleted
     * Returns paginated list of images
     */
    await list({
        route     : '/:page/:pageSize',
        service   : service,
        schema    : schemas.ImagePaginatedSchema,
        getWhere  : (req) => {
            const filters = {};
            if (req.query.entityType) filters.entityType = req.query.entityType;
            if (req.query.entityId) filters.entityId = Number(req.query.entityId);
            if (req.query.isDeleted !== undefined) filters.isDeleted = req.query.isDeleted;
            return filters;
        },
    })(fastify);

    /**
     * GET /image/
     * Supports query params: entityType, entityId, isDeleted
     * Returns paginated list of images
     */
    await list({
        route     : '/',
        service   : service,
        schema    : schemas.ImagePaginatedSchema,
        getWhere  : (req) => {
            const filters = {};
            if (req.query.entityType) filters.entityType = req.query.entityType;
            if (req.query.entityId) filters.entityId = Number(req.query.entityId);
            if (req.query.isDeleted !== undefined) filters.isDeleted = req.query.isDeleted;
            return filters;
        },
    })(fastify);

    /**
     * GET /image/:id
     * Returns a single image by ID
     */
    await getItem({
        route       : '/:id',
        idParam     : 'id',
        parseId     : (v) => Number(v),
        name        : 'image',
        ...baseConfig,
    })(fastify);

    /**
     * POST /image
     * Creates a new image
     * Body must match CreateSchema
     * Returns the created image
     */
    await createItem({
        route       : '/',
        name        : 'image',
        schema      : schemas.CreateSchema,
        ...baseConfig,
    })(fastify);

    /**
     * PATCH /image/:id
     * Updates an image by ID
     * Body must match UpdateSchema
     * Returns the updated image
     */
    await patchItem({
        route       : '/:id',
        idParam     : 'id',
        parseId     : (v) => Number(v),
        name        : 'image',
        schema      : schemas.UpdateSchema,
        ...baseConfig,
    })(fastify);

    /**
     * DELETE /image/:id
     * Deletes an image by ID
     * Returns { deleted: true } if successful
     */
    await deleteItem({
        route       : '/:id',
        idParam     : 'id',
        parseId     : (v) => Number(v),
        name        : 'image',
        schema      : schemas.DeleteSchema,
        ...baseConfig,
    })(fastify);
};

module.exports = {
    handler: plugin,
    prefix: '/image',
};