UNPKG

@solid-nestjs/rest-api

Version:

solid-nestjs Rest-API utilities

157 lines 6.89 kB
"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.GroupByArgsFrom = GroupByArgsFrom; const swagger_1 = require("@nestjs/swagger"); const class_validator_1 = require("class-validator"); const class_transformer_1 = require("class-transformer"); const inputs_1 = require("../classes/inputs"); const common_1 = require("@solid-nestjs/common"); /** * Creates a GroupByArgsFrom mixin with REST API decorators. * This function extends the base GroupByArgsFrom functionality to include * proper Swagger decorators for REST APIs. * * @template T - The entity type (optional, for type inference) * @param config - Configuration with FindArgs type, fields, and optional class options * @returns A dynamically generated GroupBy class with REST API decorators * * @example * ```typescript * import { GroupByArgsFrom } from '@solid-nestjs/rest-api'; * * export class FindProductArgs extends FindArgsFrom({ * whereType: ProductWhere, * orderByType: ProductOrderBy * }) {} * * // Using field names * const ProductGroupByFromArgs = GroupByArgsFrom({ * findArgsType: FindProductArgs, * groupByFields: ['category', 'supplier', 'status'], * className: 'ProductGroupByFromFindArgs', * options: { * description: 'Group by fields for Product queries' * } * }); * * // Using generated fields class * const ProductGroupByFields = createGroupByFields(Product, {...}); * const ProductGroupByFromArgs = GroupByArgsFrom({ * findArgsType: FindProductArgs, * groupByFieldsType: ProductGroupByFields, * options: { * description: 'Group by fields for Product queries' * } * }); * ``` */ function GroupByArgsFrom(config) { // Determine the fields type to use const fieldsType = config.groupByFieldsType || config.groupByFields; // If a class type is provided, use static class decoration pattern if (fieldsType && typeof fieldsType === 'function') { // Get the FindArgs class const FindArgsClass = config.findArgsType; const className = config.options?.name || `${FindArgsClass.name}GroupBy`; // Create a GroupByRequest class using plain class (no decorators for REST) class GroupByRequestClass { } __decorate([ (0, swagger_1.ApiProperty)({ type: fieldsType, required: false, description: 'Fields to group by' }), (0, class_validator_1.IsOptional)(), (0, class_validator_1.ValidateNested)(), (0, class_transformer_1.Type)(() => fieldsType), __metadata("design:type", Object) ], GroupByRequestClass.prototype, "fields", void 0); __decorate([ (0, swagger_1.ApiProperty)({ type: [inputs_1.AggregateFieldInput], required: false, description: 'Aggregate functions to apply', example: [{ field: 'price', function: 'AVG', alias: 'avgPrice' }] }), (0, class_validator_1.IsOptional)(), (0, class_validator_1.ValidateNested)({ each: true }), (0, class_transformer_1.Type)(() => inputs_1.AggregateFieldInput), __metadata("design:type", Array) ], GroupByRequestClass.prototype, "aggregates", void 0); // Create the main GroupByArgs class class GroupByArgsClass extends FindArgsClass { } __decorate([ (0, swagger_1.ApiProperty)({ type: GroupByRequestClass, required: true, description: config.options?.description || 'GroupBy configuration' }), (0, class_validator_1.ValidateNested)(), (0, class_transformer_1.Type)(() => GroupByRequestClass), __metadata("design:type", Object) ], GroupByArgsClass.prototype, "groupBy", void 0); // Set class name Object.defineProperty(GroupByArgsClass, 'name', { value: className, configurable: true }); return GroupByArgsClass; } // Fall back to original implementation for string array const baseConfig = { ...config, groupByFields: config.groupByFields }; // Create base class using common GroupByArgsFrom const BaseGroupByClass = (0, common_1.GroupByArgsFrom)(baseConfig); const metadata = (0, common_1.getGroupByArgsMetadata)(BaseGroupByClass); if (!metadata) { throw new Error('Failed to extract metadata from base GroupBy class'); } // Generate enhanced class with decorators const EnhancedClass = (0, common_1.generateBaseClass)({ className: metadata.className, metadata: metadata }); // Apply class-level decorators (no class decorators for REST, but keeping structure consistent) const classOptions = config.options || {}; const classDecorators = [ ...(classOptions.decorators || []) ]; for (const decorator of classDecorators) { (0, common_1.applyDecoratorToClass)(decorator, EnhancedClass); } // Add fields with decorators config.groupByFields.forEach(fieldName => { const fieldMetadata = (0, common_1.getGroupByFieldMetadata)(BaseGroupByClass, fieldName); // Add property to class (0, common_1.addPropertyToClass)(EnhancedClass, fieldName, { type: Boolean, isOptional: true, description: fieldMetadata?.description, }); // Apply Swagger decorator (0, common_1.applyDecoratorToProperty)((0, swagger_1.ApiProperty)({ type: Boolean, required: false, description: fieldMetadata?.description || `Group by ${fieldName}`, example: true }), EnhancedClass, fieldName); // Apply validation decorators (0, common_1.applyDecoratorToProperty)((0, class_validator_1.IsOptional)(), EnhancedClass, fieldName); (0, common_1.applyDecoratorToProperty)((0, class_validator_1.IsBoolean)(), EnhancedClass, fieldName); }); return EnhancedClass; } //# sourceMappingURL=groupby-args.mixin.js.map