@autofleet/sadot 1.1.3 → 1.1.5-beta

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 (331) hide show
  1. package/.nvmrc +1 -0
  2. package/dist/api/index.d.ts +3 -0
  3. package/dist/api/index.js +12 -2
  4. package/dist/api/v1/definition/index.d.ts +3 -0
  5. package/dist/api/v1/definition/index.js +116 -2
  6. package/dist/api/v1/definition/validations.d.ts +2 -0
  7. package/dist/api/v1/definition/validations.js +77 -2
  8. package/dist/api/v1/errors.d.ts +4 -0
  9. package/dist/api/v1/errors.js +12 -2
  10. package/dist/api/v1/index.d.ts +3 -0
  11. package/dist/api/v1/index.js +13 -2
  12. package/dist/api/v1/validator/index.d.ts +3 -0
  13. package/dist/api/v1/validator/index.js +143 -2
  14. package/dist/api/v1/validator/validations.d.ts +6 -23
  15. package/dist/api/v1/validator/validations.js +38 -2
  16. package/dist/errors/index.d.ts +24 -0
  17. package/dist/errors/index.js +66 -3
  18. package/dist/events/index.d.ts +5 -0
  19. package/dist/events/index.js +54 -2
  20. package/dist/hooks/create.d.ts +10 -0
  21. package/dist/hooks/create.js +95 -0
  22. package/dist/hooks/enrich.d.ts +25 -0
  23. package/dist/hooks/enrich.js +198 -2
  24. package/dist/hooks/find.d.ts +1 -0
  25. package/dist/hooks/find.js +29 -2
  26. package/dist/hooks/hooks.d.ts +17 -0
  27. package/dist/hooks/hooks.js +388 -2
  28. package/dist/hooks/index.d.ts +5 -0
  29. package/dist/hooks/index.js +17 -1
  30. package/dist/hooks/update.d.ts +10 -0
  31. package/dist/hooks/update.js +49 -0
  32. package/dist/hooks/utils/updateInstanceValues.d.ts +15 -0
  33. package/dist/hooks/utils/updateInstanceValues.js +50 -2
  34. package/dist/hooks/workaround.d.ts +10 -0
  35. package/dist/hooks/workaround.js +37 -0
  36. package/dist/index.d.ts +12 -22
  37. package/dist/index.js +67 -2
  38. package/dist/models/CustomFieldDefinition.d.ts +23 -29
  39. package/dist/models/CustomFieldDefinition.js +192 -2
  40. package/dist/models/CustomFieldEntries.d.ts +13 -14
  41. package/dist/models/CustomFieldEntries.js +123 -2
  42. package/dist/models/CustomFieldValue.d.ts +14 -20
  43. package/dist/models/CustomFieldValue.js +151 -2
  44. package/dist/models/CustomValidator.d.ts +15 -17
  45. package/dist/models/CustomValidator.js +98 -2
  46. package/dist/models/index.d.ts +18 -6
  47. package/dist/models/index.js +131 -2
  48. package/dist/models/tests/AssociatedTestModel.d.ts +12 -0
  49. package/dist/models/tests/AssociatedTestModel.js +71 -2
  50. package/dist/models/tests/TestModel.d.ts +12 -0
  51. package/dist/models/tests/TestModel.js +69 -2
  52. package/dist/models/tests/contextAwareModels/ContextAwareTestModel.d.ts +10 -0
  53. package/dist/models/tests/contextAwareModels/ContextAwareTestModel.js +53 -2
  54. package/dist/models/tests/contextAwareModels/ContextTestModel.d.ts +13 -0
  55. package/dist/models/tests/contextAwareModels/ContextTestModel.js +47 -2
  56. package/dist/repository/definition.d.ts +36 -0
  57. package/dist/repository/definition.js +121 -2
  58. package/dist/repository/entries.d.ts +13 -0
  59. package/dist/repository/entries.js +92 -2
  60. package/dist/repository/utils/formatValues.d.ts +3 -0
  61. package/dist/repository/utils/formatValues.js +16 -2
  62. package/dist/repository/validator.d.ts +27 -0
  63. package/dist/repository/validator.js +69 -2
  64. package/dist/repository/value.d.ts +28 -0
  65. package/dist/repository/value.js +124 -2
  66. package/dist/scopes/filter.d.ts +29 -22
  67. package/dist/scopes/filter.js +75 -2
  68. package/dist/scopes/helpers/filter.helpers.d.ts +40 -15
  69. package/dist/scopes/helpers/filter.helpers.js +183 -25
  70. package/dist/scopes/index.d.ts +2 -0
  71. package/dist/scopes/index.js +6 -1
  72. package/dist/tests/api/test-api.d.ts +2 -0
  73. package/dist/tests/api/test-api.js +38 -0
  74. package/dist/tests/functional/searching/index.d.ts +8 -0
  75. package/dist/tests/functional/searching/index.js +44 -0
  76. package/dist/tests/helpers/commonHooks.d.ts +6 -0
  77. package/dist/tests/helpers/commonHooks.js +62 -0
  78. package/dist/tests/helpers/database-config.d.ts +16 -0
  79. package/dist/tests/helpers/database-config.js +17 -0
  80. package/dist/tests/helpers/index.d.ts +7 -0
  81. package/dist/tests/helpers/index.js +33 -0
  82. package/dist/tests/mocks/definition.mock.d.ts +48 -0
  83. package/dist/tests/mocks/definition.mock.js +78 -0
  84. package/dist/tests/mocks/events.mock.d.ts +4 -0
  85. package/dist/tests/mocks/events.mock.js +21 -0
  86. package/dist/tests/mocks/testModel.d.ts +12 -0
  87. package/dist/tests/mocks/testModel.js +35 -0
  88. package/dist/types/definition/index.d.ts +25 -0
  89. package/dist/types/definition/index.js +2 -0
  90. package/dist/types/entries/index.d.ts +25 -0
  91. package/dist/types/entries/index.js +2 -0
  92. package/dist/types/index.d.ts +46 -45
  93. package/dist/types/index.js +2 -0
  94. package/dist/types/value/index.d.ts +15 -0
  95. package/dist/types/value/index.js +2 -0
  96. package/dist/utils/constants/index.d.ts +17 -20
  97. package/dist/utils/constants/index.js +22 -2
  98. package/dist/utils/db/index.d.ts +4 -0
  99. package/dist/utils/db/index.js +24 -2
  100. package/dist/utils/helpers/index.d.ts +23 -28
  101. package/dist/utils/helpers/index.js +40 -2
  102. package/dist/utils/init.d.ts +7 -0
  103. package/dist/utils/init.js +112 -2
  104. package/dist/utils/logger/index.d.ts +3 -0
  105. package/dist/utils/logger/index.js +42 -2
  106. package/dist/utils/scopeAttributes.d.ts +2 -0
  107. package/dist/utils/scopeAttributes.js +11 -2
  108. package/dist/utils/validations/index.d.ts +8 -0
  109. package/dist/utils/validations/index.js +41 -2
  110. package/dist/utils/validations/schema/custom-fields.d.ts +2 -6
  111. package/dist/utils/validations/schema/custom-fields.js +9 -2
  112. package/dist/utils/validations/schema/validator-schema.d.ts +9 -0
  113. package/dist/utils/validations/schema/validator-schema.js +95 -2
  114. package/dist/utils/validations/type.d.ts +15 -0
  115. package/dist/utils/validations/type.js +2 -0
  116. package/dist/utils/validations/validators/index.d.ts +14 -0
  117. package/dist/utils/validations/validators/index.js +40 -2
  118. package/dist/utils/validations/validators/select.validator.d.ts +5 -0
  119. package/dist/utils/validations/validators/select.validator.js +12 -2
  120. package/dist/utils/validations/validators/status.validator.d.ts +12 -0
  121. package/dist/utils/validations/validators/status.validator.js +15 -2
  122. package/package.json +39 -40
  123. package/src/api/index.ts +10 -0
  124. package/src/api/v1/definition/index.ts +104 -0
  125. package/src/api/v1/definition/validations.ts +75 -0
  126. package/src/api/v1/errors.ts +13 -0
  127. package/src/api/v1/index.ts +11 -0
  128. package/src/api/v1/validator/index.ts +141 -0
  129. package/src/api/v1/validator/validations.ts +38 -0
  130. package/src/errors/index.ts +70 -0
  131. package/src/events/index.ts +63 -0
  132. package/src/hooks/create.ts +81 -0
  133. package/src/hooks/enrich.ts +255 -0
  134. package/src/hooks/find.ts +27 -0
  135. package/src/hooks/hooks.ts +482 -0
  136. package/src/hooks/index.ts +20 -0
  137. package/src/hooks/update.ts +55 -0
  138. package/src/hooks/utils/updateInstanceValues.ts +63 -0
  139. package/src/hooks/workaround.ts +47 -0
  140. package/src/index.ts +52 -0
  141. package/src/models/CustomFieldDefinition.ts +162 -0
  142. package/src/models/CustomFieldEntries.ts +81 -0
  143. package/src/models/CustomFieldValue.ts +118 -0
  144. package/src/models/CustomValidator.ts +78 -0
  145. package/src/models/index.ts +165 -0
  146. package/src/models/tests/AssociatedTestModel.ts +57 -0
  147. package/src/models/tests/TestModel.ts +54 -0
  148. package/src/models/tests/contextAwareModels/ContextAwareTestModel.ts +43 -0
  149. package/src/models/tests/contextAwareModels/ContextTestModel.ts +38 -0
  150. package/src/repository/definition.ts +175 -0
  151. package/src/repository/entries.ts +88 -0
  152. package/src/repository/utils/formatValues.ts +14 -0
  153. package/src/repository/validator.ts +104 -0
  154. package/src/repository/value.ts +116 -0
  155. package/src/scopes/filter.ts +100 -0
  156. package/src/scopes/helpers/filter.helpers.ts +227 -0
  157. package/src/scopes/index.ts +6 -0
  158. package/src/tests/api/test-api.ts +40 -0
  159. package/src/tests/functional/searching/index.ts +39 -0
  160. package/src/tests/helpers/commonHooks.ts +43 -0
  161. package/src/tests/helpers/database-config.ts +15 -0
  162. package/src/tests/helpers/index.ts +35 -0
  163. package/src/tests/mocks/definition.mock.ts +84 -0
  164. package/src/tests/mocks/events.mock.ts +21 -0
  165. package/src/tests/mocks/testModel.ts +37 -0
  166. package/src/types/definition/index.ts +24 -0
  167. package/src/types/entries/index.ts +27 -0
  168. package/src/types/index.ts +52 -0
  169. package/src/types/value/index.ts +14 -0
  170. package/src/utils/constants/index.ts +25 -0
  171. package/src/utils/db/index.ts +21 -0
  172. package/src/utils/helpers/index.ts +66 -0
  173. package/src/utils/init.ts +120 -0
  174. package/src/utils/logger/index.ts +14 -0
  175. package/src/utils/scopeAttributes.ts +12 -0
  176. package/src/utils/validations/index.ts +46 -0
  177. package/src/utils/validations/schema/README.md +93 -0
  178. package/src/utils/validations/schema/custom-fields.ts +8 -0
  179. package/src/utils/validations/schema/validator-schema.ts +106 -0
  180. package/src/utils/validations/type.ts +20 -0
  181. package/src/utils/validations/validators/index.ts +38 -0
  182. package/src/utils/validations/validators/select.validator.ts +12 -0
  183. package/src/utils/validations/validators/status.validator.ts +22 -0
  184. package/tsconfig.build.json +7 -0
  185. package/tsconfig.json +16 -0
  186. package/dist/_virtual/_@oxc-project_runtime@0.101.0/helpers/decorate.cjs +0 -1
  187. package/dist/_virtual/_@oxc-project_runtime@0.101.0/helpers/decorate.js +0 -1
  188. package/dist/_virtual/_@oxc-project_runtime@0.101.0/helpers/decorateMetadata.cjs +0 -1
  189. package/dist/_virtual/_@oxc-project_runtime@0.101.0/helpers/decorateMetadata.js +0 -1
  190. package/dist/_virtual/rolldown_runtime.cjs +0 -1
  191. package/dist/api/index.cjs +0 -2
  192. package/dist/api/index.cjs.map +0 -1
  193. package/dist/api/index.js.map +0 -1
  194. package/dist/api/v1/definition/index.cjs +0 -2
  195. package/dist/api/v1/definition/index.cjs.map +0 -1
  196. package/dist/api/v1/definition/index.js.map +0 -1
  197. package/dist/api/v1/definition/validations.cjs +0 -2
  198. package/dist/api/v1/definition/validations.cjs.map +0 -1
  199. package/dist/api/v1/definition/validations.js.map +0 -1
  200. package/dist/api/v1/errors.cjs +0 -2
  201. package/dist/api/v1/errors.cjs.map +0 -1
  202. package/dist/api/v1/errors.js.map +0 -1
  203. package/dist/api/v1/index.cjs +0 -2
  204. package/dist/api/v1/index.cjs.map +0 -1
  205. package/dist/api/v1/index.js.map +0 -1
  206. package/dist/api/v1/validator/index.cjs +0 -2
  207. package/dist/api/v1/validator/index.cjs.map +0 -1
  208. package/dist/api/v1/validator/index.js.map +0 -1
  209. package/dist/api/v1/validator/validations.cjs +0 -2
  210. package/dist/api/v1/validator/validations.cjs.map +0 -1
  211. package/dist/api/v1/validator/validations.d.cts +0 -23
  212. package/dist/api/v1/validator/validations.js.map +0 -1
  213. package/dist/errors/index.cjs +0 -3
  214. package/dist/errors/index.cjs.map +0 -1
  215. package/dist/errors/index.js.map +0 -1
  216. package/dist/events/index.cjs +0 -2
  217. package/dist/events/index.cjs.map +0 -1
  218. package/dist/events/index.js.map +0 -1
  219. package/dist/hooks/enrich.cjs +0 -2
  220. package/dist/hooks/enrich.cjs.map +0 -1
  221. package/dist/hooks/enrich.js.map +0 -1
  222. package/dist/hooks/find.cjs +0 -2
  223. package/dist/hooks/find.cjs.map +0 -1
  224. package/dist/hooks/find.js.map +0 -1
  225. package/dist/hooks/hooks.cjs +0 -2
  226. package/dist/hooks/hooks.cjs.map +0 -1
  227. package/dist/hooks/hooks.js.map +0 -1
  228. package/dist/hooks/index.cjs +0 -1
  229. package/dist/hooks/utils/updateInstanceValues.cjs +0 -2
  230. package/dist/hooks/utils/updateInstanceValues.cjs.map +0 -1
  231. package/dist/hooks/utils/updateInstanceValues.js.map +0 -1
  232. package/dist/index.cjs +0 -2
  233. package/dist/index.cjs.map +0 -1
  234. package/dist/index.d.cts +0 -23
  235. package/dist/index.js.map +0 -1
  236. package/dist/models/CustomFieldDefinition.cjs +0 -2
  237. package/dist/models/CustomFieldDefinition.cjs.map +0 -1
  238. package/dist/models/CustomFieldDefinition.d.cts +0 -31
  239. package/dist/models/CustomFieldDefinition.js.map +0 -1
  240. package/dist/models/CustomFieldEntries.cjs +0 -2
  241. package/dist/models/CustomFieldEntries.cjs.map +0 -1
  242. package/dist/models/CustomFieldEntries.d.cts +0 -16
  243. package/dist/models/CustomFieldEntries.js.map +0 -1
  244. package/dist/models/CustomFieldValue.cjs +0 -2
  245. package/dist/models/CustomFieldValue.cjs.map +0 -1
  246. package/dist/models/CustomFieldValue.d.cts +0 -22
  247. package/dist/models/CustomFieldValue.js.map +0 -1
  248. package/dist/models/CustomValidator.cjs +0 -2
  249. package/dist/models/CustomValidator.cjs.map +0 -1
  250. package/dist/models/CustomValidator.d.cts +0 -19
  251. package/dist/models/CustomValidator.js.map +0 -1
  252. package/dist/models/index.cjs +0 -2
  253. package/dist/models/index.cjs.map +0 -1
  254. package/dist/models/index.d.cts +0 -6
  255. package/dist/models/index.js.map +0 -1
  256. package/dist/models/tests/AssociatedTestModel.cjs +0 -2
  257. package/dist/models/tests/AssociatedTestModel.cjs.map +0 -1
  258. package/dist/models/tests/AssociatedTestModel.js.map +0 -1
  259. package/dist/models/tests/TestModel.cjs +0 -2
  260. package/dist/models/tests/TestModel.cjs.map +0 -1
  261. package/dist/models/tests/TestModel.js.map +0 -1
  262. package/dist/models/tests/contextAwareModels/ContextAwareTestModel.cjs +0 -2
  263. package/dist/models/tests/contextAwareModels/ContextAwareTestModel.cjs.map +0 -1
  264. package/dist/models/tests/contextAwareModels/ContextAwareTestModel.js.map +0 -1
  265. package/dist/models/tests/contextAwareModels/ContextTestModel.cjs +0 -2
  266. package/dist/models/tests/contextAwareModels/ContextTestModel.cjs.map +0 -1
  267. package/dist/models/tests/contextAwareModels/ContextTestModel.js.map +0 -1
  268. package/dist/repository/definition.cjs +0 -2
  269. package/dist/repository/definition.cjs.map +0 -1
  270. package/dist/repository/definition.js.map +0 -1
  271. package/dist/repository/entries.cjs +0 -2
  272. package/dist/repository/entries.cjs.map +0 -1
  273. package/dist/repository/entries.js.map +0 -1
  274. package/dist/repository/utils/formatValues.cjs +0 -2
  275. package/dist/repository/utils/formatValues.cjs.map +0 -1
  276. package/dist/repository/utils/formatValues.js.map +0 -1
  277. package/dist/repository/validator.cjs +0 -2
  278. package/dist/repository/validator.cjs.map +0 -1
  279. package/dist/repository/validator.js.map +0 -1
  280. package/dist/repository/value.cjs +0 -2
  281. package/dist/repository/value.cjs.map +0 -1
  282. package/dist/repository/value.js.map +0 -1
  283. package/dist/scopes/filter.cjs +0 -2
  284. package/dist/scopes/filter.cjs.map +0 -1
  285. package/dist/scopes/filter.d.cts +0 -23
  286. package/dist/scopes/filter.js.map +0 -1
  287. package/dist/scopes/helpers/filter.helpers.cjs +0 -46
  288. package/dist/scopes/helpers/filter.helpers.cjs.map +0 -1
  289. package/dist/scopes/helpers/filter.helpers.d.cts +0 -17
  290. package/dist/scopes/helpers/filter.helpers.js.map +0 -1
  291. package/dist/scopes/index.cjs +0 -1
  292. package/dist/types/index.d.cts +0 -45
  293. package/dist/utils/constants/index.cjs +0 -2
  294. package/dist/utils/constants/index.cjs.map +0 -1
  295. package/dist/utils/constants/index.d.cts +0 -22
  296. package/dist/utils/constants/index.js.map +0 -1
  297. package/dist/utils/db/index.cjs +0 -2
  298. package/dist/utils/db/index.cjs.map +0 -1
  299. package/dist/utils/db/index.js.map +0 -1
  300. package/dist/utils/helpers/index.cjs +0 -2
  301. package/dist/utils/helpers/index.cjs.map +0 -1
  302. package/dist/utils/helpers/index.d.cts +0 -31
  303. package/dist/utils/helpers/index.js.map +0 -1
  304. package/dist/utils/init.cjs +0 -2
  305. package/dist/utils/init.cjs.map +0 -1
  306. package/dist/utils/init.js.map +0 -1
  307. package/dist/utils/logger/index.cjs +0 -2
  308. package/dist/utils/logger/index.cjs.map +0 -1
  309. package/dist/utils/logger/index.js.map +0 -1
  310. package/dist/utils/scopeAttributes.cjs +0 -2
  311. package/dist/utils/scopeAttributes.cjs.map +0 -1
  312. package/dist/utils/scopeAttributes.js.map +0 -1
  313. package/dist/utils/validations/index.cjs +0 -2
  314. package/dist/utils/validations/index.cjs.map +0 -1
  315. package/dist/utils/validations/index.js.map +0 -1
  316. package/dist/utils/validations/schema/custom-fields.cjs +0 -2
  317. package/dist/utils/validations/schema/custom-fields.cjs.map +0 -1
  318. package/dist/utils/validations/schema/custom-fields.d.cts +0 -7
  319. package/dist/utils/validations/schema/custom-fields.js.map +0 -1
  320. package/dist/utils/validations/schema/validator-schema.cjs +0 -2
  321. package/dist/utils/validations/schema/validator-schema.cjs.map +0 -1
  322. package/dist/utils/validations/schema/validator-schema.js.map +0 -1
  323. package/dist/utils/validations/validators/index.cjs +0 -2
  324. package/dist/utils/validations/validators/index.cjs.map +0 -1
  325. package/dist/utils/validations/validators/index.js.map +0 -1
  326. package/dist/utils/validations/validators/select.validator.cjs +0 -2
  327. package/dist/utils/validations/validators/select.validator.cjs.map +0 -1
  328. package/dist/utils/validations/validators/select.validator.js.map +0 -1
  329. package/dist/utils/validations/validators/status.validator.cjs +0 -2
  330. package/dist/utils/validations/validators/status.validator.cjs.map +0 -1
  331. package/dist/utils/validations/validators/status.validator.js.map +0 -1
@@ -0,0 +1,57 @@
1
+ /* eslint-disable @typescript-eslint/no-unused-vars */
2
+ import {
3
+ Table,
4
+ Column,
5
+ Model,
6
+ PrimaryKey,
7
+ DataType,
8
+ ForeignKey,
9
+ BelongsTo,
10
+ } from 'sequelize-typescript';
11
+ import TestModel from './TestModel';
12
+
13
+ @Table({ schema: 'custom-fields', createdAt: false, updatedAt: false })
14
+ class AssociatedTestModel extends Model {
15
+ @PrimaryKey
16
+ @Column({
17
+ type: DataType.UUID,
18
+ defaultValue: DataType.UUIDV4,
19
+ allowNull: false,
20
+ })
21
+ id!: string;
22
+
23
+ @ForeignKey(() => TestModel)
24
+ @Column({
25
+ type: DataType.UUID,
26
+ allowNull: false,
27
+ })
28
+ testModelId!: string;
29
+
30
+ @Column({
31
+ type: DataType.UUID,
32
+ allowNull: false,
33
+ })
34
+ fleetId: string;
35
+
36
+ @Column({
37
+ type: DataType.UUID,
38
+ allowNull: true,
39
+ })
40
+ businessModelId: string;
41
+
42
+ @Column({
43
+ type: DataType.UUID,
44
+ allowNull: true,
45
+ })
46
+ demandSourceId: string;
47
+
48
+ @Column({
49
+ type: DataType.BOOLEAN,
50
+ })
51
+ anotherAttribute?: boolean;
52
+
53
+ @BelongsTo(() => TestModel)
54
+ testModel: TestModel;
55
+ }
56
+
57
+ export default AssociatedTestModel;
@@ -0,0 +1,54 @@
1
+ /* eslint-disable @typescript-eslint/no-unused-vars */
2
+ import {
3
+ Table,
4
+ Column,
5
+ Model,
6
+ PrimaryKey,
7
+ DataType,
8
+ HasMany,
9
+ } from 'sequelize-typescript';
10
+ import AssociatedTestModel from './AssociatedTestModel';
11
+
12
+ @Table({ schema: 'custom-fields', createdAt: false, updatedAt: false })
13
+ class TestModel extends Model {
14
+ @PrimaryKey
15
+ @Column({
16
+ type: DataType.UUID,
17
+ defaultValue: DataType.UUIDV4,
18
+ allowNull: false,
19
+ })
20
+ id!: string;
21
+
22
+ @Column({
23
+ type: DataType.UUID,
24
+ allowNull: false,
25
+ })
26
+ fleetId: string;
27
+
28
+ @Column({
29
+ type: DataType.UUID,
30
+ allowNull: true,
31
+ })
32
+ businessModelId: string;
33
+
34
+ @Column({
35
+ type: DataType.UUID,
36
+ allowNull: true,
37
+ })
38
+ demandSourceId: string;
39
+
40
+ @Column({
41
+ type: DataType.BOOLEAN,
42
+ })
43
+ coolAttribute?: boolean;
44
+
45
+ @HasMany(() => AssociatedTestModel)
46
+ associatedModels: AssociatedTestModel[];
47
+
48
+ @Column({
49
+ type: DataType.VIRTUAL,
50
+ })
51
+ customFields?: any;
52
+ }
53
+
54
+ export default TestModel;
@@ -0,0 +1,43 @@
1
+ /* eslint-disable @typescript-eslint/no-unused-vars */
2
+ import {
3
+ Table,
4
+ Column,
5
+ Model,
6
+ PrimaryKey,
7
+ DataType,
8
+ HasMany,
9
+ BelongsTo,
10
+ ForeignKey,
11
+ } from 'sequelize-typescript';
12
+ import AssociatedTestModel from '../AssociatedTestModel';
13
+ import ContextTestModel from './ContextTestModel';
14
+
15
+ @Table({ createdAt: false, updatedAt: false })
16
+ class ContextAwareTestModel extends Model {
17
+ @PrimaryKey
18
+ @Column({
19
+ type: DataType.UUID,
20
+ defaultValue: DataType.UUIDV4,
21
+ allowNull: false,
22
+ })
23
+ id!: string;
24
+
25
+ @ForeignKey(() => ContextTestModel)
26
+ @Column({ type: DataType.UUID })
27
+ contextId: string;
28
+
29
+ @Column({
30
+ type: DataType.BOOLEAN,
31
+ })
32
+ coolAttribute?: boolean;
33
+
34
+ @Column({
35
+ type: DataType.VIRTUAL,
36
+ })
37
+ customFields?: any;
38
+
39
+ @BelongsTo(() => ContextTestModel)
40
+ context: ContextTestModel;
41
+ }
42
+
43
+ export default ContextAwareTestModel;
@@ -0,0 +1,38 @@
1
+ /* eslint-disable @typescript-eslint/no-unused-vars */
2
+ import {
3
+ Table,
4
+ Column,
5
+ Model,
6
+ PrimaryKey,
7
+ DataType,
8
+ } from 'sequelize-typescript';
9
+
10
+ // eslint-disable-next-line no-shadow
11
+ enum EEntityTypes {
12
+ BUSINESS_MODEL = 'businessModel',
13
+ CONTEXT = 'context',
14
+ DEMAND_SOURCE = 'demandSource',
15
+ FLEET = 'fleet',
16
+ }
17
+
18
+ @Table({ createdAt: false, updatedAt: false })
19
+ class ContextTestModel extends Model {
20
+ @PrimaryKey
21
+ @Column({
22
+ defaultValue: DataType.UUIDV4,
23
+ type: DataType.UUID,
24
+ })
25
+ id: string;
26
+
27
+ @Column({
28
+ type: DataType.UUID,
29
+ })
30
+ entityId: string;
31
+
32
+ @Column({
33
+ type: DataType.ENUM(...Object.values(EEntityTypes)),
34
+ })
35
+ entityType: EEntityTypes;
36
+ }
37
+
38
+ export default ContextTestModel;
@@ -0,0 +1,175 @@
1
+ import {
2
+ Op,
3
+ type Includeable, type Transaction, type FindOptions, type WhereOptions,
4
+ } from 'sequelize';
5
+ import { CustomFieldDefinition, type CustomFieldEntries } from '../models';
6
+ import type { CreateCustomFieldDefinition, UpdateCustomFieldDefinition } from '../types/definition';
7
+ import type { ModelOptions } from '../types';
8
+ import { MissingDefinitionError } from '../errors';
9
+
10
+ export const create = (data: CreateCustomFieldDefinition): Promise<CustomFieldDefinition> =>
11
+ CustomFieldDefinition.create(data);
12
+
13
+ interface SadotFindOptions {
14
+ withDisabled?: boolean;
15
+ transaction?: Transaction;
16
+ include?: Includeable | Includeable[];
17
+ }
18
+
19
+ type SadotGetDefinitionsByEntityIdsOptions = FindOptions & { modelOptions?: ModelOptions } & Pick<SadotFindOptions, 'withDisabled'>;
20
+
21
+ export const findAll = (
22
+ where: WhereOptions,
23
+ options: SadotFindOptions = { withDisabled: false },
24
+ ): Promise<CustomFieldDefinition[]> => {
25
+ const queryModel = options.withDisabled
26
+ ? CustomFieldDefinition.unscoped()
27
+ : CustomFieldDefinition;
28
+
29
+ return queryModel.scope('userScope').findAll({
30
+ where,
31
+ transaction: options.transaction,
32
+ raw: true,
33
+ include: options.include,
34
+ });
35
+ };
36
+
37
+ export const findByIds = (
38
+ ids: string[],
39
+ options: SadotFindOptions = { withDisabled: false },
40
+ ): Promise<CustomFieldDefinition[]> => findAll({ id: { [Op.in]: ids } }, options);
41
+
42
+ export const findById = (
43
+ id: string,
44
+ options: Pick<SadotFindOptions, 'withDisabled'> = { withDisabled: false },
45
+ ): Promise<CustomFieldDefinition | null> => {
46
+ const { withDisabled } = options;
47
+ if (withDisabled) {
48
+ return CustomFieldDefinition.unscoped().scope('userScope').findByPk(id);
49
+ }
50
+ return CustomFieldDefinition.scope('userScope').findByPk(id);
51
+ };
52
+
53
+ export const findByEntityIds = async (
54
+ modelType: string,
55
+ entityIds: string[],
56
+ options: FindOptions & { modelOptions?: ModelOptions } = {},
57
+ ): Promise<CustomFieldDefinition[]> => {
58
+ const { include, useEntityIdFromInclude } = options.modelOptions;
59
+ const where: WhereOptions = {
60
+ modelType,
61
+ ...(!useEntityIdFromInclude && { entityId: { [Op.in]: entityIds } }),
62
+ };
63
+
64
+ return CustomFieldDefinition.findAll({
65
+ where,
66
+ transaction: options.transaction,
67
+ include: include?.(entityIds),
68
+ raw: true,
69
+ });
70
+ };
71
+
72
+ export const findByWhere = (where): Promise<CustomFieldDefinition | null> =>
73
+ CustomFieldDefinition.scope('userScope').findOne({
74
+ where,
75
+ });
76
+
77
+ export const findDefinitionsByModels = async (
78
+ modelTypes: string[],
79
+ options?,
80
+ ): Promise<CustomFieldDefinition[]> => {
81
+ const query: WhereOptions<CreateCustomFieldDefinition> = { modelType: { [Op.in]: modelTypes } };
82
+ return CustomFieldDefinition.findAll({
83
+ where: query,
84
+ transaction: options?.transaction,
85
+ });
86
+ };
87
+
88
+ export const update = async (
89
+ id: string,
90
+ data: UpdateCustomFieldDefinition,
91
+ ): Promise<CustomFieldDefinition> => {
92
+ const updatedDefinition = (await CustomFieldDefinition.scope('userScope').update(data, {
93
+ where: { id },
94
+ returning: true,
95
+ individualHooks: true,
96
+ }))[1][0];
97
+ return updatedDefinition;
98
+ };
99
+
100
+ export const disable = (id: string): Promise<[affectedCount: number]> =>
101
+ CustomFieldDefinition.update(
102
+ { disabled: true },
103
+ { where: { id } },
104
+ );
105
+
106
+ export const destroy = (id: string): Promise<number> =>
107
+ CustomFieldDefinition.destroy({ where: { id } });
108
+
109
+ /**
110
+ * Return the names of the required fields for a given model
111
+ */
112
+ export const getRequiredFields = async (
113
+ modelType: string,
114
+ modelId: string | string[],
115
+ entityId: string | string[],
116
+ modelOptions: ModelOptions = {},
117
+ ): Promise<string[]> => {
118
+ const entityIds = Array.isArray(entityId) ? entityId : [entityId];
119
+ const { include, useEntityIdFromInclude } = modelOptions;
120
+
121
+ const where: WhereOptions = {
122
+ modelType,
123
+ required: true,
124
+ ...(!useEntityIdFromInclude && { entityId: { [Op.in]: entityIds } }),
125
+ };
126
+
127
+ const requiredFields = await CustomFieldDefinition.findAll({
128
+ where,
129
+ include: include?.(entityIds),
130
+ logging: true,
131
+ });
132
+ const requiredFieldsNames = requiredFields.map((definition) => definition.name);
133
+ return [...new Set(requiredFieldsNames)];
134
+ };
135
+
136
+ /**
137
+ * @returns A promise resolving with a dictionary of custom field definitions by name.
138
+ * @throws A {@link MissingDefinitionError} if any of the custom fields doesn't have a definition.
139
+ */
140
+ export const getCustomFieldDefinitionsDictionary = async (
141
+ instances: CustomFieldEntries[],
142
+ options: SadotGetDefinitionsByEntityIdsOptions = { withDisabled: false, modelOptions: {} },
143
+ ): Promise<{ [definitionName: string]: CustomFieldDefinition }> => {
144
+ const { modelType } = instances[0]?.dataValues ?? {};
145
+ const customFields = new Set<string>();
146
+ const modelIds = [];
147
+ const entityIds = new Set<string>();
148
+ instances.forEach((instance) => {
149
+ const { dataValues: { modelId, entityId, customFields: instanceCustomFields } } = instance;
150
+ modelIds.push(modelId);
151
+ entityIds.add(entityId);
152
+
153
+ Object.keys(instanceCustomFields ?? {}).forEach((fieldName) => {
154
+ customFields.add(fieldName);
155
+ });
156
+ });
157
+
158
+ const where: WhereOptions = {
159
+ modelType,
160
+ entityId: { [Op.in]: Array.from(entityIds) },
161
+ name: { [Op.in]: Array.from(customFields) },
162
+ };
163
+
164
+ const definitions = await findAll(where, { ...options });
165
+
166
+ const matchedDefinitions = definitions.filter((def) => customFields.has(def.name));
167
+ const matchedDefinitionsByName = Object.fromEntries(matchedDefinitions.map((definition) => [definition.name, definition]));
168
+
169
+ if (!definitions?.length || matchedDefinitions.length !== customFields.size) {
170
+ const unmatchedCustomFields = Array.from(customFields).filter((customField) => !matchedDefinitionsByName[customField]);
171
+ throw new MissingDefinitionError(unmatchedCustomFields);
172
+ }
173
+
174
+ return matchedDefinitionsByName;
175
+ };
@@ -0,0 +1,88 @@
1
+ /* eslint-disable no-param-reassign */
2
+ import type {
3
+ FindOptions,
4
+ Includeable,
5
+ Transaction,
6
+ WhereOptions,
7
+ } from 'sequelize';
8
+ import { CustomFieldEntries } from '../models';
9
+ import type { ModelOptions } from '../types';
10
+ import logger from '../utils/logger';
11
+ import { MissingDefinitionError } from '../errors';
12
+ import * as DefinitionRepo from './definition';
13
+ import { formatFunctions } from './utils/formatValues';
14
+
15
+ type CustomFieldEntriesModelOptions = ModelOptions & { include?: Includeable, transaction?: Transaction };
16
+
17
+ export const findEntriesByModelId = async (modelId: string, options: CustomFieldEntriesModelOptions = {}) => {
18
+ const { transaction } = options;
19
+ return CustomFieldEntries.findOne({
20
+ where: { modelId },
21
+ transaction,
22
+ });
23
+ };
24
+
25
+ export const findEntriesByModelIds = async (modelIds: string[], options: CustomFieldEntriesModelOptions = {}) => {
26
+ const { transaction } = options;
27
+ return CustomFieldEntries.findAll({
28
+ where: { modelId: modelIds },
29
+ transaction,
30
+ });
31
+ };
32
+
33
+ export const updateEntries = async (
34
+ modelId: string,
35
+ modelType: string,
36
+ customFields: Record<string, any>,
37
+ identifiers: string[],
38
+ options: FindOptions & { modelOptions?: ModelOptions } = {},
39
+ ) => {
40
+ const customFieldsNames = Object.keys(customFields);
41
+ logger.debug(`custom-fields: updating entries for ${modelType} ${modelId}`, {
42
+ customFieldsNames,
43
+ optionsKeys: options ? Object.keys(options) : null,
44
+ customFields,
45
+ identifiers,
46
+ });
47
+ const { modelOptions, transaction } = options;
48
+
49
+ const where: WhereOptions = {
50
+ modelType,
51
+ name: customFieldsNames,
52
+ ...(!options.modelOptions?.useEntityIdFromInclude && { entityId: identifiers }),
53
+ };
54
+
55
+ const fieldDefinitions = await DefinitionRepo.findAll(where, { withDisabled: true, transaction, include: modelOptions.include?.(identifiers) }) ?? [];
56
+
57
+ const disabledDefinitions = fieldDefinitions.filter((def) => def.disabled);
58
+ if (fieldDefinitions.length !== customFieldsNames.length) {
59
+ logger.warn(`custom-fields: missing definitions for ${modelType} ${modelId}`, { names: customFieldsNames, fieldDefinitions });
60
+ const missingDefinitions = customFieldsNames.filter((name) => !fieldDefinitions.some((def) => def.name === name));
61
+ throw new MissingDefinitionError(missingDefinitions);
62
+ }
63
+
64
+ const disabledNames = disabledDefinitions?.map((def) => def.name) || [];
65
+ const valuesWithDisabledDefinitions = customFieldsNames.filter((name) => disabledNames.includes(name));
66
+ if (valuesWithDisabledDefinitions?.length > 0) {
67
+ logger.warn(`custom-fields: trying to update disabled values: ${valuesWithDisabledDefinitions.join(', ')}`);
68
+ }
69
+
70
+ const definitionsByName = Object.fromEntries(fieldDefinitions.map((definition) => [definition.name, definition]));
71
+ // If we need to format the value before we save it
72
+ Object.entries(customFields)
73
+ .filter(([definitionName]) => formatFunctions[definitionsByName[definitionName].fieldType])
74
+ .forEach(([definitionName, value]) => {
75
+ const { fieldType } = definitionsByName[definitionName];
76
+ customFields[definitionName] = formatFunctions[fieldType](value);
77
+ });
78
+
79
+ return CustomFieldEntries.upsert(
80
+ {
81
+ modelId,
82
+ entityId: fieldDefinitions[0].entityId,
83
+ modelType,
84
+ customFields,
85
+ },
86
+ options,
87
+ );
88
+ };
@@ -0,0 +1,14 @@
1
+ import { CustomFieldDefinitionType } from '../../utils/constants';
2
+
3
+ export const formatFunctions = {
4
+ [CustomFieldDefinitionType.DATE]: (value) => {
5
+ if (value) {
6
+ const date = new Date(value);
7
+ if (date.toString() === 'Invalid Date') {
8
+ throw new Error(`Invalid date value: ${value}`);
9
+ }
10
+ return date.toISOString();
11
+ }
12
+ return null;
13
+ },
14
+ };
@@ -0,0 +1,104 @@
1
+ import type { IncludeOptions, Transactionable } from 'sequelize';
2
+ import logger from '../utils/logger';
3
+ import { CustomValidator } from '../models';
4
+
5
+ export interface FindValidatorOptions extends Transactionable {
6
+ withDisabled?: boolean;
7
+ attributes?: string[];
8
+ raw?: boolean;
9
+ include?: IncludeOptions[];
10
+ }
11
+
12
+ // Make sure this interface is compatible with the Sequelize model
13
+ export interface ValidatorAttributes {
14
+ entityId: string;
15
+ entityType: string;
16
+ modelType: string;
17
+ schema: CustomValidator['schema'];
18
+ disabled?: boolean;
19
+ [key: string]: unknown; // Add index signature for Sequelize compatibility
20
+ }
21
+
22
+ export const create = async (
23
+ validatorAttributes: ValidatorAttributes,
24
+ options: Transactionable = {},
25
+ ): Promise<CustomValidator> => {
26
+ logger.debug('custom-validator - create validator');
27
+
28
+ // Use unknown type to bypass TypeScript errors while maintaining compatibility
29
+ const validator = await CustomValidator.create(validatorAttributes as Record<string, unknown>, options);
30
+
31
+ return validator;
32
+ };
33
+
34
+ export const findAll = async (
35
+ where = {},
36
+ options: FindValidatorOptions = { withDisabled: false },
37
+ ): Promise<CustomValidator[]> => {
38
+ logger.debug('custom-validator - find all validators');
39
+
40
+ const { transaction, withDisabled } = options;
41
+
42
+ let validators;
43
+ if (withDisabled) {
44
+ // If withDisabled is true, use unscoped to ignore the default scope that filters disabled items
45
+ // Apply the userScope separately to maintain permission filtering
46
+ validators = await CustomValidator.unscoped().scope('userScope').findAll({
47
+ where,
48
+ transaction,
49
+ });
50
+ } else {
51
+ // Use defaultScope and userScope to filter both disabled and by permissions
52
+ // The defaultScope keeps only non-disabled validators
53
+ validators = await CustomValidator.scope(['defaultScope', 'userScope']).findAll({
54
+ where,
55
+ transaction,
56
+ });
57
+ }
58
+
59
+ return validators;
60
+ };
61
+
62
+ export const findAllByModelType = async (
63
+ modelType: string,
64
+ entityId: string,
65
+ options: FindValidatorOptions = { withDisabled: false },
66
+ ): Promise<CustomValidator[]> => {
67
+ logger.debug('custom-validator - find all validators by model type');
68
+
69
+ return findAll(
70
+ {
71
+ modelType,
72
+ ...(!options.include && {
73
+ entityId,
74
+ }),
75
+ },
76
+ options,
77
+ );
78
+ };
79
+
80
+ export const update = async (
81
+ id: string,
82
+ updates: Partial<ValidatorAttributes>,
83
+ options?: Transactionable,
84
+ ): Promise<[number, CustomValidator[]]> => {
85
+ logger.debug('custom-validator - update validator');
86
+
87
+ return CustomValidator.update(
88
+ updates,
89
+ {
90
+ where: { id },
91
+ returning: true,
92
+ ...options,
93
+ },
94
+ );
95
+ };
96
+
97
+ export const disable = async (
98
+ id: string,
99
+ options?: Transactionable,
100
+ ): Promise<[number, CustomValidator[]]> => {
101
+ logger.debug('custom-validator - disable validator');
102
+
103
+ return update(id, { disabled: true }, options);
104
+ };
@@ -0,0 +1,116 @@
1
+ import type { FindOptions, WhereOptions } from 'sequelize';
2
+ import { CustomFieldValue, CustomFieldDefinition } from '../models';
3
+ import * as DefinitionRepo from './definition';
4
+ import type { CreateCustomFieldValue, ValuesToUpdate } from '../types/value';
5
+ import logger from '../utils/logger';
6
+ import { MissingDefinitionError } from '../errors';
7
+ import type { ModelOptions } from '../types';
8
+ import { formatFunctions } from './utils/formatValues';
9
+
10
+ export const findByModelIdAndDefinition = async (modelId: string, customFieldDefinitionId: string) =>
11
+ CustomFieldValue.findAll({ where: { modelId, customFieldDefinitionId }, include: [CustomFieldDefinition] });
12
+
13
+ export const create = async (data: CreateCustomFieldValue, withAssociations = false) => {
14
+ const created = await CustomFieldValue.create(data);
15
+ if (withAssociations) {
16
+ const createdWithAssociations = await findByModelIdAndDefinition(created.modelId, created.customFieldDefinitionId);
17
+ return createdWithAssociations?.[0];
18
+ }
19
+ return created;
20
+ };
21
+
22
+ export const findAllValues = async () => CustomFieldValue.findAll({ include: [CustomFieldDefinition] });
23
+ /**
24
+ * Get all values for model instance id (with their definitions)
25
+ * @param modelId
26
+ * @returns CustomFieldValue[]
27
+ */
28
+ export const findValuesByModelId = async (modelId: string) => CustomFieldValue.findAll({ where: { modelId }, include: [CustomFieldDefinition] });
29
+
30
+ /**
31
+ * Retrieves custom field values for given model IDs
32
+ * @param modelIds - An array of model IDs to query custom field values for.
33
+ * @param options - Optional configuration object.
34
+ */
35
+ export const findValuesByModelIds = async (modelIds: string[], options?): Promise<CustomFieldValue[]> => {
36
+ const { transaction } = options;
37
+ return CustomFieldValue.findAll({
38
+ where: { modelId: modelIds },
39
+ transaction,
40
+ raw: true,
41
+ nest: true,
42
+ });
43
+ };
44
+
45
+ /**
46
+ * Try to update custom field values for a model instance.
47
+ * Create new value record if not exists, but fails if value's definition not exist.
48
+ * Return the updated values
49
+ */
50
+ export const updateValues = async (
51
+ modelType: string,
52
+ modelId: string,
53
+ identifiers: string[],
54
+ valuesToUpdate: ValuesToUpdate,
55
+ options: FindOptions & { modelOptions?: ModelOptions } = {},
56
+ ): Promise<CustomFieldValue[]> => {
57
+ const names = Object.keys(valuesToUpdate);
58
+ logger.debug(`custom-fields: updating values for ${modelType} ${modelId}`, {
59
+ names,
60
+ optionsKeys: options ? Object.keys(options) : null,
61
+ valuesToUpdate,
62
+ identifiers,
63
+ });
64
+ const { modelOptions, transaction } = options;
65
+
66
+ const where: WhereOptions = {
67
+ modelType,
68
+ name: names,
69
+ ...(!options.modelOptions?.useEntityIdFromInclude && { entityId: identifiers }),
70
+ };
71
+
72
+ const fieldDefinitions = await DefinitionRepo.findAll(where, { withDisabled: true, transaction, include: modelOptions.include?.(identifiers) }) ?? [];
73
+
74
+ const disabledDefinitions = fieldDefinitions.filter((def) => def.disabled);
75
+ if (fieldDefinitions.length !== names.length) {
76
+ logger.warn(`custom-fields: missing definitions for ${modelType} ${modelId}`, { names, fieldDefinitions });
77
+ const missingDefinitions = names.filter((name) => !fieldDefinitions.some((def) => def.name === name));
78
+ throw new MissingDefinitionError(missingDefinitions);
79
+ }
80
+
81
+ const disabledNames = disabledDefinitions?.map((def) => def.name) || [];
82
+ const valuesWithDisabledDefinitions = names.filter((name) => disabledNames.includes(name));
83
+ if (valuesWithDisabledDefinitions?.length > 0) {
84
+ logger.warn(`custom-fields: trying to update disabled values: ${valuesWithDisabledDefinitions.join(', ')}`);
85
+ }
86
+
87
+ const values: CreateCustomFieldValue[] = names.map((name) => {
88
+ const fieldDefinition = fieldDefinitions.find((def) => def.name === name);
89
+ const formatFunction = formatFunctions[fieldDefinition.fieldType];
90
+ const value = formatFunction ? formatFunction(valuesToUpdate[name]) : valuesToUpdate[name];
91
+ return {
92
+ modelId,
93
+ updatedAt: new Date(),
94
+ customFieldDefinitionId: fieldDefinition.id,
95
+ value: value !== undefined ? value : fieldDefinition.defaultValue,
96
+ };
97
+ });
98
+
99
+ return Promise.all(values.map(async (value) => {
100
+ const [cfv] = await CustomFieldValue.upsert(value, {
101
+ transaction: options.transaction,
102
+ });
103
+ return cfv;
104
+ }));
105
+ };
106
+
107
+ export const deleteValue = (
108
+ id: string,
109
+ options: any = {},
110
+ ): Promise<any> => CustomFieldValue.update(
111
+ { deletedAt: new Date() },
112
+ {
113
+ where: { id },
114
+ transaction: options.transaction,
115
+ },
116
+ );