@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 CHANGED
@@ -1,7 +1,9 @@
1
1
  ## Change Log
2
2
 
3
- #### 3.16.3:
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 fileService: AbstractFileService;
6
- constructor(fileService: AbstractFileService);
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(null);
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 fileService: AbstractFileService;
6
- readonly allowedUploadExtensions: string[];
7
- constructor(fileService: AbstractFileService, allowedUploadExtensions: string[]);
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(null);
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", [AbstractFileService, Array])
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
- constructor(model: Constructor<T>, dissolver: DtoDissolver<T, any>);
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
- constructor(model, dissolver) {
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
- await cleanUp();
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
- await cleanUp();
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
- await Promise.all(toBeRemovedUris.map((uri) => fileUploadHandler.removeFile(uri)));
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;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clairejs/server",
3
- "version": "3.16.3",
3
+ "version": "3.16.5",
4
4
  "description": "Claire server NodeJs framework written in Typescript.",
5
5
  "types": "dist/index.d.ts",
6
6
  "main": "dist/index.js",