@clairejs/server 3.16.3 → 3.16.5
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 +3 -1
- package/dist/controllers/FileManageController.d.ts +4 -2
- package/dist/controllers/FileManageController.js +6 -3
- package/dist/controllers/FileUploadController.d.ts +5 -3
- package/dist/controllers/FileUploadController.js +7 -3
- package/dist/http/repository/AbstractRepository.d.ts +1 -1
- package/dist/http/repository/DtoRepository.d.ts +5 -4
- package/dist/http/repository/DtoRepository.js +9 -7
- package/dist/http/repository/ModelRepository.d.ts +4 -3
- package/dist/http/repository/ModelRepository.js +9 -7
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
## Change Log
|
|
2
2
|
|
|
3
|
-
#### 3.16.
|
|
3
|
+
#### 3.16.5:
|
|
4
4
|
|
|
5
|
+
- do not throw when fail to clean up in ModelRepository
|
|
6
|
+
- fix file controllers
|
|
5
7
|
- fix socket authentication, fix http error code in response
|
|
6
8
|
- update claire orm
|
|
7
9
|
- update packages, fix mount undefined:undefined when introducing updateRecords
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import { AbstractDatabaseAdapter } from "@clairejs/orm";
|
|
1
2
|
import { AbstractHttpController } from "../http/controller/AbstractHttpController";
|
|
2
3
|
import { AbstractFileService } from "../services/AbstractFileService";
|
|
3
4
|
import { GetFileAccessUrlRequest, GetFileInfoRequest, GetFileInfoResponse, MoveFileRequest, RemoveFileRequest } from "./dto/upload";
|
|
4
5
|
export declare class FileManageController extends AbstractHttpController {
|
|
5
|
-
readonly
|
|
6
|
-
|
|
6
|
+
protected readonly db: AbstractDatabaseAdapter;
|
|
7
|
+
protected readonly fileService: AbstractFileService;
|
|
8
|
+
constructor(db: AbstractDatabaseAdapter, fileService: AbstractFileService);
|
|
7
9
|
moveFile(body: MoveFileRequest): Promise<import("../http/common/HttpResponse").HttpResponse<unknown>>;
|
|
8
10
|
copyFile(body: MoveFileRequest): Promise<import("../http/common/HttpResponse").HttpResponse<unknown>>;
|
|
9
11
|
removeFile(body: RemoveFileRequest): Promise<import("../http/common/HttpResponse").HttpResponse<unknown>>;
|
|
@@ -11,15 +11,18 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
|
11
11
|
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
12
|
};
|
|
13
13
|
import { Injectable } from "@clairejs/core";
|
|
14
|
+
import { AbstractDatabaseAdapter } from "@clairejs/orm";
|
|
14
15
|
import { ResponseBuilder } from "../http/common/HttpResponse";
|
|
15
16
|
import { AbstractHttpController } from "../http/controller/AbstractHttpController";
|
|
16
17
|
import { ApiResponse, Body, Get, Post, Queries } from "../http/decorators";
|
|
17
18
|
import { AbstractFileService } from "../services/AbstractFileService";
|
|
18
19
|
import { GetFileAccessUrlRequest, GetFileAccessUrlResponse, GetFileInfoRequest, GetFileInfoResponse, MoveFileRequest, RemoveFileRequest, } from "./dto/upload";
|
|
19
20
|
let FileManageController = class FileManageController extends AbstractHttpController {
|
|
21
|
+
db;
|
|
20
22
|
fileService;
|
|
21
|
-
constructor(fileService) {
|
|
22
|
-
super(
|
|
23
|
+
constructor(db, fileService) {
|
|
24
|
+
super(db);
|
|
25
|
+
this.db = db;
|
|
23
26
|
this.fileService = fileService;
|
|
24
27
|
}
|
|
25
28
|
async moveFile(body) {
|
|
@@ -85,6 +88,6 @@ __decorate([
|
|
|
85
88
|
], FileManageController.prototype, "getFileInfo", null);
|
|
86
89
|
FileManageController = __decorate([
|
|
87
90
|
Injectable(),
|
|
88
|
-
__metadata("design:paramtypes", [AbstractFileService])
|
|
91
|
+
__metadata("design:paramtypes", [AbstractDatabaseAdapter, AbstractFileService])
|
|
89
92
|
], FileManageController);
|
|
90
93
|
export { FileManageController };
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
+
import { AbstractDatabaseAdapter } from "@clairejs/orm";
|
|
1
2
|
import { AbstractHttpController } from "../http/controller/AbstractHttpController";
|
|
2
3
|
import { AbstractFileService } from "../services/AbstractFileService";
|
|
3
4
|
import { GetMultipleUploadUrlsQueries, GetUploadUrlQueries, GetUploadUrlResponseBody } from "./dto/upload";
|
|
4
5
|
export declare class FileUploadController extends AbstractHttpController {
|
|
5
|
-
readonly
|
|
6
|
-
readonly
|
|
7
|
-
|
|
6
|
+
protected readonly db: AbstractDatabaseAdapter;
|
|
7
|
+
protected readonly fileService: AbstractFileService;
|
|
8
|
+
protected readonly allowedUploadExtensions: string[];
|
|
9
|
+
constructor(db: AbstractDatabaseAdapter, fileService: AbstractFileService, allowedUploadExtensions: string[]);
|
|
8
10
|
getUploadUrl(queries: GetUploadUrlQueries): Promise<import("../http/common/HttpResponse").HttpResponse<GetUploadUrlResponseBody>>;
|
|
9
11
|
getMultipleUploadUrls(queries: GetMultipleUploadUrlsQueries): Promise<import("../http/common/HttpResponse").HttpResponse<{
|
|
10
12
|
files: GetUploadUrlResponseBody[];
|
|
@@ -11,6 +11,7 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
|
11
11
|
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
12
|
};
|
|
13
13
|
import { Errors, Injectable } from "@clairejs/core";
|
|
14
|
+
import { AbstractDatabaseAdapter } from "@clairejs/orm";
|
|
14
15
|
import randomstring from "randomstring";
|
|
15
16
|
import { ResponseBuilder } from "../http/common/HttpResponse";
|
|
16
17
|
import { AbstractHttpController } from "../http/controller/AbstractHttpController";
|
|
@@ -18,10 +19,12 @@ import { ApiResponse, Get, Queries } from "../http/decorators";
|
|
|
18
19
|
import { AbstractFileService } from "../services/AbstractFileService";
|
|
19
20
|
import { GetMultipleUploadResponseBody, GetMultipleUploadUrlsQueries, GetUploadUrlQueries, GetUploadUrlResponseBody, } from "./dto/upload";
|
|
20
21
|
let FileUploadController = class FileUploadController extends AbstractHttpController {
|
|
22
|
+
db;
|
|
21
23
|
fileService;
|
|
22
24
|
allowedUploadExtensions;
|
|
23
|
-
constructor(fileService, allowedUploadExtensions) {
|
|
24
|
-
super(
|
|
25
|
+
constructor(db, fileService, allowedUploadExtensions) {
|
|
26
|
+
super(db);
|
|
27
|
+
this.db = db;
|
|
25
28
|
this.fileService = fileService;
|
|
26
29
|
this.allowedUploadExtensions = allowedUploadExtensions;
|
|
27
30
|
}
|
|
@@ -59,6 +62,7 @@ __decorate([
|
|
|
59
62
|
], FileUploadController.prototype, "getMultipleUploadUrls", null);
|
|
60
63
|
FileUploadController = __decorate([
|
|
61
64
|
Injectable(),
|
|
62
|
-
__metadata("design:paramtypes", [
|
|
65
|
+
__metadata("design:paramtypes", [AbstractDatabaseAdapter,
|
|
66
|
+
AbstractFileService, Array])
|
|
63
67
|
], FileUploadController);
|
|
64
68
|
export { FileUploadController };
|
|
@@ -2,7 +2,7 @@ import { Constructor, DeepPartial, Identifiable } from "@clairejs/core";
|
|
|
2
2
|
import { ServerModelMetadata } from "../../common/ServerModelMetadata";
|
|
3
3
|
import { IPrincipal } from "../../common/auth/IPrincipal";
|
|
4
4
|
export declare abstract class AbstractRepository<T extends Identifiable> {
|
|
5
|
-
readonly model: Constructor<T>;
|
|
5
|
+
protected readonly model: Constructor<T>;
|
|
6
6
|
protected readonly modelMetadata: ServerModelMetadata;
|
|
7
7
|
constructor(model: Constructor<T>);
|
|
8
8
|
protected beforeCreating(principal: IPrincipal | undefined, records: DeepPartial<T>[]): Promise<void>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AbstractModel, Constructor, CreateManyRequestBody, CreateManyResponseBody, DeepPartial, GetManyQueries, GetManyResponseBody, Identifiable, UpdateManyBody, UpdateManyQueries, UpdateManyResponse } from "@clairejs/core";
|
|
1
|
+
import { AbstractLogger, AbstractModel, Constructor, CreateManyRequestBody, CreateManyResponseBody, DeepPartial, GetManyQueries, GetManyResponseBody, Identifiable, UpdateManyBody, UpdateManyQueries, UpdateManyResponse } from "@clairejs/core";
|
|
2
2
|
import { IQueryProvider, ITransaction, QueryCondition } from "@clairejs/orm";
|
|
3
3
|
import { IPrincipal } from "../../common/auth/IPrincipal";
|
|
4
4
|
import { AbstractRepository } from "./AbstractRepository";
|
|
@@ -29,9 +29,10 @@ export declare const MultipleMap: <R extends Identifiable, K extends AbstractMod
|
|
|
29
29
|
nestedMapping: DtoDissolver<R, K> | undefined;
|
|
30
30
|
};
|
|
31
31
|
export declare class DtoRepository<T extends Identifiable> extends AbstractRepository<T> implements ICrudRepository<T> {
|
|
32
|
-
readonly model: Constructor<T>;
|
|
33
|
-
readonly dissolver: DtoDissolver<T, any>;
|
|
34
|
-
|
|
32
|
+
protected readonly model: Constructor<T>;
|
|
33
|
+
protected readonly dissolver: DtoDissolver<T, any>;
|
|
34
|
+
protected readonly logger: AbstractLogger;
|
|
35
|
+
constructor(model: Constructor<T>, dissolver: DtoDissolver<T, any>, logger: AbstractLogger);
|
|
35
36
|
private getMapValue;
|
|
36
37
|
createMany({ principal, body, tx, }: {
|
|
37
38
|
principal?: IPrincipal | undefined;
|
|
@@ -26,10 +26,12 @@ export const MultipleMap = (modelClass, forwardOps, forwardMapping, rootMapping,
|
|
|
26
26
|
export class DtoRepository extends AbstractRepository {
|
|
27
27
|
model;
|
|
28
28
|
dissolver;
|
|
29
|
-
|
|
29
|
+
logger;
|
|
30
|
+
constructor(model, dissolver, logger) {
|
|
30
31
|
super(model);
|
|
31
32
|
this.model = model;
|
|
32
33
|
this.dissolver = dissolver;
|
|
34
|
+
this.logger = logger;
|
|
33
35
|
}
|
|
34
36
|
async getMapValue(root, currentInstancesResolver, mappers, preOperator, postOperator) {
|
|
35
37
|
for (const mapper of mappers) {
|
|
@@ -56,7 +58,7 @@ export class DtoRepository extends AbstractRepository {
|
|
|
56
58
|
await this.beforeCreating(principal, body.records);
|
|
57
59
|
for (const record of body.records) {
|
|
58
60
|
await this.getMapValue(record, async (mapper) => {
|
|
59
|
-
const repo = new ModelRepository(mapper.modelClass);
|
|
61
|
+
const repo = new ModelRepository(mapper.modelClass, this.logger);
|
|
60
62
|
const currentInstances = await repo.getMany({
|
|
61
63
|
ops: mapper.forwardOps(),
|
|
62
64
|
queryProvider: tx,
|
|
@@ -66,7 +68,7 @@ export class DtoRepository extends AbstractRepository {
|
|
|
66
68
|
if (!ks) {
|
|
67
69
|
return [];
|
|
68
70
|
}
|
|
69
|
-
const repo = new ModelRepository(mapper.modelClass);
|
|
71
|
+
const repo = new ModelRepository(mapper.modelClass, this.logger);
|
|
70
72
|
const ops = mapper.forwardOps();
|
|
71
73
|
if (mapper.multiple) {
|
|
72
74
|
//-- if ks contain an array of instances, we need to remove old instances and create new ones
|
|
@@ -111,7 +113,7 @@ export class DtoRepository extends AbstractRepository {
|
|
|
111
113
|
const result = { ...body.update, id: queries.fields.id[0] };
|
|
112
114
|
await this.beforeCreating(principal, [result]);
|
|
113
115
|
await this.getMapValue(result, async (mapper) => {
|
|
114
|
-
const repo = new ModelRepository(mapper.modelClass);
|
|
116
|
+
const repo = new ModelRepository(mapper.modelClass, this.logger);
|
|
115
117
|
const currentInstances = await repo.getMany({
|
|
116
118
|
ops: mapper.forwardOps(ops),
|
|
117
119
|
queryProvider: tx,
|
|
@@ -121,7 +123,7 @@ export class DtoRepository extends AbstractRepository {
|
|
|
121
123
|
if (!ks) {
|
|
122
124
|
return [];
|
|
123
125
|
}
|
|
124
|
-
const repo = new ModelRepository(mapper.modelClass);
|
|
126
|
+
const repo = new ModelRepository(mapper.modelClass, this.logger);
|
|
125
127
|
const opsx = mapper.forwardOps(ops);
|
|
126
128
|
if (mapper.multiple) {
|
|
127
129
|
//-- if ks contain an array of instances, we need to remove old instances and create new ones
|
|
@@ -170,7 +172,7 @@ export class DtoRepository extends AbstractRepository {
|
|
|
170
172
|
}
|
|
171
173
|
const result = { id: queries.fields.id[0] };
|
|
172
174
|
await this.getMapValue(result, async () => [], this.dissolver(result), async (mapper) => {
|
|
173
|
-
const repo = new ModelRepository(mapper.modelClass);
|
|
175
|
+
const repo = new ModelRepository(mapper.modelClass, this.logger);
|
|
174
176
|
//-- forward get
|
|
175
177
|
const instances = await repo.getMany({
|
|
176
178
|
ops: mapper.forwardOps(ops),
|
|
@@ -189,7 +191,7 @@ export class DtoRepository extends AbstractRepository {
|
|
|
189
191
|
}
|
|
190
192
|
const result = { id: queries.fields.id[0] };
|
|
191
193
|
await this.getMapValue(result, async () => [], this.dissolver(result), undefined, async (mapper) => {
|
|
192
|
-
const repo = new ModelRepository(mapper.modelClass);
|
|
194
|
+
const repo = new ModelRepository(mapper.modelClass, this.logger);
|
|
193
195
|
//const nestedQueries = mapper.forwardQuery();
|
|
194
196
|
const nestedOps = mapper.forwardOps(ops);
|
|
195
197
|
const result = await repo.deleteMany({
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
import { AbstractModel, Constructor, CreateManyRequestBody, CreateManyResponseBody, GetManyQueries, GetManyResponseBody, UpdateManyBody, UpdateManyQueries, UpdateManyResponse } from "@clairejs/core";
|
|
1
|
+
import { AbstractModel, Constructor, CreateManyRequestBody, CreateManyResponseBody, GetManyQueries, GetManyResponseBody, UpdateManyBody, UpdateManyQueries, UpdateManyResponse, AbstractLogger } from "@clairejs/core";
|
|
2
2
|
import { IQueryProvider, ITransaction, QueryCondition } from "@clairejs/orm";
|
|
3
3
|
import { IPrincipal } from "../../common/auth/IPrincipal";
|
|
4
4
|
import { ICrudRepository } from "./ICrudRepository";
|
|
5
5
|
import { AbstractRepository } from "./AbstractRepository";
|
|
6
6
|
export declare class ModelRepository<T extends AbstractModel> extends AbstractRepository<T> implements ICrudRepository<T> {
|
|
7
|
-
readonly model: Constructor<T>;
|
|
7
|
+
protected readonly model: Constructor<T>;
|
|
8
|
+
protected readonly logger: AbstractLogger;
|
|
8
9
|
private fileUploadHandler?;
|
|
9
|
-
constructor(model: Constructor<T
|
|
10
|
+
constructor(model: Constructor<T>, logger: AbstractLogger);
|
|
10
11
|
private getNestedQueries;
|
|
11
12
|
private getUploadHandler;
|
|
12
13
|
private getRequestQueryConditionFromQuery;
|
|
@@ -6,10 +6,12 @@ import { LocaleTranslation } from "../../system/locale/LocaleTranslation";
|
|
|
6
6
|
import { LocaleEntry } from "../../system/locale/LocaleEntry";
|
|
7
7
|
export class ModelRepository extends AbstractRepository {
|
|
8
8
|
model;
|
|
9
|
+
logger;
|
|
9
10
|
fileUploadHandler;
|
|
10
|
-
constructor(model) {
|
|
11
|
+
constructor(model, logger) {
|
|
11
12
|
super(model);
|
|
12
13
|
this.model = model;
|
|
14
|
+
this.logger = logger;
|
|
13
15
|
}
|
|
14
16
|
getNestedQueries(queries) {
|
|
15
17
|
return this.modelMetadata.fields
|
|
@@ -305,7 +307,7 @@ export class ModelRepository extends AbstractRepository {
|
|
|
305
307
|
});
|
|
306
308
|
if (hasManyRecords.length) {
|
|
307
309
|
//-- insert to db
|
|
308
|
-
const innerService = new ModelRepository(getModelById(field.hasMany.relationDto.id));
|
|
310
|
+
const innerService = new ModelRepository(getModelById(field.hasMany.relationDto.id), this.logger);
|
|
309
311
|
body.records = hasManyRecords;
|
|
310
312
|
const persistedInnerRecords = await innerService.createMany({ principal, body, tx });
|
|
311
313
|
//-- map back ids to hasManyRecords
|
|
@@ -329,7 +331,7 @@ export class ModelRepository extends AbstractRepository {
|
|
|
329
331
|
}
|
|
330
332
|
}
|
|
331
333
|
//-- everything is ok, remove original Uris
|
|
332
|
-
|
|
334
|
+
cleanUp().catch((err) => this.logger.error("Error in clean up", err));
|
|
333
335
|
return { records };
|
|
334
336
|
}
|
|
335
337
|
async updateMany({ principal, ops, queries, body, tx, }) {
|
|
@@ -479,7 +481,7 @@ export class ModelRepository extends AbstractRepository {
|
|
|
479
481
|
if (tobeRemovedIds.length) {
|
|
480
482
|
await adapter.deleteMany({ _in: { id: tobeRemovedIds } });
|
|
481
483
|
}
|
|
482
|
-
const modelService = new ModelRepository(model);
|
|
484
|
+
const modelService = new ModelRepository(model, this.logger);
|
|
483
485
|
const added = await modelService.createMany({
|
|
484
486
|
principal,
|
|
485
487
|
body: { records: tobeAdded },
|
|
@@ -510,7 +512,7 @@ export class ModelRepository extends AbstractRepository {
|
|
|
510
512
|
];
|
|
511
513
|
}
|
|
512
514
|
//-- ok clean up
|
|
513
|
-
|
|
515
|
+
cleanUp().catch((err) => this.logger.error("Error in clean up", err));
|
|
514
516
|
await this.beforeReturning(records);
|
|
515
517
|
return { modified: this.project(records, projection) };
|
|
516
518
|
}
|
|
@@ -599,7 +601,7 @@ export class ModelRepository extends AbstractRepository {
|
|
|
599
601
|
continue;
|
|
600
602
|
}
|
|
601
603
|
const model = getModelById(field.hasMany.relationDto.id);
|
|
602
|
-
const service = new ModelRepository(model);
|
|
604
|
+
const service = new ModelRepository(model, this.logger);
|
|
603
605
|
const innerRecords = !recordIds.length
|
|
604
606
|
? { records: [] }
|
|
605
607
|
: await service.getMany({
|
|
@@ -683,7 +685,7 @@ export class ModelRepository extends AbstractRepository {
|
|
|
683
685
|
if (toBeRemovedUris.length) {
|
|
684
686
|
const fileUploadHandler = await this.getUploadHandler();
|
|
685
687
|
if (fileUploadHandler) {
|
|
686
|
-
|
|
688
|
+
Promise.all(toBeRemovedUris.map((uri) => fileUploadHandler.removeFile(uri))).catch((err) => this.logger.error("Fail to remove some files", err));
|
|
687
689
|
}
|
|
688
690
|
}
|
|
689
691
|
returning = tobeRemoved;
|