Source

http/src/plugins/families.plugin.js

'use strict';

const { initFamilyService, FamilyEntity } = require('../../../src/products/families');
const {
    list,
    getItem,
    createItem,
    patchItem,
    deleteItem,
} = require('../factory');
const schemas = require('../schemas/families');

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

    const baseConfig = {
        service     : service,
        entityClass : FamilyEntity,
        baseWhere   : {},
    };

    /**
     * GET /family/:userId/:page/:pageSize
     * GET /family/:page/:pageSize
     * Supports query params for filtering: teamId, licenseId, isActive, isDeleted
     * Returns paginated list of families by userId
     */
    await list({
        route     : '/user/:userId/:page/:pageSize',
        service   : service,
        schema    : schemas.FamilyPaginatedSchema,
        getWhere  : (req) => {
            const filters = {};
            if (req.params.userId) filters.userId = Number(req.params.userId);
            if (req.query.teamId) filters.teamId = Number(req.query.teamId);
            if (req.query.licenseId) filters.licenseId = Number(req.query.licenseId);
            if (req.query.isActive !== undefined) filters.isActive = req.query.isActive;
            if (req.query.isDeleted !== undefined) filters.isDeleted = req.query.isDeleted;
            return filters;
        },
    })(fastify);

    /**
     * GET /family/:page/:pageSize
     * Supports query params for filtering: userId, teamId, licenseId, isActive, isDeleted
     * Returns paginated list of families
     */
    await list({
        route     : '/:page/:pageSize',
        service   : service,
        schema    : schemas.FamilyPaginatedSchema,
        getWhere  : (req) => {
            const filters = {};
            if (req.query.userId) filters.userId = Number(req.query.userId);
            if (req.query.teamId) filters.teamId = Number(req.query.teamId);
            if (req.query.licenseId) filters.licenseId = Number(req.query.licenseId);
            if (req.query.isActive !== undefined) filters.isActive = req.query.isActive;
            if (req.query.isDeleted !== undefined) filters.isDeleted = req.query.isDeleted;
            return filters;
        },
    })(fastify);

    /**
     * GET /family/
     * Supports query params for filtering: userId, teamId, licenseId, isActive, isDeleted
     * Returns paginated list of families
     */
    await list({
        route     : '/',
        service   : service,
        schema    : schemas.FamilyPaginatedSchema,
        getWhere  : (req) => {
            const filters = {};
            if (req.query.userId) filters.userId = Number(req.query.userId);
            if (req.query.teamId) filters.teamId = Number(req.query.teamId);
            if (req.query.licenseId) filters.licenseId = Number(req.query.licenseId);
            if (req.query.isActive !== undefined) filters.isActive = req.query.isActive;
            if (req.query.isDeleted !== undefined) filters.isDeleted = req.query.isDeleted;
            return filters;
        },
    })(fastify);

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

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

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

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

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