rez_core 6.5.75 → 6.5.76

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.
Files changed (194) hide show
  1. package/.claude/settings.local.json +26 -0
  2. package/.idea/250218_nodejs_core.iml +9 -0
  3. package/.idea/codeStyles/Project.xml +59 -0
  4. package/.idea/codeStyles/codeStyleConfig.xml +5 -0
  5. package/.idea/copilot.data.migration.agent.xml +6 -0
  6. package/.idea/copilot.data.migration.ask.xml +6 -0
  7. package/.idea/copilot.data.migration.ask2agent.xml +6 -0
  8. package/.idea/copilot.data.migration.edit.xml +6 -0
  9. package/.idea/inspectionProfiles/Project_Default.xml +6 -0
  10. package/.idea/misc.xml +6 -0
  11. package/.idea/modules.xml +8 -0
  12. package/.idea/prettier.xml +6 -0
  13. package/.idea/vcs.xml +6 -0
  14. package/dist/app.module.js +3 -1
  15. package/dist/app.module.js.map +1 -1
  16. package/dist/constant/db-data-type.constant.d.ts +30 -0
  17. package/dist/constant/db-data-type.constant.js +59 -0
  18. package/dist/constant/db-data-type.constant.js.map +1 -0
  19. package/dist/constant/storage-type.constant.d.ts +4 -0
  20. package/dist/constant/storage-type.constant.js +9 -0
  21. package/dist/constant/storage-type.constant.js.map +1 -0
  22. package/dist/module/dashboard/controller/dashboard.controller.d.ts +1 -0
  23. package/dist/module/dashboard/service/dashboard.service.d.ts +1 -0
  24. package/dist/module/eav/controller/eav.controller.d.ts +21 -0
  25. package/dist/module/eav/controller/eav.controller.js +127 -0
  26. package/dist/module/eav/controller/eav.controller.js.map +1 -0
  27. package/dist/module/eav/dto/eav-operation.dto.d.ts +20 -0
  28. package/dist/module/eav/dto/eav-operation.dto.js +75 -0
  29. package/dist/module/eav/dto/eav-operation.dto.js.map +1 -0
  30. package/dist/module/eav/eav.module.d.ts +2 -0
  31. package/dist/module/eav/eav.module.js +84 -0
  32. package/dist/module/eav/eav.module.js.map +1 -0
  33. package/dist/module/eav/entity/eav-boolean.entity.d.ts +9 -0
  34. package/dist/module/eav/entity/eav-boolean.entity.js +48 -0
  35. package/dist/module/eav/entity/eav-boolean.entity.js.map +1 -0
  36. package/dist/module/eav/entity/eav-date.entity.d.ts +9 -0
  37. package/dist/module/eav/entity/eav-date.entity.js +48 -0
  38. package/dist/module/eav/entity/eav-date.entity.js.map +1 -0
  39. package/dist/module/eav/entity/eav-decimal.entity.d.ts +9 -0
  40. package/dist/module/eav/entity/eav-decimal.entity.js +48 -0
  41. package/dist/module/eav/entity/eav-decimal.entity.js.map +1 -0
  42. package/dist/module/eav/entity/eav-int.entity.d.ts +9 -0
  43. package/dist/module/eav/entity/eav-int.entity.js +48 -0
  44. package/dist/module/eav/entity/eav-int.entity.js.map +1 -0
  45. package/dist/module/eav/entity/eav-json.entity.d.ts +9 -0
  46. package/dist/module/eav/entity/eav-json.entity.js +48 -0
  47. package/dist/module/eav/entity/eav-json.entity.js.map +1 -0
  48. package/dist/module/eav/entity/eav-text.entity.d.ts +9 -0
  49. package/dist/module/eav/entity/eav-text.entity.js +48 -0
  50. package/dist/module/eav/entity/eav-text.entity.js.map +1 -0
  51. package/dist/module/eav/entity/eav-time.entity.d.ts +9 -0
  52. package/dist/module/eav/entity/eav-time.entity.js +48 -0
  53. package/dist/module/eav/entity/eav-time.entity.js.map +1 -0
  54. package/dist/module/eav/entity/eav-timestamp.entity.d.ts +9 -0
  55. package/dist/module/eav/entity/eav-timestamp.entity.js +48 -0
  56. package/dist/module/eav/entity/eav-timestamp.entity.js.map +1 -0
  57. package/dist/module/eav/entity/eav-varchar.entity.d.ts +9 -0
  58. package/dist/module/eav/entity/eav-varchar.entity.js +48 -0
  59. package/dist/module/eav/entity/eav-varchar.entity.js.map +1 -0
  60. package/dist/module/eav/interface/eav-strategy.interface.d.ts +8 -0
  61. package/dist/module/eav/interface/eav-strategy.interface.js +3 -0
  62. package/dist/module/eav/interface/eav-strategy.interface.js.map +1 -0
  63. package/dist/module/eav/repository/eav-boolean.repository.d.ts +13 -0
  64. package/dist/module/eav/repository/eav-boolean.repository.js +57 -0
  65. package/dist/module/eav/repository/eav-boolean.repository.js.map +1 -0
  66. package/dist/module/eav/repository/eav-date.repository.d.ts +13 -0
  67. package/dist/module/eav/repository/eav-date.repository.js +57 -0
  68. package/dist/module/eav/repository/eav-date.repository.js.map +1 -0
  69. package/dist/module/eav/repository/eav-decimal.repository.d.ts +13 -0
  70. package/dist/module/eav/repository/eav-decimal.repository.js +57 -0
  71. package/dist/module/eav/repository/eav-decimal.repository.js.map +1 -0
  72. package/dist/module/eav/repository/eav-int.repository.d.ts +13 -0
  73. package/dist/module/eav/repository/eav-int.repository.js +57 -0
  74. package/dist/module/eav/repository/eav-int.repository.js.map +1 -0
  75. package/dist/module/eav/repository/eav-json.repository.d.ts +13 -0
  76. package/dist/module/eav/repository/eav-json.repository.js +57 -0
  77. package/dist/module/eav/repository/eav-json.repository.js.map +1 -0
  78. package/dist/module/eav/repository/eav-text.repository.d.ts +13 -0
  79. package/dist/module/eav/repository/eav-text.repository.js +57 -0
  80. package/dist/module/eav/repository/eav-text.repository.js.map +1 -0
  81. package/dist/module/eav/repository/eav-time.repository.d.ts +13 -0
  82. package/dist/module/eav/repository/eav-time.repository.js +57 -0
  83. package/dist/module/eav/repository/eav-time.repository.js.map +1 -0
  84. package/dist/module/eav/repository/eav-timestamp.repository.d.ts +13 -0
  85. package/dist/module/eav/repository/eav-timestamp.repository.js +57 -0
  86. package/dist/module/eav/repository/eav-timestamp.repository.js.map +1 -0
  87. package/dist/module/eav/repository/eav-varchar.repository.d.ts +13 -0
  88. package/dist/module/eav/repository/eav-varchar.repository.js +57 -0
  89. package/dist/module/eav/repository/eav-varchar.repository.js.map +1 -0
  90. package/dist/module/eav/service/eav-boolean.service.d.ts +12 -0
  91. package/dist/module/eav/service/eav-boolean.service.js +59 -0
  92. package/dist/module/eav/service/eav-boolean.service.js.map +1 -0
  93. package/dist/module/eav/service/eav-date.service.d.ts +12 -0
  94. package/dist/module/eav/service/eav-date.service.js +59 -0
  95. package/dist/module/eav/service/eav-date.service.js.map +1 -0
  96. package/dist/module/eav/service/eav-decimal.service.d.ts +12 -0
  97. package/dist/module/eav/service/eav-decimal.service.js +59 -0
  98. package/dist/module/eav/service/eav-decimal.service.js.map +1 -0
  99. package/dist/module/eav/service/eav-factory.service.d.ts +26 -0
  100. package/dist/module/eav/service/eav-factory.service.js +81 -0
  101. package/dist/module/eav/service/eav-factory.service.js.map +1 -0
  102. package/dist/module/eav/service/eav-int.service.d.ts +12 -0
  103. package/dist/module/eav/service/eav-int.service.js +59 -0
  104. package/dist/module/eav/service/eav-int.service.js.map +1 -0
  105. package/dist/module/eav/service/eav-json.service.d.ts +12 -0
  106. package/dist/module/eav/service/eav-json.service.js +59 -0
  107. package/dist/module/eav/service/eav-json.service.js.map +1 -0
  108. package/dist/module/eav/service/eav-text.service.d.ts +12 -0
  109. package/dist/module/eav/service/eav-text.service.js +59 -0
  110. package/dist/module/eav/service/eav-text.service.js.map +1 -0
  111. package/dist/module/eav/service/eav-time.service.d.ts +12 -0
  112. package/dist/module/eav/service/eav-time.service.js +59 -0
  113. package/dist/module/eav/service/eav-time.service.js.map +1 -0
  114. package/dist/module/eav/service/eav-timestamp.service.d.ts +12 -0
  115. package/dist/module/eav/service/eav-timestamp.service.js +59 -0
  116. package/dist/module/eav/service/eav-timestamp.service.js.map +1 -0
  117. package/dist/module/eav/service/eav-varchar.service.d.ts +12 -0
  118. package/dist/module/eav/service/eav-varchar.service.js +59 -0
  119. package/dist/module/eav/service/eav-varchar.service.js.map +1 -0
  120. package/dist/module/eav/service/eav.service.d.ts +14 -0
  121. package/dist/module/eav/service/eav.service.js +65 -0
  122. package/dist/module/eav/service/eav.service.js.map +1 -0
  123. package/dist/module/listmaster/service/list-master-item.service.js +9 -41
  124. package/dist/module/listmaster/service/list-master-item.service.js.map +1 -1
  125. package/dist/module/meta/controller/entity.controller.js +1 -4
  126. package/dist/module/meta/controller/entity.controller.js.map +1 -1
  127. package/dist/module/meta/entity/base-entity.entity.d.ts +1 -0
  128. package/dist/module/meta/entity/base-entity.entity.js +4 -0
  129. package/dist/module/meta/entity/base-entity.entity.js.map +1 -1
  130. package/dist/module/meta/entity/dynamic.entity.d.ts +3 -0
  131. package/dist/module/meta/entity/dynamic.entity.js +8 -0
  132. package/dist/module/meta/entity/dynamic.entity.js.map +1 -0
  133. package/dist/module/meta/entity/entity-master.entity.d.ts +4 -8
  134. package/dist/module/meta/entity/entity-master.entity.js +13 -57
  135. package/dist/module/meta/entity/entity-master.entity.js.map +1 -1
  136. package/dist/module/meta/service/entity-master.service.d.ts +8 -2
  137. package/dist/module/meta/service/entity-master.service.js +82 -2
  138. package/dist/module/meta/service/entity-master.service.js.map +1 -1
  139. package/dist/module/meta/service/media-data.service.d.ts +0 -1
  140. package/dist/module/meta/service/media-data.service.js +0 -119
  141. package/dist/module/meta/service/media-data.service.js.map +1 -1
  142. package/dist/module/workflow/controller/activity-log.controller.d.ts +1 -0
  143. package/dist/module/workflow/repository/activity-log.repository.d.ts +1 -0
  144. package/dist/module/workflow/repository/stage-group.repository.d.ts +1 -0
  145. package/dist/module/workflow/repository/stage.repository.d.ts +1 -0
  146. package/dist/module/workflow/service/activity-log.service.d.ts +1 -0
  147. package/dist/module/workflow-automation/service/workflow-automation.service.d.ts +1 -0
  148. package/dist/tsconfig.build.tsbuildinfo +1 -1
  149. package/package.json +1 -1
  150. package/server.log +850 -0
  151. package/src/app.module.ts +3 -1
  152. package/src/constant/db-data-type.constant.ts +81 -0
  153. package/src/constant/storage-type.constant.ts +4 -0
  154. package/src/module/eav/EAV_USAGE_GUIDE.md +351 -0
  155. package/src/module/eav/controller/eav.controller.ts +119 -0
  156. package/src/module/eav/dto/eav-operation.dto.ts +62 -0
  157. package/src/module/eav/eav.module.ts +80 -0
  158. package/src/module/eav/entity/eav-boolean.entity.ts +26 -0
  159. package/src/module/eav/entity/eav-date.entity.ts +25 -0
  160. package/src/module/eav/entity/eav-decimal.entity.ts +25 -0
  161. package/src/module/eav/entity/eav-int.entity.ts +25 -0
  162. package/src/module/eav/entity/eav-json.entity.ts +25 -0
  163. package/src/module/eav/entity/eav-text.entity.ts +25 -0
  164. package/src/module/eav/entity/eav-time.entity.ts +25 -0
  165. package/src/module/eav/entity/eav-timestamp.entity.ts +25 -0
  166. package/src/module/eav/entity/eav-varchar.entity.ts +25 -0
  167. package/src/module/eav/interface/eav-strategy.interface.ts +32 -0
  168. package/src/module/eav/repository/eav-boolean.repository.ts +67 -0
  169. package/src/module/eav/repository/eav-date.repository.ts +67 -0
  170. package/src/module/eav/repository/eav-decimal.repository.ts +67 -0
  171. package/src/module/eav/repository/eav-int.repository.ts +67 -0
  172. package/src/module/eav/repository/eav-json.repository.ts +67 -0
  173. package/src/module/eav/repository/eav-text.repository.ts +67 -0
  174. package/src/module/eav/repository/eav-time.repository.ts +67 -0
  175. package/src/module/eav/repository/eav-timestamp.repository.ts +67 -0
  176. package/src/module/eav/repository/eav-varchar.repository.ts +67 -0
  177. package/src/module/eav/service/eav-boolean.service.ts +64 -0
  178. package/src/module/eav/service/eav-date.service.ts +64 -0
  179. package/src/module/eav/service/eav-decimal.service.ts +64 -0
  180. package/src/module/eav/service/eav-factory.service.ts +93 -0
  181. package/src/module/eav/service/eav-int.service.ts +64 -0
  182. package/src/module/eav/service/eav-json.service.ts +64 -0
  183. package/src/module/eav/service/eav-text.service.ts +64 -0
  184. package/src/module/eav/service/eav-time.service.ts +64 -0
  185. package/src/module/eav/service/eav-timestamp.service.ts +64 -0
  186. package/src/module/eav/service/eav-varchar.service.ts +65 -0
  187. package/src/module/eav/service/eav.service.ts +116 -0
  188. package/src/module/listmaster/service/list-master-item.service.ts +11 -61
  189. package/src/module/meta/controller/entity.controller.ts +2 -10
  190. package/src/module/meta/entity/base-entity.entity.ts +3 -0
  191. package/src/module/meta/entity/dynamic.entity.ts +4 -0
  192. package/src/module/meta/entity/entity-master.entity.ts +16 -52
  193. package/src/module/meta/service/entity-master.service.ts +135 -6
  194. package/src/module/meta/service/media-data.service.ts +0 -206
@@ -0,0 +1,67 @@
1
+ import { Injectable } from '@nestjs/common';
2
+ import { DataSource, Repository } from 'typeorm';
3
+ import { EAVText } from '../entity/eav-text.entity';
4
+
5
+ @Injectable()
6
+ export class EAVTextRepository extends Repository<EAVText> {
7
+ constructor(private dataSource: DataSource) {
8
+ super(EAVText, dataSource.createEntityManager());
9
+ }
10
+
11
+ /**
12
+ * Find by entity_type, entity_id, and key
13
+ */
14
+ async findByEntityAndKey(
15
+ entityType: string,
16
+ entityId: string | number,
17
+ key: string,
18
+ ): Promise<EAVText | null> {
19
+ return await this.findOne({
20
+ where: {
21
+ entity_type: entityType,
22
+ entity_id: String(entityId),
23
+ key: key,
24
+ },
25
+ });
26
+ }
27
+
28
+ /**
29
+ * Find all by partial criteria
30
+ */
31
+ async findByPartialCriteria(criteria: {
32
+ entity_type?: string;
33
+ entity_id?: string | number;
34
+ key?: string;
35
+ }): Promise<EAVText[]> {
36
+ const where: any = {};
37
+
38
+ if (criteria.entity_type) {
39
+ where.entity_type = criteria.entity_type;
40
+ }
41
+ if (criteria.entity_id) {
42
+ where.entity_id = String(criteria.entity_id);
43
+ }
44
+ if (criteria.key) {
45
+ where.key = criteria.key;
46
+ }
47
+
48
+ return await this.find({ where });
49
+ }
50
+
51
+ /**
52
+ * Delete by entity_type, entity_id, and key
53
+ */
54
+ async deleteByEntityAndKey(
55
+ entityType: string,
56
+ entityId: string | number,
57
+ key: string,
58
+ ): Promise<boolean> {
59
+ const result = await this.delete({
60
+ entity_type: entityType,
61
+ entity_id: String(entityId),
62
+ key: key,
63
+ });
64
+
65
+ return (result.affected ?? 0) > 0;
66
+ }
67
+ }
@@ -0,0 +1,67 @@
1
+ import { Injectable } from '@nestjs/common';
2
+ import { DataSource, Repository } from 'typeorm';
3
+ import { EAVTime } from '../entity/eav-time.entity';
4
+
5
+ @Injectable()
6
+ export class EAVTimeRepository extends Repository<EAVTime> {
7
+ constructor(private dataSource: DataSource) {
8
+ super(EAVTime, dataSource.createEntityManager());
9
+ }
10
+
11
+ /**
12
+ * Find by entity_type, entity_id, and key
13
+ */
14
+ async findByEntityAndKey(
15
+ entityType: string,
16
+ entityId: string | number,
17
+ key: string,
18
+ ): Promise<EAVTime | null> {
19
+ return await this.findOne({
20
+ where: {
21
+ entity_type: entityType,
22
+ entity_id: String(entityId),
23
+ key: key,
24
+ },
25
+ });
26
+ }
27
+
28
+ /**
29
+ * Find all by partial criteria
30
+ */
31
+ async findByPartialCriteria(criteria: {
32
+ entity_type?: string;
33
+ entity_id?: string | number;
34
+ key?: string;
35
+ }): Promise<EAVTime[]> {
36
+ const where: any = {};
37
+
38
+ if (criteria.entity_type) {
39
+ where.entity_type = criteria.entity_type;
40
+ }
41
+ if (criteria.entity_id) {
42
+ where.entity_id = String(criteria.entity_id);
43
+ }
44
+ if (criteria.key) {
45
+ where.key = criteria.key;
46
+ }
47
+
48
+ return await this.find({ where });
49
+ }
50
+
51
+ /**
52
+ * Delete by entity_type, entity_id, and key
53
+ */
54
+ async deleteByEntityAndKey(
55
+ entityType: string,
56
+ entityId: string | number,
57
+ key: string,
58
+ ): Promise<boolean> {
59
+ const result = await this.delete({
60
+ entity_type: entityType,
61
+ entity_id: String(entityId),
62
+ key: key,
63
+ });
64
+
65
+ return (result.affected ?? 0) > 0;
66
+ }
67
+ }
@@ -0,0 +1,67 @@
1
+ import { Injectable } from '@nestjs/common';
2
+ import { DataSource, Repository } from 'typeorm';
3
+ import { EAVTimeStamp } from '../entity/eav-timestamp.entity';
4
+
5
+ @Injectable()
6
+ export class EAVTimestampRepository extends Repository<EAVTimeStamp> {
7
+ constructor(private dataSource: DataSource) {
8
+ super(EAVTimeStamp, dataSource.createEntityManager());
9
+ }
10
+
11
+ /**
12
+ * Find by entity_type, entity_id, and key
13
+ */
14
+ async findByEntityAndKey(
15
+ entityType: string,
16
+ entityId: string | number,
17
+ key: string,
18
+ ): Promise<EAVTimeStamp | null> {
19
+ return await this.findOne({
20
+ where: {
21
+ entity_type: entityType,
22
+ entity_id: String(entityId),
23
+ key: key,
24
+ },
25
+ });
26
+ }
27
+
28
+ /**
29
+ * Find all by partial criteria
30
+ */
31
+ async findByPartialCriteria(criteria: {
32
+ entity_type?: string;
33
+ entity_id?: string | number;
34
+ key?: string;
35
+ }): Promise<EAVTimeStamp[]> {
36
+ const where: any = {};
37
+
38
+ if (criteria.entity_type) {
39
+ where.entity_type = criteria.entity_type;
40
+ }
41
+ if (criteria.entity_id) {
42
+ where.entity_id = String(criteria.entity_id);
43
+ }
44
+ if (criteria.key) {
45
+ where.key = criteria.key;
46
+ }
47
+
48
+ return await this.find({ where });
49
+ }
50
+
51
+ /**
52
+ * Delete by entity_type, entity_id, and key
53
+ */
54
+ async deleteByEntityAndKey(
55
+ entityType: string,
56
+ entityId: string | number,
57
+ key: string,
58
+ ): Promise<boolean> {
59
+ const result = await this.delete({
60
+ entity_type: entityType,
61
+ entity_id: String(entityId),
62
+ key: key,
63
+ });
64
+
65
+ return (result.affected ?? 0) > 0;
66
+ }
67
+ }
@@ -0,0 +1,67 @@
1
+ import { Injectable } from '@nestjs/common';
2
+ import { DataSource, Repository } from 'typeorm';
3
+ import { EAVVarchar } from '../entity/eav-varchar.entity';
4
+
5
+ @Injectable()
6
+ export class EAVVarcharRepository extends Repository<EAVVarchar> {
7
+ constructor(private dataSource: DataSource) {
8
+ super(EAVVarchar, dataSource.createEntityManager());
9
+ }
10
+
11
+ /**
12
+ * Find by entity_type, entity_id, and key
13
+ */
14
+ async findByEntityAndKey(
15
+ entityType: string,
16
+ entityId: string | number,
17
+ key: string,
18
+ ): Promise<EAVVarchar | null> {
19
+ return await this.findOne({
20
+ where: {
21
+ entity_type: entityType,
22
+ entity_id: String(entityId),
23
+ key: key,
24
+ },
25
+ });
26
+ }
27
+
28
+ /**
29
+ * Find all by partial criteria
30
+ */
31
+ async findByPartialCriteria(criteria: {
32
+ entity_type?: string;
33
+ entity_id?: string | number;
34
+ key?: string;
35
+ }): Promise<EAVVarchar[]> {
36
+ const where: any = {};
37
+
38
+ if (criteria.entity_type) {
39
+ where.entity_type = criteria.entity_type;
40
+ }
41
+ if (criteria.entity_id) {
42
+ where.entity_id = String(criteria.entity_id);
43
+ }
44
+ if (criteria.key) {
45
+ where.key = criteria.key;
46
+ }
47
+
48
+ return await this.find({ where });
49
+ }
50
+
51
+ /**
52
+ * Delete by entity_type, entity_id, and key
53
+ */
54
+ async deleteByEntityAndKey(
55
+ entityType: string,
56
+ entityId: string | number,
57
+ key: string,
58
+ ): Promise<boolean> {
59
+ const result = await this.delete({
60
+ entity_type: entityType,
61
+ entity_id: String(entityId),
62
+ key: key,
63
+ });
64
+
65
+ return (result.affected ?? 0) > 0;
66
+ }
67
+ }
@@ -0,0 +1,64 @@
1
+ import { Injectable } from '@nestjs/common';
2
+ import { IEAVStrategy } from '../interface/eav-strategy.interface';
3
+ import { CreateEAVDto, UpdateEAVDto, EAVQueryDto } from '../dto/eav-operation.dto';
4
+ import { EAVBooleanRepository } from '../repository/eav-boolean.repository';
5
+
6
+ @Injectable()
7
+ export class EAVBooleanService implements IEAVStrategy {
8
+ constructor(private readonly repository: EAVBooleanRepository) { }
9
+
10
+ async create(dto: CreateEAVDto, modifiedBy?: number): Promise<any> {
11
+ const entity = this.repository.create({
12
+ entity_type: dto.entity_type,
13
+ entity_id: String(dto.entity_id),
14
+ key: dto.key,
15
+ value: dto.value,
16
+ modified_by: modifiedBy,
17
+ });
18
+
19
+ return await this.repository.save(entity);
20
+ }
21
+
22
+ async findOne(query: EAVQueryDto): Promise<any> {
23
+ return await this.repository.findByEntityAndKey(
24
+ query.entity_type,
25
+ query.entity_id,
26
+ query.key,
27
+ );
28
+ }
29
+
30
+ async findAll(query: Partial<EAVQueryDto>): Promise<any[]> {
31
+ return await this.repository.findByPartialCriteria({
32
+ entity_type: query.entity_type,
33
+ entity_id: query.entity_id,
34
+ key: query.key,
35
+ });
36
+ }
37
+
38
+ async update(query: EAVQueryDto, dto: UpdateEAVDto, modifiedBy?: number): Promise<any> {
39
+ const existing = await this.repository.findByEntityAndKey(
40
+ query.entity_type,
41
+ query.entity_id,
42
+ query.key,
43
+ );
44
+
45
+ if (!existing) {
46
+ return null;
47
+ }
48
+
49
+ existing.value = dto.value;
50
+ if (modifiedBy !== undefined) {
51
+ existing.modified_by = modifiedBy;
52
+ }
53
+
54
+ return await this.repository.save(existing);
55
+ }
56
+
57
+ async delete(query: EAVQueryDto): Promise<boolean> {
58
+ return await this.repository.deleteByEntityAndKey(
59
+ query.entity_type,
60
+ query.entity_id,
61
+ query.key,
62
+ );
63
+ }
64
+ }
@@ -0,0 +1,64 @@
1
+ import { Injectable } from '@nestjs/common';
2
+ import { IEAVStrategy } from '../interface/eav-strategy.interface';
3
+ import { CreateEAVDto, UpdateEAVDto, EAVQueryDto } from '../dto/eav-operation.dto';
4
+ import { EAVDateRepository } from '../repository/eav-date.repository';
5
+
6
+ @Injectable()
7
+ export class EAVDateService implements IEAVStrategy {
8
+ constructor(private readonly repository: EAVDateRepository) { }
9
+
10
+ async create(dto: CreateEAVDto, modifiedBy?: number): Promise<any> {
11
+ const entity = this.repository.create({
12
+ entity_type: dto.entity_type,
13
+ entity_id: String(dto.entity_id),
14
+ key: dto.key,
15
+ value: dto.value,
16
+ modified_by: modifiedBy,
17
+ });
18
+
19
+ return await this.repository.save(entity);
20
+ }
21
+
22
+ async findOne(query: EAVQueryDto): Promise<any> {
23
+ return await this.repository.findByEntityAndKey(
24
+ query.entity_type,
25
+ query.entity_id,
26
+ query.key,
27
+ );
28
+ }
29
+
30
+ async findAll(query: Partial<EAVQueryDto>): Promise<any[]> {
31
+ return await this.repository.findByPartialCriteria({
32
+ entity_type: query.entity_type,
33
+ entity_id: query.entity_id,
34
+ key: query.key,
35
+ });
36
+ }
37
+
38
+ async update(query: EAVQueryDto, dto: UpdateEAVDto, modifiedBy?: number): Promise<any> {
39
+ const existing = await this.repository.findByEntityAndKey(
40
+ query.entity_type,
41
+ query.entity_id,
42
+ query.key,
43
+ );
44
+
45
+ if (!existing) {
46
+ return null;
47
+ }
48
+
49
+ existing.value = dto.value;
50
+ if (modifiedBy !== undefined) {
51
+ existing.modified_by = modifiedBy;
52
+ }
53
+
54
+ return await this.repository.save(existing);
55
+ }
56
+
57
+ async delete(query: EAVQueryDto): Promise<boolean> {
58
+ return await this.repository.deleteByEntityAndKey(
59
+ query.entity_type,
60
+ query.entity_id,
61
+ query.key,
62
+ );
63
+ }
64
+ }
@@ -0,0 +1,64 @@
1
+ import { Injectable } from '@nestjs/common';
2
+ import { IEAVStrategy } from '../interface/eav-strategy.interface';
3
+ import { CreateEAVDto, UpdateEAVDto, EAVQueryDto } from '../dto/eav-operation.dto';
4
+ import { EAVDecimalRepository } from '../repository/eav-decimal.repository';
5
+
6
+ @Injectable()
7
+ export class EAVDecimalService implements IEAVStrategy {
8
+ constructor(private readonly repository: EAVDecimalRepository) { }
9
+
10
+ async create(dto: CreateEAVDto, modifiedBy?: number): Promise<any> {
11
+ const entity = this.repository.create({
12
+ entity_type: dto.entity_type,
13
+ entity_id: String(dto.entity_id),
14
+ key: dto.key,
15
+ value: dto.value,
16
+ modified_by: modifiedBy,
17
+ });
18
+
19
+ return await this.repository.save(entity);
20
+ }
21
+
22
+ async findOne(query: EAVQueryDto): Promise<any> {
23
+ return await this.repository.findByEntityAndKey(
24
+ query.entity_type,
25
+ query.entity_id,
26
+ query.key,
27
+ );
28
+ }
29
+
30
+ async findAll(query: Partial<EAVQueryDto>): Promise<any[]> {
31
+ return await this.repository.findByPartialCriteria({
32
+ entity_type: query.entity_type,
33
+ entity_id: query.entity_id,
34
+ key: query.key,
35
+ });
36
+ }
37
+
38
+ async update(query: EAVQueryDto, dto: UpdateEAVDto, modifiedBy?: number): Promise<any> {
39
+ const existing = await this.repository.findByEntityAndKey(
40
+ query.entity_type,
41
+ query.entity_id,
42
+ query.key,
43
+ );
44
+
45
+ if (!existing) {
46
+ return null;
47
+ }
48
+
49
+ existing.value = dto.value;
50
+ if (modifiedBy !== undefined) {
51
+ existing.modified_by = modifiedBy;
52
+ }
53
+
54
+ return await this.repository.save(existing);
55
+ }
56
+
57
+ async delete(query: EAVQueryDto): Promise<boolean> {
58
+ return await this.repository.deleteByEntityAndKey(
59
+ query.entity_type,
60
+ query.entity_id,
61
+ query.key,
62
+ );
63
+ }
64
+ }
@@ -0,0 +1,93 @@
1
+ import { Injectable, BadRequestException } from '@nestjs/common';
2
+ import { IEAVStrategy } from '../interface/eav-strategy.interface';
3
+ import { EAVVarcharService } from './eav-varchar.service';
4
+ import { EAVIntService } from './eav-int.service';
5
+ import { EAVBooleanService } from './eav-boolean.service';
6
+ import { EAVDecimalService } from './eav-decimal.service';
7
+ import { EAVTextService } from './eav-text.service';
8
+ import { EAVJsonService } from './eav-json.service';
9
+ import { EAVDateService } from './eav-date.service';
10
+ import { EAVTimeService } from './eav-time.service';
11
+ import { EAVTimestampService } from './eav-timestamp.service';
12
+ import { EavDataType, EavPrimaryDataType } from '../../../constant/db-data-type.constant';
13
+
14
+ /**
15
+ * Factory service to resolve the appropriate EAV service based on data type
16
+ * Implements the Factory Pattern
17
+ */
18
+ @Injectable()
19
+ export class EAVFactoryService {
20
+ private readonly serviceMap: Map<string, IEAVStrategy>;
21
+
22
+ constructor(
23
+ private readonly eavVarcharService: EAVVarcharService,
24
+ private readonly eavIntService: EAVIntService,
25
+ private readonly eavBooleanService: EAVBooleanService,
26
+ private readonly eavDecimalService: EAVDecimalService,
27
+ private readonly eavTextService: EAVTextService,
28
+ private readonly eavJsonService: EAVJsonService,
29
+ private readonly eavDateService: EAVDateService,
30
+ private readonly eavTimeService: EAVTimeService,
31
+ private readonly eavTimestampService: EAVTimestampService,
32
+ ) {
33
+ // Initialize the service map with all available data type services using enum constants
34
+ this.serviceMap = new Map<string, IEAVStrategy>([
35
+ // String types
36
+ [EavDataType.VARCHAR, this.eavVarcharService],
37
+ [EavDataType.STRING, this.eavVarcharService],
38
+ // Numeric types
39
+ [EavDataType.INT, this.eavIntService],
40
+ [EavDataType.INTEGER, this.eavIntService],
41
+ [EavDataType.DECIMAL, this.eavDecimalService],
42
+ [EavDataType.FLOAT, this.eavDecimalService],
43
+ // Boolean types
44
+ [EavDataType.BOOLEAN, this.eavBooleanService],
45
+ [EavDataType.BOOL, this.eavBooleanService],
46
+ // Text types
47
+ [EavDataType.TEXT, this.eavTextService],
48
+ [EavDataType.JSON, this.eavJsonService],
49
+ // Date/Time types
50
+ [EavDataType.DATE, this.eavDateService],
51
+ [EavDataType.TIME, this.eavTimeService],
52
+ [EavDataType.TIMESTAMP, this.eavTimestampService],
53
+ [EavDataType.DATETIME, this.eavTimestampService],
54
+ ]);
55
+ }
56
+
57
+ /**
58
+ * Get the appropriate service based on data type
59
+ * @param dataType - The data type (varchar, int, boolean, etc.)
60
+ * @returns The corresponding EAV service
61
+ * @throws BadRequestException if data type is not supported
62
+ */
63
+ getService(dataType: string): IEAVStrategy {
64
+ const normalizedType = dataType.toLowerCase().trim();
65
+ const service = this.serviceMap.get(normalizedType);
66
+
67
+ if (!service) {
68
+ throw new BadRequestException(
69
+ `Unsupported data type: ${dataType}. Supported types: ${Array.from(this.serviceMap.keys()).join(', ')}`,
70
+ );
71
+ }
72
+
73
+ return service;
74
+ }
75
+
76
+ /**
77
+ * Get all supported data types
78
+ * @returns Array of supported data type names
79
+ */
80
+ getSupportedTypes(): string[] {
81
+ return Array.from(this.serviceMap.keys());
82
+ }
83
+
84
+ /**
85
+ * Check if a data type is supported
86
+ * @param dataType - The data type to check
87
+ * @returns True if supported, false otherwise
88
+ */
89
+ isTypeSupported(dataType: string): boolean {
90
+ const normalizedType = dataType.toLowerCase().trim();
91
+ return this.serviceMap.has(normalizedType);
92
+ }
93
+ }
@@ -0,0 +1,64 @@
1
+ import { Injectable } from '@nestjs/common';
2
+ import { IEAVStrategy } from '../interface/eav-strategy.interface';
3
+ import { CreateEAVDto, UpdateEAVDto, EAVQueryDto } from '../dto/eav-operation.dto';
4
+ import { EAVIntRepository } from '../repository/eav-int.repository';
5
+
6
+ @Injectable()
7
+ export class EAVIntService implements IEAVStrategy {
8
+ constructor(private readonly repository: EAVIntRepository) { }
9
+
10
+ async create(dto: CreateEAVDto, modifiedBy?: number): Promise<any> {
11
+ const entity = this.repository.create({
12
+ entity_type: dto.entity_type,
13
+ entity_id: String(dto.entity_id),
14
+ key: dto.key,
15
+ value: dto.value,
16
+ modified_by: modifiedBy,
17
+ });
18
+
19
+ return await this.repository.save(entity);
20
+ }
21
+
22
+ async findOne(query: EAVQueryDto): Promise<any> {
23
+ return await this.repository.findByEntityAndKey(
24
+ query.entity_type,
25
+ query.entity_id,
26
+ query.key,
27
+ );
28
+ }
29
+
30
+ async findAll(query: Partial<EAVQueryDto>): Promise<any[]> {
31
+ return await this.repository.findByPartialCriteria({
32
+ entity_type: query.entity_type,
33
+ entity_id: query.entity_id,
34
+ key: query.key,
35
+ });
36
+ }
37
+
38
+ async update(query: EAVQueryDto, dto: UpdateEAVDto, modifiedBy?: number): Promise<any> {
39
+ const existing = await this.repository.findByEntityAndKey(
40
+ query.entity_type,
41
+ query.entity_id,
42
+ query.key,
43
+ );
44
+
45
+ if (!existing) {
46
+ return null;
47
+ }
48
+
49
+ existing.value = dto.value;
50
+ if (modifiedBy !== undefined) {
51
+ existing.modified_by = modifiedBy;
52
+ }
53
+
54
+ return await this.repository.save(existing);
55
+ }
56
+
57
+ async delete(query: EAVQueryDto): Promise<boolean> {
58
+ return await this.repository.deleteByEntityAndKey(
59
+ query.entity_type,
60
+ query.entity_id,
61
+ query.key,
62
+ );
63
+ }
64
+ }
@@ -0,0 +1,64 @@
1
+ import { Injectable } from '@nestjs/common';
2
+ import { IEAVStrategy } from '../interface/eav-strategy.interface';
3
+ import { CreateEAVDto, UpdateEAVDto, EAVQueryDto } from '../dto/eav-operation.dto';
4
+ import { EAVJsonRepository } from '../repository/eav-json.repository';
5
+
6
+ @Injectable()
7
+ export class EAVJsonService implements IEAVStrategy {
8
+ constructor(private readonly repository: EAVJsonRepository) { }
9
+
10
+ async create(dto: CreateEAVDto, modifiedBy?: number): Promise<any> {
11
+ const entity = this.repository.create({
12
+ entity_type: dto.entity_type,
13
+ entity_id: String(dto.entity_id),
14
+ key: dto.key,
15
+ value: dto.value,
16
+ modified_by: modifiedBy,
17
+ });
18
+
19
+ return await this.repository.save(entity);
20
+ }
21
+
22
+ async findOne(query: EAVQueryDto): Promise<any> {
23
+ return await this.repository.findByEntityAndKey(
24
+ query.entity_type,
25
+ query.entity_id,
26
+ query.key,
27
+ );
28
+ }
29
+
30
+ async findAll(query: Partial<EAVQueryDto>): Promise<any[]> {
31
+ return await this.repository.findByPartialCriteria({
32
+ entity_type: query.entity_type,
33
+ entity_id: query.entity_id,
34
+ key: query.key,
35
+ });
36
+ }
37
+
38
+ async update(query: EAVQueryDto, dto: UpdateEAVDto, modifiedBy?: number): Promise<any> {
39
+ const existing = await this.repository.findByEntityAndKey(
40
+ query.entity_type,
41
+ query.entity_id,
42
+ query.key,
43
+ );
44
+
45
+ if (!existing) {
46
+ return null;
47
+ }
48
+
49
+ existing.value = dto.value;
50
+ if (modifiedBy !== undefined) {
51
+ existing.modified_by = modifiedBy;
52
+ }
53
+
54
+ return await this.repository.save(existing);
55
+ }
56
+
57
+ async delete(query: EAVQueryDto): Promise<boolean> {
58
+ return await this.repository.deleteByEntityAndKey(
59
+ query.entity_type,
60
+ query.entity_id,
61
+ query.key,
62
+ );
63
+ }
64
+ }