diff --git a/packages/utils/src/modules-sdk/abstract-module-service-factory.ts b/packages/utils/src/modules-sdk/abstract-module-service-factory.ts index a6c4cd430f..d57506fb4d 100644 --- a/packages/utils/src/modules-sdk/abstract-module-service-factory.ts +++ b/packages/utils/src/modules-sdk/abstract-module-service-factory.ts @@ -47,14 +47,19 @@ const writeMethods = [ const methods: BaseMethods[] = [...readMethods, ...writeMethods] +type ModelDTOConfig = { + dto: object + create?: object + update?: object +} +type ModelDTOConfigRecord = Record +type ModelNamingConfig = { + singular?: string + plural?: string +} + type ModelsConfigTemplate = { - [ModelName: string]: { - singular?: string - plural?: string - dto: object - create?: object - update?: object - } + [ModelName: string]: ModelDTOConfig & ModelNamingConfig } type ExtractSingularName< @@ -63,17 +68,17 @@ type ExtractSingularName< > = T[K] extends { singular?: string } ? T[K]["singular"] : K type CreateMethodName< - ModelConfig extends Record, - ModelKey = keyof ModelConfig -> = ModelConfig[ModelKey] extends { create?: object } - ? `create${ExtractPluralName}` + TModelDTOConfig extends ModelDTOConfigRecord, + TModelName = keyof TModelDTOConfig +> = TModelDTOConfig[TModelName] extends { create?: object } + ? `create${ExtractPluralName}` : never type UpdateMethodName< - ModelConfig extends Record, - ModelKey = keyof ModelConfig -> = ModelConfig[ModelKey] extends { update?: object } - ? `update${ExtractPluralName}` + TModelDTOConfig extends ModelDTOConfigRecord, + TModelName = keyof TModelDTOConfig +> = TModelDTOConfig[TModelName] extends { update?: object } + ? `update${ExtractPluralName}` : never type ExtractPluralName, K = keyof T> = T[K] extends { @@ -128,33 +133,42 @@ export interface AbstractModuleServiceBase { export type AbstractModuleService< TContainer, TMainModelDTO, - ModelsConfig extends ModelsConfigTemplate + TModelDTOConfig extends ModelsConfigTemplate > = AbstractModuleServiceBase & { - [K in keyof ModelsConfig as `retrieve${ExtractSingularName & + [TModelName in keyof TModelDTOConfig as `retrieve${ExtractSingularName< + TModelDTOConfig, + TModelName + > & string}`]: ( id: string, config?: FindConfig, sharedContext?: Context - ) => Promise + ) => Promise } & { - [K in keyof ModelsConfig as `list${ExtractPluralName & + [TModelName in keyof TModelDTOConfig as `list${ExtractPluralName< + TModelDTOConfig, + TModelName + > & string}`]: ( filters?: any, config?: FindConfig, sharedContext?: Context - ) => Promise + ) => Promise } & { - [K in keyof ModelsConfig as `listAndCount${ExtractPluralName< - ModelsConfig, - K + [TModelName in keyof TModelDTOConfig as `listAndCount${ExtractPluralName< + TModelDTOConfig, + TModelName > & string}`]: { (filters?: any, config?: FindConfig, sharedContext?: Context): Promise< - [ModelsConfig[K & string]["dto"][], number] + [TModelDTOConfig[TModelName & string]["dto"][], number] > } } & { - [K in keyof ModelsConfig as `delete${ExtractPluralName & + [TModelName in keyof TModelDTOConfig as `delete${ExtractPluralName< + TModelDTOConfig, + TModelName + > & string}`]: { ( primaryKeyValues: string | object | string[] | object[], @@ -162,7 +176,10 @@ export type AbstractModuleService< ): Promise } } & { - [K in keyof ModelsConfig as `softDelete${ExtractPluralName & + [TModelName in keyof TModelDTOConfig as `softDelete${ExtractPluralName< + TModelDTOConfig, + TModelName + > & string}`]: { ( primaryKeyValues: string | object | string[] | object[], @@ -171,7 +188,10 @@ export type AbstractModuleService< ): Promise | void> } } & { - [K in keyof ModelsConfig as `restore${ExtractPluralName & + [TModelName in keyof TModelDTOConfig as `restore${ExtractPluralName< + TModelDTOConfig, + TModelName + > & string}`]: { ( primaryKeyValues: string | object | string[] | object[], @@ -180,42 +200,44 @@ export type AbstractModuleService< ): Promise | void> } } & { - [ModelName in keyof ModelsConfig as CreateMethodName< - ModelsConfig, - ModelName + [TModelName in keyof TModelDTOConfig as CreateMethodName< + TModelDTOConfig, + TModelName >]: { ( - data: ModelsConfig[ModelName]["create"][], + data: TModelDTOConfig[TModelName]["create"][], sharedContext?: Context - ): Promise + ): Promise } } & { - [ModelName in keyof ModelsConfig as CreateMethodName< - ModelsConfig, - ModelName - >]: { - (data: ModelsConfig[ModelName]["create"], sharedContext?: Context): Promise< - ModelsConfig[ModelName]["dto"] - > - } -} & { - [ModelName in keyof ModelsConfig as UpdateMethodName< - ModelsConfig, - ModelName + [TModelName in keyof TModelDTOConfig as CreateMethodName< + TModelDTOConfig, + TModelName >]: { ( - data: ModelsConfig[ModelName]["update"][], + data: TModelDTOConfig[TModelName]["create"], sharedContext?: Context - ): Promise + ): Promise } } & { - [ModelName in keyof ModelsConfig as UpdateMethodName< - ModelsConfig, - ModelName + [TModelName in keyof TModelDTOConfig as UpdateMethodName< + TModelDTOConfig, + TModelName >]: { - (data: ModelsConfig[ModelName]["update"], sharedContext?: Context): Promise< - ModelsConfig[ModelName]["dto"] - > + ( + data: TModelDTOConfig[TModelName]["update"][], + sharedContext?: Context + ): Promise + } +} & { + [TModelName in keyof TModelDTOConfig as UpdateMethodName< + TModelDTOConfig, + TModelName + >]: { + ( + data: TModelDTOConfig[TModelName]["update"], + sharedContext?: Context + ): Promise } }