UNPKG

@2amtech/crudx-swagger

Version:

NestJs package to apply swagger meta-data into routes generated with @2amtech/crudx package

370 lines 14 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Swagger = exports.swaggerPkgJson = void 0; const crudx_1 = require("@2amtech/crudx"); const crudx_2 = require("@2amtech/crudx"); const crudx_3 = require("@2amtech/crudx"); const common_1 = require("@nestjs/common"); const swagger_1 = require("@nestjs/swagger"); const SWAGGER_CONSTANTS = require("@nestjs/swagger/dist/constants"); const lodash_1 = require("lodash"); // eslint-disable-next-line @typescript-eslint/no-var-requires const pluralize = require("pluralize"); exports.swaggerPkgJson = (0, crudx_3.safeRequire)("@nestjs/swagger/package.json", () => require("@nestjs/swagger/package.json")); class Swagger { static operationsMap(modelName) { return { getManyBase: `Retrieve multiple ${pluralize(modelName)}`, getOneBase: `Retrieve a single ${modelName}`, createManyBase: `Create multiple ${pluralize(modelName)}`, createOneBase: `Create a single ${modelName}`, updateOneBase: `Update a single ${modelName}`, replaceOneBase: `Replace a single ${modelName}`, deleteOneBase: `Delete a single ${modelName}`, recoverOneBase: `Recover one ${modelName}`, }; } static setOperation(metadata, func) { crudx_2.R.set(SWAGGER_CONSTANTS.DECORATORS.API_OPERATION, metadata, func); } static setParams(metadata, func) { crudx_2.R.set(SWAGGER_CONSTANTS.DECORATORS.API_PARAMETERS, metadata, func); } static setExtraModels(swaggerModels) { /* istanbul ignore else */ if (SWAGGER_CONSTANTS) { const meta = Swagger.getExtraModels(swaggerModels.get); const models = [ ...meta, ...(0, lodash_1.keys)(swaggerModels) .map((name) => swaggerModels[name]) .filter((one) => one && one.name !== swaggerModels.get.name), ]; crudx_2.R.set(SWAGGER_CONSTANTS.DECORATORS.API_EXTRA_MODELS, models, swaggerModels.get); } } static setResponseOk(metadata, func) { crudx_2.R.set(SWAGGER_CONSTANTS.DECORATORS.API_RESPONSE, metadata, func); } static getOperation(func) { return crudx_2.R.get(SWAGGER_CONSTANTS.DECORATORS.API_OPERATION, func) || {}; } static getParams(func) { return crudx_2.R.get(SWAGGER_CONSTANTS.DECORATORS.API_PARAMETERS, func) || []; } static getExtraModels(target) { return crudx_2.R.get(SWAGGER_CONSTANTS.DECORATORS.API_EXTRA_MODELS, target) || []; } static getResponseOk(func) { return crudx_2.R.get(SWAGGER_CONSTANTS.DECORATORS.API_RESPONSE, func) || {}; } static createResponseMeta(name, options, swaggerModels) { const { routes, query } = options; switch (name) { case "getOneBase": return { [common_1.HttpStatus.OK]: { description: "Get one base response", type: swaggerModels?.get ?? {}, }, }; case "getManyBase": return { [common_1.HttpStatus.OK]: query?.alwaysPaginate ? { description: "Get paginated response", type: swaggerModels.getMany, } : { description: "Get many base response", schema: { oneOf: [ { $ref: (0, swagger_1.getSchemaPath)(swaggerModels.getMany.name), }, { type: "array", items: { $ref: (0, swagger_1.getSchemaPath)(swaggerModels.get.name), }, }, ], }, }, }; case "createOneBase": return { [common_1.HttpStatus.CREATED]: { description: "Get create one base response", schema: { $ref: (0, swagger_1.getSchemaPath)(swaggerModels.create.name), }, }, }; case "createManyBase": return { [common_1.HttpStatus.CREATED]: swaggerModels.createMany ? { description: "Get create many base response", schema: { $ref: (0, swagger_1.getSchemaPath)(swaggerModels.createMany.name), }, } : { description: "Get create many base response", schema: { type: "array", items: { $ref: (0, swagger_1.getSchemaPath)(swaggerModels.create.name), }, }, }, }; case "deleteOneBase": return { [common_1.HttpStatus.OK]: routes?.deleteOneBase?.returnDeleted ? { description: "Delete one base response", schema: { $ref: (0, swagger_1.getSchemaPath)(swaggerModels.delete.name), }, } : { description: "Delete one base response", }, }; case "recoverOneBase": return { [common_1.HttpStatus.OK]: routes?.recoverOneBase?.returnRecovered ? { description: "Recover one base response", schema: { $ref: (0, swagger_1.getSchemaPath)(swaggerModels.recover.name), }, } : { description: "Recover one base response", }, }; default: const dto = swaggerModels[name.split("OneBase")[0]]; return { [common_1.HttpStatus.OK]: { description: "Response", schema: { $ref: (0, swagger_1.getSchemaPath)(dto.name) }, }, }; } } static createPathParamsMeta(options) { return SWAGGER_CONSTANTS ? (0, lodash_1.keys)(options).map((param) => ({ name: param, required: true, in: "path", type: options[param].type === "number" ? Number : String, enum: (0, lodash_1.isArray)(options[param]?.enum) ? Object.values(options[param].enum) : undefined, })) : []; } static createQueryParamsMeta(name, options) { const { delim: d, delimStr: coma, fields, search, filter, or, join, sort, limit, offset, page, cache, includeDeleted, } = Swagger.getQueryParamsNames(); const docsLink = (a) => // TODO: to modify `<a href="https://github.com/2am.tech/crudx/wiki/Requests#${a}" target="_blank">Docs</a>`; const fieldsMetaBase = { name: fields, description: `Selects resource fields. ${docsLink("select")}`, required: false, in: "query", }; const fieldsMeta = { ...fieldsMetaBase, schema: { type: "array", items: { type: "string", }, }, style: "form", explode: false, }; const searchMetaBase = { name: search, description: `Adds search condition. ${docsLink("search")}`, required: false, in: "query", }; const searchMeta = { ...searchMetaBase, schema: { type: "string" } }; const filterMetaBase = { name: filter, description: `Adds filter condition. ${docsLink("filter")}`, required: false, in: "query", }; const filterMeta = { ...filterMetaBase, schema: { type: "array", items: { type: "string", }, }, style: "form", explode: true, }; const orMetaBase = { name: or, description: `Adds OR condition. ${docsLink("or")}`, required: false, in: "query", }; const orMeta = { ...orMetaBase, schema: { type: "array", items: { type: "string", }, }, style: "form", explode: true, }; const sortMetaBase = { name: sort, description: `Adds sort by field. ${docsLink("sort")}`, required: false, in: "query", }; const sortMeta = { ...sortMetaBase, schema: { type: "array", items: { type: "string", }, }, style: "form", explode: true, }; const joinMetaBase = { name: join, description: `Adds relational resources. ${docsLink("join")}`, required: false, in: "query", }; const joinMeta = { ...joinMetaBase, schema: { type: "array", items: { type: "string", }, }, style: "form", explode: true, }; const limitMetaBase = { name: limit, description: `Limit amount of resources. ${docsLink("limit")}`, required: false, in: "query", }; const limitMeta = { ...limitMetaBase, schema: { type: "integer" } }; const offsetMetaBase = { name: offset, description: `Offset amount of resources. ${docsLink("offset")}`, required: false, in: "query", }; const offsetMeta = { ...offsetMetaBase, schema: { type: "integer" } }; const pageMetaBase = { name: page, description: `Page portion of resources. ${docsLink("page")}`, required: false, in: "query", }; const pageMeta = { ...pageMetaBase, schema: { type: "integer" } }; const cacheMetaBase = { name: cache, description: `Reset cache (if was enabled). ${docsLink("cache")}`, required: false, in: "query", }; const cacheMeta = { ...cacheMetaBase, schema: { type: "integer", minimum: 0, maximum: 1 }, }; const includeDeletedMetaBase = { name: includeDeleted, description: `Include deleted. ${docsLink("includeDeleted")}`, required: false, in: "query", }; const includeDeletedMeta = { ...includeDeletedMetaBase, schema: { type: "integer", minimum: 0, maximum: 1 }, }; switch (name) { case "getManyBase": return options.query?.softDelete ? [ fieldsMeta, searchMeta, filterMeta, orMeta, sortMeta, joinMeta, limitMeta, offsetMeta, pageMeta, cacheMeta, includeDeletedMeta, ] : [ fieldsMeta, searchMeta, filterMeta, orMeta, sortMeta, joinMeta, limitMeta, offsetMeta, pageMeta, cacheMeta, ]; case "getOneBase": return options.query?.softDelete ? [fieldsMeta, joinMeta, cacheMeta, includeDeletedMeta] : [fieldsMeta, joinMeta, cacheMeta]; default: return []; } } static getQueryParamsNames() { const qbOptions = crudx_1.QueryBuilderService.getOptions(); const name = (n) => { const selected = (0, lodash_1.get)(qbOptions, `paramNamesMap[${n}]`); return (0, lodash_1.isString)(selected) ? selected : selected?.[0]; }; return { delim: qbOptions.delim, delimStr: qbOptions.delimStr, fields: name("fields"), search: name("search"), filter: name("filter"), or: name("or"), join: name("join"), sort: name("sort"), limit: name("limit"), offset: name("offset"), page: name("page"), cache: name("cache"), includeDeleted: name("includeDeleted"), }; } } exports.Swagger = Swagger; //# sourceMappingURL=swagger.helper.js.map