@clairejs/server 3.21.9 → 3.22.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.
package/README.md CHANGED
@@ -1,5 +1,11 @@
1
1
  ## Change Log
2
2
 
3
+ #### 3.22.1:
4
+
5
+ - fix uri mapper to map Identifiable classes
6
+ - remove support of uri mapper for locale fields
7
+ - support uri mapper for nested array field
8
+
3
9
  #### 3.21.9:
4
10
 
5
11
  - fix express wrapper parse multipart form data
@@ -1,4 +1,4 @@
1
- import { type Constructor, AbstractModel, HttpMethod } from "@clairejs/core";
1
+ import { type Constructor, HttpMethod, Identifiable } from "@clairejs/core";
2
2
  import { type UriMapperHandler } from "./file-upload/types";
3
3
  import { type HttpResponse } from "./common/HttpResponse";
4
4
  import { type IPrincipal } from "../common/auth/IPrincipal";
@@ -21,7 +21,7 @@ export declare const Queries: () => (prototype: AbstractHttpController, property
21
21
  export declare const Headers: () => (prototype: AbstractHttpController, propertyKey: string, paramIndex: number) => void;
22
22
  export declare const Socket: () => (prototype: AbstractHttpController, propertyKey: string, paramIndex: number) => void;
23
23
  export declare const Raw: () => (prototype: AbstractHttpController, propertyKey: string, paramIndex: number) => void;
24
- export declare const UriMapper: (mapper: UriMapperHandler) => <T extends AbstractModel>(prototype: T, propertyKey: keyof T) => void;
24
+ export declare const UriMapper: (mapper: UriMapperHandler) => <T extends Identifiable>(prototype: T, propertyKey: keyof T) => void;
25
25
  /**
26
26
  * Current User decorator only has effect when being used with ICrudRepository.
27
27
  * */
@@ -4,6 +4,12 @@ import { AbstractFileUploadHandler } from "../file-upload/AbstractFileUploadHand
4
4
  import { AbstractRepository } from "./AbstractRepository";
5
5
  import { LocaleTranslation } from "../../system/locale/LocaleTranslation";
6
6
  import { LocaleEntry } from "../../system/locale/LocaleEntry";
7
+ const resolveUris = (record, field) => {
8
+ return field.vectorProps?.elementDataType === DataType.STRING ? record[field.name] : [record[field.name]];
9
+ };
10
+ const assignUrls = (record, field, urls) => {
11
+ record[field.name] = field.vectorProps?.elementDataType === DataType.STRING ? urls : urls[0];
12
+ };
7
13
  export class ModelRepository extends AbstractRepository {
8
14
  model;
9
15
  db;
@@ -129,17 +135,20 @@ export class ModelRepository extends AbstractRepository {
129
135
  //-- move from currentUri to newUri
130
136
  await fileUploadHandler.copyFile(tmpUri, newUri);
131
137
  //-- update record value and not persist yet
132
- // newUriCb(newUri);
133
138
  return newUri;
134
139
  };
135
- if (fileUploadHandler) {
136
- for (const field of this.modelMetadata.fields) {
140
+ const mapRecords = (records, modelMetadata) => {
141
+ for (const field of modelMetadata.fields) {
137
142
  for (const record of records) {
138
- if (field.uriMapper && record[field.name]) {
143
+ const value = record[field.name];
144
+ if (!value)
145
+ continue;
146
+ if (field.elementDto) {
147
+ mapRecords(field.vectorProps ? value : [value], field.elementDto);
148
+ }
149
+ else if (field.uriMapper) {
139
150
  const mapper = field.uriMapper;
140
- const tmpUris = field.vectorProps
141
- ? record[field.name]
142
- : [record[field.name]];
151
+ const tmpUris = resolveUris(record, field);
143
152
  if (!tmpUris.length) {
144
153
  continue;
145
154
  }
@@ -148,36 +157,14 @@ export class ModelRepository extends AbstractRepository {
148
157
  }
149
158
  operations.push((async () => {
150
159
  const urls = await Promise.all(tmpUris.map((uri, index) => uriHandler(uri, index, mapper, getSystemLocale())));
151
- record[field.name] = field.vectorProps ? urls : urls[0];
160
+ assignUrls(record, field, urls);
152
161
  })());
153
162
  }
154
- else if (field.multiLocaleColumn) {
155
- const targetField = this.modelMetadata.fields.find((f) => f.name === field.multiLocaleColumn);
156
- if (targetField?.uriMapper && record[field.name]) {
157
- const mapper = targetField.uriMapper;
158
- //-- this field is locale for targetField, which has uri mapper
159
- const localeUris = Object.keys(record[field.name]).map((lang) => [
160
- lang,
161
- targetField.vectorProps
162
- ? record[field.name][lang]
163
- : [record[field.name][lang]],
164
- ]);
165
- //-- for each pair or locale and tmp uri, invoke handle logic
166
- for (const localeUri of localeUris) {
167
- if (!targetField.mimeProps?.keepOnRemove) {
168
- modified.push(...localeUri[1]);
169
- }
170
- operations.push((async () => {
171
- const urls = await Promise.all(localeUri[1].map((uri, index) => uriHandler(uri, index, mapper, localeUri[0])));
172
- record[field.name][localeUri[0]] = targetField.vectorProps
173
- ? urls
174
- : urls[0];
175
- })());
176
- }
177
- }
178
- }
179
163
  }
180
164
  }
165
+ };
166
+ if (fileUploadHandler) {
167
+ mapRecords(records, this.modelMetadata);
181
168
  }
182
169
  //-- await all operations once to save time
183
170
  await Promise.all(operations);
@@ -194,48 +181,30 @@ export class ModelRepository extends AbstractRepository {
194
181
  return;
195
182
  }
196
183
  const mappingOperations = [];
197
- for (const record of records) {
198
- for (const field of this.modelMetadata.fields) {
199
- if (field.uriMapper) {
200
- const uri = record[field.name];
201
- if (!uri) {
184
+ const mapRecords = (records, modelMetadata) => {
185
+ for (const record of records) {
186
+ for (const field of modelMetadata.fields) {
187
+ const value = record[field.name];
188
+ if (!value)
202
189
  continue;
190
+ if (field.elementDto && value) {
191
+ mapRecords(field.vectorProps ? value : [value], field.elementDto);
203
192
  }
204
- const uris = field.vectorProps ? uri : [uri];
205
- mappingOperations.push((async () => {
206
- const urls = await Promise.all(uris.map(async (uri) => {
207
- return field.mimeProps?.public
208
- ? await fileUploadHandler.resolvePublicUrl(uri)
209
- : await fileUploadHandler.resolvePrivateUrl(uri);
210
- }));
211
- record[field.name] = field.vectorProps ? urls : urls[0];
212
- })());
213
- }
214
- else if (field.multiLocaleColumn) {
215
- const targetField = this.modelMetadata.fields.find((f) => f.name === field.multiLocaleColumn);
216
- if (targetField?.uriMapper) {
217
- const localeObject = record[field.name];
218
- if (!localeObject) {
219
- continue;
220
- }
221
- for (const locale of Object.keys(localeObject)) {
222
- mappingOperations.push((async () => {
223
- const uri = localeObject[locale];
224
- if (!uri)
225
- return;
226
- const uris = targetField.vectorProps ? uri : [uri];
227
- const urls = await Promise.all(uris.map(async (uri) => {
228
- return targetField.mimeProps?.public
229
- ? await fileUploadHandler.resolvePublicUrl(uri)
230
- : await fileUploadHandler.resolvePrivateUrl(uri);
231
- }));
232
- localeObject[locale] = targetField.vectorProps ? urls : urls[0];
233
- })());
234
- }
193
+ else if (field.uriMapper) {
194
+ const uris = resolveUris(record, field);
195
+ mappingOperations.push((async () => {
196
+ const urls = await Promise.all(uris.map(async (uri) => {
197
+ return field.mimeProps?.public
198
+ ? await fileUploadHandler.resolvePublicUrl(uri)
199
+ : await fileUploadHandler.resolvePrivateUrl(uri);
200
+ }));
201
+ assignUrls(record, field, urls);
202
+ })());
235
203
  }
236
204
  }
237
205
  }
238
- }
206
+ };
207
+ mapRecords(records, this.modelMetadata);
239
208
  await Promise.all(mappingOperations);
240
209
  }
241
210
  async createMany({ principal, body, tx, logger, }) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clairejs/server",
3
- "version": "3.21.9",
3
+ "version": "3.22.1",
4
4
  "description": "Claire server NodeJs framework written in Typescript.",
5
5
  "types": "dist/index.d.ts",
6
6
  "main": "dist/index.js",
@@ -33,9 +33,9 @@
33
33
  "ws": "^7.5.5"
34
34
  },
35
35
  "peerDependencies": {
36
- "@clairejs/client": "^3.4.1",
37
- "@clairejs/core": "^3.8.8",
38
- "@clairejs/orm": "^3.16.7"
36
+ "@clairejs/client": "^3.4.4",
37
+ "@clairejs/core": "^3.8.9",
38
+ "@clairejs/orm": "^3.16.10"
39
39
  },
40
40
  "devDependencies": {
41
41
  "@types/cookie-parser": "^1.4.3",