Source

http/src/schemas/icons.js

/**
 * @typedef {Object} IconSchema
 * @property {number} id
 * @property {string} name
 * @property {number} price
 * @property {number} width
 * @property {number} height
 * @property {number} setId
 * @property {number} styleId
 * @property {number} teamId
 * @property {number} userId
 * @property {string} uniqueId
 * @property {number} licenseId
 * @property {boolean} isActive
 * @property {string} createdAt (date-time)
 * @property {string} updatedAt (date-time)
 * @property {boolean} isDeleted
 */
const IconSchema = {
    type: 'object',
    properties: {
        id       : { type: 'integer' },
        name     : { type: 'string', maxLength: 255 },
        price    : { type: 'number' },
        width    : { type: 'number' },
        height   : { type: 'number' },
        setId    : { type: 'integer' },
        styleId  : { type: 'integer' },
        teamId   : { type: 'integer' },
        userId   : { type: 'integer' },
        uniqueId : { type: 'string' },
        licenseId: { type: 'integer' },
        isActive : { type: 'boolean' },
        createdAt: { type: 'string', format: 'date-time' },
        updatedAt: { type: 'string', format: 'date-time' },
        isDeleted: { type: 'boolean' }
    },
    required: [
        'name',
        'price',
        'width',
        'height',
        'setId',
        'styleId',
        'teamId',
        'userId',
        'uniqueId',
        'licenseId',
        'isActive',
        'createdAt',
        'updatedAt',
        'isDeleted'
    ],
    additionalProperties: false
};

/**
 * @typedef {Object} IconListSchema
 * @property {IconSchema[]} results
 */
const IconListSchema = {
    type: 'array',
    items: IconSchema
};

/**
 * @typedef {Object} IconPaginatedSchema
 * @property {IconSchema[]} results
 * @property {number} total
 * @property {number} page
 * @property {number} pageSize
 * @property {number} totalPages
 * @property {boolean} cacheHit
 */
const IconPaginatedSchema = {
    type: 'object',
    properties: {
        results   : IconListSchema,
        total     : { type: 'integer' },
        page      : { type: 'integer' },
        pageSize  : { type: 'integer' },
        totalPages: { type: 'integer' },
        cacheHit  : { type: 'boolean' }
    },
    required: ['results', 'total', 'page', 'pageSize', 'totalPages'],
    additionalProperties: false
};

/** @typedef {Object} IconDeletedSchema
 * @property {boolean} deleted
 */
const IconDeletedSchema = {
    type: 'object',
    properties: { deleted: { type: 'boolean' } },
    required: ['deleted'],
    additionalProperties: false
};

/**
 * @typedef {Object} CreateIconSchema
 * @property {string} name
 * @property {number} price
 * @property {number} width
 * @property {number} height
 * @property {number} setId
 * @property {number} styleId
 * @property {number} teamId
 * @property {number} userId
 * @property {string} uniqueId
 * @property {number} licenseId
 * @property {boolean} isActive
 */
const CreateIconSchema = {
    body: {
        type: 'object',
        properties: {
            name     : { type: 'string', maxLength: 255 },
            price    : { type: 'number' },
            width    : { type: 'number' },
            height   : { type: 'number' },
            setId    : { type: 'integer' },
            styleId  : { type: 'integer' },
            teamId   : { type: 'integer' },
            userId   : { type: 'integer' },
            uniqueId : { type: 'string' },
            licenseId: { type: 'integer' },
            isActive : { type: 'boolean' }
        },
        required: [
            'name',
            'price',
            'width',
            'height',
            'setId',
            'styleId',
            'teamId',
            'userId',
            'uniqueId',
            'licenseId',
            'isActive'
        ],
        additionalProperties: false
    },
    response: { 201: IconSchema }
};

/**
 * @typedef {Object} ListIconsSchema
 * @property {number} [page]
 * @property {number} [pageSize]
 * @property {number} [setId]
 * @property {number} [styleId]
 * @property {number} [teamId]
 * @property {number} [userId]
 * @property {boolean} [isActive]
 * @property {boolean} [isDeleted]
 * @property {IconSchema[]} 200
 */
const ListIconsSchema = {
    params: {
        type: 'object',
        properties: {
            page     : { type: 'integer', minimum: 1, default: 1 },
            pageSize : { type: 'integer', minimum: 1, maximum: 100, default: 10 },
            setId    : { type: 'integer' },
            styleId  : { type: 'integer' },
            teamId   : { type: 'integer' },
            userId   : { type: 'integer' },
            isActive : { type: 'boolean' },
            isDeleted: { type: 'boolean' }
        },
        additionalProperties: false
    },
    response: {
        200: {
            type: 'array',
            items: IconSchema
        }
    }
};

/**
 * @typedef {Object} GetIconSchema
 * @property {number} id
 * @property {IconSchema} 200
 * @property {Object} 404
 */
const GetIconSchema = {
    params: {
        type: 'object',
        properties: { id: { type: 'integer' } },
        required: ['id'],
        additionalProperties: false
    },
    response: {
        200: IconSchema,
        404: {
            type: 'object',
            properties: { error: { type: 'string' } }
        }
    }
};

const UpdateIconSchema = {
    params: {
        type: 'object',
        properties: { id: { type: 'integer' } },
        required: ['id'],
        additionalProperties: false
    },
    body: {
        type: 'object',
        properties: {
            name     : { type: 'string', maxLength: 255 },
            price    : { type: 'number' },
            width    : { type: 'number' },
            height   : { type: 'number' },
            setId    : { type: 'integer' },
            styleId  : { type: 'integer' },
            teamId   : { type: 'integer' },
            userId   : { type: 'integer' },
            uniqueId : { type: 'string' },
            licenseId: { type: 'integer' },
            isActive : { type: 'boolean' },
            isDeleted: { type: 'boolean' }
        },
        additionalProperties: false
    },
    response: {
        200: IconSchema,
        404: {
            type: 'object',
            properties: { error: { type: 'string' } }
        }
    }
};

const DeleteIconSchema = {
    params: {
        type: 'object',
        properties: { id: { type: 'integer' } },
        required: ['id'],
        additionalProperties: false
    },
    response: {
        200: IconDeletedSchema,
        404: {
            type: 'object',
            properties: { error: { type: 'string' } }
        }
    }
};

module.exports = {
    IconSchema,
    IconListSchema,
    IconPaginatedSchema,
    IconDeletedSchema,
    CreateSchema  : CreateIconSchema,
    ListSchema    : ListIconsSchema,
    GetItemSchema : GetIconSchema,
    UpdateSchema  : UpdateIconSchema,
    DeleteSchema  : DeleteIconSchema
};