@intellegens/cornerstone-client 0.0.0-experimental-upgrade-20260302-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.
Files changed (251) hide show
  1. package/README.md +256 -0
  2. package/demo/index.ts +29 -0
  3. package/demo/public_html/favicon.ico +0 -0
  4. package/demo/public_html/index.html +106 -0
  5. package/demo/public_html/websettings.json +3 -0
  6. package/dist/adapters/CollectionViewAdapter/index.d.ts +198 -0
  7. package/dist/adapters/CollectionViewAdapter/index.integration.test.d.ts +1 -0
  8. package/dist/adapters/CollectionViewAdapter/index.integration.test.js +163 -0
  9. package/dist/adapters/CollectionViewAdapter/index.js +381 -0
  10. package/dist/adapters/SearchAdapter/index.d.ts +55 -0
  11. package/dist/adapters/SearchAdapter/index.js +233 -0
  12. package/dist/adapters/index.d.ts +2 -0
  13. package/dist/adapters/index.js +2 -0
  14. package/dist/data/api/dto/PropertyPathDto.d.ts +4 -0
  15. package/dist/data/api/dto/PropertyPathDto.js +1 -0
  16. package/dist/data/api/dto/ReadOptionsDto.d.ts +8 -0
  17. package/dist/data/api/dto/ReadOptionsDto.js +1 -0
  18. package/dist/data/api/dto/ReadResultDto.d.ts +12 -0
  19. package/dist/data/api/dto/ReadResultDto.js +1 -0
  20. package/dist/data/api/dto/ReadResultMetadataDto.d.ts +8 -0
  21. package/dist/data/api/dto/ReadResultMetadataDto.js +1 -0
  22. package/dist/data/api/dto/crud/CrudMetadataDto.d.ts +4 -0
  23. package/dist/data/api/dto/crud/CrudMetadataDto.js +1 -0
  24. package/dist/data/api/dto/crud/index.d.ts +1 -0
  25. package/dist/data/api/dto/crud/index.js +1 -0
  26. package/dist/data/api/dto/index.d.ts +4 -0
  27. package/dist/data/api/dto/index.js +4 -0
  28. package/dist/data/api/dto/read/ReadMetadataDto.d.ts +8 -0
  29. package/dist/data/api/dto/read/ReadMetadataDto.js +1 -0
  30. package/dist/data/api/dto/read/ReadSelectedDefinitionDto.d.ts +18 -0
  31. package/dist/data/api/dto/read/ReadSelectedDefinitionDto.js +1 -0
  32. package/dist/data/api/dto/read/ReadSelectedNestedCollectionCriteriaDto.d.ts +22 -0
  33. package/dist/data/api/dto/read/ReadSelectedNestedCollectionCriteriaDto.js +1 -0
  34. package/dist/data/api/dto/read/ReadSelectedNestedCriteriaDto.d.ts +18 -0
  35. package/dist/data/api/dto/read/ReadSelectedNestedCriteriaDto.js +1 -0
  36. package/dist/data/api/dto/read/ReadSelectedOrderingDefinitionDto.d.ts +7 -0
  37. package/dist/data/api/dto/read/ReadSelectedOrderingDefinitionDto.js +1 -0
  38. package/dist/data/api/dto/read/ReadSelectedOrderingPropertyDefinitionDto.d.ts +14 -0
  39. package/dist/data/api/dto/read/ReadSelectedOrderingPropertyDefinitionDto.js +1 -0
  40. package/dist/data/api/dto/read/ReadSelectedPaginationDefinitionDto.d.ts +13 -0
  41. package/dist/data/api/dto/read/ReadSelectedPaginationDefinitionDto.js +1 -0
  42. package/dist/data/api/dto/read/ReadSelectedSearchDefinitionBuilder.d.ts +167 -0
  43. package/dist/data/api/dto/read/ReadSelectedSearchDefinitionBuilder.js +267 -0
  44. package/dist/data/api/dto/read/ReadSelectedSearchDefinitionDto.d.ts +33 -0
  45. package/dist/data/api/dto/read/ReadSelectedSearchDefinitionDto.js +1 -0
  46. package/dist/data/api/dto/read/ReadSelectedSearchPropertyDefinitionDto.d.ts +114 -0
  47. package/dist/data/api/dto/read/ReadSelectedSearchPropertyDefinitionDto.js +1 -0
  48. package/dist/data/api/dto/read/index.d.ts +10 -0
  49. package/dist/data/api/dto/read/index.js +10 -0
  50. package/dist/data/api/dto/response/ApiErrorDto.d.ts +17 -0
  51. package/dist/data/api/dto/response/ApiErrorDto.js +1 -0
  52. package/dist/data/api/dto/response/ApiErrorResponseDto.d.ts +11 -0
  53. package/dist/data/api/dto/response/ApiErrorResponseDto.js +1 -0
  54. package/dist/data/api/dto/response/ApiResponseDto.d.ts +3 -0
  55. package/dist/data/api/dto/response/ApiResponseDto.js +1 -0
  56. package/dist/data/api/dto/response/ApiSuccessResponseDto.d.ts +13 -0
  57. package/dist/data/api/dto/response/ApiSuccessResponseDto.js +1 -0
  58. package/dist/data/api/dto/response/EmptyMetadataDto.d.ts +4 -0
  59. package/dist/data/api/dto/response/EmptyMetadataDto.js +1 -0
  60. package/dist/data/api/dto/response/MetadataDto.d.ts +25 -0
  61. package/dist/data/api/dto/response/MetadataDto.js +1 -0
  62. package/dist/data/api/dto/response/index.d.ts +5 -0
  63. package/dist/data/api/dto/response/index.js +5 -0
  64. package/dist/data/api/enum/index.d.ts +2 -0
  65. package/dist/data/api/enum/index.js +2 -0
  66. package/dist/data/api/enum/read/ReadSelectedCollectionOperator.d.ts +16 -0
  67. package/dist/data/api/enum/read/ReadSelectedCollectionOperator.js +17 -0
  68. package/dist/data/api/enum/read/ReadSelectedComparisonOperator.d.ts +69 -0
  69. package/dist/data/api/enum/read/ReadSelectedComparisonOperator.js +76 -0
  70. package/dist/data/api/enum/read/ReadSelectedLogicalOperator.d.ts +15 -0
  71. package/dist/data/api/enum/read/ReadSelectedLogicalOperator.js +16 -0
  72. package/dist/data/api/enum/read/ReadSelectedOrderingDirection.d.ts +13 -0
  73. package/dist/data/api/enum/read/ReadSelectedOrderingDirection.js +14 -0
  74. package/dist/data/api/enum/read/ReadSelectedPropertyType.d.ts +66 -0
  75. package/dist/data/api/enum/read/ReadSelectedPropertyType.js +75 -0
  76. package/dist/data/api/enum/read/index.d.ts +5 -0
  77. package/dist/data/api/enum/read/index.js +5 -0
  78. package/dist/data/api/enum/response/ApiErrorCodes.d.ts +7 -0
  79. package/dist/data/api/enum/response/ApiErrorCodes.js +8 -0
  80. package/dist/data/api/enum/response/ErrorCode.d.ts +13 -0
  81. package/dist/data/api/enum/response/ErrorCode.js +14 -0
  82. package/dist/data/api/enum/response/index.d.ts +1 -0
  83. package/dist/data/api/enum/response/index.js +1 -0
  84. package/dist/data/api/index.d.ts +3 -0
  85. package/dist/data/api/index.js +3 -0
  86. package/dist/data/api/interface/ICommonIdentifiable.d.ts +7 -0
  87. package/dist/data/api/interface/ICommonIdentifiable.js +1 -0
  88. package/dist/data/api/interface/IConcurrencySafe.d.ts +9 -0
  89. package/dist/data/api/interface/IConcurrencySafe.js +2 -0
  90. package/dist/data/api/interface/IIdentifiable.d.ts +11 -0
  91. package/dist/data/api/interface/IIdentifiable.js +1 -0
  92. package/dist/data/api/interface/IIdentifiableSecondary.d.ts +9 -0
  93. package/dist/data/api/interface/IIdentifiableSecondary.js +1 -0
  94. package/dist/data/api/interface/index.d.ts +3 -0
  95. package/dist/data/api/interface/index.js +3 -0
  96. package/dist/data/auth/dto/ClaimDto.d.ts +4 -0
  97. package/dist/data/auth/dto/ClaimDto.js +1 -0
  98. package/dist/data/auth/dto/RegisterRequestDto.d.ts +4 -0
  99. package/dist/data/auth/dto/RegisterRequestDto.js +1 -0
  100. package/dist/data/auth/dto/RoleDto.d.ts +5 -0
  101. package/dist/data/auth/dto/RoleDto.js +1 -0
  102. package/dist/data/auth/dto/SignInRequestDto.d.ts +4 -0
  103. package/dist/data/auth/dto/SignInRequestDto.js +1 -0
  104. package/dist/data/auth/dto/TokensDto.d.ts +4 -0
  105. package/dist/data/auth/dto/TokensDto.js +1 -0
  106. package/dist/data/auth/dto/UserDto.d.ts +17 -0
  107. package/dist/data/auth/dto/UserDto.js +1 -0
  108. package/dist/data/auth/dto/UserInfoDto.d.ts +14 -0
  109. package/dist/data/auth/dto/UserInfoDto.js +1 -0
  110. package/dist/data/auth/dto/index.d.ts +5 -0
  111. package/dist/data/auth/dto/index.js +5 -0
  112. package/dist/data/auth/index.d.ts +2 -0
  113. package/dist/data/auth/index.js +2 -0
  114. package/dist/data/auth/policy.d.ts +52 -0
  115. package/dist/data/auth/policy.js +44 -0
  116. package/dist/data/index.d.ts +2 -0
  117. package/dist/data/index.js +2 -0
  118. package/dist/index.d.ts +4 -0
  119. package/dist/index.js +4 -0
  120. package/dist/services/api/ApiCrudControllerClient/index.d.ts +41 -0
  121. package/dist/services/api/ApiCrudControllerClient/index.integration.test.d.ts +1 -0
  122. package/dist/services/api/ApiCrudControllerClient/index.integration.test.js +34 -0
  123. package/dist/services/api/ApiCrudControllerClient/index.js +116 -0
  124. package/dist/services/api/ApiInitializationService/index.d.ts +106 -0
  125. package/dist/services/api/ApiInitializationService/index.js +208 -0
  126. package/dist/services/api/ApiReadControllerClient/index.d.ts +40 -0
  127. package/dist/services/api/ApiReadControllerClient/index.integration.test.d.ts +1 -0
  128. package/dist/services/api/ApiReadControllerClient/index.integration.test.js +59 -0
  129. package/dist/services/api/ApiReadControllerClient/index.js +111 -0
  130. package/dist/services/api/HttpService/FetchHttpService.d.ts +7 -0
  131. package/dist/services/api/HttpService/FetchHttpService.integration.test.d.ts +1 -0
  132. package/dist/services/api/HttpService/FetchHttpService.integration.test.js +52 -0
  133. package/dist/services/api/HttpService/FetchHttpService.js +29 -0
  134. package/dist/services/api/HttpService/HttpRequestConfig.d.ts +10 -0
  135. package/dist/services/api/HttpService/HttpRequestConfig.js +1 -0
  136. package/dist/services/api/HttpService/HttpResponse.d.ts +11 -0
  137. package/dist/services/api/HttpService/HttpResponse.js +3 -0
  138. package/dist/services/api/HttpService/IHttpService.d.ts +13 -0
  139. package/dist/services/api/HttpService/IHttpService.js +3 -0
  140. package/dist/services/api/HttpService/index.d.ts +9 -0
  141. package/dist/services/api/HttpService/index.js +10 -0
  142. package/dist/services/api/UserManagementControllerClient/index.d.ts +41 -0
  143. package/dist/services/api/UserManagementControllerClient/index.integration.test.d.ts +1 -0
  144. package/dist/services/api/UserManagementControllerClient/index.integration.test.js +60 -0
  145. package/dist/services/api/UserManagementControllerClient/index.js +117 -0
  146. package/dist/services/api/index.d.ts +5 -0
  147. package/dist/services/api/index.js +5 -0
  148. package/dist/services/auth/client/AuthService/index.d.ts +75 -0
  149. package/dist/services/auth/client/AuthService/index.js +200 -0
  150. package/dist/services/auth/client/AuthorizationManagementControllerClient/index.d.ts +48 -0
  151. package/dist/services/auth/client/AuthorizationManagementControllerClient/index.integration.test.d.ts +1 -0
  152. package/dist/services/auth/client/AuthorizationManagementControllerClient/index.integration.test.js +89 -0
  153. package/dist/services/auth/client/AuthorizationManagementControllerClient/index.js +148 -0
  154. package/dist/services/auth/client/index.d.ts +2 -0
  155. package/dist/services/auth/client/index.js +2 -0
  156. package/dist/services/auth/index.d.ts +1 -0
  157. package/dist/services/auth/index.js +1 -0
  158. package/dist/services/index.d.ts +2 -0
  159. package/dist/services/index.js +2 -0
  160. package/dist/utils/authorization/index.d.ts +17 -0
  161. package/dist/utils/authorization/index.js +45 -0
  162. package/dist/utils/index.d.ts +2 -0
  163. package/dist/utils/index.js +2 -0
  164. package/dist/utils/result/index.d.ts +21 -0
  165. package/dist/utils/result/index.js +16 -0
  166. package/dist/utils/search/index.d.ts +34 -0
  167. package/dist/utils/search/index.js +106 -0
  168. package/package.json +45 -0
  169. package/src/adapters/CollectionViewAdapter/index.integration.test.ts +197 -0
  170. package/src/adapters/CollectionViewAdapter/index.ts +477 -0
  171. package/src/adapters/SearchAdapter/index.ts +302 -0
  172. package/src/adapters/index.ts +2 -0
  173. package/src/data/api/dto/PropertyPathDto.ts +4 -0
  174. package/src/data/api/dto/ReadOptionsDto.ts +8 -0
  175. package/src/data/api/dto/ReadResultDto.ts +13 -0
  176. package/src/data/api/dto/ReadResultMetadataDto.ts +8 -0
  177. package/src/data/api/dto/crud/CrudMetadataDto.ts +4 -0
  178. package/src/data/api/dto/crud/index.ts +1 -0
  179. package/src/data/api/dto/index.ts +4 -0
  180. package/src/data/api/dto/read/ReadMetadataDto.ts +8 -0
  181. package/src/data/api/dto/read/ReadSelectedDefinitionDto.ts +21 -0
  182. package/src/data/api/dto/read/ReadSelectedNestedCollectionCriteriaDto.ts +25 -0
  183. package/src/data/api/dto/read/ReadSelectedNestedCriteriaDto.ts +20 -0
  184. package/src/data/api/dto/read/ReadSelectedOrderingDefinitionDto.ts +8 -0
  185. package/src/data/api/dto/read/ReadSelectedOrderingPropertyDefinitionDto.ts +16 -0
  186. package/src/data/api/dto/read/ReadSelectedPaginationDefinitionDto.ts +13 -0
  187. package/src/data/api/dto/read/ReadSelectedSearchDefinitionBuilder.ts +348 -0
  188. package/src/data/api/dto/read/ReadSelectedSearchDefinitionDto.ts +43 -0
  189. package/src/data/api/dto/read/ReadSelectedSearchPropertyDefinitionDto.ts +186 -0
  190. package/src/data/api/dto/read/index.ts +10 -0
  191. package/src/data/api/dto/response/ApiErrorDto.ts +21 -0
  192. package/src/data/api/dto/response/ApiErrorResponseDto.ts +13 -0
  193. package/src/data/api/dto/response/ApiResponseDto.ts +7 -0
  194. package/src/data/api/dto/response/ApiSuccessResponseDto.ts +13 -0
  195. package/src/data/api/dto/response/MetadataDto.ts +24 -0
  196. package/src/data/api/dto/response/index.ts +5 -0
  197. package/src/data/api/enum/index.ts +2 -0
  198. package/src/data/api/enum/read/ReadSelectedCollectionOperator.ts +17 -0
  199. package/src/data/api/enum/read/ReadSelectedComparisonOperator.ts +96 -0
  200. package/src/data/api/enum/read/ReadSelectedLogicalOperator.ts +16 -0
  201. package/src/data/api/enum/read/ReadSelectedOrderingDirection.ts +13 -0
  202. package/src/data/api/enum/read/ReadSelectedPropertyType.ts +96 -0
  203. package/src/data/api/enum/read/index.ts +5 -0
  204. package/src/data/api/enum/response/ErrorCode.ts +13 -0
  205. package/src/data/api/enum/response/index.ts +1 -0
  206. package/src/data/api/index.ts +3 -0
  207. package/src/data/api/interface/ICommonIdentifiable.ts +9 -0
  208. package/src/data/api/interface/IConcurrencySafe.ts +9 -0
  209. package/src/data/api/interface/IIdentifiable.ts +12 -0
  210. package/src/data/api/interface/IIdentifiableSecondary.ts +9 -0
  211. package/src/data/api/interface/index.ts +3 -0
  212. package/src/data/auth/dto/ClaimDto.ts +4 -0
  213. package/src/data/auth/dto/RegisterRequestDto.ts +4 -0
  214. package/src/data/auth/dto/RoleDto.ts +6 -0
  215. package/src/data/auth/dto/SignInRequestDto.ts +4 -0
  216. package/src/data/auth/dto/TokensDto.ts +4 -0
  217. package/src/data/auth/dto/UserDto.ts +18 -0
  218. package/src/data/auth/dto/UserInfoDto.ts +15 -0
  219. package/src/data/auth/dto/index.ts +5 -0
  220. package/src/data/auth/index.ts +2 -0
  221. package/src/data/auth/policy.ts +63 -0
  222. package/src/data/index.ts +2 -0
  223. package/src/index.ts +4 -0
  224. package/src/services/api/ApiCrudControllerClient/index.integration.test.ts +46 -0
  225. package/src/services/api/ApiCrudControllerClient/index.ts +135 -0
  226. package/src/services/api/ApiInitializationService/index.ts +254 -0
  227. package/src/services/api/ApiReadControllerClient/index.integration.test.ts +71 -0
  228. package/src/services/api/ApiReadControllerClient/index.ts +137 -0
  229. package/src/services/api/HttpService/FetchHttpService.integration.test.ts +65 -0
  230. package/src/services/api/HttpService/FetchHttpService.ts +34 -0
  231. package/src/services/api/HttpService/HttpRequestConfig.ts +10 -0
  232. package/src/services/api/HttpService/HttpResponse.ts +14 -0
  233. package/src/services/api/HttpService/IHttpService.ts +17 -0
  234. package/src/services/api/HttpService/README.md +106 -0
  235. package/src/services/api/HttpService/index.ts +12 -0
  236. package/src/services/api/UserManagementControllerClient/index.integration.test.ts +69 -0
  237. package/src/services/api/UserManagementControllerClient/index.ts +134 -0
  238. package/src/services/api/index.ts +5 -0
  239. package/src/services/auth/client/AuthService/index.ts +233 -0
  240. package/src/services/auth/client/AuthorizationManagementControllerClient/index.integration.test.ts +110 -0
  241. package/src/services/auth/client/AuthorizationManagementControllerClient/index.ts +165 -0
  242. package/src/services/auth/client/index.ts +2 -0
  243. package/src/services/auth/index.ts +1 -0
  244. package/src/services/index.ts +2 -0
  245. package/src/utils/authorization/index.ts +47 -0
  246. package/src/utils/index.ts +2 -0
  247. package/src/utils/result/index.ts +25 -0
  248. package/src/utils/search/index.ts +150 -0
  249. package/tsconfig.json +19 -0
  250. package/vitest-setup.ts +43 -0
  251. package/vitest.config.ts +59 -0
@@ -0,0 +1,348 @@
1
+ import { ReadSelectedCollectionOperator, ReadSelectedComparisonOperator, ReadSelectedLogicalOperator, ReadSelectedPropertyType } from '@data';
2
+ import { ReadSelectedSearchDefinitionDto } from './ReadSelectedSearchDefinitionDto';
3
+ import { ReadSelectedSearchPropertyDefinitionDto } from './ReadSelectedSearchPropertyDefinitionDto';
4
+ import { ReadSelectedNestedCriteriaDto } from './ReadSelectedNestedCriteriaDto';
5
+ import { ReadSelectedNestedCollectionCriteriaDto } from './ReadSelectedNestedCollectionCriteriaDto';
6
+
7
+ /**
8
+ * Builder class for constructing ReadSelectedSearchDefinitionDto with a fluent API.
9
+ *
10
+ * @example
11
+ * // Simple AND search with property criteria
12
+ * const search = SearchBuilder.and<User>()
13
+ * .whereString('name', ReadSelectedComparisonOperator.IContains, 'John')
14
+ * .whereNumber('age', ReadSelectedComparisonOperator.GreaterThan, 18)
15
+ * .build();
16
+ *
17
+ * @example
18
+ * // OR search with nested criteria (specify nested type for intellisense)
19
+ * const search = SearchBuilder.or<User>()
20
+ * .whereString('status', ReadSelectedComparisonOperator.Equal, 'active')
21
+ * .nested<Address>('address', nested =>
22
+ * nested.whereString('city', ReadSelectedComparisonOperator.Equal, 'NYC')
23
+ * )
24
+ * .build();
25
+ *
26
+ * @example
27
+ * // Complex nested search with collection criteria
28
+ * const search = SearchBuilder.and<Order>()
29
+ * .whereString('status', ReadSelectedComparisonOperator.Equal, 'pending')
30
+ * .any<OrderItem>('items', itemSearch =>
31
+ * itemSearch.whereNumber('quantity', ReadSelectedComparisonOperator.GreaterThan, 5)
32
+ * )
33
+ * .group(sub => sub.or()
34
+ * .whereString('priority', ReadSelectedComparisonOperator.Equal, 'high')
35
+ * .whereString('priority', ReadSelectedComparisonOperator.Equal, 'urgent')
36
+ * )
37
+ * .build();
38
+ */
39
+ export class SearchBuilder<T> {
40
+ private _logicalOperator: ReadSelectedLogicalOperator;
41
+ private _searches: ReadSelectedSearchDefinitionDto<T>[] = [];
42
+ private _propertyCriteria: ReadSelectedSearchPropertyDefinitionDto<T, keyof T>[] = [];
43
+ private _nestedCriteria: ReadSelectedNestedCriteriaDto<T, keyof T>[] = [];
44
+ private _nestedCollectionCriteria: ReadSelectedNestedCollectionCriteriaDto<T, keyof T>[] = [];
45
+
46
+ private constructor(logicalOperator: ReadSelectedLogicalOperator) {
47
+ this._logicalOperator = logicalOperator;
48
+ }
49
+
50
+ /**
51
+ * Creates a new builder with AND logical operator.
52
+ * All criteria added to this builder will be combined with AND.
53
+ */
54
+ static and<T>(): SearchBuilder<T> {
55
+ return new SearchBuilder<T>(ReadSelectedLogicalOperator.And);
56
+ }
57
+
58
+ /**
59
+ * Creates a new builder with OR logical operator.
60
+ * All criteria added to this builder will be combined with OR.
61
+ */
62
+ static or<T>(): SearchBuilder<T> {
63
+ return new SearchBuilder<T>(ReadSelectedLogicalOperator.Or);
64
+ }
65
+
66
+ /**
67
+ * Sets the logical operator to AND.
68
+ */
69
+ and(): this {
70
+ this._logicalOperator = ReadSelectedLogicalOperator.And;
71
+ return this;
72
+ }
73
+
74
+ /**
75
+ * Sets the logical operator to OR.
76
+ */
77
+ or(): this {
78
+ this._logicalOperator = ReadSelectedLogicalOperator.Or;
79
+ return this;
80
+ }
81
+
82
+ /**
83
+ * Adds a property comparison criterion.
84
+ *
85
+ * @param propertyName - The property to compare
86
+ * @param comparisonOperator - The comparison operator to use
87
+ * @param value - The value to compare against
88
+ * @param valueType - The type of the value
89
+ */
90
+ where<K extends keyof T>(propertyName: K, comparisonOperator: ReadSelectedComparisonOperator, value: unknown, valueType: ReadSelectedPropertyType): this {
91
+ this._propertyCriteria.push({
92
+ propertyName: this.toPascalCase(propertyName),
93
+ comparisonOperator,
94
+ value,
95
+ valueType,
96
+ } as ReadSelectedSearchPropertyDefinitionDto<T, keyof T>);
97
+ return this;
98
+ }
99
+
100
+ /**
101
+ * Adds a string property comparison with common string operations.
102
+ */
103
+ whereString<K extends keyof T>(
104
+ propertyName: K,
105
+ comparisonOperator:
106
+ | ReadSelectedComparisonOperator.Equal
107
+ | ReadSelectedComparisonOperator.NotEqual
108
+ | ReadSelectedComparisonOperator.Contains
109
+ | ReadSelectedComparisonOperator.StartsWith
110
+ | ReadSelectedComparisonOperator.EndsWith
111
+ | ReadSelectedComparisonOperator.IContains
112
+ | ReadSelectedComparisonOperator.IStartsWith
113
+ | ReadSelectedComparisonOperator.IEndsWith
114
+ | ReadSelectedComparisonOperator.IEqual
115
+ | ReadSelectedComparisonOperator.INotEqual,
116
+ value: string,
117
+ ): this {
118
+ return this.where(propertyName, comparisonOperator, value, ReadSelectedPropertyType.String);
119
+ }
120
+
121
+ /**
122
+ * Adds a number property comparison.
123
+ */
124
+ whereNumber<K extends keyof T>(
125
+ propertyName: K,
126
+ comparisonOperator:
127
+ | ReadSelectedComparisonOperator.Equal
128
+ | ReadSelectedComparisonOperator.NotEqual
129
+ | ReadSelectedComparisonOperator.LessThan
130
+ | ReadSelectedComparisonOperator.LessOrEqual
131
+ | ReadSelectedComparisonOperator.GreaterThan
132
+ | ReadSelectedComparisonOperator.GreaterOrEqual,
133
+ value: number,
134
+ valueType:
135
+ | ReadSelectedPropertyType.Int
136
+ | ReadSelectedPropertyType.Short
137
+ | ReadSelectedPropertyType.Long
138
+ | ReadSelectedPropertyType.Decimal
139
+ | ReadSelectedPropertyType.Double
140
+ | ReadSelectedPropertyType.Float = ReadSelectedPropertyType.Int,
141
+ ): this {
142
+ return this.where(propertyName, comparisonOperator, value, valueType);
143
+ }
144
+
145
+ /**
146
+ * Adds a boolean property comparison.
147
+ */
148
+ whereBool<K extends keyof T>(
149
+ propertyName: K,
150
+ comparisonOperator: ReadSelectedComparisonOperator.Equal | ReadSelectedComparisonOperator.NotEqual,
151
+ value: boolean,
152
+ ): this {
153
+ return this.where(propertyName, comparisonOperator, value, ReadSelectedPropertyType.Bool);
154
+ }
155
+
156
+ /**
157
+ * Adds a date/time property comparison.
158
+ */
159
+ whereDate<K extends keyof T>(
160
+ propertyName: K,
161
+ comparisonOperator:
162
+ | ReadSelectedComparisonOperator.Equal
163
+ | ReadSelectedComparisonOperator.NotEqual
164
+ | ReadSelectedComparisonOperator.LessThan
165
+ | ReadSelectedComparisonOperator.LessOrEqual
166
+ | ReadSelectedComparisonOperator.GreaterThan
167
+ | ReadSelectedComparisonOperator.GreaterOrEqual,
168
+ value: string | Date,
169
+ valueType:
170
+ | ReadSelectedPropertyType.DateTime
171
+ | ReadSelectedPropertyType.DateTimeOffset
172
+ | ReadSelectedPropertyType.DateOnly
173
+ | ReadSelectedPropertyType.TimeOnly
174
+ | ReadSelectedPropertyType.TimeSpan = ReadSelectedPropertyType.DateTime,
175
+ ): this {
176
+ const stringValue = value instanceof Date ? value.toISOString() : value;
177
+ return this.where(propertyName, comparisonOperator, stringValue, valueType);
178
+ }
179
+
180
+ /**
181
+ * Adds an isNull check for a property.
182
+ */
183
+ whereNull<K extends keyof T>(propertyName: K): this {
184
+ this._propertyCriteria.push({
185
+ propertyName: this.toPascalCase(propertyName),
186
+ comparisonOperator: ReadSelectedComparisonOperator.IsNull,
187
+ value: null,
188
+ valueType: ReadSelectedPropertyType.String,
189
+ } as unknown as ReadSelectedSearchPropertyDefinitionDto<T, keyof T>);
190
+ return this;
191
+ }
192
+
193
+ /**
194
+ * Adds an isNotNull check for a property.
195
+ */
196
+ whereNotNull<K extends keyof T>(propertyName: K): this {
197
+ this._propertyCriteria.push({
198
+ propertyName: this.toPascalCase(propertyName),
199
+ comparisonOperator: ReadSelectedComparisonOperator.IsNotNull,
200
+ value: null,
201
+ valueType: ReadSelectedPropertyType.String,
202
+ } as unknown as ReadSelectedSearchPropertyDefinitionDto<T, keyof T>);
203
+ return this;
204
+ }
205
+
206
+ /**
207
+ * Adds criteria for a nested object property (navigation property).
208
+ *
209
+ * @param propertyName - The navigation property name
210
+ * @param builderFn - A function that receives a new builder for the nested type
211
+ *
212
+ * @example
213
+ * // With explicit type for proper intellisense
214
+ * SearchBuilder.and<VehicleDto>()
215
+ * .nested<PersonDto>('driver', nested =>
216
+ * nested.whereString('name', ReadSelectedComparisonOperator.Contains, 'Alice')
217
+ * )
218
+ * .build();
219
+ */
220
+ nested<TNested, K extends keyof T = keyof T>(propertyName: K, builderFn: (builder: SearchBuilder<TNested>) => SearchBuilder<TNested>): this {
221
+ const nestedBuilder = SearchBuilder.and<TNested>();
222
+ const configuredBuilder = builderFn(nestedBuilder);
223
+ this._nestedCriteria.push({
224
+ propertyName: this.toPascalCase(propertyName),
225
+ criteria: configuredBuilder.build(),
226
+ } as ReadSelectedNestedCriteriaDto<T, keyof T>);
227
+ return this;
228
+ }
229
+
230
+ /**
231
+ * Adds criteria for a collection property with Any quantifier.
232
+ * Matches if at least one element in the collection satisfies the criteria.
233
+ *
234
+ * @param propertyName - The collection property name
235
+ * @param builderFn - A function that receives a new builder for the collection element type
236
+ *
237
+ * @example
238
+ * // With explicit type for proper intellisense
239
+ * SearchBuilder.and<VehicleDto>()
240
+ * .any<PersonDto>('passengers', passengers =>
241
+ * passengers.whereString('name', ReadSelectedComparisonOperator.Contains, 'Bob')
242
+ * )
243
+ * .build();
244
+ */
245
+ any<TElement, K extends keyof T = keyof T>(propertyName: K, builderFn: (builder: SearchBuilder<TElement>) => SearchBuilder<TElement>): this {
246
+ const nestedBuilder = SearchBuilder.and<TElement>();
247
+ const configuredBuilder = builderFn(nestedBuilder);
248
+ this._nestedCollectionCriteria.push({
249
+ propertyName: this.toPascalCase(propertyName),
250
+ collectionOperator: ReadSelectedCollectionOperator.Any,
251
+ criteria: configuredBuilder.build(),
252
+ } as ReadSelectedNestedCollectionCriteriaDto<T, keyof T>);
253
+ return this;
254
+ }
255
+
256
+ /**
257
+ * Adds criteria for a collection property with All quantifier.
258
+ * Matches if all elements in the collection satisfy the criteria.
259
+ *
260
+ * @param propertyName - The collection property name
261
+ * @param builderFn - A function that receives a new builder for the collection element type
262
+ *
263
+ * @example
264
+ * // With explicit type for proper intellisense
265
+ * SearchBuilder.and<VehicleDto>()
266
+ * .all<PersonDto>('passengers', passengers =>
267
+ * passengers.whereNumber('age', ReadSelectedComparisonOperator.GreaterThan, 18)
268
+ * )
269
+ * .build();
270
+ */
271
+ all<TElement, K extends keyof T = keyof T>(propertyName: K, builderFn: (builder: SearchBuilder<TElement>) => SearchBuilder<TElement>): this {
272
+ const nestedBuilder = SearchBuilder.and<TElement>();
273
+ const configuredBuilder = builderFn(nestedBuilder);
274
+ this._nestedCollectionCriteria.push({
275
+ propertyName: this.toPascalCase(propertyName),
276
+ collectionOperator: ReadSelectedCollectionOperator.All,
277
+ criteria: configuredBuilder.build(),
278
+ } as ReadSelectedNestedCollectionCriteriaDto<T, keyof T>);
279
+ return this;
280
+ }
281
+
282
+ /**
283
+ * Adds a nested search group. Use this for complex logical groupings.
284
+ *
285
+ * @param builderFn - A function that receives a new builder for creating the nested search
286
+ *
287
+ * @example
288
+ * // (name contains 'John') AND ((age > 18) OR (status = 'verified'))
289
+ * SearchBuilder.and<User>()
290
+ * .whereString('name', ReadSelectedComparisonOperator.IContains, 'John')
291
+ * .group(sub => sub.or()
292
+ * .whereNumber('age', ReadSelectedComparisonOperator.GreaterThan, 18)
293
+ * .whereString('status', ReadSelectedComparisonOperator.Equal, 'verified')
294
+ * )
295
+ * .build();
296
+ */
297
+ group(builderFn: (builder: SearchBuilder<T>) => SearchBuilder<T>): this {
298
+ const nestedBuilder = SearchBuilder.and<T>();
299
+ const configuredBuilder = builderFn(nestedBuilder);
300
+ this._searches.push(configuredBuilder.build());
301
+ return this;
302
+ }
303
+
304
+ /**
305
+ * Adds an existing search definition as a nested search.
306
+ *
307
+ * @param search - An existing ReadSelectedSearchDefinitionDto
308
+ */
309
+ addSearch(search: ReadSelectedSearchDefinitionDto<T>): this {
310
+ this._searches.push(search);
311
+ return this;
312
+ }
313
+
314
+ /**
315
+ * Builds and returns the ReadSelectedSearchDefinitionDto.
316
+ */
317
+ build(): ReadSelectedSearchDefinitionDto<T> {
318
+ const result: ReadSelectedSearchDefinitionDto<T> = {
319
+ logicalOperator: this._logicalOperator,
320
+ };
321
+
322
+ if (this._searches.length > 0) {
323
+ result.searches = this._searches;
324
+ }
325
+
326
+ if (this._propertyCriteria.length > 0) {
327
+ result.propertyCriteria = this._propertyCriteria;
328
+ }
329
+
330
+ if (this._nestedCriteria.length > 0) {
331
+ result.nestedCriteria = this._nestedCriteria;
332
+ }
333
+
334
+ if (this._nestedCollectionCriteria.length > 0) {
335
+ result.nestedCollectionCriteria = this._nestedCollectionCriteria;
336
+ }
337
+
338
+ return result;
339
+ }
340
+
341
+ private toPascalCase(str: string | number | symbol): string {
342
+ if (typeof str !== 'string') {
343
+ return str.toString();
344
+ }
345
+
346
+ return str.charAt(0).toUpperCase() + str.slice(1);
347
+ }
348
+ }
@@ -0,0 +1,43 @@
1
+ import {
2
+ ReadSelectedLogicalOperator,
3
+ ReadSelectedNestedCollectionCriteriaDto,
4
+ ReadSelectedNestedCriteriaDto,
5
+ ReadSelectedSearchPropertyDefinitionDto,
6
+ } from '@data';
7
+
8
+ /**
9
+ * Defines the search criteria for a controller using a recursive structure.
10
+ *
11
+ * This DTO supports complex search queries with:
12
+ * - Logical operators (AND/OR) to combine multiple criteria
13
+ * - Direct property value comparisons via `propertyCriteria`
14
+ * - Nested searches via `searches` for recursive query composition
15
+ * - Navigation into nested objects via `nestedCriteria`
16
+ * - Collection quantifier queries (Any/All) via `nestedCollectionCriteria`
17
+ */
18
+ export type ReadSelectedSearchDefinitionDto<T> = {
19
+ /**
20
+ * The logical operator to combine all criteria at this level.
21
+ */
22
+ logicalOperator: ReadSelectedLogicalOperator;
23
+
24
+ /**
25
+ * Recursive nested search definitions combined with the logical operator.
26
+ */
27
+ searches?: ReadSelectedSearchDefinitionDto<T>[];
28
+
29
+ /**
30
+ * Direct property value comparison criteria.
31
+ */
32
+ propertyCriteria?: ReadSelectedSearchPropertyDefinitionDto<T, keyof T>[];
33
+
34
+ /**
35
+ * Criteria for searching within nested object properties.
36
+ */
37
+ nestedCriteria?: ReadSelectedNestedCriteriaDto<T, keyof T>[];
38
+
39
+ /**
40
+ * Criteria for searching within collection properties using Any/All quantifiers.
41
+ */
42
+ nestedCollectionCriteria?: ReadSelectedNestedCollectionCriteriaDto<T, keyof T>[];
43
+ };
@@ -0,0 +1,186 @@
1
+ import {ReadSelectedComparisonOperator, ReadSelectedPropertyType} from '@data';
2
+
3
+ /**
4
+ * Defines a direct property value comparison criteria for searching.
5
+ *
6
+ * This DTO represents a leaf-level search criterion that compares a single property
7
+ * against a value using a comparison operator. For nested property searches, use
8
+ * `ReadSelectedNestedCriteriaDto` or `ReadSelectedNestedCollectionCriteriaDto`.
9
+ */
10
+ export type ReadSelectedSearchPropertyDefinitionDto<T, TPropertyName extends keyof T> =
11
+ Partial_ReadSelectedSearchPropertyDefinition_IndependentProperties<T, TPropertyName>
12
+ &
13
+ Partial_ReadSelectedSearchPropertyDefinition_TypedValueProperty
14
+ &
15
+ Partial_ReadSelectedSearchPropertyDefinition_TypedComparisonOperators;
16
+
17
+ /**
18
+ * Defines independent properties
19
+ */
20
+ type Partial_ReadSelectedSearchPropertyDefinition_IndependentProperties<T, TPropertyName extends keyof T> = {
21
+ /**
22
+ * The name of the property to compare.
23
+ *
24
+ * This must be a direct property on the target type, not a nested property path.
25
+ * Use nested criteria DTOs for navigation.
26
+ */
27
+ propertyName: TPropertyName;
28
+ /**
29
+ * The comparison operator to use for the search.
30
+ */
31
+ comparisonOperator: ReadSelectedComparisonOperator;
32
+ /**
33
+ * The type of the property value being searched.
34
+ */
35
+ valueType: ReadSelectedPropertyType;
36
+ /**
37
+ * The value to compare against.
38
+ */
39
+ value: unknown;
40
+ };
41
+
42
+ /**
43
+ * Defines the dependence between the .valueType and the type of the .value properties
44
+ */
45
+ type Partial_ReadSelectedSearchPropertyDefinition_TypedValueProperty =
46
+ // Boolean
47
+ | {
48
+ /**
49
+ * The type of the property value being searched.
50
+ */
51
+ valueType: ReadSelectedPropertyType.Bool;
52
+ /**
53
+ * The value to use for the search.
54
+ */
55
+ value: boolean;
56
+ }
57
+ // Number
58
+ | {
59
+ /**
60
+ * The type of the property value being searched.
61
+ */
62
+ valueType:
63
+ | ReadSelectedPropertyType.Int
64
+ | ReadSelectedPropertyType.Short
65
+ | ReadSelectedPropertyType.Long
66
+ | ReadSelectedPropertyType.Decimal
67
+ | ReadSelectedPropertyType.Double
68
+ | ReadSelectedPropertyType.Float;
69
+ /**
70
+ * The value to use for the search.
71
+ */
72
+ value: number;
73
+ }
74
+ // String
75
+ | {
76
+ /**
77
+ * The type of the property value being searched.
78
+ */
79
+ valueType: ReadSelectedPropertyType.String;
80
+ /**
81
+ * The value to use for the search.
82
+ */
83
+ value: string;
84
+ }
85
+ // Temporal
86
+ | {
87
+ /**
88
+ * The type of the property value being searched.
89
+ */
90
+ valueType:
91
+ | ReadSelectedPropertyType.DateTime
92
+ | ReadSelectedPropertyType.DateTimeOffset
93
+ | ReadSelectedPropertyType.TimeSpan
94
+ | ReadSelectedPropertyType.DateOnly
95
+ | ReadSelectedPropertyType.TimeOnly;
96
+ /**
97
+ * The value to use for the search.
98
+ */
99
+ value: string;
100
+ };
101
+
102
+ /**
103
+ * Defines the dependence between the .valueType and the type of the .comparisonOperator properties
104
+ */
105
+ type Partial_ReadSelectedSearchPropertyDefinition_TypedComparisonOperators =
106
+ // Boolean
107
+ | {
108
+ /**
109
+ * The type of the property value being searched.
110
+ */
111
+ valueType: ReadSelectedPropertyType.Bool;
112
+
113
+ /**
114
+ * The comparison operator to use for the search.
115
+ */
116
+ comparisonOperator: ReadSelectedComparisonOperator.Equal | ReadSelectedComparisonOperator.NotEqual;
117
+ }
118
+ // Number
119
+ | {
120
+ /**
121
+ * The type of the property value being searched.
122
+ */
123
+ valueType:
124
+ | ReadSelectedPropertyType.Int
125
+ | ReadSelectedPropertyType.Short
126
+ | ReadSelectedPropertyType.Long
127
+ | ReadSelectedPropertyType.Decimal
128
+ | ReadSelectedPropertyType.Double
129
+ | ReadSelectedPropertyType.Float;
130
+
131
+ /**
132
+ * The comparison operator to use for the search.
133
+ */
134
+ comparisonOperator:
135
+ | ReadSelectedComparisonOperator.Equal
136
+ | ReadSelectedComparisonOperator.NotEqual
137
+ | ReadSelectedComparisonOperator.LessThan
138
+ | ReadSelectedComparisonOperator.LessOrEqual
139
+ | ReadSelectedComparisonOperator.GreaterThan
140
+ | ReadSelectedComparisonOperator.GreaterOrEqual;
141
+ }
142
+ // String
143
+ | {
144
+ /**
145
+ * The type of the property value being searched.
146
+ */
147
+ valueType: ReadSelectedPropertyType.String;
148
+
149
+ /**
150
+ * The comparison operator to use for the search.
151
+ */
152
+ comparisonOperator:
153
+ | ReadSelectedComparisonOperator.Equal
154
+ | ReadSelectedComparisonOperator.NotEqual
155
+ | ReadSelectedComparisonOperator.Contains
156
+ | ReadSelectedComparisonOperator.StartsWith
157
+ | ReadSelectedComparisonOperator.EndsWith
158
+ | ReadSelectedComparisonOperator.IContains
159
+ | ReadSelectedComparisonOperator.IStartsWith
160
+ | ReadSelectedComparisonOperator.IEndsWith
161
+ | ReadSelectedComparisonOperator.IEqual
162
+ | ReadSelectedComparisonOperator.INotEqual;
163
+ }
164
+ // Temporal
165
+ | {
166
+ /**
167
+ * The type of the property value being searched.
168
+ */
169
+ valueType:
170
+ | ReadSelectedPropertyType.DateTime
171
+ | ReadSelectedPropertyType.DateTimeOffset
172
+ | ReadSelectedPropertyType.TimeSpan
173
+ | ReadSelectedPropertyType.DateOnly
174
+ | ReadSelectedPropertyType.TimeOnly;
175
+
176
+ /**
177
+ * The comparison operator to use for the search.
178
+ */
179
+ comparisonOperator:
180
+ | ReadSelectedComparisonOperator.Equal
181
+ | ReadSelectedComparisonOperator.NotEqual
182
+ | ReadSelectedComparisonOperator.LessThan
183
+ | ReadSelectedComparisonOperator.LessOrEqual
184
+ | ReadSelectedComparisonOperator.GreaterThan
185
+ | ReadSelectedComparisonOperator.GreaterOrEqual;
186
+ };
@@ -0,0 +1,10 @@
1
+ export * from './ReadMetadataDto';
2
+ export * from './ReadSelectedSearchPropertyDefinitionDto';
3
+ export * from './ReadSelectedNestedCriteriaDto';
4
+ export * from './ReadSelectedNestedCollectionCriteriaDto';
5
+ export * from './ReadSelectedOrderingDefinitionDto';
6
+ export * from './ReadSelectedOrderingPropertyDefinitionDto';
7
+ export * from './ReadSelectedPaginationDefinitionDto';
8
+ export * from './ReadSelectedDefinitionDto';
9
+ export * from './ReadSelectedSearchDefinitionDto';
10
+ export * from './ReadSelectedSearchDefinitionBuilder';
@@ -0,0 +1,21 @@
1
+ import {EmptyMetadataDto, ErrorCode, ValidationFailedMetadataDto} from '@data';
2
+
3
+ /**
4
+ * Default, empty metadata.
5
+ */
6
+ export type ApiErrorDto<TMetadata extends ApiErrorMetadataDto = ApiErrorMetadataDto> = {
7
+ message: string;
8
+ details?: string;
9
+ traceId?: string;
10
+ timestamp?: string;
11
+ } & TMetadata;
12
+
13
+ export type ApiErrorMetadataDto =
14
+ | {
15
+ code: ErrorCode.ValidationFailed;
16
+ metadata: ValidationFailedMetadataDto;
17
+ }
18
+ | {
19
+ code: Omit<number, ErrorCode.ValidationFailed>;
20
+ metadata: EmptyMetadataDto;
21
+ };
@@ -0,0 +1,13 @@
1
+ import {ApiErrorDto, ApiErrorMetadataDto} from '@data';
2
+
3
+ /**
4
+ * Represents an API response containing an error and empty metadata.
5
+ */
6
+ export type ApiErrorResponseDto<TErrorMetadata extends ApiErrorMetadataDto = ApiErrorMetadataDto> = {
7
+ ok: false;
8
+
9
+ /**
10
+ * The error object containing information about the error
11
+ */
12
+ error: ApiErrorDto<TErrorMetadata>;
13
+ };
@@ -0,0 +1,7 @@
1
+ import {ApiErrorMetadataDto, ApiErrorResponseDto, ApiSuccessResponseDto} from '@/data';
2
+ import {Result} from '@utils/result';
3
+
4
+ export type ApiResponseDto<T, TMetadata extends object, TErrorMetadata extends ApiErrorMetadataDto = ApiErrorMetadataDto> = Result<
5
+ ApiSuccessResponseDto<T, TMetadata>,
6
+ ApiErrorResponseDto<TErrorMetadata>
7
+ >;
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Represents a successful API response containing a result and metadata.
3
+ *
4
+ * @template T The type of result
5
+ * @template TMetadata The type of metadata
6
+ * @property {T} result - The result returned
7
+ * @property {TMetadata} metadata - Metadata about the result
8
+ */
9
+ export type ApiSuccessResponseDto<T, TMetadata> = {
10
+ ok: true;
11
+ result: T;
12
+ metadata: TMetadata;
13
+ };
@@ -0,0 +1,24 @@
1
+ declare const __brand: unique symbol;
2
+
3
+ /**
4
+ * Utility type for creating branded types that are nominally different but structurally identical.
5
+ * This enables compile-time type safety for values that would otherwise have the same runtime structure.
6
+ *
7
+ * @template T - The brand identifier string literal type
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * type UserId = Brand<'userId'>;
12
+ * type OrderId = Brand<'orderId'>;
13
+ *
14
+ * const userId: UserId = { [__brand]: 'userId' } as UserId;
15
+ * const orderId: OrderId = userId; // Type error! Different brands
16
+ * ```
17
+ */
18
+ export type Brand<T extends string> = { [__brand]: T };
19
+
20
+ /**
21
+ * Default, empty metadata.
22
+ */
23
+ export type EmptyMetadataDto = Brand<'emptyMetadata'>;
24
+ export type ValidationFailedMetadataDto = Brand<'validationFailedMetadata'>;
@@ -0,0 +1,5 @@
1
+ export * from './ApiResponseDto';
2
+ export * from './ApiSuccessResponseDto';
3
+ export * from './ApiErrorDto';
4
+ export * from './MetadataDto';
5
+ export * from './ApiErrorResponseDto';
@@ -0,0 +1,2 @@
1
+ export * from './response';
2
+ export * from './read';