@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,4 +1,4 @@
|
|
|
1
|
-
import { type Constructor,
|
|
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
|
|
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
|
-
|
|
136
|
-
for (const field of
|
|
140
|
+
const mapRecords = (records, modelMetadata) => {
|
|
141
|
+
for (const field of modelMetadata.fields) {
|
|
137
142
|
for (const record of records) {
|
|
138
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
198
|
-
for (const
|
|
199
|
-
|
|
200
|
-
const
|
|
201
|
-
if (!
|
|
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
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
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.
|
|
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.
|
|
37
|
-
"@clairejs/core": "^3.8.
|
|
38
|
-
"@clairejs/orm": "^3.16.
|
|
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",
|