@elsikora/nestjs-crud-automator 2.1.1 → 2.1.2-dev.1

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.
@@ -21,11 +21,34 @@ require('../../../../../enum/decorator/api/property/number-type.enum.js');
21
21
  require('../../../../../enum/decorator/api/property/string-type.enum.js');
22
22
  require('../../../../../enum/decorator/api/route-type.enum.js');
23
23
  var relationResponse_utility = require('../../../../../utility/dto/generate/relation-response.utility.js');
24
+ var exception_utility = require('../../../../../utility/error/exception.utility.js');
24
25
 
25
26
  class DtoPropertyFactoryRelation {
26
27
  create(metadata, entity, config, method, dtoType, propertyName) {
27
- const { type, ...restProperties } = metadata;
28
- return dtoType === dtoType_enum.EApiDtoType.RESPONSE ? object_decorator.ApiPropertyObject({ description: metadata.description, entity, isArray: false, type: relationResponse_utility.DtoGenerateRelationResponse(entity, method, dtoType, propertyName), ...config, ...restProperties }) : uuid_decorator.ApiPropertyUUID({ description: metadata.description, entity, isArray: false, ...config, ...restProperties });
28
+ const { description, type, ...restProperties } = metadata;
29
+ const relationColumn = entity.columns.find((column) => column.name == propertyName);
30
+ const relationDescriptionCandidate = description?.trim();
31
+ let relationDescription = propertyName;
32
+ const relationName = `${String(entity.name)}.${propertyName}`;
33
+ if (relationDescriptionCandidate) {
34
+ relationDescription = relationDescriptionCandidate;
35
+ }
36
+ if (!relationColumn?.relation?.target) {
37
+ throw exception_utility.ErrorException(`Property ${relationName} is marked as RELATION but TypeORM relation target metadata was not found. Add a TypeORM relation decorator such as @ManyToOne(() => TargetEntity).`);
38
+ }
39
+ if (dtoType === dtoType_enum.EApiDtoType.RESPONSE) {
40
+ return object_decorator.ApiPropertyObject({
41
+ description: relationDescription,
42
+ entity,
43
+ isArray: false,
44
+ type: relationResponse_utility.DtoGenerateRelationResponse(entity, method, dtoType, propertyName, {
45
+ relationDescription,
46
+ }),
47
+ ...config,
48
+ ...restProperties,
49
+ });
50
+ }
51
+ return uuid_decorator.ApiPropertyUUID({ description: relationDescription, entity, isArray: false, ...config, ...restProperties });
29
52
  }
30
53
  }
31
54
 
@@ -1 +1 @@
1
- {"version":3,"file":"relation.class.js","sources":["../../../../../../../../src/class/utility/dto/property/factory/relation.class.ts"],"sourcesContent":[null],"names":["EApiDtoType","ApiPropertyObject","DtoGenerateRelationResponse","ApiPropertyUUID"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;MAUa,0BAA0B,CAAA;IACtC,MAAM,CAAC,QAA4C,EAAE,MAAqB,EAAE,MAAyC,EAAE,MAAqB,EAAE,OAAoB,EAAE,YAAoB,EAAA;QACvL,MAAM,EAAE,IAAI,EAAE,GAAG,cAAc,EAAE,GAAuC,QAAQ;AAEhF,QAAA,OAAO,OAAO,KAAKA,wBAAW,CAAC,QAAQ,GAAGC,kCAAiB,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAEC,oDAA2B,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,CAAC,EAAE,GAAG,MAAM,EAAE,GAAG,cAAc,EAAE,CAAC,GAAGC,8BAAe,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,MAAM,EAAE,GAAG,cAAc,EAAE,CAAC;IAClV;AACA;;;;"}
1
+ {"version":3,"file":"relation.class.js","sources":["../../../../../../../../src/class/utility/dto/property/factory/relation.class.ts"],"sourcesContent":[null],"names":["ErrorException","EApiDtoType","ApiPropertyObject","DtoGenerateRelationResponse","ApiPropertyUUID"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;MAWa,0BAA0B,CAAA;IACtC,MAAM,CAAC,QAA4C,EAAE,MAAqB,EAAE,MAAyC,EAAE,MAAqB,EAAE,OAAoB,EAAE,YAAoB,EAAA;QACvL,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,cAAc,EAAE,GAAuC,QAAQ;AAC7F,QAAA,MAAM,cAAc,GAAoC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAA2B,KAAc,MAAM,CAAC,IAAI,IAAI,YAAY,CAAC;AAClJ,QAAA,MAAM,4BAA4B,GAAuB,WAAW,EAAE,IAAI,EAAE;QAC5E,IAAI,mBAAmB,GAAW,YAAY;AAC9C,QAAA,MAAM,YAAY,GAAW,CAAA,EAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA,CAAA,EAAI,YAAY,CAAA,CAAE;QAErE,IAAI,4BAA4B,EAAE;YACjC,mBAAmB,GAAG,4BAA4B;QACnD;AAEA,QAAA,IAAI,CAAC,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE;AACtC,YAAA,MAAMA,gCAAc,CAAC,CAAA,SAAA,EAAY,YAAY,CAAA,mJAAA,CAAqJ,CAAC;QACpM;AAEA,QAAA,IAAI,OAAO,KAAKC,wBAAW,CAAC,QAAQ,EAAE;AACrC,YAAA,OAAOC,kCAAiB,CAAC;AACxB,gBAAA,WAAW,EAAE,mBAAmB;gBAChC,MAAM;AACN,gBAAA,OAAO,EAAE,KAAK;gBACd,IAAI,EAAEC,oDAA2B,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE;oBACxE,mBAAmB;iBACnB,CAAC;AACF,gBAAA,GAAG,MAAM;AACT,gBAAA,GAAG,cAAc;AACjB,aAAA,CAAC;QACH;QAEA,OAAOC,8BAAe,CAAC,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,MAAM,EAAE,GAAG,cAAc,EAAE,CAAC;IACnH;AACA;;;;"}
@@ -1,7 +1,11 @@
1
+ import { IApiBaseEntity } from '../api-base-entity.interface';
1
2
  import { ColumnType } from 'typeorm';
2
3
  export interface IApiEntityColumn<E> {
3
4
  isPrimary: boolean;
4
5
  metadata?: Record<string, unknown>;
5
6
  name: keyof E;
7
+ relation?: {
8
+ target: IApiBaseEntity;
9
+ };
6
10
  type: ColumnType;
7
11
  }
@@ -1,6 +1,6 @@
1
+ import { IApiEntity } from '../../../interface/entity';
1
2
  import { Type } from '@nestjs/common';
2
3
  import { EApiDtoType, EApiRouteType } from '../../../enum/decorator/api';
3
- import { IApiEntity } from '../../../interface/entity';
4
4
  /**
5
5
  * Creates a simple relationship DTO containing only an ID field.
6
6
  * Used for representing related entities in API responses with minimal information.
@@ -8,7 +8,11 @@ import { IApiEntity } from '../../../interface/entity';
8
8
  * @param {EApiRouteType} method - The API route type (CREATE, DELETE, GET, etc.)
9
9
  * @param {EApiDtoType} dtoType - The type of DTO (REQUEST, RESPONSE, etc.)
10
10
  * @param {string} propertyName - The name of the relation property
11
+ * @param {{ relationDescription?: string }} [options] - Optional relation metadata used for the nested identifier schema
12
+ * @param {string} [options.relationDescription] - Relation-aware description to use for the nested id field.
11
13
  * @returns {Type<unknown>} A generated DTO class for relation representation
12
14
  * @template E - The entity type
13
15
  */
14
- export declare function DtoGenerateRelationResponse<E>(entity: IApiEntity<E>, method: EApiRouteType, dtoType: EApiDtoType, propertyName: string): Type<unknown>;
16
+ export declare function DtoGenerateRelationResponse<E>(entity: IApiEntity<E>, method: EApiRouteType, dtoType: EApiDtoType, propertyName: string, options?: {
17
+ relationDescription?: string;
18
+ }): Type<unknown>;
@@ -12,15 +12,28 @@ var capitalizeString_utility = require('../../capitalize-string.utility.js');
12
12
  * @param {EApiRouteType} method - The API route type (CREATE, DELETE, GET, etc.)
13
13
  * @param {EApiDtoType} dtoType - The type of DTO (REQUEST, RESPONSE, etc.)
14
14
  * @param {string} propertyName - The name of the relation property
15
+ * @param {{ relationDescription?: string }} [options] - Optional relation metadata used for the nested identifier schema
16
+ * @param {string} [options.relationDescription] - Relation-aware description to use for the nested id field.
15
17
  * @returns {Type<unknown>} A generated DTO class for relation representation
16
18
  * @template E - The entity type
17
19
  */
18
- function DtoGenerateRelationResponse(entity, method, dtoType, propertyName) {
20
+ function DtoGenerateRelationResponse(entity, method, dtoType, propertyName, options = {}) {
21
+ const entityName = (entity.name ?? "").trim();
22
+ const relationDescriptionCandidate = options.relationDescription?.trim();
23
+ let relationDescription = propertyName;
24
+ if (relationDescriptionCandidate) {
25
+ relationDescription = relationDescriptionCandidate;
26
+ }
27
+ const shouldPrefixOwnerName = !!entityName && !relationDescription.toLocaleLowerCase().startsWith(`${entityName.toLocaleLowerCase()} `);
28
+ const identifierEntity = {
29
+ ...entity,
30
+ name: shouldPrefixOwnerName ? `${entityName} ${relationDescription}` : relationDescription,
31
+ };
19
32
  class GeneratedRelationDTO {
20
33
  id;
21
34
  }
22
35
  tslib_es6.__decorate([
23
- uuid_decorator.ApiPropertyUUID({ entity, isResponse: true }),
36
+ uuid_decorator.ApiPropertyUUID({ entity: identifierEntity, isResponse: true }),
24
37
  tslib_es6.__metadata("design:type", String)
25
38
  ], GeneratedRelationDTO.prototype, "id", void 0);
26
39
  Object.defineProperty(GeneratedRelationDTO, "name", { value: `${String(entity.name)}${camelCaseString_utility.CamelCaseString(method)}${camelCaseString_utility.CamelCaseString(dtoType)}${capitalizeString_utility.CapitalizeString(propertyName)}DTO` });
@@ -1 +1 @@
1
- {"version":3,"file":"relation-response.utility.js","sources":["../../../../../../src/utility/dto/generate/relation-response.utility.ts"],"sourcesContent":[null],"names":["__decorate","ApiPropertyUUID","CamelCaseString","CapitalizeString"],"mappings":";;;;;;;AAQA;;;;;;;;;AASG;AACG,SAAU,2BAA2B,CAAI,MAAqB,EAAE,MAAqB,EAAE,OAAoB,EAAE,YAAoB,EAAA;AACtI,IAAA,MAAM,oBAAoB,CAAA;AAEzB,QAAA,EAAE;AACF;AADA,IAAAA,oBAAA,CAAA;QADCC,8BAAe,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;;AAClC,KAAA,EAAA,oBAAA,CAAA,SAAA,EAAA,IAAA,EAAA,MAAA,CAAA;AAGb,IAAA,MAAM,CAAC,cAAc,CAAC,oBAAoB,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,CAAA,EAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA,EAAGC,uCAAe,CAAC,MAAM,CAAC,CAAA,EAAGA,uCAAe,CAAC,OAAO,CAAC,CAAA,EAAGC,yCAAgB,CAAC,YAAY,CAAC,CAAA,GAAA,CAAK,EAAE,CAAC;AAEjL,IAAA,OAAO,oBAAoB;AAC5B;;;;"}
1
+ {"version":3,"file":"relation-response.utility.js","sources":["../../../../../../src/utility/dto/generate/relation-response.utility.ts"],"sourcesContent":[null],"names":["__decorate","ApiPropertyUUID","CamelCaseString","CapitalizeString"],"mappings":";;;;;;;AAQA;;;;;;;;;;;AAWG;AACG,SAAU,2BAA2B,CAAI,MAAqB,EAAE,MAAqB,EAAE,OAAoB,EAAE,YAAoB,EAAE,OAAA,GAA4C,EAAE,EAAA;AACtL,IAAA,MAAM,UAAU,GAAW,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE;IACrD,MAAM,4BAA4B,GAAuB,OAAO,CAAC,mBAAmB,EAAE,IAAI,EAAE;IAC5F,IAAI,mBAAmB,GAAW,YAAY;IAE9C,IAAI,4BAA4B,EAAE;QACjC,mBAAmB,GAAG,4BAA4B;IACnD;IAEA,MAAM,qBAAqB,GAAY,CAAC,CAAC,UAAU,IAAI,CAAC,mBAAmB,CAAC,iBAAiB,EAAE,CAAC,UAAU,CAAC,CAAA,EAAG,UAAU,CAAC,iBAAiB,EAAE,CAAA,CAAA,CAAG,CAAC;AAEhJ,IAAA,MAAM,gBAAgB,GAAkB;AACvC,QAAA,GAAG,MAAM;AACT,QAAA,IAAI,EAAE,qBAAqB,GAAG,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,mBAAmB,CAAA,CAAE,GAAG,mBAAmB;KAC1F;AAED,IAAA,MAAM,oBAAoB,CAAA;AAEzB,QAAA,EAAE;AACF;AADA,IAAAA,oBAAA,CAAA;QADCC,8BAAe,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;;AACpD,KAAA,EAAA,oBAAA,CAAA,SAAA,EAAA,IAAA,EAAA,MAAA,CAAA;AAGb,IAAA,MAAM,CAAC,cAAc,CAAC,oBAAoB,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,CAAA,EAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA,EAAGC,uCAAe,CAAC,MAAM,CAAC,CAAA,EAAGA,uCAAe,CAAC,OAAO,CAAC,CAAA,EAAGC,yCAAgB,CAAC,YAAY,CAAC,CAAA,GAAA,CAAK,EAAE,CAAC;AAEjL,IAAA,OAAO,oBAAoB;AAC5B;;;;"}
@@ -97,7 +97,7 @@ function GenerateEntityInformation(entity) {
97
97
  type: options.type,
98
98
  };
99
99
  }),
100
- ...relationList.map(({ propertyName, relationType }) => {
100
+ ...relationList.map(({ propertyName, relationType, type }) => {
101
101
  let metadata;
102
102
  for (const entityName of entityNames) {
103
103
  metadata = storage.getMetadata(entityName, propertyName);
@@ -105,10 +105,34 @@ function GenerateEntityInformation(entity) {
105
105
  break;
106
106
  }
107
107
  }
108
+ let relationTarget;
109
+ let resolvedRelationTarget = type;
110
+ if (typeof type === "function") {
111
+ try {
112
+ resolvedRelationTarget = type();
113
+ }
114
+ catch {
115
+ resolvedRelationTarget = type;
116
+ }
117
+ }
118
+ if (typeof resolvedRelationTarget === "string") {
119
+ relationTarget = { name: resolvedRelationTarget };
120
+ }
121
+ else if (typeof resolvedRelationTarget === "function" && resolvedRelationTarget.name) {
122
+ relationTarget = resolvedRelationTarget;
123
+ }
124
+ else if (typeof resolvedRelationTarget === "object" && resolvedRelationTarget !== null && "name" in resolvedRelationTarget && typeof resolvedRelationTarget.name === "string") {
125
+ relationTarget = resolvedRelationTarget;
126
+ }
108
127
  return {
109
128
  isPrimary: false,
110
129
  metadata,
111
130
  name: propertyName,
131
+ relation: relationTarget
132
+ ? {
133
+ target: relationTarget,
134
+ }
135
+ : undefined,
112
136
  type: relationType,
113
137
  };
114
138
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"generate-entity-information.utility.js","sources":["../../../../src/utility/generate-entity-information.utility.ts"],"sourcesContent":[null],"names":["getMetadataArgsStorage","ErrorException","DefaultNamingStrategy","MetadataStorage"],"mappings":";;;;;;AAYA;;;;;AAKG;AACG,SAAU,yBAAyB,CAAI,MAAsB,EAAA;AAClE,IAAA,MAAM,eAAe,GAAkB;AACtC,QAAA,OAAO,EAAE,EAAE;AACX,QAAA,IAAI,EAAE,EAAE;AACR,QAAA,UAAU,EAAE,SAAS;AACrB,QAAA,SAAS,EAAE,EAAE;KACb;AAED,IAAA,eAAe,CAAC,SAAS,GAAG,CAAC,MAAa;;QAEzC,MAAM,KAAK,GAAkCA,8BAAsB,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,EAAqB,KAAe,MAAmB,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC;QAExK,IAAI,CAAC,KAAK,EAAE;YACX,MAAMC,gCAAc,CAAC,CAAA,iBAAA,EAAoB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA,8BAAA,CAAgC,CAAC;QAC9F;QAEA,MAAM,cAAc,GAAG,CAAC,SAA6B,KAAa,IAAIC,6BAAqB,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,IAAI,iBAAiB,EAAE,SAAS,CAAC;QAEpJ,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE;YACjD,MAAM,kBAAkB,GAA+CF,8BAAsB,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,EAAkC,KAAc,MAAM,IAAI,MAAM,CAAC;AAEnM,YAAA,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE;gBAC/B,MAAMC,gCAAc,CAAC,CAAA,+BAAA,EAAkC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA,8BAAA,CAAgC,CAAC;YAC5G;AAAO,iBAAA,IAAI,OAAO,kBAAkB,CAAC,KAAK,KAAK,QAAQ,EAAE;AACxD,gBAAA,OAAO,cAAc,CAAC,kBAAkB,CAAC,KAAK,CAAC;YAChD;iBAAO;;gBAEN,OAAO,cAAc,CAAC,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC;YACtD;QACD;AAEA,QAAA,OAAO,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC;IAClC,CAAC,GAAG;AAEJ,IAAA,eAAe,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI;AAElC,IAAA,MAAM,OAAO,GAAoBE,qCAAe,CAAC,WAAW,EAAE;IAC9D,MAAM,eAAe,GAA0D,EAAE;IACjF,MAAM,WAAW,GAAkB,EAAE;AAErC,IAAA,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE;QACjC,IAAI,OAAO,GAAiE,MAAmE;QAE/I,OAAO,OAAO,EAAE;AACf,YAAA,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC;AAC7B,YAAA,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;YAE9B,MAAM,eAAe,GAAkB,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,SAAS,CAAkB;AAChG,YAAA,MAAM,iBAAiB,GAAY,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,aAAa,CAAC,GAAG,SAAS;AAC5G,YAAA,MAAM,MAAM,GAAiE,OAAO,iBAAiB,KAAK,UAAU,GAAI,iBAAoE,GAAG,SAAS;AAExM,YAAA,IAAI,CAAC,MAAM,IAAI,MAAM,KAAK,MAAM,EAAE;gBACjC;YACD;YAEA,OAAO,GAAG,MAAM;QACjB;IACD;AAAO,SAAA,IAAI,MAAM,CAAC,IAAI,EAAE;AACvB,QAAA,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;IAC9B;AAEA,IAAA,MAAM,UAAU,GAA8BH,8BAAsB,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,EAAsB,KAAa;AACjI,QAAA,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;AAC/B,YAAA,OAAO,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC;QACpC;AAEA,QAAA,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE;AACjC,YAAA,OAAO,KAAK;QACb;QAEA,MAAM,YAAY,GAAmD,MAAmE;AAExI,QAAA,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,aAA6D,KAAc,aAAa,KAAK,YAAY,IAAI,aAAa,CAAC,IAAI,KAAK,YAAY,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC;AAC/N,IAAA,CAAC,CAAC;AAEF,IAAA,MAAM,YAAY,GAAgCA,8BAAsB,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,EAAwB,KAAa;AACzI,QAAA,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;AAC/B,YAAA,OAAO,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC;QACpC;AAEA,QAAA,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE;AACjC,YAAA,OAAO,KAAK;QACb;QAEA,MAAM,YAAY,GAAmD,MAAmE;AAExI,QAAA,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,aAA6D,KAAc,aAAa,KAAK,YAAY,IAAI,aAAa,CAAC,IAAI,KAAK,YAAY,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC;AAC/N,IAAA,CAAC,CAAC;AAEF,IAAA,MAAM,aAAa,GAA+B;QACjD,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,YAAY,EAAsB,KAAI;AACnE,YAAA,IAAI,QAA6C;AAEjD,YAAA,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE;gBACrC,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,UAAU,EAAE,YAAY,CAAC;gBAExD,IAAI,QAAQ,EAAE;oBACb;gBACD;YACD;YAEA,OAAO;AACN,gBAAA,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;gBACnC,QAAQ;AACR,gBAAA,IAAI,EAAE,YAAuB;;gBAE7B,IAAI,EAAE,OAAO,CAAC,IAAK;aACnB;AACF,QAAA,CAAC,CAAC;QACF,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,EAAE,YAAY,EAAwB,KAAI;AAC5E,YAAA,IAAI,QAA6C;AAEjD,YAAA,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE;gBACrC,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,UAAU,EAAE,YAAY,CAAC;gBAExD,IAAI,QAAQ,EAAE;oBACb;gBACD;YACD;YAEA,OAAO;AACN,gBAAA,SAAS,EAAE,KAAK;gBAChB,QAAQ;AACR,gBAAA,IAAI,EAAE,YAAuB;AAC7B,gBAAA,IAAI,EAAE,YAA0B;aAChC;AACF,QAAA,CAAC,CAAC;KACF;AAED,IAAA,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE;AACnC,QAAA,IAAI,MAAM,CAAC,SAAS,EAAE;AACrB,YAAA,eAAe,CAAC,UAAU,GAAG,MAAM;QACpC;IACD;AAEA,IAAA,eAAe,CAAC,OAAO,GAAG,aAAa;AAEvC,IAAA,OAAO,eAAe;AACvB;;;;"}
1
+ {"version":3,"file":"generate-entity-information.utility.js","sources":["../../../../src/utility/generate-entity-information.utility.ts"],"sourcesContent":[null],"names":["getMetadataArgsStorage","ErrorException","DefaultNamingStrategy","MetadataStorage"],"mappings":"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"}
@@ -19,11 +19,34 @@ import '../../../../../enum/decorator/api/property/number-type.enum.js';
19
19
  import '../../../../../enum/decorator/api/property/string-type.enum.js';
20
20
  import '../../../../../enum/decorator/api/route-type.enum.js';
21
21
  import { DtoGenerateRelationResponse } from '../../../../../utility/dto/generate/relation-response.utility.js';
22
+ import { ErrorException } from '../../../../../utility/error/exception.utility.js';
22
23
 
23
24
  class DtoPropertyFactoryRelation {
24
25
  create(metadata, entity, config, method, dtoType, propertyName) {
25
- const { type, ...restProperties } = metadata;
26
- return dtoType === EApiDtoType.RESPONSE ? ApiPropertyObject({ description: metadata.description, entity, isArray: false, type: DtoGenerateRelationResponse(entity, method, dtoType, propertyName), ...config, ...restProperties }) : ApiPropertyUUID({ description: metadata.description, entity, isArray: false, ...config, ...restProperties });
26
+ const { description, type, ...restProperties } = metadata;
27
+ const relationColumn = entity.columns.find((column) => column.name == propertyName);
28
+ const relationDescriptionCandidate = description?.trim();
29
+ let relationDescription = propertyName;
30
+ const relationName = `${String(entity.name)}.${propertyName}`;
31
+ if (relationDescriptionCandidate) {
32
+ relationDescription = relationDescriptionCandidate;
33
+ }
34
+ if (!relationColumn?.relation?.target) {
35
+ throw ErrorException(`Property ${relationName} is marked as RELATION but TypeORM relation target metadata was not found. Add a TypeORM relation decorator such as @ManyToOne(() => TargetEntity).`);
36
+ }
37
+ if (dtoType === EApiDtoType.RESPONSE) {
38
+ return ApiPropertyObject({
39
+ description: relationDescription,
40
+ entity,
41
+ isArray: false,
42
+ type: DtoGenerateRelationResponse(entity, method, dtoType, propertyName, {
43
+ relationDescription,
44
+ }),
45
+ ...config,
46
+ ...restProperties,
47
+ });
48
+ }
49
+ return ApiPropertyUUID({ description: relationDescription, entity, isArray: false, ...config, ...restProperties });
27
50
  }
28
51
  }
29
52
 
@@ -1 +1 @@
1
- {"version":3,"file":"relation.class.js","sources":["../../../../../../../../src/class/utility/dto/property/factory/relation.class.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;MAUa,0BAA0B,CAAA;IACtC,MAAM,CAAC,QAA4C,EAAE,MAAqB,EAAE,MAAyC,EAAE,MAAqB,EAAE,OAAoB,EAAE,YAAoB,EAAA;QACvL,MAAM,EAAE,IAAI,EAAE,GAAG,cAAc,EAAE,GAAuC,QAAQ;AAEhF,QAAA,OAAO,OAAO,KAAK,WAAW,CAAC,QAAQ,GAAG,iBAAiB,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,2BAA2B,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,CAAC,EAAE,GAAG,MAAM,EAAE,GAAG,cAAc,EAAE,CAAC,GAAG,eAAe,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,MAAM,EAAE,GAAG,cAAc,EAAE,CAAC;IAClV;AACA;;;;"}
1
+ {"version":3,"file":"relation.class.js","sources":["../../../../../../../../src/class/utility/dto/property/factory/relation.class.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;MAWa,0BAA0B,CAAA;IACtC,MAAM,CAAC,QAA4C,EAAE,MAAqB,EAAE,MAAyC,EAAE,MAAqB,EAAE,OAAoB,EAAE,YAAoB,EAAA;QACvL,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,cAAc,EAAE,GAAuC,QAAQ;AAC7F,QAAA,MAAM,cAAc,GAAoC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAA2B,KAAc,MAAM,CAAC,IAAI,IAAI,YAAY,CAAC;AAClJ,QAAA,MAAM,4BAA4B,GAAuB,WAAW,EAAE,IAAI,EAAE;QAC5E,IAAI,mBAAmB,GAAW,YAAY;AAC9C,QAAA,MAAM,YAAY,GAAW,CAAA,EAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA,CAAA,EAAI,YAAY,CAAA,CAAE;QAErE,IAAI,4BAA4B,EAAE;YACjC,mBAAmB,GAAG,4BAA4B;QACnD;AAEA,QAAA,IAAI,CAAC,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE;AACtC,YAAA,MAAM,cAAc,CAAC,CAAA,SAAA,EAAY,YAAY,CAAA,mJAAA,CAAqJ,CAAC;QACpM;AAEA,QAAA,IAAI,OAAO,KAAK,WAAW,CAAC,QAAQ,EAAE;AACrC,YAAA,OAAO,iBAAiB,CAAC;AACxB,gBAAA,WAAW,EAAE,mBAAmB;gBAChC,MAAM;AACN,gBAAA,OAAO,EAAE,KAAK;gBACd,IAAI,EAAE,2BAA2B,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE;oBACxE,mBAAmB;iBACnB,CAAC;AACF,gBAAA,GAAG,MAAM;AACT,gBAAA,GAAG,cAAc;AACjB,aAAA,CAAC;QACH;QAEA,OAAO,eAAe,CAAC,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,MAAM,EAAE,GAAG,cAAc,EAAE,CAAC;IACnH;AACA;;;;"}
@@ -1,7 +1,11 @@
1
+ import { IApiBaseEntity } from '../api-base-entity.interface';
1
2
  import { ColumnType } from 'typeorm';
2
3
  export interface IApiEntityColumn<E> {
3
4
  isPrimary: boolean;
4
5
  metadata?: Record<string, unknown>;
5
6
  name: keyof E;
7
+ relation?: {
8
+ target: IApiBaseEntity;
9
+ };
6
10
  type: ColumnType;
7
11
  }
@@ -1,6 +1,6 @@
1
+ import { IApiEntity } from '../../../interface/entity';
1
2
  import { Type } from '@nestjs/common';
2
3
  import { EApiDtoType, EApiRouteType } from '../../../enum/decorator/api';
3
- import { IApiEntity } from '../../../interface/entity';
4
4
  /**
5
5
  * Creates a simple relationship DTO containing only an ID field.
6
6
  * Used for representing related entities in API responses with minimal information.
@@ -8,7 +8,11 @@ import { IApiEntity } from '../../../interface/entity';
8
8
  * @param {EApiRouteType} method - The API route type (CREATE, DELETE, GET, etc.)
9
9
  * @param {EApiDtoType} dtoType - The type of DTO (REQUEST, RESPONSE, etc.)
10
10
  * @param {string} propertyName - The name of the relation property
11
+ * @param {{ relationDescription?: string }} [options] - Optional relation metadata used for the nested identifier schema
12
+ * @param {string} [options.relationDescription] - Relation-aware description to use for the nested id field.
11
13
  * @returns {Type<unknown>} A generated DTO class for relation representation
12
14
  * @template E - The entity type
13
15
  */
14
- export declare function DtoGenerateRelationResponse<E>(entity: IApiEntity<E>, method: EApiRouteType, dtoType: EApiDtoType, propertyName: string): Type<unknown>;
16
+ export declare function DtoGenerateRelationResponse<E>(entity: IApiEntity<E>, method: EApiRouteType, dtoType: EApiDtoType, propertyName: string, options?: {
17
+ relationDescription?: string;
18
+ }): Type<unknown>;
@@ -10,15 +10,28 @@ import { CapitalizeString } from '../../capitalize-string.utility.js';
10
10
  * @param {EApiRouteType} method - The API route type (CREATE, DELETE, GET, etc.)
11
11
  * @param {EApiDtoType} dtoType - The type of DTO (REQUEST, RESPONSE, etc.)
12
12
  * @param {string} propertyName - The name of the relation property
13
+ * @param {{ relationDescription?: string }} [options] - Optional relation metadata used for the nested identifier schema
14
+ * @param {string} [options.relationDescription] - Relation-aware description to use for the nested id field.
13
15
  * @returns {Type<unknown>} A generated DTO class for relation representation
14
16
  * @template E - The entity type
15
17
  */
16
- function DtoGenerateRelationResponse(entity, method, dtoType, propertyName) {
18
+ function DtoGenerateRelationResponse(entity, method, dtoType, propertyName, options = {}) {
19
+ const entityName = (entity.name ?? "").trim();
20
+ const relationDescriptionCandidate = options.relationDescription?.trim();
21
+ let relationDescription = propertyName;
22
+ if (relationDescriptionCandidate) {
23
+ relationDescription = relationDescriptionCandidate;
24
+ }
25
+ const shouldPrefixOwnerName = !!entityName && !relationDescription.toLocaleLowerCase().startsWith(`${entityName.toLocaleLowerCase()} `);
26
+ const identifierEntity = {
27
+ ...entity,
28
+ name: shouldPrefixOwnerName ? `${entityName} ${relationDescription}` : relationDescription,
29
+ };
17
30
  class GeneratedRelationDTO {
18
31
  id;
19
32
  }
20
33
  __decorate([
21
- ApiPropertyUUID({ entity, isResponse: true }),
34
+ ApiPropertyUUID({ entity: identifierEntity, isResponse: true }),
22
35
  __metadata("design:type", String)
23
36
  ], GeneratedRelationDTO.prototype, "id", void 0);
24
37
  Object.defineProperty(GeneratedRelationDTO, "name", { value: `${String(entity.name)}${CamelCaseString(method)}${CamelCaseString(dtoType)}${CapitalizeString(propertyName)}DTO` });
@@ -1 +1 @@
1
- {"version":3,"file":"relation-response.utility.js","sources":["../../../../../../src/utility/dto/generate/relation-response.utility.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;AAQA;;;;;;;;;AASG;AACG,SAAU,2BAA2B,CAAI,MAAqB,EAAE,MAAqB,EAAE,OAAoB,EAAE,YAAoB,EAAA;AACtI,IAAA,MAAM,oBAAoB,CAAA;AAEzB,QAAA,EAAE;AACF;AADA,IAAA,UAAA,CAAA;QADC,eAAe,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;;AAClC,KAAA,EAAA,oBAAA,CAAA,SAAA,EAAA,IAAA,EAAA,MAAA,CAAA;AAGb,IAAA,MAAM,CAAC,cAAc,CAAC,oBAAoB,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,CAAA,EAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA,EAAG,eAAe,CAAC,MAAM,CAAC,CAAA,EAAG,eAAe,CAAC,OAAO,CAAC,CAAA,EAAG,gBAAgB,CAAC,YAAY,CAAC,CAAA,GAAA,CAAK,EAAE,CAAC;AAEjL,IAAA,OAAO,oBAAoB;AAC5B;;;;"}
1
+ {"version":3,"file":"relation-response.utility.js","sources":["../../../../../../src/utility/dto/generate/relation-response.utility.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;AAQA;;;;;;;;;;;AAWG;AACG,SAAU,2BAA2B,CAAI,MAAqB,EAAE,MAAqB,EAAE,OAAoB,EAAE,YAAoB,EAAE,OAAA,GAA4C,EAAE,EAAA;AACtL,IAAA,MAAM,UAAU,GAAW,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE;IACrD,MAAM,4BAA4B,GAAuB,OAAO,CAAC,mBAAmB,EAAE,IAAI,EAAE;IAC5F,IAAI,mBAAmB,GAAW,YAAY;IAE9C,IAAI,4BAA4B,EAAE;QACjC,mBAAmB,GAAG,4BAA4B;IACnD;IAEA,MAAM,qBAAqB,GAAY,CAAC,CAAC,UAAU,IAAI,CAAC,mBAAmB,CAAC,iBAAiB,EAAE,CAAC,UAAU,CAAC,CAAA,EAAG,UAAU,CAAC,iBAAiB,EAAE,CAAA,CAAA,CAAG,CAAC;AAEhJ,IAAA,MAAM,gBAAgB,GAAkB;AACvC,QAAA,GAAG,MAAM;AACT,QAAA,IAAI,EAAE,qBAAqB,GAAG,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,mBAAmB,CAAA,CAAE,GAAG,mBAAmB;KAC1F;AAED,IAAA,MAAM,oBAAoB,CAAA;AAEzB,QAAA,EAAE;AACF;AADA,IAAA,UAAA,CAAA;QADC,eAAe,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;;AACpD,KAAA,EAAA,oBAAA,CAAA,SAAA,EAAA,IAAA,EAAA,MAAA,CAAA;AAGb,IAAA,MAAM,CAAC,cAAc,CAAC,oBAAoB,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,CAAA,EAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA,EAAG,eAAe,CAAC,MAAM,CAAC,CAAA,EAAG,eAAe,CAAC,OAAO,CAAC,CAAA,EAAG,gBAAgB,CAAC,YAAY,CAAC,CAAA,GAAA,CAAK,EAAE,CAAC;AAEjL,IAAA,OAAO,oBAAoB;AAC5B;;;;"}
@@ -95,7 +95,7 @@ function GenerateEntityInformation(entity) {
95
95
  type: options.type,
96
96
  };
97
97
  }),
98
- ...relationList.map(({ propertyName, relationType }) => {
98
+ ...relationList.map(({ propertyName, relationType, type }) => {
99
99
  let metadata;
100
100
  for (const entityName of entityNames) {
101
101
  metadata = storage.getMetadata(entityName, propertyName);
@@ -103,10 +103,34 @@ function GenerateEntityInformation(entity) {
103
103
  break;
104
104
  }
105
105
  }
106
+ let relationTarget;
107
+ let resolvedRelationTarget = type;
108
+ if (typeof type === "function") {
109
+ try {
110
+ resolvedRelationTarget = type();
111
+ }
112
+ catch {
113
+ resolvedRelationTarget = type;
114
+ }
115
+ }
116
+ if (typeof resolvedRelationTarget === "string") {
117
+ relationTarget = { name: resolvedRelationTarget };
118
+ }
119
+ else if (typeof resolvedRelationTarget === "function" && resolvedRelationTarget.name) {
120
+ relationTarget = resolvedRelationTarget;
121
+ }
122
+ else if (typeof resolvedRelationTarget === "object" && resolvedRelationTarget !== null && "name" in resolvedRelationTarget && typeof resolvedRelationTarget.name === "string") {
123
+ relationTarget = resolvedRelationTarget;
124
+ }
106
125
  return {
107
126
  isPrimary: false,
108
127
  metadata,
109
128
  name: propertyName,
129
+ relation: relationTarget
130
+ ? {
131
+ target: relationTarget,
132
+ }
133
+ : undefined,
110
134
  type: relationType,
111
135
  };
112
136
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"generate-entity-information.utility.js","sources":["../../../../src/utility/generate-entity-information.utility.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generate-entity-information.utility.js","sources":["../../../../src/utility/generate-entity-information.utility.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elsikora/nestjs-crud-automator",
3
- "version": "2.1.1",
3
+ "version": "2.1.2-dev.1",
4
4
  "description": "A library for automating the creation of CRUD operations in NestJS.",
5
5
  "keywords": [
6
6
  "NestJS",
@@ -72,7 +72,7 @@
72
72
  "@nestjs/core": "^11.1.19",
73
73
  "@nestjs/passport": "^11.0.5",
74
74
  "@nestjs/platform-fastify": "^11.1.19",
75
- "@nestjs/swagger": "^11.4.2",
75
+ "@nestjs/swagger": "11.4.2",
76
76
  "@nestjs/testing": "^11.1.19",
77
77
  "@nestjs/throttler": "^6.5.0",
78
78
  "@nestjs/typeorm": "^11.0.1",