nicot 1.2.10 → 1.2.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../index.ts", "../src/dto/import-entry.ts", "../src/dto/cursor-pagination.ts", "../src/decorators/access.ts", "../src/utility/metadata.ts", "../src/decorators/property.ts", "../src/utility/bigint.ts", "../src/utility/non-transformable-types.ts", "../src/utility/type-transformer.ts", "../src/utility/parse-bool.ts", "../src/decorators/get-mutator.ts", "../src/decorators/pipes.ts", "../src/decorators/query.ts", "../src/utility/unshift-order-by.ts", "../src/utility/subject-registry.ts", "../src/decorators/binding.ts", "../src/crud-base.ts", "../src/bases/time-base.ts", "../src/bases/page-settings.ts", "../src/bases/id-base.ts", "../src/utility/get-typeorm-relations.ts", "../src/utility/cursor-pagination-utils.ts", "../src/utility/filter-relations.ts", "../src/restful.ts", "../src/bases/base-restful-controller.ts", "../src/utility/omit-type-exclude.ts", "../src/utility/patch-column-in-get.ts", "../src/utility/mutate-pipe.ts", "../src/utility/query.ts"],
4
- "sourcesContent": ["export * from 'nesties';\nexport * from './src/crud-base';\nexport * from './src/restful';\nexport * from './src/bases';\nexport * from './src/decorators';\nexport * from './src/dto';\nexport * from './src/utility';\n", "import { ApiProperty } from '@nestjs/swagger';\nimport { Type } from 'class-transformer';\nimport { ValidateNested } from 'class-validator';\nimport {\n AnyClass,\n ClassOrArray,\n getClassFromClassOrArray,\n InsertField,\n} from 'nesties';\n\nexport class ImportEntryBaseDto {\n @ApiProperty({ description: 'Import result', type: String })\n result: string;\n}\n\nexport interface ImportEntry<T> {\n entry: T;\n result: string;\n}\n\nexport function ImportEntryDto<C extends ClassOrArray>(type: C) {\n return InsertField(\n ImportEntryBaseDto,\n {\n entry: { type, options: { description: 'Import entry' } },\n },\n `${getClassFromClassOrArray(type).name}ImportEntry`,\n );\n}\n\nexport class ImportDataBaseDto<T> {\n @ValidateNested()\n data: T[];\n}\n\nexport function ImportDataDto<C extends AnyClass>(type: C) {\n const dtoClass = InsertField(\n ImportDataBaseDto,\n {\n data: { type: [type], options: { description: 'Import data' } },\n },\n `${getClassFromClassOrArray(type).name}ImportData`,\n );\n Type(() => type)(dtoClass.prototype, 'data');\n return dtoClass;\n}\n", "import {\n IsInt,\n IsNotEmpty,\n IsOptional,\n IsPositive,\n IsString,\n} from 'class-validator';\nimport { ApiProperty } from '@nestjs/swagger';\nimport {\n AnyClass,\n BlankReturnMessageDto,\n getClassFromClassOrArray,\n InsertField,\n} from 'nesties';\nimport { NotInResult, NotWritable, QueryManual } from '../decorators';\n\nexport class CursorPaginationDto {\n @NotWritable()\n @IsNotEmpty()\n @IsString()\n @IsOptional()\n @ApiProperty({\n description: 'Pagination Cursor',\n required: false,\n type: String,\n })\n @NotInResult()\n @QueryManual()\n paginationCursor: string;\n\n @NotWritable()\n @IsPositive()\n @IsInt()\n @ApiProperty({\n description: 'Records per page.',\n required: false,\n type: Number,\n minimum: 1,\n })\n @NotInResult()\n @QueryManual()\n recordsPerPage: number;\n}\n\nexport interface CursorPaginationResponseWise {\n nextCursor?: string;\n previousCursor?: string;\n}\n\nexport class BlankCursorPaginationReturnMessageDto\n extends BlankReturnMessageDto\n implements CursorPaginationResponseWise\n{\n @ApiProperty({\n description: 'Next Cursor',\n required: false,\n type: String,\n })\n nextCursor?: string;\n\n @ApiProperty({\n description: 'Previous Cursor',\n required: false,\n type: String,\n })\n previousCursor?: string;\n\n constructor(\n statusCode: number,\n message: string,\n cursorResponse: CursorPaginationResponseWise,\n ) {\n super(statusCode, message);\n this.nextCursor = cursorResponse.nextCursor;\n this.previousCursor = cursorResponse.previousCursor;\n }\n}\n\nexport class GenericCursorPaginationReturnMessageDto<T>\n extends BlankCursorPaginationReturnMessageDto\n implements CursorPaginationResponseWise\n{\n data: T[];\n\n constructor(\n statusCode: number,\n message: string,\n data: T[],\n cursorResponse: CursorPaginationResponseWise,\n ) {\n super(statusCode, message, cursorResponse);\n this.data = data;\n }\n}\n\nexport function CursorPaginationReturnMessageDto<T extends AnyClass>(\n type: T,\n): new (\n statusCode: number,\n message: string,\n data: InstanceType<T>[],\n cursorResponse: CursorPaginationResponseWise,\n) => GenericCursorPaginationReturnMessageDto<InstanceType<T>> {\n return InsertField(\n GenericCursorPaginationReturnMessageDto,\n {\n data: {\n type: [type],\n options: {\n required: false,\n description: 'Return data.',\n },\n },\n },\n `${getClassFromClassOrArray(type).name}CursorPaginationReturnMessageDto`,\n );\n}\n", "import { IsOptional } from 'class-validator';\nimport { Metadata } from '../utility/metadata';\nimport { MergePropertyDecorators } from 'nesties';\n\nexport const NotWritable = () =>\n MergePropertyDecorators([\n IsOptional(),\n Metadata.set('notWritable', true, 'notWritableFields'),\n ]);\n\nexport const NotCreatable = () =>\n MergePropertyDecorators([\n IsOptional(),\n Metadata.set('notCreatable', true, 'notCreatableFields'),\n ]);\n\nexport const NotChangeable = () =>\n MergePropertyDecorators([\n Metadata.set('notChangeable', true, 'notChangeableFields'),\n ]);\n\nexport const NotQueryable = () =>\n Metadata.set('notQueryable', true, 'notQueryableFields');\n\nexport const NotInResult = (options: { entityVersioningDate?: boolean } = {}) =>\n Metadata.set('notInResult', options, 'notInResultFields');\n", "import { MetadataSetter, Reflector } from 'typed-reflector';\nimport { QueryCond } from '../bases';\nimport { AnyClass } from 'nesties';\nimport { QueryFullTextColumnOptions } from './query-full-text-column-options.interface';\nimport { GetMutatorOptions } from '../decorators/get-mutator';\nimport { BindingValueMetadata } from '../decorators/binding';\n\ninterface SpecificFields {\n notColumn: { keepInCreate?: boolean };\n notWritable: boolean;\n notCreatable: boolean;\n notChangeable: boolean;\n notQueryable: boolean;\n notInResult: { entityVersioningDate?: boolean };\n relationComputed: () => { entityClass: AnyClass; isArray: boolean };\n queryFullTextColumn: QueryFullTextColumnOptions;\n // boolColumn: boolean;\n notRequiredButHasDefault: boolean;\n queryCondition: QueryCond;\n requireGetMutator: boolean;\n getMutator: GetMutatorOptions;\n bindingColumn: string;\n bindingValue: BindingValueMetadata;\n}\n\ntype MetadataMap = SpecificFields;\n\ntype FieldsMap = {\n [K in keyof MetadataMap as `${K}Fields`]: string;\n};\n\ntype MetadataArrayMap = FieldsMap;\n\nexport const Metadata = new MetadataSetter<MetadataMap, MetadataArrayMap>();\nexport const reflector = new Reflector<MetadataMap, MetadataArrayMap>();\n\nexport function getSpecificFields<K extends keyof SpecificFields>(\n obj: any,\n type: K,\n filter: (meta: SpecificFields[K], obj: any) => boolean = () => true,\n) {\n return reflector.getArray(`${type}Fields`, obj).filter((field) => {\n const value = reflector.get(type, obj, field);\n if (value == null) {\n return false;\n }\n return filter(value, obj);\n });\n}\n\nexport function getNotInResultFields(\n obj: any,\n keepEntityVersioningDates = false,\n) {\n return getSpecificFields(\n obj,\n 'notInResult',\n (meta) => !keepEntityVersioningDates || !meta.entityVersioningDate,\n );\n}\n", "import { ColumnCommonOptions } from 'typeorm/decorator/options/ColumnCommonOptions';\nimport { ApiProperty, ApiPropertyOptions } from '@nestjs/swagger';\nimport { ColumnWithLengthOptions } from 'typeorm/decorator/options/ColumnWithLengthOptions';\nimport { AnyClass, MergePropertyDecorators } from 'nesties';\nimport { Column, Index } from 'typeorm';\nimport {\n IsDate,\n IsEnum,\n IsInt,\n IsNumber,\n IsOptional,\n IsString,\n IsUUID,\n Max,\n MaxLength,\n Min,\n ValidateNested,\n} from 'class-validator';\nimport {\n SimpleColumnType,\n UnsignedColumnType,\n WithLengthColumnType,\n WithPrecisionColumnType,\n} from 'typeorm/driver/types/ColumnTypes';\nimport { ColumnNumericOptions } from 'typeorm/decorator/options/ColumnNumericOptions';\nimport { Exclude, Transform, Type } from 'class-transformer';\nimport { BigintTransformer } from '../utility/bigint';\nimport { Metadata } from '../utility/metadata';\nimport { ClassOrArray, getClassFromClassOrArray, ParseType } from 'nesties';\nimport {\n TypeTransformer,\n TypeTransformerString,\n} from '../utility/type-transformer';\nimport {\n NotChangeable,\n NotInResult,\n NotQueryable,\n NotWritable,\n} from './access';\nimport { parseBool } from '../utility/parse-bool';\nimport { ColumnUnsignedOptions } from 'typeorm/decorator/options/ColumnUnsignedOptions';\nimport { GetMutatorBool, RequireGetMutator } from './get-mutator';\n\nexport interface OpenAPIOptions<T> {\n description?: string;\n propertyExtras?: ApiPropertyOptions;\n default?: T;\n required?: boolean;\n}\n\nconst NotRequiredButHasDefaultDec = () =>\n Metadata.set(\n 'notRequiredButHasDefault',\n true,\n 'notRequiredButHasDefaultFields',\n );\n\nfunction swaggerDecorator(\n options: OpenAPIOptions<any>,\n injected: ApiPropertyOptions = {},\n) {\n // we should patch the required flag in EntityResultDto\n const notRequiredButHasDefault =\n options.required == null && options.default != null;\n const apiPropertyDec = ApiProperty({\n default: options.default,\n required: !!(options.required && options.default == null),\n example: options.default,\n description: options.description,\n ...injected,\n ...(options.propertyExtras || {}),\n } as ApiPropertyOptions);\n if (notRequiredButHasDefault) {\n return MergePropertyDecorators([\n apiPropertyDec,\n NotRequiredButHasDefaultDec(),\n ]);\n } else {\n return apiPropertyDec;\n }\n}\n\nfunction validatorDecorator(options: OpenAPIOptions<any>) {\n const decs: PropertyDecorator[] = [];\n if (!options.required) {\n decs.push(IsOptional());\n }\n return MergePropertyDecorators(decs);\n}\n\nexport interface PropertyOptions<T, ColumnEx = unknown>\n extends OpenAPIOptions<T> {\n columnExtras?: ColumnCommonOptions & ColumnEx;\n}\n\nfunction columnDecoratorOptions<T>(\n options: PropertyOptions<T>,\n): ColumnCommonOptions {\n return {\n default: options.default,\n nullable: !options.required && options.default == null,\n comment: options.description,\n ...options.columnExtras,\n };\n}\n\nexport const StringColumn = (\n length: number,\n options: PropertyOptions<string, ColumnWithLengthOptions> & {\n columnType?: WithLengthColumnType;\n } = {},\n): PropertyDecorator => {\n return MergePropertyDecorators([\n Column(options.columnType || 'varchar', {\n length,\n ...columnDecoratorOptions(options),\n }),\n IsString(),\n MaxLength(length),\n validatorDecorator(options),\n swaggerDecorator(options, { type: String, maxLength: length }),\n ]);\n};\n\nexport const TextColumn = (\n options: PropertyOptions<string> & {\n columnType?: SimpleColumnType;\n } = {},\n): PropertyDecorator => {\n return MergePropertyDecorators([\n Column(options.columnType || 'text', columnDecoratorOptions(options)),\n IsString(),\n validatorDecorator(options),\n swaggerDecorator(options, { type: String }),\n ]);\n};\n\nexport const UuidColumn = (\n options: PropertyOptions<string> & { generated?: boolean } = {},\n): PropertyDecorator => {\n return MergePropertyDecorators([\n Column('uuid', {\n ...columnDecoratorOptions(options),\n ...(options.generated\n ? {\n nullable: false,\n generated: 'uuid',\n }\n : {}),\n }),\n IsUUID(),\n validatorDecorator(options),\n swaggerDecorator(options, {\n type: String,\n format: 'uuid',\n example: '550e8400-e29b-41d4-a716-446655440000',\n }),\n ...(options.generated ? [NotRequiredButHasDefaultDec()] : []),\n ]);\n};\n\nconst intMaxList = {\n tinyint: 0x7f,\n smallint: 0x7fff,\n mediumint: 0x7fffff,\n int: 0x7fffffff,\n bigint: Number.MAX_SAFE_INTEGER,\n};\n\nexport const IntColumn = (\n type: UnsignedColumnType,\n options: PropertyOptions<number, ColumnUnsignedOptions> & {\n unsigned?: boolean;\n range?: {\n min?: number;\n max?: number;\n };\n } = {},\n): PropertyDecorator => {\n let max = intMaxList[type] || Number.MAX_SAFE_INTEGER;\n if (max !== Number.MAX_SAFE_INTEGER && options.unsigned) {\n max = max * 2 + 1;\n }\n let min = options.unsigned ? 0 : -max - 1;\n if (options.range) {\n if (typeof options.range.min === 'number' && options.range.min > min) {\n min = options.range.min;\n }\n if (typeof options.range.max === 'number' && options.range.max < max) {\n max = options.range.max;\n }\n }\n return MergePropertyDecorators([\n Column(type, {\n default: options.default,\n unsigned: options.unsigned,\n ...(type === 'bigint' ? { transformer: new BigintTransformer() } : {}),\n ...columnDecoratorOptions(options),\n }),\n IsInt(),\n ...(min > Number.MIN_SAFE_INTEGER ? [Min(min)] : []),\n ...(max < Number.MAX_SAFE_INTEGER ? [Max(max)] : []),\n validatorDecorator(options),\n swaggerDecorator(options, {\n type: Number,\n minimum: min > Number.MIN_SAFE_INTEGER ? min : undefined,\n maximum: max < Number.MAX_SAFE_INTEGER ? max : undefined,\n }),\n ]);\n};\n\nexport const FloatColumn = (\n type: WithPrecisionColumnType,\n options: PropertyOptions<number, ColumnNumericOptions> & {\n unsigned?: boolean;\n range?: {\n min?: number;\n max?: number;\n };\n } = {},\n): PropertyDecorator => {\n let min = options.unsigned ? 0 : Number.MIN_SAFE_INTEGER;\n let max = Number.MAX_SAFE_INTEGER;\n if (\n options.columnExtras?.precision != null &&\n options.columnExtras?.scale != null\n ) {\n const precision = options.columnExtras.precision;\n const scale = options.columnExtras.scale;\n\n const intDigits = precision - scale;\n\n if (intDigits > 0) {\n const maxIntPart = Math.pow(10, intDigits) - 1;\n const maxDecimalPart =\n scale > 0 ? (Math.pow(10, scale) - 1) / Math.pow(10, scale) : 0;\n max = maxIntPart + maxDecimalPart;\n min = options.unsigned ? 0 : -max;\n }\n }\n return MergePropertyDecorators([\n Column(type, {\n default: options.default,\n unsigned: options.unsigned,\n ...columnDecoratorOptions(options),\n }),\n IsNumber(),\n ...(min > Number.MIN_SAFE_INTEGER ? [Min(min)] : []),\n ...(max < Number.MAX_SAFE_INTEGER ? [Max(max)] : []),\n validatorDecorator(options),\n swaggerDecorator(options, {\n type: Number,\n minimum: min > Number.MIN_SAFE_INTEGER ? min : undefined,\n maximum: max < Number.MAX_SAFE_INTEGER ? max : undefined,\n }),\n ]);\n};\n\nexport const DateColumn = (\n options: PropertyOptions<Date> & { columnType?: SimpleColumnType } = {},\n): PropertyDecorator => {\n return MergePropertyDecorators([\n Column(\n options.columnType || ('timestamp' as SimpleColumnType),\n columnDecoratorOptions(options),\n ),\n IsDate(),\n Transform(\n (v) => {\n const value = v.value;\n if (value == null || value instanceof Date) return value;\n\n const timestampToDate = (t: number, isSeconds: boolean) =>\n new Date(isSeconds ? t * 1000 : t);\n\n if (typeof value === 'number') {\n const isSeconds = !Number.isInteger(value) || value < 1e12;\n return timestampToDate(value, isSeconds);\n }\n\n if (typeof value === 'string' && /^\\d+(\\.\\d+)?$/.test(value)) {\n const isSeconds = value.includes('.') || parseFloat(value) < 1e12;\n return timestampToDate(parseFloat(value), isSeconds);\n }\n\n return new Date(value); // fallback to native parser\n },\n {\n toClassOnly: true,\n },\n ),\n validatorDecorator(options),\n swaggerDecorator(options, { type: Date }),\n ]);\n};\n\nexport const EnumColumn = <T>(\n targetEnum: Record<string, T>,\n options: PropertyOptions<T> = {},\n): PropertyDecorator => {\n return MergePropertyDecorators([\n Index(),\n Column('enum', {\n enum: targetEnum,\n ...columnDecoratorOptions(options),\n }),\n IsEnum(targetEnum),\n validatorDecorator(options),\n swaggerDecorator(options, { enum: targetEnum }),\n ]);\n};\n\nexport const BoolColumn = (\n options: PropertyOptions<boolean> = {},\n): PropertyDecorator =>\n MergePropertyDecorators([\n Index(),\n Transform((v) => {\n return parseBool(v.value);\n }),\n Column('boolean', columnDecoratorOptions(options)),\n validatorDecorator(options),\n swaggerDecorator(options, { type: Boolean }),\n GetMutatorBool(),\n ]);\n\nconst createJsonColumnDef =\n (\n columnType: SimpleColumnType = 'jsonb',\n typeTransformerClass = TypeTransformer,\n ) =>\n <C extends ClassOrArray>(\n definition: C,\n options: PropertyOptions<ParseType<C>> & {\n columnType?: SimpleColumnType;\n } = {},\n ): PropertyDecorator => {\n const cl = getClassFromClassOrArray(definition);\n return MergePropertyDecorators([\n RequireGetMutator(),\n Type(() => cl),\n ValidateNested(),\n Column(options.columnType || columnType, {\n ...columnDecoratorOptions(options),\n transformer: new typeTransformerClass(definition),\n }),\n validatorDecorator(options),\n swaggerDecorator(options, { type: definition }),\n ]);\n };\n\nexport const JsonColumn = createJsonColumnDef();\nexport const SimpleJsonColumn = createJsonColumnDef('json');\nexport const StringJsonColumn = createJsonColumnDef(\n 'text',\n TypeTransformerString,\n);\n\nexport const NotColumn = (\n options: OpenAPIOptions<any> = {},\n specials: { keepInCreate?: boolean } = {},\n): PropertyDecorator =>\n MergePropertyDecorators([\n Exclude(),\n swaggerDecorator({\n required: false,\n ...options,\n }),\n Metadata.set('notColumn', specials, 'notColumnFields'),\n ]);\n\nexport const QueryColumn = (\n options: OpenAPIOptions<any> = {},\n): PropertyDecorator =>\n MergePropertyDecorators([\n NotWritable(),\n NotInResult(),\n swaggerDecorator({\n required: false,\n ...options,\n }),\n ]);\n\nexport const InternalColumn = () =>\n MergePropertyDecorators([NotQueryable(), NotWritable(), NotInResult()]);\n\nexport const CreateOnlyColumn = () =>\n MergePropertyDecorators([NotQueryable(), NotChangeable(), NotInResult()]);\n\nexport const RelationComputed =\n (type?: () => AnyClass): PropertyDecorator =>\n (obj, propertyKey) => {\n const fun = () => {\n const designType = Reflect.getMetadata('design:type', obj, propertyKey);\n const entityClass = type ? type() : designType;\n return {\n entityClass,\n isArray: designType === Array,\n };\n };\n\n const dec = Metadata.set('relationComputed', fun, 'relationComputedFields');\n return dec(obj, propertyKey);\n };\n", "import { ValueTransformer } from 'typeorm';\n\nexport class BigintTransformer implements ValueTransformer {\n from(dbValue) {\n if (dbValue == null) {\n return dbValue;\n }\n return parseInt(dbValue);\n }\n to(entValue): any {\n return entValue;\n }\n}\n", "// eslint-disable-next-line @typescript-eslint/ban-types\nexport const nonTransformableTypes = new Set<Function>([\n // Primitive wrappers\n String,\n Number,\n Boolean,\n BigInt,\n Symbol,\n\n // Built-ins\n Date,\n RegExp,\n Error,\n Array,\n Object,\n Function,\n Promise,\n\n // Collections\n Map,\n Set,\n WeakMap,\n WeakSet,\n\n // Node / Buffer\n Buffer,\n ArrayBuffer,\n SharedArrayBuffer,\n DataView,\n Int8Array,\n Uint8Array,\n Uint8ClampedArray,\n Int16Array,\n Uint16Array,\n Int32Array,\n Uint32Array,\n Float32Array,\n Float64Array,\n BigInt64Array,\n BigUint64Array,\n\n // URL stuff\n URL,\n URLSearchParams,\n]);\n", "import { ValueTransformer } from 'typeorm';\nimport { ClassOrArray } from 'nesties';\nimport { nonTransformableTypes } from './non-transformable-types';\n\nconst toValue = (cl: new () => any, value: any) => {\n if (cl === Date) {\n return new Date(value);\n }\n if (nonTransformableTypes.has(cl) || value instanceof cl) {\n return value;\n }\n if (typeof value === 'object') {\n return Object.assign(new cl(), value);\n }\n return value;\n};\n\nexport class TypeTransformer implements ValueTransformer {\n constructor(private definition: ClassOrArray) {}\n\n from(dbValue) {\n if (!dbValue) {\n return dbValue;\n }\n if (Array.isArray(this.definition)) {\n return dbValue.map((value) => toValue(this.definition[0], value));\n }\n return toValue(this.definition as new () => any, dbValue);\n }\n to(entValue): any {\n return entValue;\n }\n}\n\nexport class TypeTransformerString extends TypeTransformer {\n from(dbValue) {\n if (dbValue == null) {\n return dbValue;\n }\n return super.from(JSON.parse(dbValue));\n }\n\n to(entValue): any {\n if (entValue == null) {\n return entValue;\n }\n return JSON.stringify(super.to(entValue));\n }\n}\n", "export const parseBool = (value: any): boolean => {\n const trueValues = ['true', '1', 'yes', 'on', true, 1];\n const falseValues = ['false', '0', 'no', 'off', false, 0];\n if (trueValues.indexOf(value) !== -1) return true;\n if (falseValues.indexOf(value) !== -1) return false;\n if (!!value) {\n return true;\n }\n return undefined;\n};\n", "import { ApiPropertyOptions } from '@nestjs/swagger';\nimport { Metadata } from '../utility/metadata';\nimport { parseBool } from '../utility/parse-bool';\n\nexport interface GetMutatorOptions {\n mutator: (s: string) => any;\n enum?: string[];\n example?: string;\n apiPropertyExtras?: ApiPropertyOptions;\n}\n\nexport const RequireGetMutator = () =>\n Metadata.set('requireGetMutator', true, 'requireGetMutatorFields');\n\nexport const GetMutator = (\n mutator: (s: string) => any,\n options: Omit<GetMutatorOptions, 'mutator'> = {},\n) => Metadata.set('getMutator', { mutator, ...options }, 'getMutatorFields');\n\nexport const createGetMutator =\n (\n mutator: (s: string) => any,\n defaultOptions: Omit<GetMutatorOptions, 'mutator'> = {},\n ) =>\n (options: Omit<GetMutatorOptions, 'mutator'> = {}) =>\n GetMutator(mutator, {\n ...defaultOptions,\n ...options,\n apiPropertyExtras: {\n ...(defaultOptions.apiPropertyExtras || {}),\n ...(options.apiPropertyExtras || {}),\n } as ApiPropertyOptions,\n });\n\nexport const GetMutatorBool = createGetMutator(parseBool, {\n enum: ['0', '1'],\n example: '1',\n});\n\nexport const GetMutatorInt = createGetMutator((s: string) => parseInt(s, 10));\n\nexport const GetMutatorFloat = createGetMutator((s: string) => parseFloat(s));\n\nexport const GetMutatorStringSeparated = (\n separator = ',',\n options: Omit<GetMutatorOptions, 'mutator'> = {},\n) =>\n GetMutator((s: string) => s.split(separator), {\n example: `value1${separator}value2${separator}value3`,\n ...options,\n });\n\nexport const GetMutatorIntSeparated = (\n separator = ',',\n options: Omit<GetMutatorOptions, 'mutator'> = {},\n) =>\n GetMutator(\n (s: string) => s.split(separator).map((item) => parseInt(item.trim(), 10)),\n {\n example: `1${separator}2${separator}3`,\n ...options,\n },\n );\n\nexport const GetMutatorFloatSeparated = (\n separator = ',',\n options: Omit<GetMutatorOptions, 'mutator'> = {},\n) =>\n GetMutator(\n (s: string) => s.split(separator).map((item) => parseFloat(item.trim())),\n {\n example: `1.5${separator}2.5${separator}3.5`,\n ...options,\n },\n );\n\nexport const GetMutatorJson = createGetMutator((s: string) => JSON.parse(s), {\n example: `{\"key1\":\"value1\",\"key2\":2,\"key3\":[1,2,3]}`,\n});\n", "import { PipeTransform, ValidationPipe } from '@nestjs/common';\nimport { AnyClass } from 'nesties';\nimport { getSpecificFields } from '../utility/metadata';\n\nexport const OptionalDataPipe = () =>\n new ValidationPipe({\n transform: true,\n transformOptions: { enableImplicitConversion: true },\n skipMissingProperties: true,\n skipNullProperties: true,\n skipUndefinedProperties: true,\n });\n\ntype FieldKey = string | number | symbol;\n\nexport const PickPipe = (fields: FieldKey[]): PipeTransform => ({\n transform<T>(obj: T): T {\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n const proto = Object.getPrototypeOf(obj);\n const clone = Object.create(proto) as T;\n const fieldSet = new Set<FieldKey>(fields);\n\n for (const key of fieldSet) {\n const desc = Object.getOwnPropertyDescriptor(obj, key);\n if (desc) {\n Object.defineProperty(clone, key, desc);\n }\n }\n\n return clone;\n },\n});\n\nexport const OmitPipe = (fields: FieldKey[]): PipeTransform => ({\n transform<T>(obj: T): T {\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n const proto = Object.getPrototypeOf(obj);\n const clone = Object.create(proto) as T;\n const omitSet = new Set<FieldKey>(fields);\n\n // \u7528 Reflect.ownKeys \u628A symbol \u4E5F\u4E00\u8D77\u5E26\u4E0A\n for (const key of Reflect.ownKeys(obj)) {\n if (omitSet.has(key)) continue;\n\n const desc = Object.getOwnPropertyDescriptor(obj, key);\n if (desc) {\n Object.defineProperty(clone, key, desc);\n }\n }\n\n return clone;\n },\n});\n", "import { QueryCond } from '../bases';\nimport { Metadata, reflector } from '../utility/metadata';\nimport { QueryFullTextColumnOptions } from '../utility/query-full-text-column-options.interface';\nimport { MergePropertyDecorators } from 'nesties';\nimport { unshiftOrderBy } from '../utility/unshift-order-by';\nimport { addSubject } from '../utility/subject-registry';\nimport { parseBool } from '../utility/parse-bool';\nimport { Brackets, SelectQueryBuilder } from 'typeorm';\n\nexport const QueryCondition = (cond: QueryCond) =>\n Metadata.set(\n 'queryCondition',\n cond,\n 'queryConditionFields',\n ) as PropertyDecorator;\n\nexport const QueryManual = () =>\n QueryCondition((obj, qb, entityName, key) => {});\n\nexport class QueryWrapInfo<T = unknown> {\n private _value: T;\n\n constructor(\n public readonly obj: any,\n public readonly key: string,\n public readonly field: string,\n ) {\n this._value = obj[key];\n }\n\n get value() {\n return this._value;\n }\n\n mutateValue(next: T) {\n this._value = next;\n }\n}\n\nexport type QueryWrapper = (\n entityExpr: string,\n varExpr: string,\n info: QueryWrapInfo<any>,\n) => string | undefined;\n\nconst queryWrapCounters = new WeakMap<any, Record<string, number>>();\nconst getQueryVarName = (obj: any, key: string) => {\n const queryCounters = queryWrapCounters.get(obj) || {};\n let useField = `_qw_` + key;\n if (queryCounters[key] == null) {\n queryCounters[key] = 0;\n } else {\n useField += `__${queryCounters[key].toString(36)}`;\n ++queryCounters[key];\n }\n queryWrapCounters.set(obj, queryCounters);\n return useField;\n};\n\nexport const QueryWrap = (wrapper: QueryWrapper, field?: string) =>\n QueryCondition((obj, qb, entityName, key) => {\n if (obj[key] == null) return;\n const fieldName = field || key;\n const varField = getQueryVarName(obj, key);\n const entityExpr = `${entityName}.${fieldName}`;\n const varExpr = `:${varField}`;\n\n const info = new QueryWrapInfo<any>(obj, key, fieldName);\n\n const expr = wrapper(entityExpr, varExpr, info);\n if (expr) {\n qb.andWhere(expr, {\n [varField]: info.value,\n });\n }\n });\n\nexport const createQueryWrap = (wrapper: QueryWrapper) => (field?: string) =>\n QueryWrap(wrapper, field);\n\nexport const QueryLike = createQueryWrap(\n (entityExpr, varExpr) => `${entityExpr} LIKE (${varExpr} || '%')`,\n);\nexport const QuerySearch = createQueryWrap(\n (entityExpr, varExpr) => `${entityExpr} LIKE ('%' || ${varExpr} || '%')`,\n);\nexport const QueryEqualZeroNullable = createQueryWrap(\n (entityExpr, varExpr, info) =>\n [0, '0'].indexOf(info.value) !== -1\n ? `${entityExpr} IS NULL`\n : `${entityExpr} = ${varExpr}`,\n);\nexport const QueryMatchBoolean = createQueryWrap(\n (entityExpr, varExpr, info) => {\n const value = parseBool(info.value);\n if (value === true) {\n return `${entityExpr} = TRUE`;\n }\n if (value === false) {\n return `${entityExpr} = FALSE`;\n }\n },\n);\nexport const QueryMatchBooleanMySQL = createQueryWrap(\n (entityExpr, varExpr, info) => {\n const value = parseBool(info.value);\n if (value === true) {\n return `${entityExpr} = 1`;\n }\n if (value === false) {\n return `${entityExpr} = 0`;\n }\n },\n);\n\nexport const QueryOperator = (operator: string, field?: string) =>\n QueryWrap(\n (entityExpr, varExpr) => `${entityExpr} ${operator} ${varExpr}`,\n field,\n );\n\nexport const createQueryOperator = (operator: string) => (field?: string) =>\n QueryOperator(operator, field);\n\nexport const QueryEqual = createQueryOperator('=');\nexport const QueryGreater = createQueryOperator('>');\nexport const QueryGreaterEqual = createQueryOperator('>=');\nexport const QueryLess = createQueryOperator('<');\nexport const QueryLessEqual = createQueryOperator('<=');\nexport const QueryNotEqual = createQueryOperator('!=');\nexport const QueryJsonbHas = createQueryOperator('?');\n\nexport const createQueryArrayify = (\n newWrapper: QueryWrapper,\n singleFallbackWrapper?: QueryWrapper,\n) =>\n createQueryWrap((entityExpr, varExpr, info) => {\n const value = info.value;\n const items = Array.isArray(value)\n ? value\n : typeof value === 'string'\n ? value.split(',')\n : [value];\n if (items.length === 1 && singleFallbackWrapper) {\n const singleRes = singleFallbackWrapper(entityExpr, varExpr, info);\n if (singleRes) {\n info.mutateValue(items[0]);\n return singleRes;\n }\n }\n info.mutateValue(items);\n const newVarExpr = `(:...${varExpr.slice(1)})`;\n return newWrapper(entityExpr, newVarExpr, info);\n });\n\nexport const createQueryOperatorArrayify = (\n operator: string,\n singleFallback?: string | QueryWrapper,\n) =>\n createQueryArrayify(\n (entityExpr, varExpr) => `${entityExpr} ${operator} ${varExpr}`,\n typeof singleFallback === 'string'\n ? singleFallback.length\n ? (entityExpr, varExpr) => `${entityExpr} ${singleFallback} ${varExpr}`\n : undefined\n : singleFallback,\n );\n\nexport const QueryIn = createQueryOperatorArrayify('IN', '=');\nexport const QueryNotIn = createQueryOperatorArrayify('NOT IN', '!=');\n\nexport const QueryFullText = (options: QueryFullTextColumnOptions = {}) => {\n const configurationName = options.parser\n ? `nicot_parser_${options.parser}`\n : options.configuration || 'english';\n const tsQueryFunction = options.tsQueryFunction || 'websearch_to_tsquery';\n return MergePropertyDecorators([\n QueryCondition((obj, qb, entityName, key) => {\n if (obj[key] == null) return;\n const fieldName = key;\n const typeormField = getQueryVarName(obj, key);\n\n const tsVectorStatement = `to_tsvector('${configurationName}', \"${entityName}\".\"${fieldName}\")`;\n const tsQueryStatement = `${tsQueryFunction}('${configurationName}', :${typeormField})`;\n\n qb.andWhere(`${tsVectorStatement} @@ ${tsQueryStatement}`, {\n [typeormField]: obj[key],\n });\n\n if (options.orderBySimilarity) {\n const rankVirtualField = `_fulltext_rank_${key}`;\n addSubject(\n qb,\n `ts_rank(${tsVectorStatement}, ${tsQueryStatement})`,\n rankVirtualField,\n );\n unshiftOrderBy(qb, `\"${rankVirtualField}\"`, 'DESC');\n }\n }),\n Metadata.set(\n 'queryFullTextColumn',\n {\n ...options,\n configuration: configurationName,\n },\n 'queryFullTextColumnFields',\n ),\n ]);\n};\n\nexport const QueryAnd = (...decs: PropertyDecorator[]) => {\n const conditions = decs.map((dec) =>\n reflector.getMetadataFromDecorator(dec, 'queryCondition'),\n );\n return QueryCondition((obj, qb, entityName, key) =>\n conditions.forEach((cond) => cond(obj, qb, entityName, key)),\n );\n};\n\nexport const QueryOr = (...decs: PropertyDecorator[]) => {\n const conditions = decs.map((dec) =>\n reflector.getMetadataFromDecorator(dec, 'queryCondition'),\n );\n return QueryCondition((obj, qb, entityName, key) => {\n if (!conditions.length) {\n return;\n }\n qb.andWhere(\n new Brackets((orQb) => {\n const innerBrackets = conditions.map(\n (cond) =>\n new Brackets((andQb) => {\n cond(obj, andQb as SelectQueryBuilder<any>, entityName, key);\n }),\n );\n const [first, ...rest] = innerBrackets;\n orQb.where(first);\n rest.forEach((bracket) => orQb.orWhere(bracket));\n }),\n );\n });\n};\n", "import { SelectQueryBuilder } from 'typeorm';\n\nexport const unshiftOrderBy = <T>(\n qb: SelectQueryBuilder<T>,\n sort: string,\n order?: 'ASC' | 'DESC',\n nulls?: 'NULLS FIRST' | 'NULLS LAST',\n) => {\n const currentOrderBys = Object.entries(qb.expressionMap.allOrderBys);\n qb.orderBy(sort, order, nulls);\n currentOrderBys.forEach(([key, value]) => {\n if (typeof value === 'string') {\n qb.addOrderBy(key, value);\n } else {\n qb.addOrderBy(key, value.order, value.nulls);\n }\n });\n return qb;\n};\n", "import { SelectQueryBuilder } from 'typeorm';\n\nconst subjectRegistry = new WeakMap<\n SelectQueryBuilder<any>,\n Record<string, string>\n>();\n\nexport const addSubject = <T>(\n qb: SelectQueryBuilder<T>,\n select: string,\n alias: string,\n) => {\n let subjects = subjectRegistry.get(qb);\n if (!subjects) {\n subjects = {};\n subjectRegistry.set(qb, subjects);\n }\n subjects[alias] = select;\n return qb.addSelect(select, alias);\n};\n\nexport const getSubject = <T>(\n qb: SelectQueryBuilder<T>,\n alias: string,\n): string | undefined => {\n return subjectRegistry.get(qb)?.[alias];\n};\n", "import { Metadata } from '../utility/metadata';\n\nexport interface BindingValueMetadata {\n bindingKey: string;\n isMethod: boolean;\n}\n\nexport const DefaultBindingKey = 'default';\n\nexport const BindingColumn = (\n bindingKey = DefaultBindingKey,\n): PropertyDecorator =>\n Metadata.set('bindingColumn', bindingKey, 'bindingColumnFields');\n\nexport const BindingValue =\n (bindingKey = DefaultBindingKey): PropertyDecorator & MethodDecorator =>\n (obj: any, key: string, des?: TypedPropertyDescriptor<any>) => {\n const isMethod = !!des && typeof des.value === 'function';\n\n Metadata.set(\n 'bindingValue',\n { bindingKey, isMethod },\n 'bindingValueFields',\n )(obj, key);\n };\n", "import {\n CursorPaginationDto,\n CursorPaginationReturnMessageDto,\n ImportEntryDto,\n} from './dto';\nimport {\n DeepPartial,\n DeleteResult,\n FindOneOptions,\n FindOptionsWhere,\n In,\n Repository,\n SelectQueryBuilder,\n UpdateResult,\n} from 'typeorm';\nimport {\n EntityHooks,\n PageSettingsDto,\n PageSettingsFactory,\n QueryWise,\n} from './bases';\nimport { ConsoleLogger } from '@nestjs/common';\nimport { camelCase } from 'typeorm/util/StringUtils';\nimport _, { omit } from 'lodash';\nimport {\n Awaitable,\n BlankReturnMessageDto,\n ClassType,\n GenericReturnMessageDto,\n PaginatedReturnMessageDto,\n ReturnMessageDto,\n} from 'nesties';\nimport {\n getNotInResultFields,\n getSpecificFields,\n reflector,\n} from './utility/metadata';\nimport { getTypeormRelations } from './utility/get-typeorm-relations';\nimport { getPaginatedResult } from './utility/cursor-pagination-utils';\nimport PQueue from 'p-queue';\nimport { RelationDef } from './utility/relation-def';\nimport { filterRelations } from './utility/filter-relations';\nimport { BindingValueMetadata, DefaultBindingKey } from './decorators';\nimport { observeDiff } from 'nfkit';\n\nexport type EntityId<T extends { id: any }> = T['id'];\ntype BindingSnapshot = Record<string, any>;\n\nexport const Relation = (\n name: string,\n options: Omit<RelationDef, 'name'> = {},\n): RelationDef => {\n return { name, inner: false, ...options };\n};\n\nexport const Inner = (\n name: string,\n options: Omit<RelationDef, 'name'> = {},\n): RelationDef => {\n return Relation(name, { inner: true, ...options });\n};\n\nexport type ValidCrudEntity<T> = Record<string, any> & {\n id: any;\n} & Partial<QueryWise<T> & EntityHooks & PageSettingsFactory>;\n\nexport interface CrudOptions<T extends ValidCrudEntity<T>> {\n relations?: (string | RelationDef)[];\n extraGetQuery?: (qb: SelectQueryBuilder<T>) => void;\n hardDelete?: boolean;\n createOrUpdate?: boolean;\n keepEntityVersioningDates?: boolean;\n outputFieldsToOmit?: (keyof T)[];\n}\n\nconst loadedParsers = new Set<string>();\nconst loadFullTextQueue = new PQueue({\n concurrency: 1,\n});\n\nexport class CrudBase<T extends ValidCrudEntity<T>> {\n readonly entityName = this.entityClass.name;\n readonly entityReturnMessageDto = ReturnMessageDto(this.entityClass);\n readonly importEntryDto = ImportEntryDto(this.entityClass);\n readonly importReturnMessageDto = ReturnMessageDto([this.importEntryDto]);\n readonly entityPaginatedReturnMessageDto = PaginatedReturnMessageDto(\n this.entityClass,\n );\n readonly entityCursorPaginatedReturnMessageDto =\n CursorPaginationReturnMessageDto(this.entityClass);\n readonly entityRelations = filterRelations(\n this.entityClass,\n this.crudOptions.relations,\n (r) => !r.computed,\n );\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n readonly extraGetQuery = this.crudOptions.extraGetQuery || ((qb) => {});\n readonly log = new ConsoleLogger(`${this.entityClass.name}Service`);\n readonly _typeormRelations = getTypeormRelations(this.entityClass);\n\n constructor(\n public entityClass: ClassType<T>,\n public repo: Repository<T>,\n public crudOptions: CrudOptions<T>,\n ) {}\n\n // cleaning entities\n\n _cleanEntityNotInResultFields(ent: T): T {\n const visited = new Set();\n const runSingleObject = (o: any, cl) => {\n if (visited.has(o)) {\n return o;\n }\n const fields = getNotInResultFields(\n cl,\n this.crudOptions.keepEntityVersioningDates,\n );\n if (cl === this.entityClass && this.crudOptions.outputFieldsToOmit) {\n fields.push(...(this.crudOptions.outputFieldsToOmit as string[]));\n }\n for (const field of fields) {\n delete o[field];\n }\n visited.add(o);\n for (const relation of getTypeormRelations(cl)) {\n const propertyName = relation.propertyName as string;\n if (o[propertyName]) {\n if (Array.isArray(o[propertyName])) {\n o[propertyName] = o[propertyName].map((r) =>\n runSingleObject(r, relation.propertyClass),\n );\n } else {\n o[propertyName] = runSingleObject(\n o[propertyName],\n relation.propertyClass,\n );\n }\n }\n }\n return o;\n };\n\n return runSingleObject(ent, this.entityClass);\n }\n\n cleanEntityNotInResultFields<E extends T | T[]>(ents: E): E {\n if (Array.isArray(ents)) {\n return ents.map((ent) => this._cleanEntityNotInResultFields(ent)) as E;\n } else {\n return this._cleanEntityNotInResultFields(ents as T) as E;\n }\n }\n\n // binding things\n\n readonly _tmpBindingMap = new Map<string, any>();\n readonly _bindingCache = new Map<\n string,\n BindingValueMetadata & { field: string }\n >();\n\n _lookForBindingValueField(bindingKey: string) {\n if (this._bindingCache.has(bindingKey)) {\n return this._bindingCache.get(bindingKey);\n }\n const bindingServiceFields = getSpecificFields(this, 'bindingValue');\n const useField = bindingServiceFields.find((f) => {\n const meta = reflector.get('bindingValue', this, f);\n return meta?.bindingKey === bindingKey;\n });\n if (useField) {\n const meta = reflector.get('bindingValue', this, useField);\n const res = {\n ...meta,\n field: useField,\n };\n this._bindingCache.set(bindingKey, res);\n return res;\n }\n return undefined;\n }\n\n _resolveBindingValue<K extends keyof T>(\n entityField: K,\n ): T[K] | Promise<T[K]> {\n const bindingKey = reflector.get(\n 'bindingColumn',\n this.entityClass,\n entityField as string,\n );\n if (!bindingKey) {\n return undefined;\n }\n if (this._tmpBindingMap.has(bindingKey)) {\n return this._tmpBindingMap.get(bindingKey);\n }\n const bindingValueField = this._lookForBindingValueField(bindingKey);\n if (!bindingValueField) {\n return undefined;\n }\n if (bindingValueField.isMethod) {\n return (this as any)[bindingValueField.field]();\n } else {\n return (this as any)[bindingValueField.field];\n }\n }\n\n // MUST be called 1st on every CRUD operation\n async getBindingPartialEntity(): Promise<Partial<T>> {\n const bindingFields = getSpecificFields(this.entityClass, 'bindingColumn');\n if (!bindingFields.length) {\n return {};\n }\n const values = bindingFields.map((field, i) => {\n return {\n field,\n value: this._resolveBindingValue(field),\n i,\n };\n });\n this._tmpBindingMap.clear();\n const containingPromiseValues = values.filter(\n (v) => v.value instanceof Promise,\n );\n if (containingPromiseValues.length) {\n await Promise.all(\n containingPromiseValues.map(async (v) => {\n v.value = await v.value;\n }),\n );\n }\n // now it's all resolved\n const res: Partial<T> = {};\n for (const v of values) {\n if (v.value != null) {\n (res as any)[v.field] = v.value;\n }\n }\n return res;\n }\n\n useBinding(value: any, bindngKey = DefaultBindingKey): this {\n this._tmpBindingMap.set(bindngKey, value);\n return this;\n }\n\n _freezeBindings(): BindingSnapshot {\n const res: Record<string, any> = {};\n for (const [key, value] of this._tmpBindingMap.entries()) {\n res[key] = value;\n }\n this._tmpBindingMap.clear();\n return res;\n }\n\n _restoreBindings(frozen: BindingSnapshot): this {\n this._tmpBindingMap.clear();\n for (const key of Object.keys(frozen)) {\n this._tmpBindingMap.set(key, frozen[key]);\n }\n return this;\n }\n\n async beforeSuper<R>(fn: () => Promise<R>): Promise<R> {\n const snap = this._freezeBindings();\n const res = await fn();\n this._restoreBindings(snap);\n return res;\n }\n\n async _batchCreate(\n ents: T[],\n beforeCreate?: (repo: Repository<T>) => Promise<void>,\n skipErrors = false,\n ) {\n const entsWithId = ents.filter((ent) => ent.id != null);\n return this.repo.manager.transaction(async (mdb) => {\n let skipped: { result: string; entry: T }[] = [];\n const repo = mdb.getRepository(this.entityClass);\n\n let entsToSave = ents;\n\n if (entsWithId.length) {\n const entIds = entsWithId.map((ent) => ent.id);\n const entIdChunks = _.chunk(entIds, 65535);\n const existingEnts = (\n await Promise.all(\n entIdChunks.map((chunk) =>\n repo.find({\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n where: {\n id: In<string | number>(chunk),\n },\n select: this.crudOptions.createOrUpdate\n ? undefined\n : ['id', 'deleteTime'],\n withDeleted: true,\n }),\n ),\n )\n ).flat();\n if (existingEnts.length) {\n const existingEntsWithoutDeleteTime = existingEnts.filter(\n (ent) => ent.deleteTime == null,\n );\n const existingEntsWithDeleteTime = existingEnts.filter(\n (ent) => ent.deleteTime != null,\n );\n if (existingEntsWithoutDeleteTime.length) {\n if (this.crudOptions.createOrUpdate) {\n const existingIdMap = new Map<number, T>();\n existingEntsWithoutDeleteTime.forEach((ent) => {\n existingIdMap.set(ent.id, ent);\n });\n entsToSave = [];\n for (const ent of ents) {\n if (existingIdMap.has(ent.id)) {\n const existingEnt = existingIdMap.get(ent.id);\n Object.assign(existingEnt, ent);\n entsToSave.push(existingEnt);\n } else {\n entsToSave.push(ent);\n }\n }\n } else {\n if (!skipErrors) {\n throw new BlankReturnMessageDto(\n 404,\n `${this.entityName} ID ${existingEntsWithoutDeleteTime.join(\n ',',\n )} already exists`,\n ).toException();\n }\n const existingEntsWithoutDeleteTimeIdSet = new Set(\n existingEntsWithoutDeleteTime.map((e) => e.id),\n );\n const skippedEnts = ents.filter((ent) =>\n existingEntsWithoutDeleteTimeIdSet.has(ent.id),\n );\n skipped = skippedEnts.map((ent) => ({\n result: 'Already exists',\n entry: ent,\n }));\n const skippedEntsSet = new Set(skippedEnts);\n entsToSave = ents.filter((ent) => !skippedEntsSet.has(ent));\n }\n }\n if (existingEntsWithDeleteTime.length) {\n await repo.delete(\n existingEntsWithDeleteTime.map((ent) => ent.id) as any[],\n );\n }\n }\n }\n if (beforeCreate) {\n await beforeCreate(repo);\n }\n try {\n const entChunksToSave = _.chunk(\n entsToSave,\n Math.floor(\n 65535 / Math.max(1, Object.keys(entsToSave[0] || {}).length),\n ),\n );\n let results: T[] = [];\n for (const entChunk of entChunksToSave) {\n const savedChunk = await repo.save(entChunk);\n results = results.concat(savedChunk);\n }\n return {\n results,\n skipped,\n };\n } catch (e) {\n this.log.error(\n `Failed to create entity ${JSON.stringify(\n entsToSave,\n )}: ${e.toString()}`,\n );\n throw new BlankReturnMessageDto(500, 'Internal error').toException();\n }\n });\n }\n\n async create(_ent: T, beforeCreate?: (repo: Repository<T>) => Promise<void>) {\n const bindingEnt = await this.getBindingPartialEntity();\n if (!_ent) {\n throw new BlankReturnMessageDto(400, 'Invalid entity').toException();\n }\n let ent = new this.entityClass();\n Object.assign(\n ent,\n omit(_ent, ...this._typeormRelations.map((r) => r.propertyName)),\n );\n const invalidReason = ent.isValidInCreate();\n if (invalidReason) {\n throw new BlankReturnMessageDto(400, invalidReason).toException();\n }\n const savedEnt = await this.repo.manager.transaction(async (mdb) => {\n const repo = mdb.getRepository(this.entityClass);\n if (ent.id != null) {\n const existingEnt = await repo.findOne({\n where: { id: ent.id },\n select: this.crudOptions.createOrUpdate\n ? undefined\n : ['id', 'deleteTime'],\n withDeleted: true,\n });\n if (existingEnt) {\n if (existingEnt.deleteTime) {\n await repo.delete(existingEnt.id);\n } else if (this.crudOptions.createOrUpdate) {\n Object.assign(existingEnt, ent);\n ent = existingEnt;\n } else {\n throw new BlankReturnMessageDto(\n 404,\n `${this.entityName} ID ${ent.id} already exists`,\n ).toException();\n }\n }\n }\n Object.assign(ent, bindingEnt);\n if (beforeCreate) {\n await beforeCreate(repo);\n }\n await ent.beforeCreate?.();\n try {\n const savedEnt = await repo.save(ent as DeepPartial<T>);\n await savedEnt.afterCreate?.();\n return this.cleanEntityNotInResultFields(savedEnt);\n } catch (e) {\n this.log.error(\n `Failed to create entity ${JSON.stringify(ent)}: ${e.toString()}`,\n );\n throw new BlankReturnMessageDto(500, 'Internal error').toException();\n }\n });\n return new this.entityReturnMessageDto(200, 'success', savedEnt);\n }\n\n get entityAliasName() {\n return camelCase(this.entityName);\n }\n\n _applyQueryRelation(qb: SelectQueryBuilder<T>, relation: RelationDef) {\n const { name } = relation;\n const relationUnit = name.split('.');\n const base =\n relationUnit.length === 1\n ? this.entityAliasName\n : relationUnit.slice(0, relationUnit.length - 1).join('_');\n const property = relationUnit[relationUnit.length - 1];\n const properyAlias = relationUnit.join('_');\n const methodName = relation.inner ? 'innerJoin' : 'leftJoin';\n if (!relation.noSelect) {\n qb.addSelect(properyAlias);\n }\n qb[methodName](\n `${base}.${property}`,\n properyAlias,\n relation.extraCondition || undefined,\n relation.extraConditionFields || undefined,\n );\n }\n\n _applyQueryRelations(qb: SelectQueryBuilder<T>) {\n for (const relation of this.entityRelations) {\n if (typeof relation === 'string') {\n this._applyQueryRelation(qb, { name: relation });\n } else {\n this._applyQueryRelation(qb, relation);\n }\n }\n }\n\n _applyQueryFilters(qb: SelectQueryBuilder<T>, ent: T) {\n const queryFields = reflector.getArray(\n 'queryConditionFields',\n this.entityClass,\n );\n for (const field of queryFields) {\n const condition = reflector.get(\n 'queryCondition',\n this.entityClass,\n field,\n );\n if (condition) {\n condition(ent, qb, this.entityAliasName, field);\n }\n }\n }\n\n queryBuilder() {\n return this.repo.createQueryBuilder(this.entityAliasName);\n }\n\n _applyQueryFromBinding(bindingEnt: Partial<T>, qb: SelectQueryBuilder<T>) {\n for (const [key, value] of Object.entries(bindingEnt)) {\n const typeormKey = `_binding_${key}`;\n qb.andWhere(`${this.entityAliasName}.${key} = :${typeormKey}`, {\n [typeormKey]: value,\n });\n }\n }\n\n async findOne(\n id: EntityId<T>,\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n extraQuery: (qb: SelectQueryBuilder<T>) => void = () => {},\n ) {\n const bindingEnt = await this.getBindingPartialEntity();\n const query = this.queryBuilder()\n .where(`${this.entityAliasName}.id = :id`, { id })\n .take(1);\n this._applyQueryRelations(query);\n this._applyQueryFromBinding(bindingEnt, query);\n this.extraGetQuery(query);\n extraQuery(query);\n query.take(1);\n let ent: T;\n try {\n ent = await query.getOne();\n } catch (e) {\n const [sql, params] = query.getQueryAndParameters();\n this.log.error(\n `Failed to read entity ID ${id} with SQL ${sql} param ${params.join(\n ',',\n )}: ${e.toString()}`,\n );\n throw new BlankReturnMessageDto(500, 'Internal error').toException();\n }\n if (!ent) {\n throw new BlankReturnMessageDto(\n 404,\n `${this.entityName} ID ${id} not found.`,\n ).toException();\n }\n await ent.afterGet?.();\n return new this.entityReturnMessageDto(\n 200,\n 'success',\n this.cleanEntityNotInResultFields(ent),\n );\n }\n\n async _preFindAll(\n ent?: Partial<T>,\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n extraQuery: (qb: SelectQueryBuilder<T>) => void = () => {},\n ) {\n const bindingEnt = await this.getBindingPartialEntity();\n const query = this.queryBuilder().where('1 = 1');\n const newEnt = new this.entityClass();\n if (ent) {\n Object.assign(newEnt, ent);\n await newEnt?.beforeGet?.();\n newEnt.applyQuery(query, this.entityAliasName);\n }\n this._applyQueryRelations(query);\n this._applyQueryFilters(query, newEnt);\n this._applyQueryFromBinding(bindingEnt, query);\n const pageSettings =\n newEnt instanceof PageSettingsDto\n ? newEnt\n : Object.assign(new PageSettingsDto(), newEnt);\n this.extraGetQuery(query);\n extraQuery(query);\n return { query, newEnt, pageSettings };\n }\n\n async findAll(\n ent?: Partial<T>,\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n extraQuery: (qb: SelectQueryBuilder<T>) => void = () => {},\n ) {\n const { query, pageSettings } = await this._preFindAll(ent, extraQuery);\n pageSettings.applyPaginationQuery(query);\n try {\n const [data, count] = await query.getManyAndCount();\n await Promise.all(data.map((ent) => ent.afterGet?.()));\n return new this.entityPaginatedReturnMessageDto(\n 200,\n 'success',\n this.cleanEntityNotInResultFields(data),\n count,\n pageSettings.getActualPageSettings(),\n );\n } catch (e) {\n const [sql, params] = query.getQueryAndParameters();\n this.log.error(\n `Failed to read entity cond ${JSON.stringify(\n ent,\n )} with SQL ${sql} param ${params.join(',')}: ${e.toString()}`,\n );\n throw new BlankReturnMessageDto(500, 'Internal error').toException();\n }\n }\n async findAllCursorPaginated(\n ent?: Partial<T & Partial<CursorPaginationDto>>,\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n extraQuery: (qb: SelectQueryBuilder<T>) => void = () => {},\n ) {\n const { query, pageSettings } = await this._preFindAll(ent, extraQuery);\n try {\n const { data, paginatedResult } = await getPaginatedResult(\n query,\n this.entityClass,\n this.entityAliasName,\n pageSettings.getRecordsPerPage(),\n ent.paginationCursor,\n );\n await Promise.all(data.map((ent) => ent.afterGet?.()));\n return new this.entityCursorPaginatedReturnMessageDto(\n 200,\n 'success',\n this.cleanEntityNotInResultFields(data),\n paginatedResult,\n );\n } catch (e) {\n const [sql, params] = query.getQueryAndParameters();\n this.log.error(\n `Failed to read entity cond ${JSON.stringify(\n ent,\n )} with SQL ${sql} param ${params.join(',')}: ${e.toString()}`,\n );\n throw new BlankReturnMessageDto(500, 'Internal error').toException();\n }\n }\n\n async update(\n id: EntityId<T>,\n entPart: Partial<T>,\n cond: FindOptionsWhere<T> = {},\n ) {\n const bindingEnt = await this.getBindingPartialEntity();\n let result: UpdateResult;\n const ent = new this.entityClass();\n Object.assign(ent, entPart);\n const invalidReason = ent.isValidInUpdate();\n if (invalidReason) {\n throw new BlankReturnMessageDto(400, invalidReason).toException();\n }\n await ent.beforeUpdate?.();\n try {\n result = await this.repo.update(\n {\n id,\n ...bindingEnt,\n ...cond,\n },\n ent,\n );\n } catch (e) {\n this.log.error(\n `Failed to update entity ID ${id} to ${JSON.stringify(\n entPart,\n )}: ${e.toString()}`,\n );\n throw new BlankReturnMessageDto(500, 'Internal error').toException();\n }\n if (!result.affected) {\n throw new BlankReturnMessageDto(\n 404,\n `${this.entityName} ID ${id} not found.`,\n ).toException();\n }\n return new BlankReturnMessageDto(200, 'success');\n }\n\n async delete(id: EntityId<T>, cond: FindOptionsWhere<T> = {}) {\n const bindingEnt = await this.getBindingPartialEntity();\n let result: UpdateResult | DeleteResult;\n const searchCond = {\n id,\n ...bindingEnt,\n ...cond,\n };\n try {\n result = await (this.crudOptions.hardDelete ||\n !this.repo.manager.connection.getMetadata(this.entityClass)\n .deleteDateColumn\n ? this.repo.delete(searchCond)\n : this.repo.softDelete(searchCond));\n } catch (e) {\n this.log.error(`Failed to delete entity ID ${id}: ${e.toString()}`);\n throw new BlankReturnMessageDto(500, 'Internal error').toException();\n }\n if (!result.affected) {\n throw new BlankReturnMessageDto(\n 404,\n `${this.entityName} ID ${id} not found.`,\n ).toException();\n }\n return new BlankReturnMessageDto(200, 'success');\n }\n\n async importEntities(\n _ents: T[],\n extraChecking?: (ent: T) => string | Promise<string>,\n ) {\n const bindingEnt = await this.getBindingPartialEntity();\n const ents = _ents.map((ent) => {\n const newEnt = new this.entityClass();\n Object.assign(\n newEnt,\n omit(ent, ...this._typeormRelations.map((r) => r.propertyName)),\n );\n return newEnt;\n });\n const invalidResults = _.compact(\n await Promise.all(\n ents.map(async (ent) => {\n const reason = ent.isValidInCreate();\n if (reason) {\n return { entry: ent, result: reason };\n }\n if (extraChecking) {\n const reason = await extraChecking(ent);\n if (reason) {\n return { entry: ent, result: reason };\n }\n }\n }),\n ),\n );\n const remainingEnts = ents.filter(\n (ent) => !invalidResults.find((result) => result.entry === ent),\n );\n for (const ent of remainingEnts) {\n Object.assign(ent, bindingEnt);\n }\n await Promise.all(remainingEnts.map((ent) => ent.beforeCreate?.()));\n const data = await this._batchCreate(remainingEnts, undefined, true);\n await Promise.all(data.results.map((e) => e.afterCreate?.()));\n const results = [\n ...invalidResults,\n ...data.skipped,\n ...data.results.map((e) => ({ entry: e, result: 'OK' })),\n ];\n return new this.importReturnMessageDto(\n 200,\n 'success',\n results.map((r) => {\n const entry = new this.importEntryDto();\n Object.assign(entry, r);\n entry.entry = this.cleanEntityNotInResultFields(r.entry);\n return entry;\n }),\n );\n }\n\n async exists(\n id: EntityId<T>,\n cond: FindOptionsWhere<T> = {},\n ): Promise<boolean> {\n const bindingEnt = await this.getBindingPartialEntity();\n return this.repo.exists({\n where: { id, ...bindingEnt, ...cond },\n });\n }\n\n async operation<R>(\n id: EntityId<T>,\n cb: (\n ent: T,\n ctx: {\n repo: Repository<T>;\n flush: () => Promise<void>;\n },\n ) => Awaitable<R>,\n options: {\n find?: FindOneOptions<T>;\n repo?: Repository<T>;\n } = {},\n ): Promise<GenericReturnMessageDto<R>> {\n const bindingEnt = await this.getBindingPartialEntity();\n const where: FindOptionsWhere<T> = {\n id,\n ...bindingEnt,\n ...(options.find?.where || {}),\n };\n const throw404 = () => {\n throw new BlankReturnMessageDto(\n 404,\n `${this.entityName} ID ${id} not found.`,\n ).toException();\n };\n if (!(await this.repo.exists({ where }))) {\n throw404();\n }\n const op = async (repo: Repository<T>) => {\n const ent = await repo.findOne({\n lock: { mode: 'pessimistic_write', tables: [repo.metadata.tableName] },\n ...(options.find || {}),\n where,\n });\n if (!ent) {\n throw404();\n }\n const initial = { ...ent };\n let changes: Partial<T> = {};\n const entProxy = observeDiff(ent, (change) => {\n if (change.type === 'delete') {\n if (initial[change.key] === null) {\n delete changes[change.key];\n } else {\n changes[change.key] = null;\n }\n } else {\n if (change.newValue !== initial[change.key]) {\n changes[change.key] = change.newValue;\n } else {\n delete changes[change.key];\n }\n }\n });\n const flush = async () => {\n if (Object.keys(changes).length) {\n const currentChanges = { ...changes };\n Object.assign(initial, changes);\n changes = {};\n await repo.update({ id }, currentChanges);\n }\n };\n const result = await cb(entProxy, { repo, flush });\n await flush();\n return result;\n };\n const res = await (options.repo\n ? op(options.repo)\n : this.repo.manager.transaction((tdb) =>\n op(tdb.getRepository(this.entityClass)),\n ));\n if (res == null) {\n return new BlankReturnMessageDto(200, 'success');\n } else {\n return new GenericReturnMessageDto(200, 'success', res);\n }\n }\n\n async _loadFullTextIndex() {\n const fields = reflector.getArray(\n 'queryFullTextColumnFields',\n this.entityClass,\n );\n\n const metadata = this.repo.metadata;\n const tableName = metadata.tableName; // \u771F\u6B63\u6570\u636E\u5E93\u91CC\u7684\u8868\u540D\n\n const sqls: string[] = [];\n\n for (const field of fields) {\n const options = reflector.get(\n 'queryFullTextColumn',\n this.entityClass,\n field,\n );\n if (!options) continue;\n\n const configurationName = options.configuration;\n const parser = options.parser;\n\n if (parser && !loadedParsers.has(parser)) {\n loadedParsers.add(parser);\n\n sqls.push(\n `CREATE EXTENSION IF NOT EXISTS ${parser};`,\n `DROP TEXT SEARCH CONFIGURATION IF EXISTS ${configurationName};`,\n `CREATE TEXT SEARCH CONFIGURATION ${configurationName} (PARSER = ${parser});`,\n `ALTER TEXT SEARCH CONFIGURATION ${configurationName} ADD MAPPING FOR n, v, a, i, e, l WITH simple;`,\n );\n }\n\n const indexName = `idx_fulltext_${this.entityName}_${field}`;\n\n // \u5EFA\u7ACB\u7D22\u5F15\uFF0C\u7D22\u5F15\u540D\u5B57\u7528 this.entityName\uFF0C\u8868\u540D\u7528\u771F\u5B9E tableName\n sqls.push(\n `CREATE INDEX IF NOT EXISTS \"${indexName}\" ON \"${tableName}\" USING GIN (to_tsvector('${configurationName}', \"${field}\"));`,\n );\n }\n if (sqls.length) {\n await this.repo.manager.query(sqls.join('\\n'));\n }\n }\n\n async onModuleInit() {\n await loadFullTextQueue.add(() => this._loadFullTextIndex());\n }\n}\n\nexport function CrudService<T extends ValidCrudEntity<T>>(\n entityClass: ClassType<T>,\n crudOptions: CrudOptions<T> = {},\n) {\n return class CrudServiceImpl extends CrudBase<T> {\n constructor(repo: Repository<T>) {\n super(entityClass, repo, crudOptions);\n }\n };\n}\n", "import {\n CreateDateColumn,\n DeleteDateColumn,\n SelectQueryBuilder,\n UpdateDateColumn,\n} from 'typeorm';\nimport { NotColumn, NotInResult } from '../decorators';\nimport { PageSettingsDto } from './page-settings';\n\nexport interface DeletionWise {\n deleteTime?: Date;\n}\n\nexport interface EntityHooks {\n isValidInCreate(): string | undefined;\n beforeCreate(): Promise<void>;\n afterCreate(): Promise<void>;\n beforeGet(): Promise<void>;\n afterGet(): Promise<void>;\n isValidInUpdate(): string | undefined;\n beforeUpdate(): Promise<void>;\n}\n\nexport class TimeBase\n extends PageSettingsDto\n implements DeletionWise, EntityHooks\n{\n @CreateDateColumn({ select: false })\n @NotColumn()\n @NotInResult({ entityVersioningDate: true })\n @Reflect.metadata('design:type', Date)\n createTime: Date;\n\n @UpdateDateColumn({ select: false })\n @NotColumn()\n @NotInResult({ entityVersioningDate: true })\n @Reflect.metadata('design:type', Date)\n updateTime: Date;\n\n @DeleteDateColumn({ select: false })\n @NotColumn()\n @NotInResult({ entityVersioningDate: true })\n @Reflect.metadata('design:type', Date)\n deleteTime: Date;\n\n isValidInCreate(): string | undefined {\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n async beforeCreate(): Promise<void> {}\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n async afterCreate(): Promise<void> {}\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n async beforeGet(): Promise<void> {}\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n async afterGet(): Promise<void> {}\n\n isValidInUpdate(): string | undefined {\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n async beforeUpdate(): Promise<void> {}\n}\n", "import { NotInResult, NotWritable, QueryManual } from '../decorators';\nimport { SelectQueryBuilder } from 'typeorm';\nimport { IsInt, IsPositive } from 'class-validator';\nimport { ApiProperty } from '@nestjs/swagger';\nimport { PageSettingsWise } from 'nesties';\n\nexport interface PageSettingsFactory {\n getActualPageSettings(): PageSettingsWise;\n}\n\nexport interface QueryWise<T> {\n applyQuery(qb: SelectQueryBuilder<T>, entityName: string): void;\n}\n\nexport type QueryCond = <T>(\n obj: T,\n qb: SelectQueryBuilder<T>,\n entityName: string,\n key: keyof T & string,\n) => any;\n\nexport class PageSettingsDto\n implements PageSettingsWise, PageSettingsFactory, QueryWise<PageSettingsDto>\n{\n @NotWritable()\n @IsPositive()\n @IsInt()\n @ApiProperty({\n description: 'The nth page, starting with 1.',\n required: false,\n minimum: 1,\n })\n @NotInResult()\n @Reflect.metadata('design:type', Number)\n @QueryManual()\n pageCount: number;\n\n @NotWritable()\n @IsPositive()\n @IsInt()\n @ApiProperty({\n description: 'Records per page.',\n required: false,\n minimum: 1,\n })\n @NotInResult()\n @QueryManual()\n @Reflect.metadata('design:type', Number)\n recordsPerPage: number;\n\n getActualPageSettings(): PageSettingsWise {\n return {\n pageCount: this.getPageCount(),\n recordsPerPage: this.getRecordsPerPage(),\n };\n }\n\n getPageCount() {\n return parseInt(this.pageCount as any) || 1;\n }\n\n getRecordsPerPage() {\n return parseInt(this.recordsPerPage as any) || 25;\n }\n\n getStartingFrom() {\n return (this.getPageCount() - 1) * this.getRecordsPerPage();\n }\n\n applyPaginationQuery(qb: SelectQueryBuilder<any>): void {\n qb.take(this.getRecordsPerPage()).skip(this.getStartingFrom());\n }\n\n applyQuery(qb: SelectQueryBuilder<any>, entityName: string) {}\n}\n", "import { TimeBase } from './time-base';\nimport { Generated, SelectQueryBuilder } from 'typeorm';\nimport {\n IntColumn,\n NotChangeable,\n NotWritable,\n PropertyOptions,\n QueryEqual,\n StringColumn,\n UuidColumn,\n} from '../decorators';\nimport { IsNotEmpty } from 'class-validator';\nimport { MergePropertyDecorators } from 'nesties';\nimport { Metadata } from '../utility/metadata';\n\nexport interface IdOptions {\n description?: string;\n noOrderById?: boolean;\n}\n\nexport function IdBase(idOptions: IdOptions = {}) {\n const cl = class IdBase extends TimeBase {\n id: number;\n override applyQuery(qb: SelectQueryBuilder<IdBase>, entityName: string) {\n super.applyQuery(qb, entityName);\n if (!idOptions.noOrderById) {\n qb.orderBy(`${entityName}.id`, 'DESC');\n }\n }\n };\n const dec = MergePropertyDecorators([\n NotWritable(),\n IntColumn('bigint', {\n unsigned: true,\n description: idOptions.description,\n columnExtras: { nullable: false, primary: true },\n }),\n Reflect.metadata('design:type', Number),\n Generated('increment'),\n QueryEqual(),\n Metadata.set(\n 'notRequiredButHasDefault',\n true,\n 'notRequiredButHasDefaultFields',\n ),\n ]);\n dec(cl.prototype, 'id');\n return cl;\n}\n\nexport interface StringIdOptions extends IdOptions {\n length?: number;\n uuid?: boolean;\n}\n\nexport function StringIdBase(idOptions: StringIdOptions) {\n const cl = class StringIdBase extends TimeBase {\n id: string;\n\n override applyQuery(\n qb: SelectQueryBuilder<StringIdBase>,\n entityName: string,\n ) {\n super.applyQuery(qb, entityName);\n if (!idOptions.noOrderById) {\n qb.orderBy(`${entityName}.id`, 'ASC');\n }\n }\n };\n const columnOptions: PropertyOptions<string> = {\n required: !idOptions.uuid,\n description: idOptions.description,\n columnExtras: { primary: true, nullable: false },\n };\n const decs = [\n Reflect.metadata('design:type', String),\n QueryEqual(),\n Metadata.set(\n 'notRequiredButHasDefault',\n true,\n 'notRequiredButHasDefaultFields',\n ),\n ...(idOptions.uuid\n ? [UuidColumn({ ...columnOptions, generated: true }), NotWritable()]\n : [\n StringColumn(idOptions.length || 255, columnOptions),\n IsNotEmpty(),\n NotChangeable(),\n ]),\n ];\n const dec = MergePropertyDecorators(decs);\n dec(cl.prototype, 'id');\n return cl;\n}\n", "import { AnyClass, ClassType } from 'nesties';\nimport { getMetadataArgsStorage } from 'typeorm';\nimport { getSpecificFields, reflector } from './metadata';\nimport _ from 'lodash';\n\nexport type TypeormRelation<T = any, KT = string> = {\n isArray: boolean;\n propertyClass: ClassType<T>;\n propertyName: KT;\n computed: boolean;\n};\n\nexport function getTypeormRelations<T>(cl: ClassType<T>): TypeormRelation[] {\n const relations = getMetadataArgsStorage().relations.filter(\n (r) => r.target === cl,\n );\n\n const typeormRelations = relations.map((relation) => {\n const isArray = relation.relationType.endsWith('-many');\n const relationClassFactory = relation.type;\n // check if it's a callable function\n let propertyClass: AnyClass;\n if (typeof relationClassFactory === 'function') {\n const relationClass = (relationClassFactory as () => AnyClass)();\n if (typeof relationClass === 'function') {\n propertyClass = relationClass;\n }\n }\n if (!propertyClass) {\n propertyClass = Reflect.getMetadata(\n 'design:type',\n cl.prototype,\n relation.propertyName,\n );\n }\n return {\n isArray,\n propertyClass,\n propertyName: relation.propertyName,\n computed: false,\n };\n });\n\n const computedRelations = getSpecificFields(cl, 'relationComputed').map(\n (field) => {\n const meta = reflector.get('relationComputed', cl, field);\n const res = meta();\n return {\n isArray: res.isArray,\n propertyClass: res.entityClass,\n propertyName: field,\n computed: true,\n };\n },\n );\n return _.uniqBy(\n [...typeormRelations, ...computedRelations], // Merge typeorm relations and computed relations\n (r) => r.propertyName,\n );\n}\n\nexport function getTypeormRelationsMap<T>(cl: ClassType<T>) {\n return Object.fromEntries(\n getTypeormRelations(cl).map((r) => [r.propertyName, r]),\n ) as {\n [key in keyof T]: TypeormRelation<T, key>;\n };\n}\n", "import { Brackets, SelectQueryBuilder } from 'typeorm';\nimport _ from 'lodash';\nimport SJSON from 'superjson';\nimport { queryColumnOptionsFromAlias } from './filter-relations';\nimport { AnyClass } from 'nesties';\nimport { getSubject } from './subject-registry';\n\nexport type TypeormOrderByObject = {\n order: 'ASC' | 'DESC';\n nulls?: 'NULLS FIRST' | 'NULLS LAST';\n};\nexport type TypeormOrderByKey = 'ASC' | 'DESC';\nexport type TypeormOrderBy = ('ASC' | 'DESC') | TypeormOrderByObject;\n\nfunction getValueFromOrderBy(\n orderBy: TypeormOrderBy,\n reversed = false,\n): TypeormOrderByKey {\n if (reversed) {\n const value = getValueFromOrderBy(orderBy, false);\n return value === 'ASC' ? 'DESC' : 'ASC';\n }\n return typeof orderBy === 'string' ? orderBy : orderBy.order;\n}\n\nfunction getNullsFromOrderBy(\n orderBy: TypeormOrderBy,\n reversed = false,\n): 'NULLS FIRST' | 'NULLS LAST' {\n if (reversed) {\n const value = getNullsFromOrderBy(orderBy, false);\n return value === 'NULLS FIRST' ? 'NULLS LAST' : 'NULLS FIRST';\n }\n const nulls = typeof orderBy === 'string' ? undefined : orderBy.nulls;\n if (!nulls) {\n const value = getValueFromOrderBy(orderBy);\n return value === 'ASC' ? 'NULLS FIRST' : 'NULLS LAST';\n }\n return nulls;\n}\n\nfunction getOperator(orderBy: TypeormOrderBy) {\n const value = getValueFromOrderBy(orderBy);\n return value === 'ASC' ? '>' : '<';\n}\n\nfunction getReversedTypeormOrderBy(\n orderBy: TypeormOrderBy | string,\n): TypeormOrderByObject {\n if (typeof orderBy === 'string') {\n return {\n order: orderBy === 'ASC' ? 'DESC' : 'ASC',\n nulls: undefined,\n };\n }\n return {\n order: orderBy.order === 'ASC' ? 'DESC' : 'ASC',\n nulls: orderBy.nulls\n ? orderBy.nulls === 'NULLS FIRST'\n ? 'NULLS LAST'\n : 'NULLS FIRST'\n : undefined,\n };\n}\n\nfunction reverseQueryOrderBy(qb: SelectQueryBuilder<any>) {\n const orderBys = getTypeormOrderBy(qb);\n orderBys.forEach(({ key, direction }, i) => {\n const reversed = getReversedTypeormOrderBy(direction);\n if (i === 0) {\n qb.orderBy(key, reversed.order, reversed.nulls);\n } else {\n qb.addOrderBy(key, reversed.order, reversed.nulls);\n }\n });\n}\n\nfunction getTypeormOrderBy(\n qb: SelectQueryBuilder<any>,\n): { key: string; direction: TypeormOrderBy }[] {\n const orderBy = qb.expressionMap.allOrderBys;\n const orderByEntrys = Object.entries(orderBy);\n return orderByEntrys.map(([key, value]) => ({\n key,\n direction: value,\n }));\n}\n\nexport function extractValueFromOrderByKey(\n obj: any,\n key: string,\n entityAliasName?: string,\n) {\n const getField = (obj, key) => {\n const value = obj[key];\n if (value == null) return value;\n if (Array.isArray(value)) {\n /*\n if (!value.length) {\n return undefined;\n }\n return value[value.length - 1];\n */\n return undefined;\n }\n return value;\n };\n const [alias, field] = key.split('.');\n if (alias === entityAliasName) {\n return getField(obj, field);\n }\n const aliasParts = alias.split('_');\n\n if (aliasParts.length === 1) {\n const value = getField(obj, alias);\n if (value == null) return value;\n return getField(value, field);\n }\n const value = getField(obj, aliasParts[0]);\n if (!value == null) return value;\n return extractValueFromOrderByKey(\n value,\n `${aliasParts.slice(1).join('_')}.${field}`,\n );\n}\n\nfunction encodeBase64Url(str: string) {\n return Buffer.from(str)\n .toString('base64')\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=+$/, '');\n}\n\nfunction decodeBase64Url(str: string) {\n str = str.replace(/-/g, '+').replace(/_/g, '/');\n while (str.length % 4) str += '=';\n return Buffer.from(str, 'base64').toString();\n}\n\nexport async function getPaginatedResult<T>(\n qb: SelectQueryBuilder<T>,\n entityClass: AnyClass,\n entityAliasName: string,\n take: number,\n cursor?: string,\n) {\n const orderBys = getTypeormOrderBy(qb);\n qb.take(take + 1);\n\n let type: 'prev' | 'next' = 'next';\n if (cursor) {\n // cursor is base64url encoded string\n const data = SJSON.parse(decodeBase64Url(cursor)) as {\n type: 'prev' | 'next';\n payload: any;\n };\n\n type = data.type;\n\n const keys = Object.keys(data.payload).filter(\n (k) => qb.expressionMap.orderBys[k],\n );\n if (keys.length) {\n const staircasedKeys = keys.map((key, i) =>\n _.range(i + 1).map((j) => keys[j]),\n );\n\n const cursorKey = (key: string) =>\n `_cursor_${key.replace(/\\./g, '__').replace(/\"/g, '')}`;\n\n const expressionMatrix = staircasedKeys\n .map((keys) =>\n keys.map((key, j) => {\n const paramKey = cursorKey(key);\n const cursorValue = data.payload[key];\n const orderBy = qb.expressionMap.orderBys[key];\n const reversed = data.type === 'prev';\n const order = getValueFromOrderBy(orderBy, reversed); // 'ASC' or 'DESC'\n const nulls = getNullsFromOrderBy(orderBy, reversed); // 'NULLS FIRST' or 'NULLS LAST' or undefined\n\n const isLast = j === keys.length - 1;\n\n const subject = key.includes('\"')\n ? getSubject(qb, key.replace(/\"/g, ''))\n : key;\n\n const mayBeNullAtEnd = () => {\n const res =\n (nulls === 'NULLS LAST' && order === 'ASC') ||\n (nulls === 'NULLS FIRST' && order === 'DESC');\n if (reversed) {\n return !res;\n }\n return res;\n };\n\n if (cursorValue == null) {\n if (isLast) {\n if (mayBeNullAtEnd()) {\n return '__never__';\n } else {\n return `${subject} IS NOT NULL`;\n }\n } else {\n // \u4E2D\u95F4\u5B57\u6BB5\uFF0C\u5982\u679C\u662Fnull\uFF0C\u5C31\u6BD4\u8F83 IS NULL\n return `${subject} IS NULL`;\n }\n } else {\n if (isLast) {\n const expr = `${subject} ${getOperator(order)} :${paramKey}`;\n if (\n mayBeNullAtEnd() &&\n queryColumnOptionsFromAlias(\n qb,\n entityClass,\n entityAliasName,\n key,\n )?.column?.isNullable\n ) {\n return `(${expr} OR ${subject} IS NULL)`;\n }\n return expr;\n } else {\n return `${subject} = :${paramKey}`;\n }\n }\n }),\n )\n .filter((s) => !s.includes('__never__'));\n\n if (expressionMatrix.length) {\n qb.andWhere(\n new Brackets((sqb) => {\n const levelToBrackets = (level: string[]) =>\n new Brackets((qb) => {\n level.forEach((expr, i) => {\n if (i === 0) {\n qb.where(expr);\n } else {\n qb.andWhere(expr);\n }\n });\n });\n const [first, ...rest] = expressionMatrix;\n sqb.where(levelToBrackets(first));\n rest.forEach((level) => sqb.orWhere(levelToBrackets(level)));\n }),\n ).setParameters(\n Object.fromEntries(\n Object.entries(data.payload)\n .filter(([k, v]) => qb.expressionMap.orderBys[k] && v != null)\n .map(([k, v]) => [cursorKey(k), v]),\n ),\n );\n }\n }\n if (data.type === 'prev') {\n reverseQueryOrderBy(qb);\n }\n }\n\n const { raw, entities: data } = await qb.getRawAndEntities();\n\n const rawMapById = new Map<any, any>();\n const getRawFromEntity = (entity: any) => {\n const isNumberId = typeof entity.id === 'number';\n const id = entity.id;\n if (rawMapById.has(id)) {\n return rawMapById.get(id);\n }\n return raw.find((r) => {\n let id = r[`${entityAliasName}_id`];\n if (isNumberId) {\n id = Number(id);\n if (isNaN(id)) return false;\n }\n if (id == null) return false;\n rawMapById[id] = r;\n return id === entity.id;\n });\n };\n\n const enough = data.length > take;\n const hasNext = enough || type === 'prev';\n const hasPrev = cursor && (enough || type === 'next');\n if (enough) {\n data.pop();\n }\n if (type === 'prev') {\n data.reverse();\n }\n\n const generateCursor = (type: 'prev' | 'next', data: T[]) => {\n const targetObject = type === 'prev' ? data[0] : data[data.length - 1];\n const payload = Object.fromEntries(\n orderBys\n .map(({ key }) => {\n const value =\n !key.includes('.') || key.includes('\"')\n ? getRawFromEntity(targetObject)?.[key.replace(/\"/g, '')]\n : extractValueFromOrderByKey(targetObject, key, entityAliasName);\n return [key, value];\n })\n .filter((s) => s[1] !== undefined),\n );\n return encodeBase64Url(SJSON.stringify({ type, payload }));\n };\n\n return {\n data,\n paginatedResult: {\n nextCursor: hasNext ? generateCursor('next', data) : undefined,\n previousCursor: hasPrev ? generateCursor('prev', data) : undefined,\n },\n };\n}\n", "import { AnyClass } from 'nesties';\nimport { RelationDef } from './relation-def';\nimport { getTypeormRelations, TypeormRelation } from './get-typeorm-relations';\nimport { Relation, SelectQueryBuilder } from 'typeorm';\n\nexport const extractRelationName = (relation: string | RelationDef) => {\n if (typeof relation === 'string') {\n return relation;\n } else {\n return relation.name;\n }\n};\n\nconst typeormRelationsCache = new Map<\n AnyClass,\n Record<string, TypeormRelation>\n>();\n\nconst fetchTypeormRelations = (cl: AnyClass) => {\n if (typeormRelationsCache.has(cl)) {\n return typeormRelationsCache.get(cl)!;\n }\n const relations = getTypeormRelations(cl);\n const map = Object.fromEntries(\n relations.map((r) => [r.propertyName, r]),\n ) as Record<string, TypeormRelation>;\n typeormRelationsCache.set(cl, map);\n return map;\n};\n\nexport const filterRelations = <T extends string | RelationDef>(\n cl: AnyClass,\n relations?: T[],\n cond: (r: TypeormRelation) => boolean = () => true,\n) => {\n return (\n relations?.filter((r) => {\n const relationName = extractRelationName(r);\n const checkLevel = (entityClass: AnyClass, name: string): boolean => {\n const [currentLevel, ...nextLevel] = name.split('.');\n const relation = fetchTypeormRelations(entityClass)?.[currentLevel];\n if (!relation) {\n throw new Error(\n `Relation ${currentLevel} not found in ${entityClass.name} (Reading ${relationName} in ${cl.name})`,\n );\n }\n if (relation.computed) return false;\n if (!nextLevel.length) return true;\n return checkLevel(relation.propertyClass, nextLevel.join('.'));\n };\n return checkLevel(cl, relationName);\n }) || []\n );\n};\n\nexport const filterAliases = (\n cl: AnyClass,\n rootAlias: string,\n aliases?: string[],\n cond: (\n r: TypeormRelation | undefined,\n field: string,\n key: string | undefined,\n ) => boolean = () => true,\n) => {\n return (\n aliases?.filter((alias) => {\n const [field, key] = alias.split('.');\n if (!key || field === rootAlias) {\n return cond(undefined, field, key);\n }\n const relationLevels = [...field.split('_'), key];\n let currentClass = cl;\n for (let i = 0; i < relationLevels.length; i++) {\n const f = relationLevels[i];\n const k = relationLevels[i + 1];\n const relation = fetchTypeormRelations(currentClass)?.[f];\n if (!cond(relation, f, k)) return false;\n currentClass = relation.propertyClass;\n }\n return true;\n }) || []\n );\n};\n\nexport const queryColumnOptionsFromAlias = (\n qb: SelectQueryBuilder<any>,\n cl: AnyClass,\n rootAlias: string,\n alias: string,\n) => {\n const [field, key] = alias.split('.');\n if (field === rootAlias) {\n return {\n relations: [],\n column: qb.connection.getMetadata(cl)?.findColumnWithPropertyName(key),\n };\n }\n\n const relationLevels = field.split('_');\n let currentClass = cl;\n const relations: TypeormRelation[] = [];\n while (relationLevels.length) {\n const f = relationLevels.shift()!;\n const relation = fetchTypeormRelations(currentClass)?.[f];\n if (!relation || relation.computed) {\n return;\n }\n relations.push(relation);\n currentClass = relation.propertyClass;\n }\n return {\n relations,\n column: qb.connection\n .getMetadata(currentClass)\n ?.findColumnWithPropertyName(key),\n };\n};\n", "import {\n Body,\n Delete,\n Get,\n HttpCode,\n Param,\n ParseIntPipe,\n Patch,\n Post,\n Query,\n} from '@nestjs/common';\nimport { ImportDataDto, ImportEntryDto } from './dto';\nimport {\n AnyClass,\n MergeMethodDecorators,\n PaginatedReturnMessageDto,\n ReturnMessageDto,\n ClassType,\n getApiProperty,\n DataPipe,\n ApiTypeResponse,\n ApiBlankResponse,\n ApiError,\n} from 'nesties';\nimport {\n ApiBody,\n ApiOkResponse,\n ApiOperation,\n ApiParam,\n ApiProperty,\n ApiPropertyOptions,\n IntersectionType,\n OmitType,\n PartialType,\n} from '@nestjs/swagger';\nimport { OperationObject } from '@nestjs/swagger/dist/interfaces/open-api-spec.interface';\nimport _, { upperFirst } from 'lodash';\nimport { getNotInResultFields, getSpecificFields } from './utility/metadata';\nimport { RenameClass } from 'nesties';\nimport { getTypeormRelations } from './utility/get-typeorm-relations';\nimport { CrudBase, CrudOptions, CrudService } from './crud-base';\nimport { PageSettingsDto } from './bases';\nimport { CursorPaginationDto, CursorPaginationReturnMessageDto } from './dto';\nimport {\n BaseRestfulController,\n RestfulMethods,\n RestfulPaginateType,\n} from './bases/base-restful-controller';\nimport { Repository } from 'typeorm';\nimport { RelationDef } from './utility/relation-def';\nimport {\n filterRelations,\n extractRelationName,\n} from './utility/filter-relations';\nimport { OmitTypeExclude, PickTypeExpose } from './utility/omit-type-exclude';\nimport { nonTransformableTypes } from './utility/non-transformable-types';\nimport { PatchColumnsInGet } from './utility/patch-column-in-get';\nimport { OmitPipe, OptionalDataPipe, PickPipe } from './decorators';\nimport { MutatorPipe } from './utility/mutate-pipe';\nimport { Memorize } from 'nfkit';\n\nexport interface RestfulFactoryOptions<\n T,\n O extends keyof T = never,\n W extends keyof T = never,\n C extends keyof T = never,\n U extends keyof T = never,\n F extends keyof T = never,\n R extends keyof T = never,\n> {\n fieldsToOmit?: O[];\n writeFieldsToOmit?: W[];\n createFieldsToOmit?: C[];\n updateFieldsToOmit?: U[];\n findAllFieldsToOmit?: F[];\n outputFieldsToOmit?: R[];\n prefix?: string;\n keepEntityVersioningDates?: boolean;\n entityClassName?: string;\n relations?: (string | RelationDef)[];\n skipNonQueryableFields?: boolean;\n}\n\nconst getCurrentLevelRelations = (relations: string[]) =>\n relations.filter((r) => !r.includes('.'));\n\nconst getNextLevelRelations = (relations: string[], enteringField: string) =>\n relations\n .filter((r) => r.includes('.') && r.startsWith(`${enteringField}.`))\n .map((r) => r.split('.').slice(1).join('.'));\n\nexport interface ResourceOptions extends Partial<OperationObject> {\n prefix?: string;\n}\n\nexport class RestfulFactory<\n T extends { id: any },\n O extends keyof T = never,\n W extends keyof T = never,\n C extends keyof T = never,\n U extends keyof T = never,\n F extends keyof T = never,\n R extends keyof T = never,\n> {\n constructor(\n public readonly entityClass: ClassType<T>,\n private options: RestfulFactoryOptions<T, O, W, C, U, F, R> = {},\n private __resolveVisited = new Map<AnyClass, [AnyClass]>(),\n ) {\n if (options.relations) {\n // we have to filter once to ensure every relation is correct\n filterRelations(entityClass, options.relations);\n }\n }\n\n omitInput<K extends keyof T>(...fields: K[]) {\n return new RestfulFactory<T, O | K, W, C, U, F, R>(\n this.entityClass,\n {\n ...this.options,\n fieldsToOmit: _.uniq([...(this.options.fieldsToOmit || []), ...fields]),\n },\n this.__resolveVisited,\n );\n }\n\n omitWrite<K extends keyof T>(...fields: K[]) {\n return new RestfulFactory<T, O, W | K, C, U, F, R>(\n this.entityClass,\n {\n ...this.options,\n writeFieldsToOmit: _.uniq([\n ...(this.options.writeFieldsToOmit || []),\n ...fields,\n ]),\n },\n this.__resolveVisited,\n );\n }\n\n omitCreate<K extends keyof T>(...fields: K[]) {\n return new RestfulFactory<T, O, W, C | K, U, F, R>(\n this.entityClass,\n {\n ...this.options,\n createFieldsToOmit: _.uniq([\n ...(this.options.createFieldsToOmit || []),\n ...fields,\n ]),\n },\n this.__resolveVisited,\n );\n }\n\n omitUpdate<K extends keyof T>(...fields: K[]) {\n return new RestfulFactory<T, O, W, C, U | K, F, R>(\n this.entityClass,\n {\n ...this.options,\n updateFieldsToOmit: _.uniq([\n ...(this.options.updateFieldsToOmit || []),\n ...fields,\n ]),\n },\n this.__resolveVisited,\n );\n }\n\n omitFindAll<K extends keyof T>(...fields: K[]) {\n return new RestfulFactory<T, O, W, C, U, F | K, R>(\n this.entityClass,\n {\n ...this.options,\n findAllFieldsToOmit: _.uniq([\n ...(this.options.findAllFieldsToOmit || []),\n ...fields,\n ]),\n },\n this.__resolveVisited,\n );\n }\n\n omitOutput<K extends keyof T>(...fields: K[]) {\n return new RestfulFactory<T, O, W, C, U, F, R | K>(\n this.entityClass,\n {\n ...this.options,\n outputFieldsToOmit: _.uniq([\n ...(this.options.outputFieldsToOmit || []),\n ...fields,\n ]),\n },\n this.__resolveVisited,\n );\n }\n\n pathPrefix(prefix: string) {\n return new RestfulFactory<T, O, W, C, U, F, R>(\n this.entityClass,\n {\n ...this.options,\n prefix,\n },\n this.__resolveVisited,\n );\n }\n\n keepEntityVersioningDates(enable = true) {\n return new RestfulFactory<T, O, W, C, U, F, R>(\n this.entityClass,\n {\n ...this.options,\n keepEntityVersioningDates: enable,\n },\n this.__resolveVisited,\n );\n }\n\n skipNonQueryableFields(enable = true) {\n return new RestfulFactory<T, O, W, C, U, F, R>(\n this.entityClass,\n {\n ...this.options,\n skipNonQueryableFields: enable,\n },\n this.__resolveVisited,\n );\n }\n\n renameEntityClass(name: string) {\n return new RestfulFactory<T, O, W, C, U, F, R>(\n this.entityClass,\n {\n ...this.options,\n entityClassName: name,\n },\n this.__resolveVisited,\n );\n }\n\n useRelations(...relations: (string | RelationDef)[]) {\n return new RestfulFactory<T, O, W, C, U, F, R>(\n this.entityClass,\n {\n ...this.options,\n relations: [...(this.options.relations || []), ...relations],\n },\n this.__resolveVisited,\n );\n }\n\n get entityClassName() {\n return this.options.entityClassName || this.entityClass.name;\n }\n\n @Memorize()\n get fieldsToOmit() {\n return _.uniq([\n ...(getSpecificFields(this.entityClass, 'notColumn') as (keyof T)[]),\n ...(this.options.fieldsToOmit || []),\n ...getTypeormRelations(this.entityClass).map(\n (r) => r.propertyName as keyof T,\n ),\n ]);\n }\n\n @Memorize()\n get fieldsInCreateToOmit() {\n return _.uniq([\n ...this.fieldsToOmit,\n ...(this.options.writeFieldsToOmit || []),\n ...(this.options.createFieldsToOmit || []),\n ...(getSpecificFields(this.entityClass, 'notWritable') as (keyof T)[]),\n ...(getSpecificFields(this.entityClass, 'notCreatable') as (keyof T)[]),\n ]);\n }\n\n @Memorize()\n get createDto() {\n return RenameClass(\n OmitTypeExclude(this.entityClass, this.fieldsInCreateToOmit),\n `Create${this.entityClassName}Dto`,\n ) as ClassType<Omit<T, O | W | C>>;\n }\n\n @Memorize()\n get fieldsInUpdateToOmit() {\n return _.uniq([\n ...this.fieldsToOmit,\n ...(this.options.writeFieldsToOmit || []),\n ...(this.options.updateFieldsToOmit || []),\n ...(getSpecificFields(this.entityClass, 'notWritable') as (keyof T)[]),\n ...(getSpecificFields(this.entityClass, 'notChangeable') as (keyof T)[]),\n ]);\n }\n\n @Memorize()\n get updateDto() {\n return RenameClass(\n PartialType(OmitTypeExclude(this.entityClass, this.fieldsInUpdateToOmit)),\n `Update${this.entityClassName}Dto`,\n ) as ClassType<Omit<T, O | W | U>>;\n }\n\n @Memorize()\n get importDto() {\n return ImportDataDto(this.createDto);\n }\n\n @Memorize()\n get fieldsInGetToOmit() {\n return _.uniq([\n ...this.fieldsToOmit,\n ...(getSpecificFields(this.entityClass, 'notQueryable') as (keyof T)[]),\n ...(_.difference(\n getSpecificFields(this.entityClass, 'requireGetMutator'),\n getSpecificFields(this.entityClass, 'getMutator'),\n ) as (keyof T)[]),\n ]);\n }\n\n @Memorize()\n get queryableFields() {\n return _.difference(\n [\n ...getSpecificFields(this.entityClass, 'queryCondition'),\n 'pageCount',\n 'recordsPerPage',\n 'paginationCursor',\n ] as (keyof T)[],\n this.fieldsInGetToOmit,\n );\n }\n\n @Memorize()\n get findAllDto() {\n let cl = PartialType(\n PatchColumnsInGet(\n OmitTypeExclude(\n this.entityClass instanceof PageSettingsDto\n ? this.entityClass\n : (IntersectionType(\n this.entityClass,\n PageSettingsDto,\n ) as unknown as ClassType<T>),\n this.fieldsInGetToOmit,\n ),\n this.entityClass,\n this.fieldsInGetToOmit as string[],\n ),\n ) as ClassType<T>;\n if (this.options.skipNonQueryableFields) {\n cl = PickTypeExpose(cl, this.queryableFields) as ClassType<T>;\n }\n return RenameClass(cl, `Find${this.entityClassName}Dto`) as ClassType<\n Omit<T, O | F>\n >;\n }\n\n @Memorize()\n get findAllCursorPaginatedDto() {\n return RenameClass(\n IntersectionType(\n OmitTypeExclude(this.findAllDto, ['pageCount' as keyof Omit<T, O | F>]),\n CursorPaginationDto,\n ),\n `Find${this.entityClassName}CursorPaginatedDto`,\n ) as unknown as ClassType<T>;\n }\n\n @Memorize()\n get entityResultDto() {\n const relations = getTypeormRelations(this.entityClass);\n const currentLevelRelations =\n this.options.relations &&\n new Set(\n getCurrentLevelRelations(\n this.options.relations.map(extractRelationName),\n ),\n );\n const outputFieldsToOmit = new Set([\n ...(getNotInResultFields(\n this.entityClass,\n this.options.keepEntityVersioningDates,\n ) as (keyof T)[]),\n ...(this.options.outputFieldsToOmit || []),\n ...(this.options.relations\n ? (relations\n .map((r) => r.propertyName)\n .filter((r) => !currentLevelRelations.has(r)) as (keyof T)[])\n : []),\n ]);\n const resultDto = OmitType(this.entityClass, [...outputFieldsToOmit]);\n for (const relation of relations) {\n if (outputFieldsToOmit.has(relation.propertyName as keyof T)) continue;\n if (nonTransformableTypes.has(relation.propertyClass)) continue;\n const replace = (useClass: [AnyClass]) => {\n const oldApiProperty = getApiProperty(\n this.entityClass,\n relation.propertyName,\n );\n ApiProperty({\n ...oldApiProperty,\n // required: false,\n type: () => (relation.isArray ? [useClass[0]] : useClass[0]),\n } as ApiPropertyOptions)(resultDto.prototype, relation.propertyName);\n };\n const existing = this.__resolveVisited.get(relation.propertyClass);\n if (existing) {\n replace(existing);\n } else {\n if (\n !this.__resolveVisited.has(this.entityClass) &&\n !this.options.relations\n ) {\n this.__resolveVisited.set(this.entityClass, [null]);\n }\n const relationFactory = new RestfulFactory(\n relation.propertyClass,\n {\n entityClassName: `${this.entityClassName}${\n this.options.relations\n ? upperFirst(relation.propertyName)\n : relation.propertyClass.name\n }`,\n relations:\n this.options.relations &&\n getNextLevelRelations(\n this.options.relations.map(extractRelationName),\n relation.propertyName,\n ),\n keepEntityVersioningDates: this.options.keepEntityVersioningDates,\n },\n this.__resolveVisited,\n );\n const relationResultDto = relationFactory.entityResultDto;\n replace([relationResultDto]);\n if (!this.options.relations) {\n this.__resolveVisited.set(relation.propertyClass, [\n relationResultDto,\n ]);\n }\n }\n }\n const notRequiredButHasDefaultFields = getSpecificFields(\n this.entityClass,\n 'notRequiredButHasDefault',\n ).filter((f) => !outputFieldsToOmit.has(f as keyof T));\n for (const field of notRequiredButHasDefaultFields) {\n const oldApiProperty = getApiProperty(resultDto, field);\n ApiProperty({\n ...oldApiProperty,\n required: true,\n } as ApiPropertyOptions)(resultDto.prototype, field);\n }\n const res = RenameClass(\n resultDto,\n `${this.entityClassName}ResultDto`,\n ) as ClassType<Omit<T, R>>;\n const currentContainer = this.__resolveVisited.get(this.entityClass);\n if (currentContainer) {\n currentContainer[0] = res;\n }\n return res;\n }\n\n @Memorize()\n get entityCreateResultDto() {\n return RenameClass(\n OmitType(this.entityResultDto, [\n ...getTypeormRelations(this.entityClass).map(\n (r) => r.propertyName as keyof T,\n ),\n ...(getSpecificFields(\n this.entityClass,\n 'notColumn',\n (m) => !m.keepInCreate,\n ) as any[]),\n ]),\n `${this.entityClassName}CreateResultDto`,\n ) as ClassType<Omit<T, R>>;\n }\n\n @Memorize()\n get entityReturnMessageDto() {\n return ReturnMessageDto(this.entityResultDto);\n }\n\n @Memorize()\n get entityCreateReturnMessageDto() {\n return ReturnMessageDto(this.entityCreateResultDto);\n }\n\n @Memorize()\n get entityArrayReturnMessageDto() {\n return PaginatedReturnMessageDto(this.entityResultDto);\n }\n\n @Memorize()\n get entityCursorPaginationReturnMessageDto() {\n return CursorPaginationReturnMessageDto(this.entityResultDto);\n }\n\n @Memorize()\n get importReturnMessageDto() {\n return ReturnMessageDto([ImportEntryDto(this.entityCreateResultDto)]);\n }\n\n @Memorize()\n // eslint-disable-next-line @typescript-eslint/ban-types\n get idType(): StringConstructor | NumberConstructor {\n return Reflect.getMetadata('design:type', this.entityClass.prototype, 'id');\n }\n\n private usePrefix(\n methodDec: (path?: string) => MethodDecorator,\n ...paths: string[]\n ) {\n const usePaths = [this.options.prefix, ...paths].filter(\n (s) => s && s.length > 0,\n );\n if (usePaths.length > 0) {\n return methodDec(usePaths.join('/'));\n } else {\n return methodDec();\n }\n }\n\n create(extras: ResourceOptions = {}): MethodDecorator {\n return MergeMethodDecorators([\n this.usePrefix(Post, extras.prefix),\n HttpCode(200),\n ApiOperation({\n summary: `Create a new ${this.entityClassName}`,\n ..._.omit(extras, 'prefix'),\n }),\n ApiBody({ type: this.createDto }),\n ApiOkResponse({ type: this.entityCreateReturnMessageDto }),\n ApiError(400, `The ${this.entityClassName} is not valid`),\n ]);\n }\n\n createParam() {\n return Body(DataPipe(), OmitPipe(this.fieldsInCreateToOmit));\n }\n\n findOne(extras: ResourceOptions = {}): MethodDecorator {\n return MergeMethodDecorators([\n this.usePrefix(Get, extras.prefix, ':id'),\n ApiOperation({\n summary: `Find a ${this.entityClassName} by id`,\n ..._.omit(extras, 'prefix'),\n }),\n ApiParam({ name: 'id', type: this.idType, required: true }),\n ApiOkResponse({ type: this.entityReturnMessageDto }),\n ApiError(\n 400,\n `The ${this.entityClassName} with the given id was not found`,\n ),\n ]);\n }\n\n idParam() {\n if (this.idType === Number) {\n return Param('id', ParseIntPipe);\n } else {\n return Param('id');\n }\n }\n\n findAll(extras: ResourceOptions = {}): MethodDecorator {\n return MergeMethodDecorators([\n this.usePrefix(Get, extras.prefix),\n ApiOperation({\n summary: `Find all ${this.entityClassName}`,\n ..._.omit(extras, 'prefix'),\n }),\n ApiOkResponse({ type: this.entityArrayReturnMessageDto }),\n ]);\n }\n\n findAllCursorPaginated(extras: ResourceOptions = {}): MethodDecorator {\n return MergeMethodDecorators([\n this.usePrefix(Get, extras.prefix),\n ApiOperation({\n summary: `Find all ${this.entityClassName}`,\n ..._.omit(extras, 'prefix'),\n }),\n ApiOkResponse({ type: this.entityCursorPaginationReturnMessageDto }),\n ]);\n }\n\n private getMutatorColumns() {\n const mutatorColumns = getSpecificFields(this.entityClass, 'getMutator');\n return _.difference(mutatorColumns, this.fieldsInGetToOmit as string[]);\n }\n\n findAllParam() {\n const mutatorColumns = this.getMutatorColumns();\n const restPipes = [OptionalDataPipe(), OmitPipe(this.fieldsInGetToOmit)];\n if (this.options.skipNonQueryableFields) {\n restPipes.push(PickPipe(this.queryableFields));\n }\n if (mutatorColumns.length) {\n return Query(new MutatorPipe(this.entityClass), ...restPipes);\n } else {\n return Query(...restPipes);\n }\n }\n\n update(extras: ResourceOptions = {}): MethodDecorator {\n return MergeMethodDecorators([\n this.usePrefix(Patch, extras.prefix, ':id'),\n HttpCode(200),\n ApiOperation({\n summary: `Update a ${this.entityClassName} by id`,\n ..._.omit(extras, 'prefix'),\n }),\n ApiParam({ name: 'id', type: this.idType, required: true }),\n ApiBody({ type: this.updateDto }),\n ApiBlankResponse(),\n ApiError(\n 404,\n `The ${this.entityClassName} with the given id was not found`,\n ),\n ApiError(400, `The ${this.entityClassName} is not valid`),\n ApiError(500, 'Internal error'),\n ]);\n }\n\n updateParam() {\n return Body(OptionalDataPipe(), OmitPipe(this.fieldsInUpdateToOmit));\n }\n\n delete(extras: ResourceOptions = {}): MethodDecorator {\n return MergeMethodDecorators([\n this.usePrefix(Delete, extras.prefix, ':id'),\n HttpCode(200),\n ApiOperation({\n summary: `Delete a ${this.entityClassName} by id`,\n ..._.omit(extras, 'prefix'),\n }),\n ApiParam({ name: 'id', type: this.idType, required: true }),\n ApiBlankResponse(),\n ApiError(\n 404,\n `The ${this.entityClassName} with the given id was not found`,\n ),\n ApiError(500, 'Internal error'),\n ]);\n }\n\n import(extras: ResourceOptions = {}): MethodDecorator {\n return MergeMethodDecorators([\n this.usePrefix(Post, extras.prefix, 'import'),\n HttpCode(200),\n ApiOperation({\n summary: `Import ${this.entityClassName}`,\n ..._.omit(extras, 'prefix'),\n }),\n ApiBody({ type: this.importDto }),\n ApiOkResponse({ type: this.importReturnMessageDto }),\n ApiError(500, 'Internal error'),\n ]);\n }\n\n operation(\n operationName: string,\n options: ResourceOptions & {\n returnType?: AnyClass;\n } = {},\n ): MethodDecorator {\n return MergeMethodDecorators([\n this.usePrefix(Post, options.prefix, ':id', operationName),\n HttpCode(200),\n ApiOperation({\n summary: `${upperFirst(operationName)} a ${this.entityClassName} by id`,\n ..._.omit(options, 'prefix', 'returnType'),\n }),\n options.returnType\n ? ApiTypeResponse(options.returnType)\n : ApiBlankResponse(),\n ApiError(\n 404,\n `The ${this.entityClassName} with the given id was not found`,\n ),\n ]);\n }\n\n baseController<\n Options extends Partial<{\n paginateType: RestfulPaginateType;\n globalMethodDecorators: MethodDecorator[];\n routes: Partial<\n Record<\n RestfulMethods,\n Partial<{\n enabled: boolean;\n methodDecorators: MethodDecorator[];\n }>\n >\n >;\n // eslint-disable-next-line @typescript-eslint/ban-types\n }> = {},\n >(routeOptions: Options = {} as Options) {\n // \u8BA1\u7B97\u51FA\u54EA\u4E9B\u662F disabled \u7684\u65B9\u6CD5\n type Routes = NonNullable<Options['routes']>;\n type ExplicitlyEnabledOrDisabledMethods<E> = {\n [M in keyof Routes]: Routes[M] extends { enabled: E } ? M : never;\n }[keyof Routes] &\n RestfulMethods;\n type ExplicitlyDisabledMethods = ExplicitlyEnabledOrDisabledMethods<false>;\n type ExplicitlyEnabledMethods = ExplicitlyEnabledOrDisabledMethods<true>;\n\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const _this = this;\n\n const cl =\n class SpecificRestfulController extends BaseRestfulController<T> {\n constructor(service: CrudBase<T> | Repository<T>) {\n super(service, {\n paginateType: routeOptions.paginateType || 'offset',\n relations: _this.options.relations,\n entityClass: _this.entityClass,\n });\n }\n } as new (service: CrudBase<T> | Repository<T>) => ([\n ExplicitlyEnabledMethods,\n ] extends [never]\n ? Omit<BaseRestfulController<T>, ExplicitlyDisabledMethods>\n : Pick<BaseRestfulController<T>, ExplicitlyEnabledMethods>) & {\n _service: CrudBase<T>;\n };\n\n const anyTrueWritten = RestfulMethods.some(\n (m) => routeOptions?.routes?.[m]?.enabled === true,\n );\n\n const validMethods = RestfulMethods.filter((m) => {\n const value = routeOptions?.routes?.[m]?.enabled;\n if (value === false) return false;\n if (value === true) return true;\n return !anyTrueWritten || value === true;\n });\n\n const useDecorators: Record<\n RestfulMethods,\n {\n paramDecorators: () => ParameterDecorator[];\n paramTypes: AnyClass[];\n methodDecorators: () => MethodDecorator[];\n }\n > = {\n findOne: {\n paramTypes: [this.idType as AnyClass],\n paramDecorators: () => [this.idParam()],\n methodDecorators: () => [this.findOne()],\n },\n findAll: {\n paramTypes: [\n routeOptions.paginateType === 'cursor'\n ? this.findAllCursorPaginatedDto\n : routeOptions.paginateType === 'none'\n ? OmitType(this.findAllDto, [\n 'pageCount',\n 'recordsPerPage',\n ] as (keyof Omit<T, O | F>)[])\n : this.findAllDto,\n ],\n paramDecorators: () => [this.findAllParam()],\n methodDecorators: () => [\n routeOptions.paginateType === 'cursor'\n ? this.findAllCursorPaginated()\n : this.findAll(),\n ],\n },\n create: {\n paramTypes: [this.createDto],\n paramDecorators: () => [this.createParam()],\n methodDecorators: () => [this.create()],\n },\n update: {\n paramTypes: [this.idType as AnyClass, this.updateDto],\n paramDecorators: () => [this.idParam(), this.updateParam()],\n methodDecorators: () => [this.update()],\n },\n delete: {\n paramTypes: [this.idType as AnyClass],\n paramDecorators: () => [this.idParam()],\n methodDecorators: () => [this.delete()],\n },\n import: {\n paramTypes: [this.importDto],\n paramDecorators: () => [this.createParam()],\n methodDecorators: () => [this.import()],\n },\n };\n\n for (const method of validMethods) {\n // 1. Override \u7EE7\u627F\u65B9\u6CD5\uFF0C\u8BA9\u5B83\u6210\u4E3A\u81EA\u5DF1\u7684\uFF08\u4EE5\u4FBF\u80FD\u88C5\u9970\uFF09\n const methodImpl = function namedMethodImpl(...args: any[]) {\n return BaseRestfulController.prototype[method].apply(this, args);\n };\n Object.defineProperty(methodImpl, 'name', {\n value: method,\n configurable: true,\n });\n cl.prototype[method] = methodImpl;\n\n const paramDecorators = useDecorators[method].paramDecorators();\n const paramTypes = useDecorators[method].paramTypes;\n const methodDecorators = [\n ...useDecorators[method].methodDecorators(),\n ...(routeOptions?.routes?.[method]?.methodDecorators || []),\n ...(routeOptions?.globalMethodDecorators || []),\n ];\n\n // 2. \u5148\u6253\u53C2\u6570\u88C5\u9970\u5668\n paramDecorators.forEach((paramDecorator, index) => {\n paramDecorator(cl.prototype, method, index);\n });\n\n // 3. \u6253 Reflect Metadata\uFF08design:paramtypes\uFF09\n Reflect.defineMetadata(\n 'design:paramtypes',\n paramTypes,\n cl.prototype,\n method,\n );\n\n // 4. \u6253 Reflect Metadata\uFF08design:type \u548C design:returntype\uFF09\n const baseDescriptor = Object.getOwnPropertyDescriptor(\n BaseRestfulController.prototype,\n method,\n );\n if (baseDescriptor) {\n // \u65B9\u6CD5\u662F function\n Reflect.defineMetadata(\n 'design:type',\n baseDescriptor.value,\n cl.prototype,\n method,\n );\n\n // \u8FD9\u91CC return type \u901A\u5E38\u53EF\u4EE5\u662F Promise<any>\uFF0C\u4F46\u5982\u679C\u4F60\u6709\u66F4\u5177\u4F53\u7684\u7C7B\u578B\uFF0C\u53EF\u4EE5\u6269\u5C55\n Reflect.defineMetadata(\n 'design:returntype',\n Promise,\n cl.prototype,\n method,\n );\n }\n\n // 5. \u518D\u6253\u65B9\u6CD5\u88C5\u9970\u5668\n methodDecorators.forEach((methodDecorator) => {\n const descriptor = Object.getOwnPropertyDescriptor(\n cl.prototype,\n method,\n )!;\n methodDecorator(cl.prototype, method, descriptor);\n Object.defineProperty(cl.prototype, method, descriptor);\n });\n }\n\n return RenameClass(cl, `${this.entityClassName}Controller`);\n }\n\n crudService(options: CrudOptions<T> = {}) {\n return CrudService(this.entityClass, {\n relations: this.options.relations,\n outputFieldsToOmit: this.options.outputFieldsToOmit,\n ...options,\n });\n }\n}\n", "import { CrudBase, CrudService } from '../crud-base';\nimport { Repository } from 'typeorm';\nimport { ClassType } from 'nesties';\nimport { RelationDef } from '../utility/relation-def';\n\nexport const RestfulMethods = [\n 'findOne',\n 'findAll',\n 'create',\n 'update',\n 'delete',\n 'import',\n] as const;\n\nexport type RestfulMethods = typeof RestfulMethods[number];\n\nexport type RestfulPaginateType = 'offset' | 'cursor' | 'none';\n\nexport class BaseRestfulController<T extends { id: any }> {\n _service: CrudBase<T>;\n constructor(\n serviceOrRepo: CrudBase<T> | Repository<T>,\n public _options: Partial<{\n paginateType: RestfulPaginateType;\n relations: (string | RelationDef)[];\n entityClass: ClassType<T>;\n }> = {},\n ) {\n if (serviceOrRepo instanceof CrudBase) {\n this._service = serviceOrRepo;\n } else {\n const crudServiceClass = CrudService(this._options.entityClass, {\n relations: this._options.relations,\n });\n this._service = new crudServiceClass(serviceOrRepo);\n }\n }\n\n findOne(id: number) {\n return this._service.findOne(id);\n }\n\n findAll(dto: Partial<T>) {\n if (this._options.paginateType === 'cursor') {\n return this._service.findAllCursorPaginated(dto);\n }\n if (this._options.paginateType === 'offset') {\n return this._service.findAll(dto);\n }\n dto['recordsPerPage'] ??= 99999;\n return this._service.findAll(dto);\n }\n\n create(dto: T) {\n return this._service.create(dto);\n }\n\n update(id: number, dto: Partial<T>) {\n return this._service.update(id, dto);\n }\n\n delete(id: number) {\n return this._service.delete(id);\n }\n\n import(data: { data: T[] }) {\n return this._service.importEntities(data.data);\n }\n}\n", "import { OmitType } from '@nestjs/swagger';\nimport { Exclude, Expose } from 'class-transformer';\nimport { ClassType } from 'nesties';\n\nexport const OmitTypeExclude = <T, K extends keyof T>(\n cl: ClassType<T>,\n keys: readonly K[],\n) => {\n const omitted = OmitType(cl, keys);\n for (const key of keys) {\n Exclude()(omitted.prototype, key as any);\n }\n return omitted;\n};\n\nexport const PickTypeExpose = <T, K extends keyof T>(\n cl: ClassType<T>,\n keys: readonly K[],\n) => {\n const picked = OmitType(\n cl,\n Object.keys(cl.prototype).filter((k) => !keys.includes(k as K)) as K[],\n );\n for (const key of keys) {\n Expose()(picked.prototype, key as any);\n }\n return picked;\n};\n", "import { ApiProperty, ApiPropertyOptions } from '@nestjs/swagger';\nimport { getSpecificFields, reflector } from './metadata';\nimport { AnyClass, getApiProperty } from 'nesties';\nimport _ from 'lodash';\nimport { DECORATORS } from '@nestjs/swagger/dist/constants';\n\nexport const PatchColumnsInGet = <C extends AnyClass>(\n cl: C,\n originalCl: AnyClass = cl,\n fieldsToOmit: string[] = [],\n) => {\n const omit = new Set(fieldsToOmit);\n const useCl = originalCl || cl;\n const mutateFields = getSpecificFields(useCl, 'getMutator').filter(\n (f) => !omit.has(f),\n );\n for (const field of mutateFields) {\n const originalApiProp = getApiProperty(originalCl, field);\n const info = reflector.get('getMutator', useCl, field);\n Reflect.defineMetadata(\n DECORATORS.API_MODEL_PROPERTIES,\n {\n ...originalApiProp,\n type: String,\n required: false,\n example: info.example ?? undefined,\n enum: info.enum ?? undefined,\n default: undefined,\n ...(info.apiPropertyExtras || {}),\n },\n cl.prototype,\n field,\n );\n }\n const queryableFieldsRemaining = _.difference(\n getSpecificFields(useCl, 'queryCondition'),\n mutateFields,\n );\n for (const field of queryableFieldsRemaining) {\n const originalApiProp = getApiProperty(originalCl, field);\n Reflect.defineMetadata(\n DECORATORS.API_MODEL_PROPERTIES,\n {\n ...originalApiProp,\n default: undefined, // we remove every default value in get\n },\n cl.prototype,\n field,\n );\n }\n return cl;\n};\n", "import { getSpecificFields, reflector } from './metadata';\nimport { PipeTransform } from '@nestjs/common';\nimport { AnyClass } from 'nesties';\n\nexport class MutatorPipe implements PipeTransform {\n constructor(private readonly entityClass: AnyClass) {}\n\n private mutatorFields = getSpecificFields(this.entityClass, 'getMutator');\n\n transform<T>(obj: T): T {\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n const newObj = { ...obj } as any;\n for (const field of this.mutatorFields) {\n const v = newObj[field];\n if (v == null) {\n continue;\n }\n const mutator = reflector.get('getMutator', this.entityClass, field);\n newObj[field] = mutator.mutator(v);\n }\n return newObj;\n }\n}\n", "import { SelectQueryBuilder } from 'typeorm';\nimport { parseBool } from './parse-bool';\n\nexport function createQueryCondition(\n cond: <T>(\n obj: T,\n qb: SelectQueryBuilder<T>,\n entityName: string,\n field: keyof T & string,\n ) =>\n | void\n | SelectQueryBuilder<any>\n | string\n | { query: string; params: Record<string, any> },\n) {\n return <T>(\n obj: T,\n qb: SelectQueryBuilder<T>,\n entityName: string,\n ...fields: (keyof T & string)[]\n ) => {\n for (const field of fields) {\n if (obj[field] == null) {\n continue;\n }\n const ret = cond(obj, qb, entityName, field);\n if (typeof ret === 'string') {\n qb.andWhere(ret);\n } else if (typeof ret === 'object' && typeof ret['query'] === 'string') {\n const _ret = ret as { query: string; params: Record<string, any> };\n qb.andWhere(_ret.query, _ret.params);\n }\n }\n return qb;\n };\n}\n\nexport const applyQueryProperty = createQueryCondition(\n (obj, qb, entityName, field) =>\n qb.andWhere(`${entityName}.${field} = :${field}`, { [field]: obj[field] }),\n);\n\nexport const applyQueryPropertyLike = createQueryCondition(\n (obj, qb, entityName, field) =>\n qb.andWhere(`${entityName}.${field} like (:${field} || '%')`, {\n [field]: obj[field],\n }),\n);\n\nexport const applyQueryPropertySearch = createQueryCondition(\n (obj, qb, entityName, field) =>\n qb.andWhere(`${entityName}.${field} like ('%' || :${field} || '%')`, {\n [field]: obj[field],\n }),\n);\n\nexport const applyQueryPropertyZeroNullable = createQueryCondition(\n (obj, qb, entityName, field) => {\n if ([0, '0'].indexOf(obj[field] as any) !== -1) {\n qb.andWhere(`${entityName}.${field} IS NULL`);\n } else {\n qb.andWhere(`${entityName}.${field} = :${field}`, {\n [field]: obj[field],\n });\n }\n },\n);\n\nexport const applyQueryMatchBoolean = createQueryCondition(\n (obj, qb, entityName, field) => {\n const value = parseBool(obj[field]);\n if (value === true) {\n qb.andWhere(`${entityName}.${field} = TRUE`);\n }\n if (value === false) {\n qb.andWhere(`${entityName}.${field} = FALSE`);\n }\n },\n);\n\nexport const applyQueryMatchBooleanMySQL = createQueryCondition(\n (obj, qb, entityName, field) => {\n const value = parseBool(obj[field]);\n if (value === true) {\n qb.andWhere(`${entityName}.${field} = 1`);\n }\n if (value === false) {\n qb.andWhere(`${entityName}.${field} = 0`);\n }\n },\n);\n"],
5
- "mappings": "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",
6
- "names": ["import_class_validator", "import_swagger", "import_nesties", "import_class_validator", "import_nesties", "import_swagger", "import_nesties", "import_class_validator", "import_class_transformer", "import_nesties", "import_nesties", "import_typeorm", "import_typeorm", "import_typeorm", "import_class_validator", "import_swagger", "import_typeorm", "import_class_validator", "import_nesties", "import_common", "import_lodash", "import_nesties", "import_typeorm", "_", "import_typeorm", "import_lodash", "obj", "key", "value", "data", "SJSON", "_", "keys", "qb", "id", "type", "PQueue", "_", "savedEnt", "ent", "reason", "import_common", "import_nesties", "import_swagger", "import_lodash", "import_nesties", "import_swagger", "import_class_transformer", "import_nesties", "import_lodash", "omit", "_", "import_nfkit", "_"]
4
+ "sourcesContent": ["export * from 'nesties';\nexport * from './src/crud-base';\nexport * from './src/restful';\nexport * from './src/bases';\nexport * from './src/decorators';\nexport * from './src/dto';\nexport * from './src/utility';\n", "import { ApiProperty } from '@nestjs/swagger';\nimport { Type } from 'class-transformer';\nimport { ValidateNested } from 'class-validator';\nimport {\n AnyClass,\n ClassOrArray,\n getClassFromClassOrArray,\n InsertField,\n} from 'nesties';\n\nexport class ImportEntryBaseDto {\n @ApiProperty({ description: 'Import result', type: String })\n result: string;\n}\n\nexport interface ImportEntry<T> {\n entry: T;\n result: string;\n}\n\nexport function ImportEntryDto<C extends ClassOrArray>(type: C) {\n return InsertField(\n ImportEntryBaseDto,\n {\n entry: { type, options: { description: 'Import entry' } },\n },\n `${getClassFromClassOrArray(type).name}ImportEntry`,\n );\n}\n\nexport class ImportDataBaseDto<T> {\n @ValidateNested()\n data: T[];\n}\n\nexport function ImportDataDto<C extends AnyClass>(type: C) {\n const dtoClass = InsertField(\n ImportDataBaseDto,\n {\n data: { type: [type], options: { description: 'Import data' } },\n },\n `${getClassFromClassOrArray(type).name}ImportData`,\n );\n Type(() => type)(dtoClass.prototype, 'data');\n return dtoClass;\n}\n", "import {\n IsInt,\n IsNotEmpty,\n IsOptional,\n IsPositive,\n IsString,\n} from 'class-validator';\nimport { ApiProperty } from '@nestjs/swagger';\nimport {\n AnyClass,\n BlankReturnMessageDto,\n getClassFromClassOrArray,\n InsertField,\n} from 'nesties';\nimport { NotInResult, NotWritable, QueryManual } from '../decorators';\n\nexport class CursorPaginationDto {\n @NotWritable()\n @IsNotEmpty()\n @IsString()\n @IsOptional()\n @ApiProperty({\n description: 'Pagination Cursor',\n required: false,\n type: String,\n })\n @NotInResult()\n @QueryManual()\n paginationCursor: string;\n\n @NotWritable()\n @IsPositive()\n @IsInt()\n @ApiProperty({\n description: 'Records per page.',\n required: false,\n type: Number,\n minimum: 1,\n })\n @NotInResult()\n @QueryManual()\n recordsPerPage: number;\n}\n\nexport interface CursorPaginationResponseWise {\n nextCursor?: string;\n previousCursor?: string;\n}\n\nexport class BlankCursorPaginationReturnMessageDto\n extends BlankReturnMessageDto\n implements CursorPaginationResponseWise\n{\n @ApiProperty({\n description: 'Next Cursor',\n required: false,\n type: String,\n })\n nextCursor?: string;\n\n @ApiProperty({\n description: 'Previous Cursor',\n required: false,\n type: String,\n })\n previousCursor?: string;\n\n constructor(\n statusCode: number,\n message: string,\n cursorResponse: CursorPaginationResponseWise,\n ) {\n super(statusCode, message);\n this.nextCursor = cursorResponse.nextCursor;\n this.previousCursor = cursorResponse.previousCursor;\n }\n}\n\nexport class GenericCursorPaginationReturnMessageDto<T>\n extends BlankCursorPaginationReturnMessageDto\n implements CursorPaginationResponseWise\n{\n data: T[];\n\n constructor(\n statusCode: number,\n message: string,\n data: T[],\n cursorResponse: CursorPaginationResponseWise,\n ) {\n super(statusCode, message, cursorResponse);\n this.data = data;\n }\n}\n\nexport function CursorPaginationReturnMessageDto<T extends AnyClass>(\n type: T,\n): new (\n statusCode: number,\n message: string,\n data: InstanceType<T>[],\n cursorResponse: CursorPaginationResponseWise,\n) => GenericCursorPaginationReturnMessageDto<InstanceType<T>> {\n return InsertField(\n GenericCursorPaginationReturnMessageDto,\n {\n data: {\n type: [type],\n options: {\n required: false,\n description: 'Return data.',\n },\n },\n },\n `${getClassFromClassOrArray(type).name}CursorPaginationReturnMessageDto`,\n );\n}\n", "import { IsOptional } from 'class-validator';\nimport { Metadata } from '../utility/metadata';\nimport { MergePropertyDecorators } from 'nesties';\n\nexport const NotWritable = () =>\n MergePropertyDecorators([\n IsOptional(),\n Metadata.set('notWritable', true, 'notWritableFields'),\n ]);\n\nexport const NotCreatable = () =>\n MergePropertyDecorators([\n IsOptional(),\n Metadata.set('notCreatable', true, 'notCreatableFields'),\n ]);\n\nexport const NotChangeable = () =>\n MergePropertyDecorators([\n Metadata.set('notChangeable', true, 'notChangeableFields'),\n ]);\n\nexport const NotQueryable = () =>\n Metadata.set('notQueryable', true, 'notQueryableFields');\n\nexport const NotInResult = (options: { entityVersioningDate?: boolean } = {}) =>\n Metadata.set('notInResult', options, 'notInResultFields');\n", "import { MetadataSetter, Reflector } from 'typed-reflector';\nimport { QueryCond } from '../bases';\nimport { AnyClass } from 'nesties';\nimport { QueryFullTextColumnOptions } from './query-full-text-column-options.interface';\nimport { GetMutatorOptions } from '../decorators/get-mutator';\nimport { BindingValueMetadata } from '../decorators/binding';\n\ninterface SpecificFields {\n notColumn: { keepInCreate?: boolean };\n notWritable: boolean;\n notCreatable: boolean;\n notChangeable: boolean;\n notQueryable: boolean;\n notInResult: { entityVersioningDate?: boolean };\n relationComputed: () => { entityClass: AnyClass; isArray: boolean };\n queryFullTextColumn: QueryFullTextColumnOptions;\n // boolColumn: boolean;\n notRequiredButHasDefault: boolean;\n queryCondition: QueryCond;\n requireGetMutator: boolean;\n getMutator: GetMutatorOptions;\n bindingColumn: string;\n bindingValue: BindingValueMetadata;\n}\n\ntype MetadataMap = SpecificFields;\n\ntype FieldsMap = {\n [K in keyof MetadataMap as `${K}Fields`]: string;\n};\n\ntype MetadataArrayMap = FieldsMap;\n\nexport const Metadata = new MetadataSetter<MetadataMap, MetadataArrayMap>();\nexport const reflector = new Reflector<MetadataMap, MetadataArrayMap>();\n\nexport function getSpecificFields<K extends keyof SpecificFields>(\n obj: any,\n type: K,\n filter: (meta: SpecificFields[K], obj: any) => boolean = () => true,\n) {\n return reflector.getArray(`${type}Fields`, obj).filter((field) => {\n const value = reflector.get(type, obj, field);\n if (value == null) {\n return false;\n }\n return filter(value, obj);\n });\n}\n\nexport function getNotInResultFields(\n obj: any,\n keepEntityVersioningDates = false,\n) {\n return getSpecificFields(\n obj,\n 'notInResult',\n (meta) => !keepEntityVersioningDates || !meta.entityVersioningDate,\n );\n}\n", "import { ColumnCommonOptions } from 'typeorm/decorator/options/ColumnCommonOptions';\nimport { ApiProperty, ApiPropertyOptions } from '@nestjs/swagger';\nimport { ColumnWithLengthOptions } from 'typeorm/decorator/options/ColumnWithLengthOptions';\nimport { AnyClass, MergePropertyDecorators } from 'nesties';\nimport { Column, Index } from 'typeorm';\nimport {\n IsDate,\n IsEnum,\n IsInt,\n IsNumber,\n IsOptional,\n IsString,\n IsUUID,\n Max,\n MaxLength,\n Min,\n ValidateNested,\n} from 'class-validator';\nimport {\n SimpleColumnType,\n UnsignedColumnType,\n WithLengthColumnType,\n WithPrecisionColumnType,\n} from 'typeorm/driver/types/ColumnTypes';\nimport { ColumnNumericOptions } from 'typeorm/decorator/options/ColumnNumericOptions';\nimport { Exclude, Transform, Type } from 'class-transformer';\nimport { BigintTransformer } from '../utility/bigint';\nimport { Metadata } from '../utility/metadata';\nimport { ClassOrArray, getClassFromClassOrArray, ParseType } from 'nesties';\nimport {\n TypeTransformer,\n TypeTransformerString,\n} from '../utility/type-transformer';\nimport {\n NotChangeable,\n NotInResult,\n NotQueryable,\n NotWritable,\n} from './access';\nimport { parseBool } from '../utility/parse-bool';\nimport { ColumnUnsignedOptions } from 'typeorm/decorator/options/ColumnUnsignedOptions';\nimport { GetMutatorBool, RequireGetMutator } from './get-mutator';\n\nexport interface OpenAPIOptions<T> {\n description?: string;\n propertyExtras?: ApiPropertyOptions;\n default?: T;\n required?: boolean;\n}\n\nconst NotRequiredButHasDefaultDec = () =>\n Metadata.set(\n 'notRequiredButHasDefault',\n true,\n 'notRequiredButHasDefaultFields',\n );\n\nfunction swaggerDecorator(\n options: OpenAPIOptions<any>,\n injected: ApiPropertyOptions = {},\n) {\n // we should patch the required flag in EntityResultDto\n const notRequiredButHasDefault =\n options.required == null && options.default != null;\n const apiPropertyDec = ApiProperty({\n default: options.default,\n required: !!(options.required && options.default == null),\n example: options.default,\n description: options.description,\n ...injected,\n ...(options.propertyExtras || {}),\n } as ApiPropertyOptions);\n if (notRequiredButHasDefault) {\n return MergePropertyDecorators([\n apiPropertyDec,\n NotRequiredButHasDefaultDec(),\n ]);\n } else {\n return apiPropertyDec;\n }\n}\n\nfunction validatorDecorator(options: OpenAPIOptions<any>) {\n const decs: PropertyDecorator[] = [];\n if (!options.required) {\n decs.push(IsOptional());\n }\n return MergePropertyDecorators(decs);\n}\n\nexport interface PropertyOptions<T, ColumnEx = unknown>\n extends OpenAPIOptions<T> {\n columnExtras?: ColumnCommonOptions & ColumnEx;\n}\n\nfunction columnDecoratorOptions<T>(\n options: PropertyOptions<T>,\n): ColumnCommonOptions {\n return {\n default: options.default,\n nullable: !options.required && options.default == null,\n comment: options.description,\n ...options.columnExtras,\n };\n}\n\nexport const StringColumn = (\n length: number,\n options: PropertyOptions<string, ColumnWithLengthOptions> & {\n columnType?: WithLengthColumnType;\n } = {},\n): PropertyDecorator => {\n return MergePropertyDecorators([\n Column(options.columnType || 'varchar', {\n length,\n ...columnDecoratorOptions(options),\n }),\n IsString(),\n MaxLength(length),\n validatorDecorator(options),\n swaggerDecorator(options, { type: String, maxLength: length }),\n ]);\n};\n\nexport const TextColumn = (\n options: PropertyOptions<string> & {\n columnType?: SimpleColumnType;\n } = {},\n): PropertyDecorator => {\n return MergePropertyDecorators([\n Column(options.columnType || 'text', columnDecoratorOptions(options)),\n IsString(),\n validatorDecorator(options),\n swaggerDecorator(options, { type: String }),\n ]);\n};\n\nexport const UuidColumn = (\n options: PropertyOptions<string> & { generated?: boolean } = {},\n): PropertyDecorator => {\n return MergePropertyDecorators([\n Column('uuid', {\n ...columnDecoratorOptions(options),\n ...(options.generated\n ? {\n nullable: false,\n generated: 'uuid',\n }\n : {}),\n }),\n IsUUID(),\n validatorDecorator(options),\n swaggerDecorator(options, {\n type: String,\n format: 'uuid',\n example: '550e8400-e29b-41d4-a716-446655440000',\n }),\n ...(options.generated ? [NotRequiredButHasDefaultDec()] : []),\n ]);\n};\n\nconst intMaxList = {\n tinyint: 0x7f,\n smallint: 0x7fff,\n mediumint: 0x7fffff,\n int: 0x7fffffff,\n bigint: Number.MAX_SAFE_INTEGER,\n};\n\nexport const IntColumn = (\n type: UnsignedColumnType,\n options: PropertyOptions<number, ColumnUnsignedOptions> & {\n unsigned?: boolean;\n range?: {\n min?: number;\n max?: number;\n };\n } = {},\n): PropertyDecorator => {\n let max = intMaxList[type] || Number.MAX_SAFE_INTEGER;\n if (max !== Number.MAX_SAFE_INTEGER && options.unsigned) {\n max = max * 2 + 1;\n }\n let min = options.unsigned ? 0 : -max - 1;\n if (options.range) {\n if (typeof options.range.min === 'number' && options.range.min > min) {\n min = options.range.min;\n }\n if (typeof options.range.max === 'number' && options.range.max < max) {\n max = options.range.max;\n }\n }\n return MergePropertyDecorators([\n Column(type, {\n default: options.default,\n unsigned: options.unsigned,\n ...(type === 'bigint' ? { transformer: new BigintTransformer() } : {}),\n ...columnDecoratorOptions(options),\n }),\n IsInt(),\n ...(min > Number.MIN_SAFE_INTEGER ? [Min(min)] : []),\n ...(max < Number.MAX_SAFE_INTEGER ? [Max(max)] : []),\n validatorDecorator(options),\n swaggerDecorator(options, {\n type: Number,\n minimum: min > Number.MIN_SAFE_INTEGER ? min : undefined,\n maximum: max < Number.MAX_SAFE_INTEGER ? max : undefined,\n }),\n ]);\n};\n\nexport const FloatColumn = (\n type: WithPrecisionColumnType,\n options: PropertyOptions<number, ColumnNumericOptions> & {\n unsigned?: boolean;\n range?: {\n min?: number;\n max?: number;\n };\n } = {},\n): PropertyDecorator => {\n let min = options.unsigned ? 0 : Number.MIN_SAFE_INTEGER;\n let max = Number.MAX_SAFE_INTEGER;\n if (\n options.columnExtras?.precision != null &&\n options.columnExtras?.scale != null\n ) {\n const precision = options.columnExtras.precision;\n const scale = options.columnExtras.scale;\n\n const intDigits = precision - scale;\n\n if (intDigits > 0) {\n const maxIntPart = Math.pow(10, intDigits) - 1;\n const maxDecimalPart =\n scale > 0 ? (Math.pow(10, scale) - 1) / Math.pow(10, scale) : 0;\n max = maxIntPart + maxDecimalPart;\n min = options.unsigned ? 0 : -max;\n }\n }\n return MergePropertyDecorators([\n Column(type, {\n default: options.default,\n unsigned: options.unsigned,\n ...columnDecoratorOptions(options),\n }),\n IsNumber(),\n ...(min > Number.MIN_SAFE_INTEGER ? [Min(min)] : []),\n ...(max < Number.MAX_SAFE_INTEGER ? [Max(max)] : []),\n validatorDecorator(options),\n swaggerDecorator(options, {\n type: Number,\n minimum: min > Number.MIN_SAFE_INTEGER ? min : undefined,\n maximum: max < Number.MAX_SAFE_INTEGER ? max : undefined,\n }),\n ]);\n};\n\nexport const DateColumn = (\n options: PropertyOptions<Date> & { columnType?: SimpleColumnType } = {},\n): PropertyDecorator => {\n return MergePropertyDecorators([\n Column(\n options.columnType || ('timestamp' as SimpleColumnType),\n columnDecoratorOptions(options),\n ),\n IsDate(),\n Transform(\n (v) => {\n const value = v.value;\n if (value == null || value instanceof Date) return value;\n\n const timestampToDate = (t: number, isSeconds: boolean) =>\n new Date(isSeconds ? t * 1000 : t);\n\n if (typeof value === 'number') {\n const isSeconds = !Number.isInteger(value) || value < 1e12;\n return timestampToDate(value, isSeconds);\n }\n\n if (typeof value === 'string' && /^\\d+(\\.\\d+)?$/.test(value)) {\n const isSeconds = value.includes('.') || parseFloat(value) < 1e12;\n return timestampToDate(parseFloat(value), isSeconds);\n }\n\n return new Date(value); // fallback to native parser\n },\n {\n toClassOnly: true,\n },\n ),\n validatorDecorator(options),\n swaggerDecorator(options, { type: Date }),\n ]);\n};\n\nexport const EnumColumn = <T>(\n targetEnum: Record<string, T>,\n options: PropertyOptions<T> = {},\n): PropertyDecorator => {\n return MergePropertyDecorators([\n Index(),\n Column('enum', {\n enum: targetEnum,\n ...columnDecoratorOptions(options),\n }),\n IsEnum(targetEnum),\n validatorDecorator(options),\n swaggerDecorator(options, { enum: targetEnum }),\n ]);\n};\n\nexport const BoolColumn = (\n options: PropertyOptions<boolean> = {},\n): PropertyDecorator =>\n MergePropertyDecorators([\n Index(),\n Transform((v) => {\n return parseBool(v.value);\n }),\n Column('boolean', columnDecoratorOptions(options)),\n validatorDecorator(options),\n swaggerDecorator(options, { type: Boolean }),\n GetMutatorBool(),\n ]);\n\nconst createJsonColumnDef =\n (\n columnType: SimpleColumnType = 'jsonb',\n typeTransformerClass = TypeTransformer,\n ) =>\n <C extends ClassOrArray>(\n definition: C,\n options: PropertyOptions<ParseType<C>> & {\n columnType?: SimpleColumnType;\n } = {},\n ): PropertyDecorator => {\n const cl = getClassFromClassOrArray(definition);\n return MergePropertyDecorators([\n RequireGetMutator(),\n Type(() => cl),\n ValidateNested(),\n Column(options.columnType || columnType, {\n ...columnDecoratorOptions(options),\n transformer: new typeTransformerClass(definition),\n }),\n validatorDecorator(options),\n swaggerDecorator(options, { type: definition }),\n ]);\n };\n\nexport const JsonColumn = createJsonColumnDef();\nexport const SimpleJsonColumn = createJsonColumnDef('json');\nexport const StringJsonColumn = createJsonColumnDef(\n 'text',\n TypeTransformerString,\n);\n\nexport const NotColumn = (\n options: OpenAPIOptions<any> = {},\n specials: { keepInCreate?: boolean } = {},\n): PropertyDecorator =>\n MergePropertyDecorators([\n Exclude(),\n swaggerDecorator({\n required: false,\n ...options,\n }),\n Metadata.set('notColumn', specials, 'notColumnFields'),\n ]);\n\nexport const QueryColumn = (\n options: OpenAPIOptions<any> = {},\n): PropertyDecorator =>\n MergePropertyDecorators([\n NotWritable(),\n NotInResult(),\n swaggerDecorator({\n required: false,\n ...options,\n }),\n ]);\n\nexport const InternalColumn = () =>\n MergePropertyDecorators([NotQueryable(), NotWritable(), NotInResult()]);\n\nexport const CreateOnlyColumn = () =>\n MergePropertyDecorators([NotQueryable(), NotChangeable(), NotInResult()]);\n\nexport const RelationComputed =\n (type?: () => AnyClass): PropertyDecorator =>\n (obj, propertyKey) => {\n const fun = () => {\n const designType = Reflect.getMetadata('design:type', obj, propertyKey);\n const entityClass = type ? type() : designType;\n return {\n entityClass,\n isArray: designType === Array,\n };\n };\n\n const dec = Metadata.set('relationComputed', fun, 'relationComputedFields');\n return dec(obj, propertyKey);\n };\n", "import { ValueTransformer } from 'typeorm';\n\nexport class BigintTransformer implements ValueTransformer {\n from(dbValue) {\n if (dbValue == null) {\n return dbValue;\n }\n return parseInt(dbValue);\n }\n to(entValue): any {\n return entValue;\n }\n}\n", "// eslint-disable-next-line @typescript-eslint/ban-types\nexport const nonTransformableTypes = new Set<Function>([\n // Primitive wrappers\n String,\n Number,\n Boolean,\n BigInt,\n Symbol,\n\n // Built-ins\n Date,\n RegExp,\n Error,\n Array,\n Object,\n Function,\n Promise,\n\n // Collections\n Map,\n Set,\n WeakMap,\n WeakSet,\n\n // Node / Buffer\n Buffer,\n ArrayBuffer,\n SharedArrayBuffer,\n DataView,\n Int8Array,\n Uint8Array,\n Uint8ClampedArray,\n Int16Array,\n Uint16Array,\n Int32Array,\n Uint32Array,\n Float32Array,\n Float64Array,\n BigInt64Array,\n BigUint64Array,\n\n // URL stuff\n URL,\n URLSearchParams,\n]);\n", "import { ValueTransformer } from 'typeorm';\nimport { ClassOrArray } from 'nesties';\nimport { nonTransformableTypes } from './non-transformable-types';\n\nconst toValue = (cl: new () => any, value: any) => {\n if (cl === Date) {\n return new Date(value);\n }\n if (nonTransformableTypes.has(cl) || value instanceof cl) {\n return value;\n }\n if (typeof value === 'object') {\n return Object.assign(new cl(), value);\n }\n return value;\n};\n\nexport class TypeTransformer implements ValueTransformer {\n constructor(private definition: ClassOrArray) {}\n\n from(dbValue) {\n if (!dbValue) {\n return dbValue;\n }\n if (Array.isArray(this.definition)) {\n return dbValue.map((value) => toValue(this.definition[0], value));\n }\n return toValue(this.definition as new () => any, dbValue);\n }\n to(entValue): any {\n return entValue;\n }\n}\n\nexport class TypeTransformerString extends TypeTransformer {\n from(dbValue) {\n if (dbValue == null) {\n return dbValue;\n }\n return super.from(JSON.parse(dbValue));\n }\n\n to(entValue): any {\n if (entValue == null) {\n return entValue;\n }\n return JSON.stringify(super.to(entValue));\n }\n}\n", "export const parseBool = (value: any): boolean => {\n const trueValues = ['true', '1', 'yes', 'on', true, 1];\n const falseValues = ['false', '0', 'no', 'off', false, 0];\n if (trueValues.indexOf(value) !== -1) return true;\n if (falseValues.indexOf(value) !== -1) return false;\n if (!!value) {\n return true;\n }\n return undefined;\n};\n", "import { ApiPropertyOptions } from '@nestjs/swagger';\nimport { Metadata } from '../utility/metadata';\nimport { parseBool } from '../utility/parse-bool';\n\nexport interface GetMutatorOptions {\n mutator: (s: string) => any;\n enum?: string[];\n example?: string;\n apiPropertyExtras?: ApiPropertyOptions;\n}\n\nexport const RequireGetMutator = () =>\n Metadata.set('requireGetMutator', true, 'requireGetMutatorFields');\n\nexport const GetMutator = (\n mutator: (s: string) => any,\n options: Omit<GetMutatorOptions, 'mutator'> = {},\n) => Metadata.set('getMutator', { mutator, ...options }, 'getMutatorFields');\n\nexport const createGetMutator =\n (\n mutator: (s: string) => any,\n defaultOptions: Omit<GetMutatorOptions, 'mutator'> = {},\n ) =>\n (options: Omit<GetMutatorOptions, 'mutator'> = {}) =>\n GetMutator(mutator, {\n ...defaultOptions,\n ...options,\n apiPropertyExtras: {\n ...(defaultOptions.apiPropertyExtras || {}),\n ...(options.apiPropertyExtras || {}),\n } as ApiPropertyOptions,\n });\n\nexport const GetMutatorBool = createGetMutator(parseBool, {\n enum: ['0', '1'],\n example: '1',\n});\n\nexport const GetMutatorInt = createGetMutator((s: string) => parseInt(s, 10));\n\nexport const GetMutatorFloat = createGetMutator((s: string) => parseFloat(s));\n\nexport const GetMutatorStringSeparated = (\n separator = ',',\n options: Omit<GetMutatorOptions, 'mutator'> = {},\n) =>\n GetMutator((s: string) => s.split(separator), {\n example: `value1${separator}value2${separator}value3`,\n ...options,\n });\n\nexport const GetMutatorIntSeparated = (\n separator = ',',\n options: Omit<GetMutatorOptions, 'mutator'> = {},\n) =>\n GetMutator(\n (s: string) => s.split(separator).map((item) => parseInt(item.trim(), 10)),\n {\n example: `1${separator}2${separator}3`,\n ...options,\n },\n );\n\nexport const GetMutatorFloatSeparated = (\n separator = ',',\n options: Omit<GetMutatorOptions, 'mutator'> = {},\n) =>\n GetMutator(\n (s: string) => s.split(separator).map((item) => parseFloat(item.trim())),\n {\n example: `1.5${separator}2.5${separator}3.5`,\n ...options,\n },\n );\n\nexport const GetMutatorJson = createGetMutator((s: string) => JSON.parse(s), {\n example: `{\"key1\":\"value1\",\"key2\":2,\"key3\":[1,2,3]}`,\n});\n", "import { PipeTransform, ValidationPipe } from '@nestjs/common';\nimport { AnyClass } from 'nesties';\nimport { getSpecificFields } from '../utility/metadata';\n\nexport const OptionalDataPipe = () =>\n new ValidationPipe({\n transform: true,\n transformOptions: { enableImplicitConversion: true },\n skipMissingProperties: true,\n skipNullProperties: true,\n skipUndefinedProperties: true,\n });\n\ntype FieldKey = string | number | symbol;\n\nexport const PickPipe = (fields: FieldKey[]): PipeTransform => ({\n transform<T>(obj: T): T {\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n const proto = Object.getPrototypeOf(obj);\n const clone = Object.create(proto) as T;\n const fieldSet = new Set<FieldKey>(fields);\n\n for (const key of fieldSet) {\n const desc = Object.getOwnPropertyDescriptor(obj, key);\n if (desc) {\n Object.defineProperty(clone, key, desc);\n }\n }\n\n return clone;\n },\n});\n\nexport const OmitPipe = (fields: FieldKey[]): PipeTransform => ({\n transform<T>(obj: T): T {\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n const proto = Object.getPrototypeOf(obj);\n const clone = Object.create(proto) as T;\n const omitSet = new Set<FieldKey>(fields);\n\n // \u7528 Reflect.ownKeys \u628A symbol \u4E5F\u4E00\u8D77\u5E26\u4E0A\n for (const key of Reflect.ownKeys(obj)) {\n if (omitSet.has(key)) continue;\n\n const desc = Object.getOwnPropertyDescriptor(obj, key);\n if (desc) {\n Object.defineProperty(clone, key, desc);\n }\n }\n\n return clone;\n },\n});\n", "import { QueryCond } from '../bases';\nimport { Metadata, reflector } from '../utility/metadata';\nimport { QueryFullTextColumnOptions } from '../utility/query-full-text-column-options.interface';\nimport { MergePropertyDecorators } from 'nesties';\nimport { unshiftOrderBy } from '../utility/unshift-order-by';\nimport { addSubject } from '../utility/subject-registry';\nimport { parseBool } from '../utility/parse-bool';\nimport { Brackets, SelectQueryBuilder } from 'typeorm';\n\nexport const QueryCondition = (cond: QueryCond) =>\n Metadata.set(\n 'queryCondition',\n cond,\n 'queryConditionFields',\n ) as PropertyDecorator;\n\nexport const QueryManual = () =>\n QueryCondition((obj, qb, entityName, key) => {});\n\nexport class QueryWrapInfo<T = unknown> {\n private _value: T;\n\n constructor(\n public readonly obj: any,\n public readonly key: string,\n public readonly field: string,\n ) {\n this._value = obj[key];\n }\n\n get value() {\n return this._value;\n }\n\n mutateValue(next: T) {\n this._value = next;\n }\n}\n\nexport type QueryWrapper = (\n entityExpr: string,\n varExpr: string,\n info: QueryWrapInfo<any>,\n) => string | undefined;\n\nconst queryWrapCounters = new WeakMap<any, Record<string, number>>();\nconst getQueryVarName = (obj: any, key: string) => {\n const queryCounters = queryWrapCounters.get(obj) || {};\n let useField = `_qw_` + key;\n if (queryCounters[key] == null) {\n queryCounters[key] = 0;\n } else {\n useField += `__${queryCounters[key].toString(36)}`;\n ++queryCounters[key];\n }\n queryWrapCounters.set(obj, queryCounters);\n return useField;\n};\n\nexport const QueryWrap = (wrapper: QueryWrapper, field?: string) =>\n QueryCondition((obj, qb, entityName, key) => {\n if (obj[key] == null) return;\n const fieldName = field || key;\n const varField = getQueryVarName(obj, key);\n const entityExpr = `${entityName}.${fieldName}`;\n const varExpr = `:${varField}`;\n\n const info = new QueryWrapInfo<any>(obj, key, fieldName);\n\n const expr = wrapper(entityExpr, varExpr, info);\n if (expr) {\n qb.andWhere(expr, {\n [varField]: info.value,\n });\n }\n });\n\nexport const createQueryWrap = (wrapper: QueryWrapper) => (field?: string) =>\n QueryWrap(wrapper, field);\n\nexport const QueryLike = createQueryWrap(\n (entityExpr, varExpr) => `${entityExpr} LIKE (${varExpr} || '%')`,\n);\nexport const QuerySearch = createQueryWrap(\n (entityExpr, varExpr) => `${entityExpr} LIKE ('%' || ${varExpr} || '%')`,\n);\nexport const QueryEqualZeroNullable = createQueryWrap(\n (entityExpr, varExpr, info) =>\n [0, '0'].indexOf(info.value) !== -1\n ? `${entityExpr} IS NULL`\n : `${entityExpr} = ${varExpr}`,\n);\nexport const QueryMatchBoolean = createQueryWrap(\n (entityExpr, varExpr, info) => {\n const value = parseBool(info.value);\n if (value === true) {\n return `${entityExpr} = TRUE`;\n }\n if (value === false) {\n return `${entityExpr} = FALSE`;\n }\n },\n);\nexport const QueryMatchBooleanMySQL = createQueryWrap(\n (entityExpr, varExpr, info) => {\n const value = parseBool(info.value);\n if (value === true) {\n return `${entityExpr} = 1`;\n }\n if (value === false) {\n return `${entityExpr} = 0`;\n }\n },\n);\n\nexport const QueryOperator = (operator: string, field?: string) =>\n QueryWrap(\n (entityExpr, varExpr) => `${entityExpr} ${operator} ${varExpr}`,\n field,\n );\n\nexport const createQueryOperator = (operator: string) => (field?: string) =>\n QueryOperator(operator, field);\n\nexport const QueryEqual = createQueryOperator('=');\nexport const QueryGreater = createQueryOperator('>');\nexport const QueryGreaterEqual = createQueryOperator('>=');\nexport const QueryLess = createQueryOperator('<');\nexport const QueryLessEqual = createQueryOperator('<=');\nexport const QueryNotEqual = createQueryOperator('!=');\nexport const QueryJsonbHas = createQueryOperator('?');\n\nexport const createQueryArrayify = (\n newWrapper: QueryWrapper,\n singleFallbackWrapper?: QueryWrapper,\n) =>\n createQueryWrap((entityExpr, varExpr, info) => {\n const value = info.value;\n const items = Array.isArray(value)\n ? value\n : typeof value === 'string'\n ? value.split(',')\n : [value];\n if (items.length === 1 && singleFallbackWrapper) {\n const singleRes = singleFallbackWrapper(entityExpr, varExpr, info);\n if (singleRes) {\n info.mutateValue(items[0]);\n return singleRes;\n }\n }\n info.mutateValue(items);\n const newVarExpr = `(:...${varExpr.slice(1)})`;\n return newWrapper(entityExpr, newVarExpr, info);\n });\n\nexport const createQueryOperatorArrayify = (\n operator: string,\n singleFallback?: string | QueryWrapper,\n) =>\n createQueryArrayify(\n (entityExpr, varExpr) => `${entityExpr} ${operator} ${varExpr}`,\n typeof singleFallback === 'string'\n ? singleFallback.length\n ? (entityExpr, varExpr) => `${entityExpr} ${singleFallback} ${varExpr}`\n : undefined\n : singleFallback,\n );\n\nexport const QueryIn = createQueryOperatorArrayify('IN', '=');\nexport const QueryNotIn = createQueryOperatorArrayify('NOT IN', '!=');\n\nexport const QueryFullText = (options: QueryFullTextColumnOptions = {}) => {\n const configurationName = options.parser\n ? `nicot_parser_${options.parser}`\n : options.configuration || 'english';\n const tsQueryFunction = options.tsQueryFunction || 'websearch_to_tsquery';\n return MergePropertyDecorators([\n QueryCondition((obj, qb, entityName, key) => {\n if (obj[key] == null) return;\n const fieldName = key;\n const typeormField = getQueryVarName(obj, key);\n\n const tsVectorStatement = `to_tsvector('${configurationName}', \"${entityName}\".\"${fieldName}\")`;\n const tsQueryStatement = `${tsQueryFunction}('${configurationName}', :${typeormField})`;\n\n qb.andWhere(`${tsVectorStatement} @@ ${tsQueryStatement}`, {\n [typeormField]: obj[key],\n });\n\n if (options.orderBySimilarity) {\n const rankVirtualField = `_fulltext_rank_${key}`;\n addSubject(\n qb,\n `ts_rank(${tsVectorStatement}, ${tsQueryStatement})`,\n rankVirtualField,\n );\n unshiftOrderBy(qb, `\"${rankVirtualField}\"`, 'DESC');\n }\n }),\n Metadata.set(\n 'queryFullTextColumn',\n {\n ...options,\n configuration: configurationName,\n },\n 'queryFullTextColumnFields',\n ),\n ]);\n};\n\nexport const QueryAnd = (...decs: PropertyDecorator[]) => {\n const conditions = decs.map((dec) =>\n reflector.getMetadataFromDecorator(dec, 'queryCondition'),\n );\n return QueryCondition((obj, qb, entityName, key) =>\n conditions.forEach((cond) => cond(obj, qb, entityName, key)),\n );\n};\n\nexport const QueryOr = (...decs: PropertyDecorator[]) => {\n const conditions = decs.map((dec) =>\n reflector.getMetadataFromDecorator(dec, 'queryCondition'),\n );\n return QueryCondition((obj, qb, entityName, key) => {\n if (!conditions.length) {\n return;\n }\n qb.andWhere(\n new Brackets((orQb) => {\n const innerBrackets = conditions.map(\n (cond) =>\n new Brackets((andQb) => {\n cond(obj, andQb as SelectQueryBuilder<any>, entityName, key);\n }),\n );\n const [first, ...rest] = innerBrackets;\n orQb.where(first);\n rest.forEach((bracket) => orQb.orWhere(bracket));\n }),\n );\n });\n};\n", "import { SelectQueryBuilder } from 'typeorm';\n\nexport const unshiftOrderBy = <T>(\n qb: SelectQueryBuilder<T>,\n sort: string,\n order?: 'ASC' | 'DESC',\n nulls?: 'NULLS FIRST' | 'NULLS LAST',\n) => {\n const currentOrderBys = Object.entries(qb.expressionMap.allOrderBys);\n qb.orderBy(sort, order, nulls);\n currentOrderBys.forEach(([key, value]) => {\n if (typeof value === 'string') {\n qb.addOrderBy(key, value);\n } else {\n qb.addOrderBy(key, value.order, value.nulls);\n }\n });\n return qb;\n};\n", "import { SelectQueryBuilder } from 'typeorm';\n\nconst subjectRegistry = new WeakMap<\n SelectQueryBuilder<any>,\n Record<string, string>\n>();\n\nexport const addSubject = <T>(\n qb: SelectQueryBuilder<T>,\n select: string,\n alias: string,\n) => {\n let subjects = subjectRegistry.get(qb);\n if (!subjects) {\n subjects = {};\n subjectRegistry.set(qb, subjects);\n }\n subjects[alias] = select;\n return qb.addSelect(select, alias);\n};\n\nexport const getSubject = <T>(\n qb: SelectQueryBuilder<T>,\n alias: string,\n): string | undefined => {\n return subjectRegistry.get(qb)?.[alias];\n};\n", "import { Metadata } from '../utility/metadata';\n\nexport interface BindingValueMetadata {\n bindingKey: string;\n isMethod: boolean;\n}\n\nexport const DefaultBindingKey = 'default';\n\nexport const BindingColumn = (\n bindingKey = DefaultBindingKey,\n): PropertyDecorator =>\n Metadata.set('bindingColumn', bindingKey, 'bindingColumnFields');\n\nexport const BindingValue =\n (bindingKey = DefaultBindingKey): PropertyDecorator & MethodDecorator =>\n (obj: any, key: string, des?: TypedPropertyDescriptor<any>) => {\n const isMethod = !!des && typeof des.value === 'function';\n\n Metadata.set(\n 'bindingValue',\n { bindingKey, isMethod },\n 'bindingValueFields',\n )(obj, key);\n };\n", "import {\n CursorPaginationDto,\n CursorPaginationReturnMessageDto,\n ImportEntryDto,\n} from './dto';\nimport {\n DeepPartial,\n DeleteResult,\n FindOneOptions,\n FindOptionsWhere,\n In,\n Repository,\n SelectQueryBuilder,\n UpdateResult,\n} from 'typeorm';\nimport {\n EntityHooks,\n PageSettingsDto,\n PageSettingsFactory,\n QueryWise,\n} from './bases';\nimport { ConsoleLogger } from '@nestjs/common';\nimport { camelCase } from 'typeorm/util/StringUtils';\nimport _, { omit } from 'lodash';\nimport {\n Awaitable,\n BlankReturnMessageDto,\n ClassType,\n GenericReturnMessageDto,\n PaginatedReturnMessageDto,\n ReturnMessageDto,\n} from 'nesties';\nimport {\n getNotInResultFields,\n getSpecificFields,\n reflector,\n} from './utility/metadata';\nimport { getTypeormRelations } from './utility/get-typeorm-relations';\nimport { getPaginatedResult } from './utility/cursor-pagination-utils';\nimport PQueue from 'p-queue';\nimport { RelationDef } from './utility/relation-def';\nimport { filterRelations } from './utility/filter-relations';\nimport { BindingValueMetadata, DefaultBindingKey } from './decorators';\nimport { observeDiff } from 'nfkit';\n\nexport type EntityId<T extends { id: any }> = T['id'];\ntype BindingSnapshot = Record<string, any>;\n\nexport const Relation = (\n name: string,\n options: Omit<RelationDef, 'name'> = {},\n): RelationDef => {\n return { name, inner: false, ...options };\n};\n\nexport const Inner = (\n name: string,\n options: Omit<RelationDef, 'name'> = {},\n): RelationDef => {\n return Relation(name, { inner: true, ...options });\n};\n\nexport type ValidCrudEntity<T> = Record<string, any> & {\n id: any;\n} & Partial<QueryWise<T> & EntityHooks & PageSettingsFactory>;\n\nexport interface CrudOptions<T extends ValidCrudEntity<T>> {\n relations?: (string | RelationDef)[];\n extraGetQuery?: (qb: SelectQueryBuilder<T>) => void;\n hardDelete?: boolean;\n createOrUpdate?: boolean;\n keepEntityVersioningDates?: boolean;\n outputFieldsToOmit?: (keyof T)[];\n}\n\nconst loadedParsers = new Set<string>();\nconst loadFullTextQueue = new PQueue({\n concurrency: 1,\n});\n\nexport class CrudBase<T extends ValidCrudEntity<T>> {\n readonly entityName = this.entityClass.name;\n readonly entityReturnMessageDto = ReturnMessageDto(this.entityClass);\n readonly importEntryDto = ImportEntryDto(this.entityClass);\n readonly importReturnMessageDto = ReturnMessageDto([this.importEntryDto]);\n readonly entityPaginatedReturnMessageDto = PaginatedReturnMessageDto(\n this.entityClass,\n );\n readonly entityCursorPaginatedReturnMessageDto =\n CursorPaginationReturnMessageDto(this.entityClass);\n readonly entityRelations = filterRelations(\n this.entityClass,\n this.crudOptions.relations,\n (r) => !r.computed,\n );\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n readonly extraGetQuery = this.crudOptions.extraGetQuery || ((qb) => {});\n readonly log = new ConsoleLogger(`${this.entityClass.name}Service`);\n readonly _typeormRelations = getTypeormRelations(this.entityClass);\n\n constructor(\n public entityClass: ClassType<T>,\n public repo: Repository<T>,\n public crudOptions: CrudOptions<T>,\n ) {}\n\n // cleaning entities\n\n _cleanEntityNotInResultFields(ent: T): T {\n const visited = new Set();\n const runSingleObject = (o: any, cl) => {\n if (visited.has(o)) {\n return o;\n }\n const fields = getNotInResultFields(\n cl,\n this.crudOptions.keepEntityVersioningDates,\n );\n if (cl === this.entityClass && this.crudOptions.outputFieldsToOmit) {\n fields.push(...(this.crudOptions.outputFieldsToOmit as string[]));\n }\n for (const field of fields) {\n delete o[field];\n }\n visited.add(o);\n for (const relation of getTypeormRelations(cl)) {\n const propertyName = relation.propertyName as string;\n if (o[propertyName]) {\n if (Array.isArray(o[propertyName])) {\n o[propertyName] = o[propertyName].map((r) =>\n runSingleObject(r, relation.propertyClass),\n );\n } else {\n o[propertyName] = runSingleObject(\n o[propertyName],\n relation.propertyClass,\n );\n }\n }\n }\n return o;\n };\n\n return runSingleObject(ent, this.entityClass);\n }\n\n cleanEntityNotInResultFields<E extends T | T[]>(ents: E): E {\n if (Array.isArray(ents)) {\n return ents.map((ent) => this._cleanEntityNotInResultFields(ent)) as E;\n } else {\n return this._cleanEntityNotInResultFields(ents as T) as E;\n }\n }\n\n // binding things\n\n readonly _tmpBindingMap = new Map<string, any>();\n readonly _bindingCache = new Map<\n string,\n BindingValueMetadata & { field: string }\n >();\n\n _lookForBindingValueField(bindingKey: string) {\n if (this._bindingCache.has(bindingKey)) {\n return this._bindingCache.get(bindingKey);\n }\n const bindingServiceFields = getSpecificFields(this, 'bindingValue');\n const useField = bindingServiceFields.find((f) => {\n const meta = reflector.get('bindingValue', this, f);\n return meta?.bindingKey === bindingKey;\n });\n if (useField) {\n const meta = reflector.get('bindingValue', this, useField);\n const res = {\n ...meta,\n field: useField,\n };\n this._bindingCache.set(bindingKey, res);\n return res;\n }\n return undefined;\n }\n\n _resolveBindingValue<K extends keyof T>(\n entityField: K,\n ): T[K] | Promise<T[K]> {\n const bindingKey = reflector.get(\n 'bindingColumn',\n this.entityClass,\n entityField as string,\n );\n if (!bindingKey) {\n return undefined;\n }\n if (this._tmpBindingMap.has(bindingKey)) {\n return this._tmpBindingMap.get(bindingKey);\n }\n const bindingValueField = this._lookForBindingValueField(bindingKey);\n if (!bindingValueField) {\n return undefined;\n }\n if (bindingValueField.isMethod) {\n return (this as any)[bindingValueField.field]();\n } else {\n return (this as any)[bindingValueField.field];\n }\n }\n\n // MUST be called 1st on every CRUD operation\n async getBindingPartialEntity(): Promise<Partial<T>> {\n const bindingFields = getSpecificFields(this.entityClass, 'bindingColumn');\n if (!bindingFields.length) {\n return {};\n }\n const values = bindingFields.map((field, i) => {\n return {\n field,\n value: this._resolveBindingValue(field),\n i,\n };\n });\n this._tmpBindingMap.clear();\n const containingPromiseValues = values.filter(\n (v) => v.value instanceof Promise,\n );\n if (containingPromiseValues.length) {\n await Promise.all(\n containingPromiseValues.map(async (v) => {\n v.value = await v.value;\n }),\n );\n }\n // now it's all resolved\n const res: Partial<T> = {};\n for (const v of values) {\n if (v.value != null) {\n (res as any)[v.field] = v.value;\n }\n }\n return res;\n }\n\n useBinding(value: any, bindngKey = DefaultBindingKey): this {\n this._tmpBindingMap.set(bindngKey, value);\n return this;\n }\n\n _freezeBindings(): BindingSnapshot {\n const res: Record<string, any> = {};\n for (const [key, value] of this._tmpBindingMap.entries()) {\n res[key] = value;\n }\n this._tmpBindingMap.clear();\n return res;\n }\n\n _restoreBindings(frozen: BindingSnapshot): this {\n this._tmpBindingMap.clear();\n for (const key of Object.keys(frozen)) {\n this._tmpBindingMap.set(key, frozen[key]);\n }\n return this;\n }\n\n async beforeSuper<R>(fn: () => Promise<R>): Promise<R> {\n const snap = this._freezeBindings();\n const res = await fn();\n this._restoreBindings(snap);\n return res;\n }\n\n async _batchCreate(\n ents: T[],\n beforeCreate?: (repo: Repository<T>) => Promise<void>,\n skipErrors = false,\n ) {\n const entsWithId = ents.filter((ent) => ent.id != null);\n return this.repo.manager.transaction(async (mdb) => {\n let skipped: { result: string; entry: T }[] = [];\n const repo = mdb.getRepository(this.entityClass);\n\n let entsToSave = ents;\n\n if (entsWithId.length) {\n const entIds = entsWithId.map((ent) => ent.id);\n const entIdChunks = _.chunk(entIds, 65535);\n const existingEnts = (\n await Promise.all(\n entIdChunks.map((chunk) =>\n repo.find({\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n where: {\n id: In<string | number>(chunk),\n },\n select: this.crudOptions.createOrUpdate\n ? undefined\n : ['id', 'deleteTime'],\n withDeleted: true,\n }),\n ),\n )\n ).flat();\n if (existingEnts.length) {\n const existingEntsWithoutDeleteTime = existingEnts.filter(\n (ent) => ent.deleteTime == null,\n );\n const existingEntsWithDeleteTime = existingEnts.filter(\n (ent) => ent.deleteTime != null,\n );\n if (existingEntsWithoutDeleteTime.length) {\n if (this.crudOptions.createOrUpdate) {\n const existingIdMap = new Map<number, T>();\n existingEntsWithoutDeleteTime.forEach((ent) => {\n existingIdMap.set(ent.id, ent);\n });\n entsToSave = [];\n for (const ent of ents) {\n if (existingIdMap.has(ent.id)) {\n const existingEnt = existingIdMap.get(ent.id);\n Object.assign(existingEnt, ent);\n entsToSave.push(existingEnt);\n } else {\n entsToSave.push(ent);\n }\n }\n } else {\n if (!skipErrors) {\n throw new BlankReturnMessageDto(\n 404,\n `${this.entityName} ID ${existingEntsWithoutDeleteTime.join(\n ',',\n )} already exists`,\n ).toException();\n }\n const existingEntsWithoutDeleteTimeIdSet = new Set(\n existingEntsWithoutDeleteTime.map((e) => e.id),\n );\n const skippedEnts = ents.filter((ent) =>\n existingEntsWithoutDeleteTimeIdSet.has(ent.id),\n );\n skipped = skippedEnts.map((ent) => ({\n result: 'Already exists',\n entry: ent,\n }));\n const skippedEntsSet = new Set(skippedEnts);\n entsToSave = ents.filter((ent) => !skippedEntsSet.has(ent));\n }\n }\n if (existingEntsWithDeleteTime.length) {\n await repo.delete(\n existingEntsWithDeleteTime.map((ent) => ent.id) as any[],\n );\n }\n }\n }\n if (beforeCreate) {\n await beforeCreate(repo);\n }\n try {\n const entChunksToSave = _.chunk(\n entsToSave,\n Math.floor(\n 65535 / Math.max(1, Object.keys(entsToSave[0] || {}).length),\n ),\n );\n let results: T[] = [];\n for (const entChunk of entChunksToSave) {\n const savedChunk = await repo.save(entChunk);\n results = results.concat(savedChunk);\n }\n return {\n results,\n skipped,\n };\n } catch (e) {\n this.log.error(\n `Failed to create entity ${JSON.stringify(\n entsToSave,\n )}: ${e.toString()}`,\n );\n throw new BlankReturnMessageDto(500, 'Internal error').toException();\n }\n });\n }\n\n async create(_ent: T, beforeCreate?: (repo: Repository<T>) => Promise<void>) {\n const bindingEnt = await this.getBindingPartialEntity();\n if (!_ent) {\n throw new BlankReturnMessageDto(400, 'Invalid entity').toException();\n }\n let ent = new this.entityClass();\n Object.assign(\n ent,\n omit(_ent, ...this._typeormRelations.map((r) => r.propertyName)),\n );\n const invalidReason = ent.isValidInCreate();\n if (invalidReason) {\n throw new BlankReturnMessageDto(400, invalidReason).toException();\n }\n const savedEnt = await this.repo.manager.transaction(async (mdb) => {\n const repo = mdb.getRepository(this.entityClass);\n if (ent.id != null) {\n const existingEnt = await repo.findOne({\n where: { id: ent.id },\n select: this.crudOptions.createOrUpdate\n ? undefined\n : ['id', 'deleteTime'],\n withDeleted: true,\n });\n if (existingEnt) {\n if (existingEnt.deleteTime) {\n await repo.delete(existingEnt.id);\n } else if (this.crudOptions.createOrUpdate) {\n Object.assign(existingEnt, ent);\n ent = existingEnt;\n } else {\n throw new BlankReturnMessageDto(\n 404,\n `${this.entityName} ID ${ent.id} already exists`,\n ).toException();\n }\n }\n }\n Object.assign(ent, bindingEnt);\n if (beforeCreate) {\n await beforeCreate(repo);\n }\n await ent.beforeCreate?.();\n try {\n const savedEnt = await repo.save(ent as DeepPartial<T>);\n await savedEnt.afterCreate?.();\n return this.cleanEntityNotInResultFields(savedEnt);\n } catch (e) {\n this.log.error(\n `Failed to create entity ${JSON.stringify(ent)}: ${e.toString()}`,\n );\n throw new BlankReturnMessageDto(500, 'Internal error').toException();\n }\n });\n return new this.entityReturnMessageDto(200, 'success', savedEnt);\n }\n\n get entityAliasName() {\n return camelCase(this.entityName);\n }\n\n _applyQueryRelation(qb: SelectQueryBuilder<T>, relation: RelationDef) {\n const { name } = relation;\n const relationUnit = name.split('.');\n const base =\n relationUnit.length === 1\n ? this.entityAliasName\n : relationUnit.slice(0, relationUnit.length - 1).join('_');\n const property = relationUnit[relationUnit.length - 1];\n const properyAlias = relationUnit.join('_');\n const methodName = relation.inner ? 'innerJoin' : 'leftJoin';\n if (!relation.noSelect) {\n qb.addSelect(properyAlias);\n }\n qb[methodName](\n `${base}.${property}`,\n properyAlias,\n relation.extraCondition || undefined,\n relation.extraConditionFields || undefined,\n );\n }\n\n _applyQueryRelations(qb: SelectQueryBuilder<T>) {\n for (const relation of this.entityRelations) {\n if (typeof relation === 'string') {\n this._applyQueryRelation(qb, { name: relation });\n } else {\n this._applyQueryRelation(qb, relation);\n }\n }\n }\n\n _applyQueryFilters(qb: SelectQueryBuilder<T>, ent: T) {\n const queryFields = reflector.getArray(\n 'queryConditionFields',\n this.entityClass,\n );\n for (const field of queryFields) {\n const condition = reflector.get(\n 'queryCondition',\n this.entityClass,\n field,\n );\n if (condition) {\n condition(ent, qb, this.entityAliasName, field);\n }\n }\n }\n\n queryBuilder() {\n return this.repo.createQueryBuilder(this.entityAliasName);\n }\n\n _applyQueryFromBinding(bindingEnt: Partial<T>, qb: SelectQueryBuilder<T>) {\n for (const [key, value] of Object.entries(bindingEnt)) {\n const typeormKey = `_binding_${key}`;\n qb.andWhere(`${this.entityAliasName}.${key} = :${typeormKey}`, {\n [typeormKey]: value,\n });\n }\n }\n\n async findOne(\n id: EntityId<T>,\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n extraQuery: (qb: SelectQueryBuilder<T>) => void = () => {},\n ) {\n const bindingEnt = await this.getBindingPartialEntity();\n const query = this.queryBuilder()\n .where(`${this.entityAliasName}.id = :id`, { id })\n .take(1);\n this._applyQueryRelations(query);\n this._applyQueryFromBinding(bindingEnt, query);\n this.extraGetQuery(query);\n extraQuery(query);\n query.take(1);\n let ent: T;\n try {\n ent = await query.getOne();\n } catch (e) {\n const [sql, params] = query.getQueryAndParameters();\n this.log.error(\n `Failed to read entity ID ${id} with SQL ${sql} param ${params.join(\n ',',\n )}: ${e.toString()}`,\n );\n throw new BlankReturnMessageDto(500, 'Internal error').toException();\n }\n if (!ent) {\n throw new BlankReturnMessageDto(\n 404,\n `${this.entityName} ID ${id} not found.`,\n ).toException();\n }\n await ent.afterGet?.();\n return new this.entityReturnMessageDto(\n 200,\n 'success',\n this.cleanEntityNotInResultFields(ent),\n );\n }\n\n async _preFindAll(\n ent?: Partial<T>,\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n extraQuery: (qb: SelectQueryBuilder<T>) => void = () => {},\n ) {\n const bindingEnt = await this.getBindingPartialEntity();\n const query = this.queryBuilder().where('1 = 1');\n const newEnt = new this.entityClass();\n if (ent) {\n Object.assign(newEnt, ent);\n await newEnt?.beforeGet?.();\n newEnt.applyQuery(query, this.entityAliasName);\n }\n this._applyQueryRelations(query);\n this._applyQueryFilters(query, newEnt);\n this._applyQueryFromBinding(bindingEnt, query);\n const pageSettings =\n newEnt instanceof PageSettingsDto\n ? newEnt\n : Object.assign(new PageSettingsDto(), newEnt);\n this.extraGetQuery(query);\n extraQuery(query);\n return { query, newEnt, pageSettings };\n }\n\n async findAll(\n ent?: Partial<T>,\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n extraQuery: (qb: SelectQueryBuilder<T>) => void = () => {},\n ) {\n const { query, pageSettings } = await this._preFindAll(ent, extraQuery);\n pageSettings.applyPaginationQuery(query);\n try {\n const [data, count] = await query.getManyAndCount();\n await Promise.all(data.map((ent) => ent.afterGet?.()));\n return new this.entityPaginatedReturnMessageDto(\n 200,\n 'success',\n this.cleanEntityNotInResultFields(data),\n count,\n pageSettings.getActualPageSettings(),\n );\n } catch (e) {\n const [sql, params] = query.getQueryAndParameters();\n this.log.error(\n `Failed to read entity cond ${JSON.stringify(\n ent,\n )} with SQL ${sql} param ${params.join(',')}: ${e.toString()}`,\n );\n throw new BlankReturnMessageDto(500, 'Internal error').toException();\n }\n }\n async findAllCursorPaginated(\n ent?: Partial<T & Partial<CursorPaginationDto>>,\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n extraQuery: (qb: SelectQueryBuilder<T>) => void = () => {},\n ) {\n const { query, pageSettings } = await this._preFindAll(ent, extraQuery);\n try {\n const { data, paginatedResult } = await getPaginatedResult(\n query,\n this.entityClass,\n this.entityAliasName,\n pageSettings.getRecordsPerPage(),\n ent.paginationCursor,\n );\n await Promise.all(data.map((ent) => ent.afterGet?.()));\n return new this.entityCursorPaginatedReturnMessageDto(\n 200,\n 'success',\n this.cleanEntityNotInResultFields(data),\n paginatedResult,\n );\n } catch (e) {\n const [sql, params] = query.getQueryAndParameters();\n this.log.error(\n `Failed to read entity cond ${JSON.stringify(\n ent,\n )} with SQL ${sql} param ${params.join(',')}: ${e.toString()}`,\n );\n throw new BlankReturnMessageDto(500, 'Internal error').toException();\n }\n }\n\n async update(\n id: EntityId<T>,\n entPart: Partial<T>,\n cond: FindOptionsWhere<T> = {},\n ) {\n const bindingEnt = await this.getBindingPartialEntity();\n let result: UpdateResult;\n const ent = new this.entityClass();\n Object.assign(ent, entPart);\n const invalidReason = ent.isValidInUpdate();\n if (invalidReason) {\n throw new BlankReturnMessageDto(400, invalidReason).toException();\n }\n await ent.beforeUpdate?.();\n try {\n result = await this.repo.update(\n {\n id,\n ...bindingEnt,\n ...cond,\n },\n ent,\n );\n } catch (e) {\n this.log.error(\n `Failed to update entity ID ${id} to ${JSON.stringify(\n entPart,\n )}: ${e.toString()}`,\n );\n throw new BlankReturnMessageDto(500, 'Internal error').toException();\n }\n if (!result.affected) {\n throw new BlankReturnMessageDto(\n 404,\n `${this.entityName} ID ${id} not found.`,\n ).toException();\n }\n return new BlankReturnMessageDto(200, 'success');\n }\n\n async delete(id: EntityId<T>, cond: FindOptionsWhere<T> = {}) {\n const bindingEnt = await this.getBindingPartialEntity();\n let result: UpdateResult | DeleteResult;\n const searchCond = {\n id,\n ...bindingEnt,\n ...cond,\n };\n try {\n result = await (this.crudOptions.hardDelete ||\n !this.repo.manager.connection.getMetadata(this.entityClass)\n .deleteDateColumn\n ? this.repo.delete(searchCond)\n : this.repo.softDelete(searchCond));\n } catch (e) {\n this.log.error(`Failed to delete entity ID ${id}: ${e.toString()}`);\n throw new BlankReturnMessageDto(500, 'Internal error').toException();\n }\n if (!result.affected) {\n throw new BlankReturnMessageDto(\n 404,\n `${this.entityName} ID ${id} not found.`,\n ).toException();\n }\n return new BlankReturnMessageDto(200, 'success');\n }\n\n async importEntities(\n _ents: T[],\n extraChecking?: (ent: T) => string | Promise<string>,\n ) {\n const bindingEnt = await this.getBindingPartialEntity();\n const ents = _ents.map((ent) => {\n const newEnt = new this.entityClass();\n Object.assign(\n newEnt,\n omit(ent, ...this._typeormRelations.map((r) => r.propertyName)),\n );\n return newEnt;\n });\n const invalidResults = _.compact(\n await Promise.all(\n ents.map(async (ent) => {\n const reason = ent.isValidInCreate();\n if (reason) {\n return { entry: ent, result: reason };\n }\n if (extraChecking) {\n const reason = await extraChecking(ent);\n if (reason) {\n return { entry: ent, result: reason };\n }\n }\n }),\n ),\n );\n const remainingEnts = ents.filter(\n (ent) => !invalidResults.find((result) => result.entry === ent),\n );\n for (const ent of remainingEnts) {\n Object.assign(ent, bindingEnt);\n }\n await Promise.all(remainingEnts.map((ent) => ent.beforeCreate?.()));\n const data = await this._batchCreate(remainingEnts, undefined, true);\n await Promise.all(data.results.map((e) => e.afterCreate?.()));\n const results = [\n ...invalidResults,\n ...data.skipped,\n ...data.results.map((e) => ({ entry: e, result: 'OK' })),\n ];\n return new this.importReturnMessageDto(\n 200,\n 'success',\n results.map((r) => {\n const entry = new this.importEntryDto();\n Object.assign(entry, r);\n entry.entry = this.cleanEntityNotInResultFields(r.entry);\n return entry;\n }),\n );\n }\n\n async exists(\n id: EntityId<T>,\n cond: FindOptionsWhere<T> = {},\n ): Promise<boolean> {\n const bindingEnt = await this.getBindingPartialEntity();\n return this.repo.exists({\n where: { id, ...bindingEnt, ...cond },\n });\n }\n\n async operation<R>(\n id: EntityId<T>,\n cb: (\n ent: T,\n ctx: {\n repo: Repository<T>;\n flush: () => Promise<void>;\n },\n ) => Awaitable<R>,\n options: {\n find?: FindOneOptions<T>;\n repo?: Repository<T>;\n } = {},\n ): Promise<GenericReturnMessageDto<R>> {\n const bindingEnt = await this.getBindingPartialEntity();\n\n const where: FindOptionsWhere<T> = {\n id,\n ...bindingEnt,\n ...(options.find?.where || {}),\n };\n\n const throw404 = () => {\n throw new BlankReturnMessageDto(\n 404,\n `${this.entityName} ID ${id} not found.`,\n ).toException();\n };\n\n if (!(await this.repo.exists({ where }))) {\n throw404();\n }\n\n // -------- utils (keep simple) --------\n\n const isPlainObject = (v: unknown): v is Record<string, any> => {\n if (!v || typeof v !== 'object') return false;\n const proto = Object.getPrototypeOf(v);\n return proto === Object.prototype || proto === null;\n };\n\n const cloneAtomicOrJson = <V>(v: V): V => {\n if (v == null) return v;\n\n // primitives\n if (typeof v !== 'object') return v;\n\n // Date\n if (v instanceof Date) return new Date(v.getTime()) as any;\n\n // Buffer / TypedArray / ArrayBuffer\n if (typeof Buffer !== 'undefined' && Buffer.isBuffer(v)) {\n return Buffer.from(v) as any;\n }\n if (ArrayBuffer.isView(v)) {\n // Uint8Array etc.\n const ctor = (v as any).constructor;\n return new ctor((v as any).slice?.() ?? v) as any;\n }\n if (v instanceof ArrayBuffer) return v.slice(0) as any;\n\n // array / plain object => deep clone for json/jsonb usage\n if (Array.isArray(v) || isPlainObject(v)) {\n // Node 18+ has structuredClone. Jest env usually supports it.\n // Fallback to JSON clone (good enough for jsonb; won't support Date/Buffer but we handled those above)\n const sc = (globalThis as any).structuredClone;\n if (typeof sc === 'function') return sc(v);\n return JSON.parse(JSON.stringify(v)) as V;\n }\n\n // other objects (class instances) => keep reference (rare for real columns)\n return v;\n };\n\n const deepEqual = (a: any, b: any): boolean => {\n if (a === b) return true;\n if (a == null || b == null) return a === b;\n\n // Date\n if (a instanceof Date && b instanceof Date)\n return a.getTime() === b.getTime();\n\n // Buffer\n if (\n typeof Buffer !== 'undefined' &&\n Buffer.isBuffer(a) &&\n Buffer.isBuffer(b)\n ) {\n return a.equals(b);\n }\n\n // TypedArray / ArrayBuffer\n if (ArrayBuffer.isView(a) && ArrayBuffer.isView(b)) {\n if (a.byteLength !== b.byteLength) return false;\n const ua = new Uint8Array(a.buffer, a.byteOffset, a.byteLength);\n const ub = new Uint8Array(b.buffer, b.byteOffset, b.byteLength);\n for (let i = 0; i < ua.length; i++) if (ua[i] !== ub[i]) return false;\n return true;\n }\n if (a instanceof ArrayBuffer && b instanceof ArrayBuffer) {\n if (a.byteLength !== b.byteLength) return false;\n const ua = new Uint8Array(a);\n const ub = new Uint8Array(b);\n for (let i = 0; i < ua.length; i++) if (ua[i] !== ub[i]) return false;\n return true;\n }\n\n // arrays\n if (Array.isArray(a) || Array.isArray(b)) {\n if (!Array.isArray(a) || !Array.isArray(b)) return false;\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++)\n if (!deepEqual(a[i], b[i])) return false;\n return true;\n }\n\n // plain objects\n if (typeof a === 'object' && typeof b === 'object') {\n const keys = new Set([...Object.keys(a), ...Object.keys(b)]);\n for (const k of keys) {\n if (!deepEqual(a[k], b[k])) return false;\n }\n return true;\n }\n\n return false;\n };\n\n // -------- core --------\n\n const op = async (repo: Repository<T>) => {\n const ent = await repo.findOne({\n lock: { mode: 'pessimistic_write', tables: [repo.metadata.tableName] },\n ...(options.find || {}),\n where,\n });\n\n if (!ent) throw404();\n\n // columns we are allowed to update\n const columns = repo.metadata.columns.map(\n (c) => c.propertyName,\n ) as (keyof T)[];\n\n // snapshot ONLY stores column values, and clones json-ish values to avoid shared refs\n const snapshot: Partial<Record<keyof T, any>> = {};\n const snapshotHasKey: Partial<Record<keyof T, boolean>> = {};\n for (const key of columns) {\n snapshotHasKey[key] = Object.prototype.hasOwnProperty.call(\n ent as any,\n key,\n );\n snapshot[key] = cloneAtomicOrJson((ent as any)[key]);\n }\n\n const flush = async () => {\n const patch: Partial<T> = {};\n\n for (const key of columns) {\n const hasNow = Object.prototype.hasOwnProperty.call(ent, key);\n\n // delete -> NULL (only if it existed initially or previously flushed)\n if (!hasNow) {\n if (snapshotHasKey[key]) {\n patch[key] = null;\n snapshotHasKey[key] = true; // after update, column exists with null\n snapshot[key] = null;\n }\n continue;\n }\n\n const current = ent[key];\n const before = snapshot[key];\n\n if (!deepEqual(before, current)) {\n patch[key] = current;\n snapshotHasKey[key] = true;\n snapshot[key] = cloneAtomicOrJson(current);\n }\n }\n\n if (Object.keys(patch).length) {\n await repo.update({ id } as any, patch);\n }\n };\n\n const result = await cb(ent, { repo, flush });\n await flush();\n return result;\n };\n\n const res = await (options.repo\n ? op(options.repo)\n : this.repo.manager.transaction((tdb) =>\n op(tdb.getRepository(this.entityClass)),\n ));\n\n return res == null\n ? new BlankReturnMessageDto(200, 'success')\n : new GenericReturnMessageDto(200, 'success', res);\n }\n\n async _loadFullTextIndex() {\n const fields = reflector.getArray(\n 'queryFullTextColumnFields',\n this.entityClass,\n );\n\n const metadata = this.repo.metadata;\n const tableName = metadata.tableName; // \u771F\u6B63\u6570\u636E\u5E93\u91CC\u7684\u8868\u540D\n\n const sqls: string[] = [];\n\n for (const field of fields) {\n const options = reflector.get(\n 'queryFullTextColumn',\n this.entityClass,\n field,\n );\n if (!options) continue;\n\n const configurationName = options.configuration;\n const parser = options.parser;\n\n if (parser && !loadedParsers.has(parser)) {\n loadedParsers.add(parser);\n\n sqls.push(\n `CREATE EXTENSION IF NOT EXISTS ${parser};`,\n `DROP TEXT SEARCH CONFIGURATION IF EXISTS ${configurationName};`,\n `CREATE TEXT SEARCH CONFIGURATION ${configurationName} (PARSER = ${parser});`,\n `ALTER TEXT SEARCH CONFIGURATION ${configurationName} ADD MAPPING FOR n, v, a, i, e, l WITH simple;`,\n );\n }\n\n const indexName = `idx_fulltext_${this.entityName}_${field}`;\n\n // \u5EFA\u7ACB\u7D22\u5F15\uFF0C\u7D22\u5F15\u540D\u5B57\u7528 this.entityName\uFF0C\u8868\u540D\u7528\u771F\u5B9E tableName\n sqls.push(\n `CREATE INDEX IF NOT EXISTS \"${indexName}\" ON \"${tableName}\" USING GIN (to_tsvector('${configurationName}', \"${field}\"));`,\n );\n }\n if (sqls.length) {\n await this.repo.manager.query(sqls.join('\\n'));\n }\n }\n\n async onModuleInit() {\n await loadFullTextQueue.add(() => this._loadFullTextIndex());\n }\n}\n\nexport function CrudService<T extends ValidCrudEntity<T>>(\n entityClass: ClassType<T>,\n crudOptions: CrudOptions<T> = {},\n) {\n return class CrudServiceImpl extends CrudBase<T> {\n constructor(repo: Repository<T>) {\n super(entityClass, repo, crudOptions);\n }\n };\n}\n", "import {\n CreateDateColumn,\n DeleteDateColumn,\n SelectQueryBuilder,\n UpdateDateColumn,\n} from 'typeorm';\nimport { NotColumn, NotInResult } from '../decorators';\nimport { PageSettingsDto } from './page-settings';\n\nexport interface DeletionWise {\n deleteTime?: Date;\n}\n\nexport interface EntityHooks {\n isValidInCreate(): string | undefined;\n beforeCreate(): Promise<void>;\n afterCreate(): Promise<void>;\n beforeGet(): Promise<void>;\n afterGet(): Promise<void>;\n isValidInUpdate(): string | undefined;\n beforeUpdate(): Promise<void>;\n}\n\nexport class TimeBase\n extends PageSettingsDto\n implements DeletionWise, EntityHooks\n{\n @CreateDateColumn({ select: false })\n @NotColumn()\n @NotInResult({ entityVersioningDate: true })\n @Reflect.metadata('design:type', Date)\n createTime: Date;\n\n @UpdateDateColumn({ select: false })\n @NotColumn()\n @NotInResult({ entityVersioningDate: true })\n @Reflect.metadata('design:type', Date)\n updateTime: Date;\n\n @DeleteDateColumn({ select: false })\n @NotColumn()\n @NotInResult({ entityVersioningDate: true })\n @Reflect.metadata('design:type', Date)\n deleteTime: Date;\n\n isValidInCreate(): string | undefined {\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n async beforeCreate(): Promise<void> {}\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n async afterCreate(): Promise<void> {}\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n async beforeGet(): Promise<void> {}\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n async afterGet(): Promise<void> {}\n\n isValidInUpdate(): string | undefined {\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n async beforeUpdate(): Promise<void> {}\n}\n", "import { NotInResult, NotWritable, QueryManual } from '../decorators';\nimport { SelectQueryBuilder } from 'typeorm';\nimport { IsInt, IsPositive } from 'class-validator';\nimport { ApiProperty } from '@nestjs/swagger';\nimport { PageSettingsWise } from 'nesties';\n\nexport interface PageSettingsFactory {\n getActualPageSettings(): PageSettingsWise;\n}\n\nexport interface QueryWise<T> {\n applyQuery(qb: SelectQueryBuilder<T>, entityName: string): void;\n}\n\nexport type QueryCond = <T>(\n obj: T,\n qb: SelectQueryBuilder<T>,\n entityName: string,\n key: keyof T & string,\n) => any;\n\nexport class PageSettingsDto\n implements PageSettingsWise, PageSettingsFactory, QueryWise<PageSettingsDto>\n{\n @NotWritable()\n @IsPositive()\n @IsInt()\n @ApiProperty({\n description: 'The nth page, starting with 1.',\n required: false,\n minimum: 1,\n })\n @NotInResult()\n @Reflect.metadata('design:type', Number)\n @QueryManual()\n pageCount: number;\n\n @NotWritable()\n @IsPositive()\n @IsInt()\n @ApiProperty({\n description: 'Records per page.',\n required: false,\n minimum: 1,\n })\n @NotInResult()\n @QueryManual()\n @Reflect.metadata('design:type', Number)\n recordsPerPage: number;\n\n getActualPageSettings(): PageSettingsWise {\n return {\n pageCount: this.getPageCount(),\n recordsPerPage: this.getRecordsPerPage(),\n };\n }\n\n getPageCount() {\n return parseInt(this.pageCount as any) || 1;\n }\n\n getRecordsPerPage() {\n return parseInt(this.recordsPerPage as any) || 25;\n }\n\n getStartingFrom() {\n return (this.getPageCount() - 1) * this.getRecordsPerPage();\n }\n\n applyPaginationQuery(qb: SelectQueryBuilder<any>): void {\n qb.take(this.getRecordsPerPage()).skip(this.getStartingFrom());\n }\n\n applyQuery(qb: SelectQueryBuilder<any>, entityName: string) {}\n}\n", "import { TimeBase } from './time-base';\nimport { Generated, SelectQueryBuilder } from 'typeorm';\nimport {\n IntColumn,\n NotChangeable,\n NotWritable,\n PropertyOptions,\n QueryEqual,\n StringColumn,\n UuidColumn,\n} from '../decorators';\nimport { IsNotEmpty } from 'class-validator';\nimport { MergePropertyDecorators } from 'nesties';\nimport { Metadata } from '../utility/metadata';\n\nexport interface IdOptions {\n description?: string;\n noOrderById?: boolean;\n}\n\nexport function IdBase(idOptions: IdOptions = {}) {\n const cl = class IdBase extends TimeBase {\n id: number;\n override applyQuery(qb: SelectQueryBuilder<IdBase>, entityName: string) {\n super.applyQuery(qb, entityName);\n if (!idOptions.noOrderById) {\n qb.orderBy(`${entityName}.id`, 'DESC');\n }\n }\n };\n const dec = MergePropertyDecorators([\n NotWritable(),\n IntColumn('bigint', {\n unsigned: true,\n description: idOptions.description,\n columnExtras: { nullable: false, primary: true },\n }),\n Reflect.metadata('design:type', Number),\n Generated('increment'),\n QueryEqual(),\n Metadata.set(\n 'notRequiredButHasDefault',\n true,\n 'notRequiredButHasDefaultFields',\n ),\n ]);\n dec(cl.prototype, 'id');\n return cl;\n}\n\nexport interface StringIdOptions extends IdOptions {\n length?: number;\n uuid?: boolean;\n}\n\nexport function StringIdBase(idOptions: StringIdOptions) {\n const cl = class StringIdBase extends TimeBase {\n id: string;\n\n override applyQuery(\n qb: SelectQueryBuilder<StringIdBase>,\n entityName: string,\n ) {\n super.applyQuery(qb, entityName);\n if (!idOptions.noOrderById) {\n qb.orderBy(`${entityName}.id`, 'ASC');\n }\n }\n };\n const columnOptions: PropertyOptions<string> = {\n required: !idOptions.uuid,\n description: idOptions.description,\n columnExtras: { primary: true, nullable: false },\n };\n const decs = [\n Reflect.metadata('design:type', String),\n QueryEqual(),\n Metadata.set(\n 'notRequiredButHasDefault',\n true,\n 'notRequiredButHasDefaultFields',\n ),\n ...(idOptions.uuid\n ? [UuidColumn({ ...columnOptions, generated: true }), NotWritable()]\n : [\n StringColumn(idOptions.length || 255, columnOptions),\n IsNotEmpty(),\n NotChangeable(),\n ]),\n ];\n const dec = MergePropertyDecorators(decs);\n dec(cl.prototype, 'id');\n return cl;\n}\n", "import { AnyClass, ClassType } from 'nesties';\nimport { getMetadataArgsStorage } from 'typeorm';\nimport { getSpecificFields, reflector } from './metadata';\nimport _ from 'lodash';\n\nexport type TypeormRelation<T = any, KT = string> = {\n isArray: boolean;\n propertyClass: ClassType<T>;\n propertyName: KT;\n computed: boolean;\n};\n\nexport function getTypeormRelations<T>(cl: ClassType<T>): TypeormRelation[] {\n const relations = getMetadataArgsStorage().relations.filter(\n (r) => r.target === cl,\n );\n\n const typeormRelations = relations.map((relation) => {\n const isArray = relation.relationType.endsWith('-many');\n const relationClassFactory = relation.type;\n // check if it's a callable function\n let propertyClass: AnyClass;\n if (typeof relationClassFactory === 'function') {\n const relationClass = (relationClassFactory as () => AnyClass)();\n if (typeof relationClass === 'function') {\n propertyClass = relationClass;\n }\n }\n if (!propertyClass) {\n propertyClass = Reflect.getMetadata(\n 'design:type',\n cl.prototype,\n relation.propertyName,\n );\n }\n return {\n isArray,\n propertyClass,\n propertyName: relation.propertyName,\n computed: false,\n };\n });\n\n const computedRelations = getSpecificFields(cl, 'relationComputed').map(\n (field) => {\n const meta = reflector.get('relationComputed', cl, field);\n const res = meta();\n return {\n isArray: res.isArray,\n propertyClass: res.entityClass,\n propertyName: field,\n computed: true,\n };\n },\n );\n return _.uniqBy(\n [...typeormRelations, ...computedRelations], // Merge typeorm relations and computed relations\n (r) => r.propertyName,\n );\n}\n\nexport function getTypeormRelationsMap<T>(cl: ClassType<T>) {\n return Object.fromEntries(\n getTypeormRelations(cl).map((r) => [r.propertyName, r]),\n ) as {\n [key in keyof T]: TypeormRelation<T, key>;\n };\n}\n", "import { Brackets, SelectQueryBuilder } from 'typeorm';\nimport _ from 'lodash';\nimport SJSON from 'superjson';\nimport { queryColumnOptionsFromAlias } from './filter-relations';\nimport { AnyClass } from 'nesties';\nimport { getSubject } from './subject-registry';\n\nexport type TypeormOrderByObject = {\n order: 'ASC' | 'DESC';\n nulls?: 'NULLS FIRST' | 'NULLS LAST';\n};\nexport type TypeormOrderByKey = 'ASC' | 'DESC';\nexport type TypeormOrderBy = ('ASC' | 'DESC') | TypeormOrderByObject;\n\nfunction getValueFromOrderBy(\n orderBy: TypeormOrderBy,\n reversed = false,\n): TypeormOrderByKey {\n if (reversed) {\n const value = getValueFromOrderBy(orderBy, false);\n return value === 'ASC' ? 'DESC' : 'ASC';\n }\n return typeof orderBy === 'string' ? orderBy : orderBy.order;\n}\n\nfunction getNullsFromOrderBy(\n orderBy: TypeormOrderBy,\n reversed = false,\n): 'NULLS FIRST' | 'NULLS LAST' {\n if (reversed) {\n const value = getNullsFromOrderBy(orderBy, false);\n return value === 'NULLS FIRST' ? 'NULLS LAST' : 'NULLS FIRST';\n }\n const nulls = typeof orderBy === 'string' ? undefined : orderBy.nulls;\n if (!nulls) {\n const value = getValueFromOrderBy(orderBy);\n return value === 'ASC' ? 'NULLS FIRST' : 'NULLS LAST';\n }\n return nulls;\n}\n\nfunction getOperator(orderBy: TypeormOrderBy) {\n const value = getValueFromOrderBy(orderBy);\n return value === 'ASC' ? '>' : '<';\n}\n\nfunction getReversedTypeormOrderBy(\n orderBy: TypeormOrderBy | string,\n): TypeormOrderByObject {\n if (typeof orderBy === 'string') {\n return {\n order: orderBy === 'ASC' ? 'DESC' : 'ASC',\n nulls: undefined,\n };\n }\n return {\n order: orderBy.order === 'ASC' ? 'DESC' : 'ASC',\n nulls: orderBy.nulls\n ? orderBy.nulls === 'NULLS FIRST'\n ? 'NULLS LAST'\n : 'NULLS FIRST'\n : undefined,\n };\n}\n\nfunction reverseQueryOrderBy(qb: SelectQueryBuilder<any>) {\n const orderBys = getTypeormOrderBy(qb);\n orderBys.forEach(({ key, direction }, i) => {\n const reversed = getReversedTypeormOrderBy(direction);\n if (i === 0) {\n qb.orderBy(key, reversed.order, reversed.nulls);\n } else {\n qb.addOrderBy(key, reversed.order, reversed.nulls);\n }\n });\n}\n\nfunction getTypeormOrderBy(\n qb: SelectQueryBuilder<any>,\n): { key: string; direction: TypeormOrderBy }[] {\n const orderBy = qb.expressionMap.allOrderBys;\n const orderByEntrys = Object.entries(orderBy);\n return orderByEntrys.map(([key, value]) => ({\n key,\n direction: value,\n }));\n}\n\nexport function extractValueFromOrderByKey(\n obj: any,\n key: string,\n entityAliasName?: string,\n) {\n const getField = (obj, key) => {\n const value = obj[key];\n if (value == null) return value;\n if (Array.isArray(value)) {\n /*\n if (!value.length) {\n return undefined;\n }\n return value[value.length - 1];\n */\n return undefined;\n }\n return value;\n };\n const [alias, field] = key.split('.');\n if (alias === entityAliasName) {\n return getField(obj, field);\n }\n const aliasParts = alias.split('_');\n\n if (aliasParts.length === 1) {\n const value = getField(obj, alias);\n if (value == null) return value;\n return getField(value, field);\n }\n const value = getField(obj, aliasParts[0]);\n if (!value == null) return value;\n return extractValueFromOrderByKey(\n value,\n `${aliasParts.slice(1).join('_')}.${field}`,\n );\n}\n\nfunction encodeBase64Url(str: string) {\n return Buffer.from(str)\n .toString('base64')\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=+$/, '');\n}\n\nfunction decodeBase64Url(str: string) {\n str = str.replace(/-/g, '+').replace(/_/g, '/');\n while (str.length % 4) str += '=';\n return Buffer.from(str, 'base64').toString();\n}\n\nexport async function getPaginatedResult<T>(\n qb: SelectQueryBuilder<T>,\n entityClass: AnyClass,\n entityAliasName: string,\n take: number,\n cursor?: string,\n) {\n const orderBys = getTypeormOrderBy(qb);\n qb.take(take + 1);\n\n let type: 'prev' | 'next' = 'next';\n if (cursor) {\n // cursor is base64url encoded string\n const data = SJSON.parse(decodeBase64Url(cursor)) as {\n type: 'prev' | 'next';\n payload: any;\n };\n\n type = data.type;\n\n const keys = Object.keys(data.payload).filter(\n (k) => qb.expressionMap.orderBys[k],\n );\n if (keys.length) {\n const staircasedKeys = keys.map((key, i) =>\n _.range(i + 1).map((j) => keys[j]),\n );\n\n const cursorKey = (key: string) =>\n `_cursor_${key.replace(/\\./g, '__').replace(/\"/g, '')}`;\n\n const expressionMatrix = staircasedKeys\n .map((keys) =>\n keys.map((key, j) => {\n const paramKey = cursorKey(key);\n const cursorValue = data.payload[key];\n const orderBy = qb.expressionMap.orderBys[key];\n const reversed = data.type === 'prev';\n const order = getValueFromOrderBy(orderBy, reversed); // 'ASC' or 'DESC'\n const nulls = getNullsFromOrderBy(orderBy, reversed); // 'NULLS FIRST' or 'NULLS LAST' or undefined\n\n const isLast = j === keys.length - 1;\n\n const subject = key.includes('\"')\n ? getSubject(qb, key.replace(/\"/g, ''))\n : key;\n\n const mayBeNullAtEnd = () => {\n const res =\n (nulls === 'NULLS LAST' && order === 'ASC') ||\n (nulls === 'NULLS FIRST' && order === 'DESC');\n if (reversed) {\n return !res;\n }\n return res;\n };\n\n if (cursorValue == null) {\n if (isLast) {\n if (mayBeNullAtEnd()) {\n return '__never__';\n } else {\n return `${subject} IS NOT NULL`;\n }\n } else {\n // \u4E2D\u95F4\u5B57\u6BB5\uFF0C\u5982\u679C\u662Fnull\uFF0C\u5C31\u6BD4\u8F83 IS NULL\n return `${subject} IS NULL`;\n }\n } else {\n if (isLast) {\n const expr = `${subject} ${getOperator(order)} :${paramKey}`;\n if (\n mayBeNullAtEnd() &&\n queryColumnOptionsFromAlias(\n qb,\n entityClass,\n entityAliasName,\n key,\n )?.column?.isNullable\n ) {\n return `(${expr} OR ${subject} IS NULL)`;\n }\n return expr;\n } else {\n return `${subject} = :${paramKey}`;\n }\n }\n }),\n )\n .filter((s) => !s.includes('__never__'));\n\n if (expressionMatrix.length) {\n qb.andWhere(\n new Brackets((sqb) => {\n const levelToBrackets = (level: string[]) =>\n new Brackets((qb) => {\n level.forEach((expr, i) => {\n if (i === 0) {\n qb.where(expr);\n } else {\n qb.andWhere(expr);\n }\n });\n });\n const [first, ...rest] = expressionMatrix;\n sqb.where(levelToBrackets(first));\n rest.forEach((level) => sqb.orWhere(levelToBrackets(level)));\n }),\n ).setParameters(\n Object.fromEntries(\n Object.entries(data.payload)\n .filter(([k, v]) => qb.expressionMap.orderBys[k] && v != null)\n .map(([k, v]) => [cursorKey(k), v]),\n ),\n );\n }\n }\n if (data.type === 'prev') {\n reverseQueryOrderBy(qb);\n }\n }\n\n const { raw, entities: data } = await qb.getRawAndEntities();\n\n const rawMapById = new Map<any, any>();\n const getRawFromEntity = (entity: any) => {\n const isNumberId = typeof entity.id === 'number';\n const id = entity.id;\n if (rawMapById.has(id)) {\n return rawMapById.get(id);\n }\n return raw.find((r) => {\n let id = r[`${entityAliasName}_id`];\n if (isNumberId) {\n id = Number(id);\n if (isNaN(id)) return false;\n }\n if (id == null) return false;\n rawMapById[id] = r;\n return id === entity.id;\n });\n };\n\n const enough = data.length > take;\n const hasNext = enough || type === 'prev';\n const hasPrev = cursor && (enough || type === 'next');\n if (enough) {\n data.pop();\n }\n if (type === 'prev') {\n data.reverse();\n }\n\n const generateCursor = (type: 'prev' | 'next', data: T[]) => {\n const targetObject = type === 'prev' ? data[0] : data[data.length - 1];\n const payload = Object.fromEntries(\n orderBys\n .map(({ key }) => {\n const value =\n !key.includes('.') || key.includes('\"')\n ? getRawFromEntity(targetObject)?.[key.replace(/\"/g, '')]\n : extractValueFromOrderByKey(targetObject, key, entityAliasName);\n return [key, value];\n })\n .filter((s) => s[1] !== undefined),\n );\n return encodeBase64Url(SJSON.stringify({ type, payload }));\n };\n\n return {\n data,\n paginatedResult: {\n nextCursor: hasNext ? generateCursor('next', data) : undefined,\n previousCursor: hasPrev ? generateCursor('prev', data) : undefined,\n },\n };\n}\n", "import { AnyClass } from 'nesties';\nimport { RelationDef } from './relation-def';\nimport { getTypeormRelations, TypeormRelation } from './get-typeorm-relations';\nimport { Relation, SelectQueryBuilder } from 'typeorm';\n\nexport const extractRelationName = (relation: string | RelationDef) => {\n if (typeof relation === 'string') {\n return relation;\n } else {\n return relation.name;\n }\n};\n\nconst typeormRelationsCache = new Map<\n AnyClass,\n Record<string, TypeormRelation>\n>();\n\nconst fetchTypeormRelations = (cl: AnyClass) => {\n if (typeormRelationsCache.has(cl)) {\n return typeormRelationsCache.get(cl)!;\n }\n const relations = getTypeormRelations(cl);\n const map = Object.fromEntries(\n relations.map((r) => [r.propertyName, r]),\n ) as Record<string, TypeormRelation>;\n typeormRelationsCache.set(cl, map);\n return map;\n};\n\nexport const filterRelations = <T extends string | RelationDef>(\n cl: AnyClass,\n relations?: T[],\n cond: (r: TypeormRelation) => boolean = () => true,\n) => {\n return (\n relations?.filter((r) => {\n const relationName = extractRelationName(r);\n const checkLevel = (entityClass: AnyClass, name: string): boolean => {\n const [currentLevel, ...nextLevel] = name.split('.');\n const relation = fetchTypeormRelations(entityClass)?.[currentLevel];\n if (!relation) {\n throw new Error(\n `Relation ${currentLevel} not found in ${entityClass.name} (Reading ${relationName} in ${cl.name})`,\n );\n }\n if (relation.computed) return false;\n if (!nextLevel.length) return true;\n return checkLevel(relation.propertyClass, nextLevel.join('.'));\n };\n return checkLevel(cl, relationName);\n }) || []\n );\n};\n\nexport const filterAliases = (\n cl: AnyClass,\n rootAlias: string,\n aliases?: string[],\n cond: (\n r: TypeormRelation | undefined,\n field: string,\n key: string | undefined,\n ) => boolean = () => true,\n) => {\n return (\n aliases?.filter((alias) => {\n const [field, key] = alias.split('.');\n if (!key || field === rootAlias) {\n return cond(undefined, field, key);\n }\n const relationLevels = [...field.split('_'), key];\n let currentClass = cl;\n for (let i = 0; i < relationLevels.length; i++) {\n const f = relationLevels[i];\n const k = relationLevels[i + 1];\n const relation = fetchTypeormRelations(currentClass)?.[f];\n if (!cond(relation, f, k)) return false;\n currentClass = relation.propertyClass;\n }\n return true;\n }) || []\n );\n};\n\nexport const queryColumnOptionsFromAlias = (\n qb: SelectQueryBuilder<any>,\n cl: AnyClass,\n rootAlias: string,\n alias: string,\n) => {\n const [field, key] = alias.split('.');\n if (field === rootAlias) {\n return {\n relations: [],\n column: qb.connection.getMetadata(cl)?.findColumnWithPropertyName(key),\n };\n }\n\n const relationLevels = field.split('_');\n let currentClass = cl;\n const relations: TypeormRelation[] = [];\n while (relationLevels.length) {\n const f = relationLevels.shift()!;\n const relation = fetchTypeormRelations(currentClass)?.[f];\n if (!relation || relation.computed) {\n return;\n }\n relations.push(relation);\n currentClass = relation.propertyClass;\n }\n return {\n relations,\n column: qb.connection\n .getMetadata(currentClass)\n ?.findColumnWithPropertyName(key),\n };\n};\n", "import {\n Body,\n Delete,\n Get,\n HttpCode,\n Param,\n ParseIntPipe,\n Patch,\n Post,\n Query,\n} from '@nestjs/common';\nimport { ImportDataDto, ImportEntryDto } from './dto';\nimport {\n AnyClass,\n MergeMethodDecorators,\n PaginatedReturnMessageDto,\n ReturnMessageDto,\n ClassType,\n getApiProperty,\n DataPipe,\n ApiTypeResponse,\n ApiBlankResponse,\n ApiError,\n} from 'nesties';\nimport {\n ApiBody,\n ApiOkResponse,\n ApiOperation,\n ApiParam,\n ApiProperty,\n ApiPropertyOptions,\n IntersectionType,\n OmitType,\n PartialType,\n} from '@nestjs/swagger';\nimport { OperationObject } from '@nestjs/swagger/dist/interfaces/open-api-spec.interface';\nimport _, { upperFirst } from 'lodash';\nimport { getNotInResultFields, getSpecificFields } from './utility/metadata';\nimport { RenameClass } from 'nesties';\nimport { getTypeormRelations } from './utility/get-typeorm-relations';\nimport { CrudBase, CrudOptions, CrudService } from './crud-base';\nimport { PageSettingsDto } from './bases';\nimport { CursorPaginationDto, CursorPaginationReturnMessageDto } from './dto';\nimport {\n BaseRestfulController,\n RestfulMethods,\n RestfulPaginateType,\n} from './bases/base-restful-controller';\nimport { Repository } from 'typeorm';\nimport { RelationDef } from './utility/relation-def';\nimport {\n filterRelations,\n extractRelationName,\n} from './utility/filter-relations';\nimport { OmitTypeExclude, PickTypeExpose } from './utility/omit-type-exclude';\nimport { nonTransformableTypes } from './utility/non-transformable-types';\nimport { PatchColumnsInGet } from './utility/patch-column-in-get';\nimport { OmitPipe, OptionalDataPipe, PickPipe } from './decorators';\nimport { MutatorPipe } from './utility/mutate-pipe';\nimport { Memorize } from 'nfkit';\n\nexport interface RestfulFactoryOptions<\n T,\n O extends keyof T = never,\n W extends keyof T = never,\n C extends keyof T = never,\n U extends keyof T = never,\n F extends keyof T = never,\n R extends keyof T = never,\n> {\n fieldsToOmit?: O[];\n writeFieldsToOmit?: W[];\n createFieldsToOmit?: C[];\n updateFieldsToOmit?: U[];\n findAllFieldsToOmit?: F[];\n outputFieldsToOmit?: R[];\n prefix?: string;\n keepEntityVersioningDates?: boolean;\n entityClassName?: string;\n relations?: (string | RelationDef)[];\n skipNonQueryableFields?: boolean;\n}\n\nconst getCurrentLevelRelations = (relations: string[]) =>\n relations.filter((r) => !r.includes('.'));\n\nconst getNextLevelRelations = (relations: string[], enteringField: string) =>\n relations\n .filter((r) => r.includes('.') && r.startsWith(`${enteringField}.`))\n .map((r) => r.split('.').slice(1).join('.'));\n\nexport interface ResourceOptions extends Partial<OperationObject> {\n prefix?: string;\n}\n\nexport class RestfulFactory<\n T extends { id: any },\n O extends keyof T = never,\n W extends keyof T = never,\n C extends keyof T = never,\n U extends keyof T = never,\n F extends keyof T = never,\n R extends keyof T = never,\n> {\n constructor(\n public readonly entityClass: ClassType<T>,\n private options: RestfulFactoryOptions<T, O, W, C, U, F, R> = {},\n private __resolveVisited = new Map<AnyClass, [AnyClass]>(),\n ) {\n if (options.relations) {\n // we have to filter once to ensure every relation is correct\n filterRelations(entityClass, options.relations);\n }\n }\n\n omitInput<K extends keyof T>(...fields: K[]) {\n return new RestfulFactory<T, O | K, W, C, U, F, R>(\n this.entityClass,\n {\n ...this.options,\n fieldsToOmit: _.uniq([...(this.options.fieldsToOmit || []), ...fields]),\n },\n this.__resolveVisited,\n );\n }\n\n omitWrite<K extends keyof T>(...fields: K[]) {\n return new RestfulFactory<T, O, W | K, C, U, F, R>(\n this.entityClass,\n {\n ...this.options,\n writeFieldsToOmit: _.uniq([\n ...(this.options.writeFieldsToOmit || []),\n ...fields,\n ]),\n },\n this.__resolveVisited,\n );\n }\n\n omitCreate<K extends keyof T>(...fields: K[]) {\n return new RestfulFactory<T, O, W, C | K, U, F, R>(\n this.entityClass,\n {\n ...this.options,\n createFieldsToOmit: _.uniq([\n ...(this.options.createFieldsToOmit || []),\n ...fields,\n ]),\n },\n this.__resolveVisited,\n );\n }\n\n omitUpdate<K extends keyof T>(...fields: K[]) {\n return new RestfulFactory<T, O, W, C, U | K, F, R>(\n this.entityClass,\n {\n ...this.options,\n updateFieldsToOmit: _.uniq([\n ...(this.options.updateFieldsToOmit || []),\n ...fields,\n ]),\n },\n this.__resolveVisited,\n );\n }\n\n omitFindAll<K extends keyof T>(...fields: K[]) {\n return new RestfulFactory<T, O, W, C, U, F | K, R>(\n this.entityClass,\n {\n ...this.options,\n findAllFieldsToOmit: _.uniq([\n ...(this.options.findAllFieldsToOmit || []),\n ...fields,\n ]),\n },\n this.__resolveVisited,\n );\n }\n\n omitOutput<K extends keyof T>(...fields: K[]) {\n return new RestfulFactory<T, O, W, C, U, F, R | K>(\n this.entityClass,\n {\n ...this.options,\n outputFieldsToOmit: _.uniq([\n ...(this.options.outputFieldsToOmit || []),\n ...fields,\n ]),\n },\n this.__resolveVisited,\n );\n }\n\n pathPrefix(prefix: string) {\n return new RestfulFactory<T, O, W, C, U, F, R>(\n this.entityClass,\n {\n ...this.options,\n prefix,\n },\n this.__resolveVisited,\n );\n }\n\n keepEntityVersioningDates(enable = true) {\n return new RestfulFactory<T, O, W, C, U, F, R>(\n this.entityClass,\n {\n ...this.options,\n keepEntityVersioningDates: enable,\n },\n this.__resolveVisited,\n );\n }\n\n skipNonQueryableFields(enable = true) {\n return new RestfulFactory<T, O, W, C, U, F, R>(\n this.entityClass,\n {\n ...this.options,\n skipNonQueryableFields: enable,\n },\n this.__resolveVisited,\n );\n }\n\n renameEntityClass(name: string) {\n return new RestfulFactory<T, O, W, C, U, F, R>(\n this.entityClass,\n {\n ...this.options,\n entityClassName: name,\n },\n this.__resolveVisited,\n );\n }\n\n useRelations(...relations: (string | RelationDef)[]) {\n return new RestfulFactory<T, O, W, C, U, F, R>(\n this.entityClass,\n {\n ...this.options,\n relations: [...(this.options.relations || []), ...relations],\n },\n this.__resolveVisited,\n );\n }\n\n get entityClassName() {\n return this.options.entityClassName || this.entityClass.name;\n }\n\n @Memorize()\n get fieldsToOmit() {\n return _.uniq([\n ...(getSpecificFields(this.entityClass, 'notColumn') as (keyof T)[]),\n ...(this.options.fieldsToOmit || []),\n ...getTypeormRelations(this.entityClass).map(\n (r) => r.propertyName as keyof T,\n ),\n ]);\n }\n\n @Memorize()\n get fieldsInCreateToOmit() {\n return _.uniq([\n ...this.fieldsToOmit,\n ...(this.options.writeFieldsToOmit || []),\n ...(this.options.createFieldsToOmit || []),\n ...(getSpecificFields(this.entityClass, 'notWritable') as (keyof T)[]),\n ...(getSpecificFields(this.entityClass, 'notCreatable') as (keyof T)[]),\n ]);\n }\n\n @Memorize()\n get createDto() {\n return RenameClass(\n OmitTypeExclude(this.entityClass, this.fieldsInCreateToOmit),\n `Create${this.entityClassName}Dto`,\n ) as ClassType<Omit<T, O | W | C>>;\n }\n\n @Memorize()\n get fieldsInUpdateToOmit() {\n return _.uniq([\n ...this.fieldsToOmit,\n ...(this.options.writeFieldsToOmit || []),\n ...(this.options.updateFieldsToOmit || []),\n ...(getSpecificFields(this.entityClass, 'notWritable') as (keyof T)[]),\n ...(getSpecificFields(this.entityClass, 'notChangeable') as (keyof T)[]),\n ]);\n }\n\n @Memorize()\n get updateDto() {\n return RenameClass(\n PartialType(OmitTypeExclude(this.entityClass, this.fieldsInUpdateToOmit)),\n `Update${this.entityClassName}Dto`,\n ) as ClassType<Omit<T, O | W | U>>;\n }\n\n @Memorize()\n get importDto() {\n return ImportDataDto(this.createDto);\n }\n\n @Memorize()\n get fieldsInGetToOmit() {\n return _.uniq([\n ...this.fieldsToOmit,\n ...(getSpecificFields(this.entityClass, 'notQueryable') as (keyof T)[]),\n ...(_.difference(\n getSpecificFields(this.entityClass, 'requireGetMutator'),\n getSpecificFields(this.entityClass, 'getMutator'),\n ) as (keyof T)[]),\n ]);\n }\n\n @Memorize()\n get queryableFields() {\n return _.difference(\n [\n ...getSpecificFields(this.entityClass, 'queryCondition'),\n 'pageCount',\n 'recordsPerPage',\n 'paginationCursor',\n ] as (keyof T)[],\n this.fieldsInGetToOmit,\n );\n }\n\n @Memorize()\n get findAllDto() {\n let cl = PartialType(\n PatchColumnsInGet(\n OmitTypeExclude(\n this.entityClass instanceof PageSettingsDto\n ? this.entityClass\n : (IntersectionType(\n this.entityClass,\n PageSettingsDto,\n ) as unknown as ClassType<T>),\n this.fieldsInGetToOmit,\n ),\n this.entityClass,\n this.fieldsInGetToOmit as string[],\n ),\n ) as ClassType<T>;\n if (this.options.skipNonQueryableFields) {\n cl = PickTypeExpose(cl, this.queryableFields) as ClassType<T>;\n }\n return RenameClass(cl, `Find${this.entityClassName}Dto`) as ClassType<\n Omit<T, O | F>\n >;\n }\n\n @Memorize()\n get findAllCursorPaginatedDto() {\n return RenameClass(\n IntersectionType(\n OmitTypeExclude(this.findAllDto, ['pageCount' as keyof Omit<T, O | F>]),\n CursorPaginationDto,\n ),\n `Find${this.entityClassName}CursorPaginatedDto`,\n ) as unknown as ClassType<T>;\n }\n\n @Memorize()\n get entityResultDto() {\n const relations = getTypeormRelations(this.entityClass);\n const currentLevelRelations =\n this.options.relations &&\n new Set(\n getCurrentLevelRelations(\n this.options.relations.map(extractRelationName),\n ),\n );\n const outputFieldsToOmit = new Set([\n ...(getNotInResultFields(\n this.entityClass,\n this.options.keepEntityVersioningDates,\n ) as (keyof T)[]),\n ...(this.options.outputFieldsToOmit || []),\n ...(this.options.relations\n ? (relations\n .map((r) => r.propertyName)\n .filter((r) => !currentLevelRelations.has(r)) as (keyof T)[])\n : []),\n ]);\n const resultDto = OmitType(this.entityClass, [...outputFieldsToOmit]);\n for (const relation of relations) {\n if (outputFieldsToOmit.has(relation.propertyName as keyof T)) continue;\n if (nonTransformableTypes.has(relation.propertyClass)) continue;\n const replace = (useClass: [AnyClass]) => {\n const oldApiProperty = getApiProperty(\n this.entityClass,\n relation.propertyName,\n );\n ApiProperty({\n ...oldApiProperty,\n // required: false,\n type: () => (relation.isArray ? [useClass[0]] : useClass[0]),\n } as ApiPropertyOptions)(resultDto.prototype, relation.propertyName);\n };\n const existing = this.__resolveVisited.get(relation.propertyClass);\n if (existing) {\n replace(existing);\n } else {\n if (\n !this.__resolveVisited.has(this.entityClass) &&\n !this.options.relations\n ) {\n this.__resolveVisited.set(this.entityClass, [null]);\n }\n const relationFactory = new RestfulFactory(\n relation.propertyClass,\n {\n entityClassName: `${this.entityClassName}${\n this.options.relations\n ? upperFirst(relation.propertyName)\n : relation.propertyClass.name\n }`,\n relations:\n this.options.relations &&\n getNextLevelRelations(\n this.options.relations.map(extractRelationName),\n relation.propertyName,\n ),\n keepEntityVersioningDates: this.options.keepEntityVersioningDates,\n },\n this.__resolveVisited,\n );\n const relationResultDto = relationFactory.entityResultDto;\n replace([relationResultDto]);\n if (!this.options.relations) {\n this.__resolveVisited.set(relation.propertyClass, [\n relationResultDto,\n ]);\n }\n }\n }\n const notRequiredButHasDefaultFields = getSpecificFields(\n this.entityClass,\n 'notRequiredButHasDefault',\n ).filter((f) => !outputFieldsToOmit.has(f as keyof T));\n for (const field of notRequiredButHasDefaultFields) {\n const oldApiProperty = getApiProperty(resultDto, field);\n ApiProperty({\n ...oldApiProperty,\n required: true,\n } as ApiPropertyOptions)(resultDto.prototype, field);\n }\n const res = RenameClass(\n resultDto,\n `${this.entityClassName}ResultDto`,\n ) as ClassType<Omit<T, R>>;\n const currentContainer = this.__resolveVisited.get(this.entityClass);\n if (currentContainer) {\n currentContainer[0] = res;\n }\n return res;\n }\n\n @Memorize()\n get entityCreateResultDto() {\n return RenameClass(\n OmitType(this.entityResultDto, [\n ...getTypeormRelations(this.entityClass).map(\n (r) => r.propertyName as keyof T,\n ),\n ...(getSpecificFields(\n this.entityClass,\n 'notColumn',\n (m) => !m.keepInCreate,\n ) as any[]),\n ]),\n `${this.entityClassName}CreateResultDto`,\n ) as ClassType<Omit<T, R>>;\n }\n\n @Memorize()\n get entityReturnMessageDto() {\n return ReturnMessageDto(this.entityResultDto);\n }\n\n @Memorize()\n get entityCreateReturnMessageDto() {\n return ReturnMessageDto(this.entityCreateResultDto);\n }\n\n @Memorize()\n get entityArrayReturnMessageDto() {\n return PaginatedReturnMessageDto(this.entityResultDto);\n }\n\n @Memorize()\n get entityCursorPaginationReturnMessageDto() {\n return CursorPaginationReturnMessageDto(this.entityResultDto);\n }\n\n @Memorize()\n get importReturnMessageDto() {\n return ReturnMessageDto([ImportEntryDto(this.entityCreateResultDto)]);\n }\n\n @Memorize()\n // eslint-disable-next-line @typescript-eslint/ban-types\n get idType(): StringConstructor | NumberConstructor {\n return Reflect.getMetadata('design:type', this.entityClass.prototype, 'id');\n }\n\n private usePrefix(\n methodDec: (path?: string) => MethodDecorator,\n ...paths: string[]\n ) {\n const usePaths = [this.options.prefix, ...paths].filter(\n (s) => s && s.length > 0,\n );\n if (usePaths.length > 0) {\n return methodDec(usePaths.join('/'));\n } else {\n return methodDec();\n }\n }\n\n create(extras: ResourceOptions = {}): MethodDecorator {\n return MergeMethodDecorators([\n this.usePrefix(Post, extras.prefix),\n HttpCode(200),\n ApiOperation({\n summary: `Create a new ${this.entityClassName}`,\n ..._.omit(extras, 'prefix'),\n }),\n ApiBody({ type: this.createDto }),\n ApiOkResponse({ type: this.entityCreateReturnMessageDto }),\n ApiError(400, `The ${this.entityClassName} is not valid`),\n ]);\n }\n\n createParam() {\n return Body(DataPipe(), OmitPipe(this.fieldsInCreateToOmit));\n }\n\n findOne(extras: ResourceOptions = {}): MethodDecorator {\n return MergeMethodDecorators([\n this.usePrefix(Get, extras.prefix, ':id'),\n ApiOperation({\n summary: `Find a ${this.entityClassName} by id`,\n ..._.omit(extras, 'prefix'),\n }),\n ApiParam({ name: 'id', type: this.idType, required: true }),\n ApiOkResponse({ type: this.entityReturnMessageDto }),\n ApiError(\n 400,\n `The ${this.entityClassName} with the given id was not found`,\n ),\n ]);\n }\n\n idParam() {\n if (this.idType === Number) {\n return Param('id', ParseIntPipe);\n } else {\n return Param('id');\n }\n }\n\n findAll(extras: ResourceOptions = {}): MethodDecorator {\n return MergeMethodDecorators([\n this.usePrefix(Get, extras.prefix),\n ApiOperation({\n summary: `Find all ${this.entityClassName}`,\n ..._.omit(extras, 'prefix'),\n }),\n ApiOkResponse({ type: this.entityArrayReturnMessageDto }),\n ]);\n }\n\n findAllCursorPaginated(extras: ResourceOptions = {}): MethodDecorator {\n return MergeMethodDecorators([\n this.usePrefix(Get, extras.prefix),\n ApiOperation({\n summary: `Find all ${this.entityClassName}`,\n ..._.omit(extras, 'prefix'),\n }),\n ApiOkResponse({ type: this.entityCursorPaginationReturnMessageDto }),\n ]);\n }\n\n private getMutatorColumns() {\n const mutatorColumns = getSpecificFields(this.entityClass, 'getMutator');\n return _.difference(mutatorColumns, this.fieldsInGetToOmit as string[]);\n }\n\n findAllParam() {\n const mutatorColumns = this.getMutatorColumns();\n const restPipes = [OptionalDataPipe(), OmitPipe(this.fieldsInGetToOmit)];\n if (this.options.skipNonQueryableFields) {\n restPipes.push(PickPipe(this.queryableFields));\n }\n if (mutatorColumns.length) {\n return Query(new MutatorPipe(this.entityClass), ...restPipes);\n } else {\n return Query(...restPipes);\n }\n }\n\n update(extras: ResourceOptions = {}): MethodDecorator {\n return MergeMethodDecorators([\n this.usePrefix(Patch, extras.prefix, ':id'),\n HttpCode(200),\n ApiOperation({\n summary: `Update a ${this.entityClassName} by id`,\n ..._.omit(extras, 'prefix'),\n }),\n ApiParam({ name: 'id', type: this.idType, required: true }),\n ApiBody({ type: this.updateDto }),\n ApiBlankResponse(),\n ApiError(\n 404,\n `The ${this.entityClassName} with the given id was not found`,\n ),\n ApiError(400, `The ${this.entityClassName} is not valid`),\n ApiError(500, 'Internal error'),\n ]);\n }\n\n updateParam() {\n return Body(OptionalDataPipe(), OmitPipe(this.fieldsInUpdateToOmit));\n }\n\n delete(extras: ResourceOptions = {}): MethodDecorator {\n return MergeMethodDecorators([\n this.usePrefix(Delete, extras.prefix, ':id'),\n HttpCode(200),\n ApiOperation({\n summary: `Delete a ${this.entityClassName} by id`,\n ..._.omit(extras, 'prefix'),\n }),\n ApiParam({ name: 'id', type: this.idType, required: true }),\n ApiBlankResponse(),\n ApiError(\n 404,\n `The ${this.entityClassName} with the given id was not found`,\n ),\n ApiError(500, 'Internal error'),\n ]);\n }\n\n import(extras: ResourceOptions = {}): MethodDecorator {\n return MergeMethodDecorators([\n this.usePrefix(Post, extras.prefix, 'import'),\n HttpCode(200),\n ApiOperation({\n summary: `Import ${this.entityClassName}`,\n ..._.omit(extras, 'prefix'),\n }),\n ApiBody({ type: this.importDto }),\n ApiOkResponse({ type: this.importReturnMessageDto }),\n ApiError(500, 'Internal error'),\n ]);\n }\n\n operation(\n operationName: string,\n options: ResourceOptions & {\n returnType?: AnyClass;\n } = {},\n ): MethodDecorator {\n return MergeMethodDecorators([\n this.usePrefix(Post, options.prefix, ':id', operationName),\n HttpCode(200),\n ApiOperation({\n summary: `${upperFirst(operationName)} a ${this.entityClassName} by id`,\n ..._.omit(options, 'prefix', 'returnType'),\n }),\n options.returnType\n ? ApiTypeResponse(options.returnType)\n : ApiBlankResponse(),\n ApiError(\n 404,\n `The ${this.entityClassName} with the given id was not found`,\n ),\n ]);\n }\n\n baseController<\n Options extends Partial<{\n paginateType: RestfulPaginateType;\n globalMethodDecorators: MethodDecorator[];\n routes: Partial<\n Record<\n RestfulMethods,\n Partial<{\n enabled: boolean;\n methodDecorators: MethodDecorator[];\n }>\n >\n >;\n // eslint-disable-next-line @typescript-eslint/ban-types\n }> = {},\n >(routeOptions: Options = {} as Options) {\n // \u8BA1\u7B97\u51FA\u54EA\u4E9B\u662F disabled \u7684\u65B9\u6CD5\n type Routes = NonNullable<Options['routes']>;\n type ExplicitlyEnabledOrDisabledMethods<E> = {\n [M in keyof Routes]: Routes[M] extends { enabled: E } ? M : never;\n }[keyof Routes] &\n RestfulMethods;\n type ExplicitlyDisabledMethods = ExplicitlyEnabledOrDisabledMethods<false>;\n type ExplicitlyEnabledMethods = ExplicitlyEnabledOrDisabledMethods<true>;\n\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const _this = this;\n\n const cl =\n class SpecificRestfulController extends BaseRestfulController<T> {\n constructor(service: CrudBase<T> | Repository<T>) {\n super(service, {\n paginateType: routeOptions.paginateType || 'offset',\n relations: _this.options.relations,\n entityClass: _this.entityClass,\n });\n }\n } as new (service: CrudBase<T> | Repository<T>) => ([\n ExplicitlyEnabledMethods,\n ] extends [never]\n ? Omit<BaseRestfulController<T>, ExplicitlyDisabledMethods>\n : Pick<BaseRestfulController<T>, ExplicitlyEnabledMethods>) & {\n _service: CrudBase<T>;\n };\n\n const anyTrueWritten = RestfulMethods.some(\n (m) => routeOptions?.routes?.[m]?.enabled === true,\n );\n\n const validMethods = RestfulMethods.filter((m) => {\n const value = routeOptions?.routes?.[m]?.enabled;\n if (value === false) return false;\n if (value === true) return true;\n return !anyTrueWritten || value === true;\n });\n\n const useDecorators: Record<\n RestfulMethods,\n {\n paramDecorators: () => ParameterDecorator[];\n paramTypes: AnyClass[];\n methodDecorators: () => MethodDecorator[];\n }\n > = {\n findOne: {\n paramTypes: [this.idType as AnyClass],\n paramDecorators: () => [this.idParam()],\n methodDecorators: () => [this.findOne()],\n },\n findAll: {\n paramTypes: [\n routeOptions.paginateType === 'cursor'\n ? this.findAllCursorPaginatedDto\n : routeOptions.paginateType === 'none'\n ? OmitType(this.findAllDto, [\n 'pageCount',\n 'recordsPerPage',\n ] as (keyof Omit<T, O | F>)[])\n : this.findAllDto,\n ],\n paramDecorators: () => [this.findAllParam()],\n methodDecorators: () => [\n routeOptions.paginateType === 'cursor'\n ? this.findAllCursorPaginated()\n : this.findAll(),\n ],\n },\n create: {\n paramTypes: [this.createDto],\n paramDecorators: () => [this.createParam()],\n methodDecorators: () => [this.create()],\n },\n update: {\n paramTypes: [this.idType as AnyClass, this.updateDto],\n paramDecorators: () => [this.idParam(), this.updateParam()],\n methodDecorators: () => [this.update()],\n },\n delete: {\n paramTypes: [this.idType as AnyClass],\n paramDecorators: () => [this.idParam()],\n methodDecorators: () => [this.delete()],\n },\n import: {\n paramTypes: [this.importDto],\n paramDecorators: () => [this.createParam()],\n methodDecorators: () => [this.import()],\n },\n };\n\n for (const method of validMethods) {\n // 1. Override \u7EE7\u627F\u65B9\u6CD5\uFF0C\u8BA9\u5B83\u6210\u4E3A\u81EA\u5DF1\u7684\uFF08\u4EE5\u4FBF\u80FD\u88C5\u9970\uFF09\n const methodImpl = function namedMethodImpl(...args: any[]) {\n return BaseRestfulController.prototype[method].apply(this, args);\n };\n Object.defineProperty(methodImpl, 'name', {\n value: method,\n configurable: true,\n });\n cl.prototype[method] = methodImpl;\n\n const paramDecorators = useDecorators[method].paramDecorators();\n const paramTypes = useDecorators[method].paramTypes;\n const methodDecorators = [\n ...useDecorators[method].methodDecorators(),\n ...(routeOptions?.routes?.[method]?.methodDecorators || []),\n ...(routeOptions?.globalMethodDecorators || []),\n ];\n\n // 2. \u5148\u6253\u53C2\u6570\u88C5\u9970\u5668\n paramDecorators.forEach((paramDecorator, index) => {\n paramDecorator(cl.prototype, method, index);\n });\n\n // 3. \u6253 Reflect Metadata\uFF08design:paramtypes\uFF09\n Reflect.defineMetadata(\n 'design:paramtypes',\n paramTypes,\n cl.prototype,\n method,\n );\n\n // 4. \u6253 Reflect Metadata\uFF08design:type \u548C design:returntype\uFF09\n const baseDescriptor = Object.getOwnPropertyDescriptor(\n BaseRestfulController.prototype,\n method,\n );\n if (baseDescriptor) {\n // \u65B9\u6CD5\u662F function\n Reflect.defineMetadata(\n 'design:type',\n baseDescriptor.value,\n cl.prototype,\n method,\n );\n\n // \u8FD9\u91CC return type \u901A\u5E38\u53EF\u4EE5\u662F Promise<any>\uFF0C\u4F46\u5982\u679C\u4F60\u6709\u66F4\u5177\u4F53\u7684\u7C7B\u578B\uFF0C\u53EF\u4EE5\u6269\u5C55\n Reflect.defineMetadata(\n 'design:returntype',\n Promise,\n cl.prototype,\n method,\n );\n }\n\n // 5. \u518D\u6253\u65B9\u6CD5\u88C5\u9970\u5668\n methodDecorators.forEach((methodDecorator) => {\n const descriptor = Object.getOwnPropertyDescriptor(\n cl.prototype,\n method,\n )!;\n methodDecorator(cl.prototype, method, descriptor);\n Object.defineProperty(cl.prototype, method, descriptor);\n });\n }\n\n return RenameClass(cl, `${this.entityClassName}Controller`);\n }\n\n crudService(options: CrudOptions<T> = {}) {\n return CrudService(this.entityClass, {\n relations: this.options.relations,\n outputFieldsToOmit: this.options.outputFieldsToOmit,\n ...options,\n });\n }\n}\n", "import { CrudBase, CrudService } from '../crud-base';\nimport { Repository } from 'typeorm';\nimport { ClassType } from 'nesties';\nimport { RelationDef } from '../utility/relation-def';\n\nexport const RestfulMethods = [\n 'findOne',\n 'findAll',\n 'create',\n 'update',\n 'delete',\n 'import',\n] as const;\n\nexport type RestfulMethods = typeof RestfulMethods[number];\n\nexport type RestfulPaginateType = 'offset' | 'cursor' | 'none';\n\nexport class BaseRestfulController<T extends { id: any }> {\n _service: CrudBase<T>;\n constructor(\n serviceOrRepo: CrudBase<T> | Repository<T>,\n public _options: Partial<{\n paginateType: RestfulPaginateType;\n relations: (string | RelationDef)[];\n entityClass: ClassType<T>;\n }> = {},\n ) {\n if (serviceOrRepo instanceof CrudBase) {\n this._service = serviceOrRepo;\n } else {\n const crudServiceClass = CrudService(this._options.entityClass, {\n relations: this._options.relations,\n });\n this._service = new crudServiceClass(serviceOrRepo);\n }\n }\n\n findOne(id: number) {\n return this._service.findOne(id);\n }\n\n findAll(dto: Partial<T>) {\n if (this._options.paginateType === 'cursor') {\n return this._service.findAllCursorPaginated(dto);\n }\n if (this._options.paginateType === 'offset') {\n return this._service.findAll(dto);\n }\n dto['recordsPerPage'] ??= 99999;\n return this._service.findAll(dto);\n }\n\n create(dto: T) {\n return this._service.create(dto);\n }\n\n update(id: number, dto: Partial<T>) {\n return this._service.update(id, dto);\n }\n\n delete(id: number) {\n return this._service.delete(id);\n }\n\n import(data: { data: T[] }) {\n return this._service.importEntities(data.data);\n }\n}\n", "import { OmitType } from '@nestjs/swagger';\nimport { Exclude, Expose } from 'class-transformer';\nimport { ClassType } from 'nesties';\n\nexport const OmitTypeExclude = <T, K extends keyof T>(\n cl: ClassType<T>,\n keys: readonly K[],\n) => {\n const omitted = OmitType(cl, keys);\n for (const key of keys) {\n Exclude()(omitted.prototype, key as any);\n }\n return omitted;\n};\n\nexport const PickTypeExpose = <T, K extends keyof T>(\n cl: ClassType<T>,\n keys: readonly K[],\n) => {\n const picked = OmitType(\n cl,\n Object.keys(cl.prototype).filter((k) => !keys.includes(k as K)) as K[],\n );\n for (const key of keys) {\n Expose()(picked.prototype, key as any);\n }\n return picked;\n};\n", "import { ApiProperty, ApiPropertyOptions } from '@nestjs/swagger';\nimport { getSpecificFields, reflector } from './metadata';\nimport { AnyClass, getApiProperty } from 'nesties';\nimport _ from 'lodash';\nimport { DECORATORS } from '@nestjs/swagger/dist/constants';\n\nexport const PatchColumnsInGet = <C extends AnyClass>(\n cl: C,\n originalCl: AnyClass = cl,\n fieldsToOmit: string[] = [],\n) => {\n const omit = new Set(fieldsToOmit);\n const useCl = originalCl || cl;\n const mutateFields = getSpecificFields(useCl, 'getMutator').filter(\n (f) => !omit.has(f),\n );\n for (const field of mutateFields) {\n const originalApiProp = getApiProperty(originalCl, field);\n const info = reflector.get('getMutator', useCl, field);\n Reflect.defineMetadata(\n DECORATORS.API_MODEL_PROPERTIES,\n {\n ...originalApiProp,\n type: String,\n required: false,\n example: info.example ?? undefined,\n enum: info.enum ?? undefined,\n default: undefined,\n ...(info.apiPropertyExtras || {}),\n },\n cl.prototype,\n field,\n );\n }\n const queryableFieldsRemaining = _.difference(\n getSpecificFields(useCl, 'queryCondition'),\n mutateFields,\n );\n for (const field of queryableFieldsRemaining) {\n const originalApiProp = getApiProperty(originalCl, field);\n Reflect.defineMetadata(\n DECORATORS.API_MODEL_PROPERTIES,\n {\n ...originalApiProp,\n default: undefined, // we remove every default value in get\n },\n cl.prototype,\n field,\n );\n }\n return cl;\n};\n", "import { getSpecificFields, reflector } from './metadata';\nimport { PipeTransform } from '@nestjs/common';\nimport { AnyClass } from 'nesties';\n\nexport class MutatorPipe implements PipeTransform {\n constructor(private readonly entityClass: AnyClass) {}\n\n private mutatorFields = getSpecificFields(this.entityClass, 'getMutator');\n\n transform<T>(obj: T): T {\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n const newObj = { ...obj } as any;\n for (const field of this.mutatorFields) {\n const v = newObj[field];\n if (v == null) {\n continue;\n }\n const mutator = reflector.get('getMutator', this.entityClass, field);\n newObj[field] = mutator.mutator(v);\n }\n return newObj;\n }\n}\n", "import { SelectQueryBuilder } from 'typeorm';\nimport { parseBool } from './parse-bool';\n\nexport function createQueryCondition(\n cond: <T>(\n obj: T,\n qb: SelectQueryBuilder<T>,\n entityName: string,\n field: keyof T & string,\n ) =>\n | void\n | SelectQueryBuilder<any>\n | string\n | { query: string; params: Record<string, any> },\n) {\n return <T>(\n obj: T,\n qb: SelectQueryBuilder<T>,\n entityName: string,\n ...fields: (keyof T & string)[]\n ) => {\n for (const field of fields) {\n if (obj[field] == null) {\n continue;\n }\n const ret = cond(obj, qb, entityName, field);\n if (typeof ret === 'string') {\n qb.andWhere(ret);\n } else if (typeof ret === 'object' && typeof ret['query'] === 'string') {\n const _ret = ret as { query: string; params: Record<string, any> };\n qb.andWhere(_ret.query, _ret.params);\n }\n }\n return qb;\n };\n}\n\nexport const applyQueryProperty = createQueryCondition(\n (obj, qb, entityName, field) =>\n qb.andWhere(`${entityName}.${field} = :${field}`, { [field]: obj[field] }),\n);\n\nexport const applyQueryPropertyLike = createQueryCondition(\n (obj, qb, entityName, field) =>\n qb.andWhere(`${entityName}.${field} like (:${field} || '%')`, {\n [field]: obj[field],\n }),\n);\n\nexport const applyQueryPropertySearch = createQueryCondition(\n (obj, qb, entityName, field) =>\n qb.andWhere(`${entityName}.${field} like ('%' || :${field} || '%')`, {\n [field]: obj[field],\n }),\n);\n\nexport const applyQueryPropertyZeroNullable = createQueryCondition(\n (obj, qb, entityName, field) => {\n if ([0, '0'].indexOf(obj[field] as any) !== -1) {\n qb.andWhere(`${entityName}.${field} IS NULL`);\n } else {\n qb.andWhere(`${entityName}.${field} = :${field}`, {\n [field]: obj[field],\n });\n }\n },\n);\n\nexport const applyQueryMatchBoolean = createQueryCondition(\n (obj, qb, entityName, field) => {\n const value = parseBool(obj[field]);\n if (value === true) {\n qb.andWhere(`${entityName}.${field} = TRUE`);\n }\n if (value === false) {\n qb.andWhere(`${entityName}.${field} = FALSE`);\n }\n },\n);\n\nexport const applyQueryMatchBooleanMySQL = createQueryCondition(\n (obj, qb, entityName, field) => {\n const value = parseBool(obj[field]);\n if (value === true) {\n qb.andWhere(`${entityName}.${field} = 1`);\n }\n if (value === false) {\n qb.andWhere(`${entityName}.${field} = 0`);\n }\n },\n);\n"],
5
+ "mappings": "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",
6
+ "names": ["import_class_validator", "import_swagger", "import_nesties", "import_class_validator", "import_nesties", "import_swagger", "import_nesties", "import_class_validator", "import_class_transformer", "import_nesties", "import_nesties", "import_typeorm", "import_typeorm", "import_typeorm", "import_class_validator", "import_swagger", "import_typeorm", "import_class_validator", "import_nesties", "import_common", "import_lodash", "import_nesties", "import_typeorm", "_", "import_typeorm", "import_lodash", "obj", "key", "value", "data", "SJSON", "_", "keys", "qb", "id", "type", "PQueue", "_", "savedEnt", "ent", "reason", "import_common", "import_nesties", "import_swagger", "import_lodash", "import_nesties", "import_swagger", "import_class_transformer", "import_nesties", "import_lodash", "omit", "_", "_"]
7
7
  }