pangea-server 3.3.70 → 3.3.72

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.
@@ -6,10 +6,8 @@ export declare class AccessToken {
6
6
  getKey(userCtor: UserCtor): string;
7
7
  createToken(userCtor: UserCtor, id: ModelId): string;
8
8
  verifyToken(token: string): Record<string, ModelId>;
9
- getTokenData(userCtor: UserCtor, user: ModelInstance<User>): {
9
+ getTokenData(userCtor: UserCtor, user: User): {
10
10
  accessToken: string;
11
- user: import("sequelize").InferAttributes<User, {
12
- omit: never;
13
- }>;
11
+ user: User;
14
12
  };
15
13
  }
@@ -4,22 +4,14 @@ import type { UserCtor, AuthMap } from './auth.types';
4
4
  type AuthHeader = string | undefined;
5
5
  export declare function login<U extends User>(authHeader: AuthHeader, db: Db, accessToken: AccessToken, userCtor: BaseModelCtor<U>, extraWhere?: Where<U>): Promise<{
6
6
  accessToken: string;
7
- user: import("sequelize").InferAttributes<User, {
8
- omit: never;
9
- }>;
7
+ user: User;
10
8
  }>;
11
9
  export declare function validateAccessToken(authHeader: AuthHeader, db: Db, accessToken: AccessToken, userCtor: UserCtor): Promise<{
12
10
  accessToken: string;
13
- user: import("sequelize").InferAttributes<User, {
14
- omit: never;
15
- }>;
11
+ user: User;
16
12
  }>;
17
- export declare function getUserFromToken(authHeader: AuthHeader, db: Db, accessToken: AccessToken, userCtor: UserCtor): Promise<import("sequelize").InferAttributes<User, {
18
- omit: never;
19
- }> | null> | null;
13
+ export declare function getUserFromToken(authHeader: AuthHeader, db: Db, accessToken: AccessToken, userCtor: UserCtor): Promise<User | null> | null;
20
14
  export declare function getUsersFromToken(authHeader: AuthHeader, db: Db, accessToken: AccessToken, authMap: AuthMap): Promise<{
21
- [k: string]: import("sequelize").InferAttributes<User, {
22
- omit: never;
23
- }> | null;
15
+ [k: string]: User | null;
24
16
  }>;
25
17
  export {};
@@ -4,7 +4,7 @@ export type UserCtor = BaseModelCtor<User>;
4
4
  export type AuthMap = Record<string, UserCtor>;
5
5
  export type UserType<AM extends AuthMap> = keyof AM;
6
6
  export type AuthUsers<AM extends AuthMap> = {
7
- [K in keyof AM]: ModelInstance<InstanceType<AM[K]>> | null;
7
+ [K in keyof AM]: InstanceType<AM[K]> | null;
8
8
  };
9
9
  export interface AuthCtor<AM extends AuthMap, AU extends AuthUsers<AM>, BA extends BaseAuth<AM>, IR extends any> {
10
10
  new (authUsers: AU, initRes?: IR): BA;
@@ -7,7 +7,5 @@ export declare abstract class BaseAuth<AM extends AuthMap> {
7
7
  notAllowed(): never;
8
8
  isUserAuth<T extends UserType<AM>>(type: T): boolean;
9
9
  getUserAuth<T extends UserType<AM>>(type: T): NonNullable<AuthUsers<AM>[T]>;
10
- getUsersAuth<const T extends readonly UserType<AM>[]>(types: T): { [I in keyof T]: import("sequelize").InferAttributes<InstanceType<AM[T[I]]>, {
11
- omit: never;
12
- }> | null; };
10
+ getUsersAuth<const T extends readonly UserType<AM>[]>(types: T): { [I in keyof T]: InstanceType<AM[T[I]]> | null; };
13
11
  }
@@ -2,7 +2,7 @@ import * as seq from 'sequelize-typescript';
2
2
  import { BaseModel } from './models';
3
3
  import { Db as _Db } from './db.class';
4
4
  import type { OptionalFields, OptionalIfNullish } from 'pangea-helpers';
5
- import type { InferAttributes, InferCreationAttributes, CreationOptional, NonAttribute, AbstractDataTypeConstructor, AbstractDataType, Transaction, WhereOptions } from 'sequelize';
5
+ import type { InferCreationAttributes, CreationOptional, NonAttribute, AbstractDataTypeConstructor, AbstractDataType, Transaction, WhereOptions } from 'sequelize';
6
6
  import type { ModelCtor } from 'sequelize-typescript';
7
7
  declare global {
8
8
  type ModelId = number;
@@ -16,10 +16,6 @@ declare global {
16
16
  type Where<BM extends BaseModel> = WhereOptions<BM> & Record<symbol, any>;
17
17
  type InsertParams<BM extends BaseModel> = OptionalIfNullish<OptionalIfOptional<StripRelations<OptionalFields<IncludeHidden<Omit<InferCreationAttributes<BM>, '__brand'>>, Exclude<keyof InferCreationAttributes<BM>, '__brand'> & 'id'>>>>;
18
18
  type UpdateParams<BM extends BaseModel> = Partial<InsertParams<BM>>;
19
- type UpdateParamsWithId<BM extends BaseModel> = UpdateParams<BM> & {
20
- id: ModelId;
21
- };
22
- type ModelInstance<BM extends BaseModel> = InferAttributes<BM>;
23
19
  type Tx = Transaction;
24
20
  type Db = _Db;
25
21
  }
@@ -33,51 +33,36 @@ type AggregateManyConfig = {
33
33
  group: Group;
34
34
  };
35
35
  type AggregateManyOptions<BM extends BaseModel> = Omit<FindManyOptions<BM>, 'order'>;
36
+ type Target<BM extends BaseModel> = Filters<BM> | BM;
36
37
  export declare class Db {
37
38
  private __tx?;
38
39
  constructor(tx: Tx);
39
- findOneOrNull<BM extends BaseModel>(model: BaseModelCtor<BM>, filters: Filters<BM>, options?: FindOneOptions): Promise<import("sequelize").InferAttributes<BM, {
40
- omit: never;
41
- }> | null>;
42
- findOne<BM extends BaseModel>(model: BaseModelCtor<BM>, filters: Filters<BM>, options?: FindOneOptions): Promise<import("sequelize").InferAttributes<BM, {
43
- omit: never;
44
- }>>;
40
+ findOneOrNull<BM extends BaseModel>(model: BaseModelCtor<BM>, filters: Filters<BM>, options?: FindOneOptions): Promise<BM | null>;
41
+ findOne<BM extends BaseModel>(model: BaseModelCtor<BM>, filters: Filters<BM>, options?: FindOneOptions): Promise<BM>;
45
42
  aggregateOne<BM extends BaseModel>(model: BaseModelCtor<BM>, attributes: Attributes, options?: AggregateOneOptions<BM>): Promise<unknown>;
46
43
  private __getFindOneBaseOptions;
47
- findMany<BM extends BaseModel>(model: BaseModelCtor<BM>, options?: FindManyPagedOptions<BM>): Promise<import("sequelize").InferAttributes<BM, {
48
- omit: never;
49
- }>[]>;
44
+ findMany<BM extends BaseModel>(model: BaseModelCtor<BM>, options?: FindManyPagedOptions<BM>): Promise<BM[]>;
50
45
  count<BM extends BaseModel>(model: BaseModelCtor<BM>, options?: FindManyOptions<BM>): Promise<number>;
51
46
  findManyWithCount<BM extends BaseModel>(model: BaseModelCtor<BM>, options?: FindManyPagedOptions<BM>): Promise<{
52
- instances: import("sequelize").InferAttributes<BM, {
53
- omit: never;
54
- }>[];
47
+ instances: BM[];
55
48
  totalCount: number;
56
49
  }>;
57
50
  aggregateMany<BM extends BaseModel>(model: BaseModelCtor<BM>, config: AggregateManyConfig, options?: AggregateManyOptions<BM>): Promise<unknown[]>;
58
51
  private __getFindManyBaseOptions;
59
- insertOne<BM extends BaseModel>(model: BaseModelCtor<BM>, params: InsertParams<BM>): Promise<import("sequelize").InferAttributes<BM, {
60
- omit: never;
61
- }>>;
52
+ insertOne<BM extends BaseModel>(model: BaseModelCtor<BM>, params: InsertParams<BM>): Promise<BM>;
62
53
  insertMany<BM extends BaseModel>(model: BaseModelCtor<BM>, data: InsertParams<BM>[]): Promise<number>;
63
54
  upsertMany<BM extends BaseModel>(model: BaseModelCtor<BM>, fieldsToUpdate: (keyof BM)[], data: InsertParams<BM>[]): Promise<number>;
64
- updateOne<BM extends BaseModel>(model: BaseModelCtor<BM>, params: UpdateParamsWithId<BM>): Promise<ModelInstance<BM>>;
65
- updateOne<BM extends BaseModel>(model: BaseModelCtor<BM>, id: ModelId, params: UpdateParams<BM>): Promise<ModelInstance<BM>>;
55
+ updateOne<BM extends BaseModel>(model: BaseModelCtor<BM>, target: Target<BM>, params: UpdateParams<BM>): Promise<BM>;
66
56
  updateMany<BM extends BaseModel>(model: BaseModelCtor<BM>, where: Where<BM>, params: UpdateParams<BM>): Promise<number>;
67
- deleteOne<BM extends BaseModel>(model: BaseModelCtor<BM>, id: ModelId): Promise<import("sequelize").InferAttributes<BM, {
68
- omit: never;
69
- }> | null>;
57
+ deleteOne<BM extends BaseModel>(model: BaseModelCtor<BM>, target: Target<BM>): Promise<BM | null>;
70
58
  deleteMany<BM extends BaseModel>(model: BaseModelCtor<BM>, where: Where<BM>): Promise<number>;
71
- destroyOne<BM extends BaseModel>(model: BaseModelCtor<BM>, id: ModelId): Promise<import("sequelize").InferAttributes<BM, {
72
- omit: never;
73
- }> | null>;
59
+ destroyOne<BM extends BaseModel>(model: BaseModelCtor<BM>, target: Target<BM>): Promise<BM | null>;
74
60
  destroyMany<BM extends BaseModel>(model: BaseModelCtor<BM>, where: Where<BM>): Promise<number>;
75
61
  private __deleteOne;
76
62
  private __deleteMany;
77
- restoreOne<BM extends BaseModel>(model: BaseModelCtor<BM>, id: ModelId): Promise<import("sequelize").InferAttributes<BM, {
78
- omit: never;
79
- }>>;
63
+ restoreOne<BM extends BaseModel>(model: BaseModelCtor<BM>, target: Target<BM>): Promise<BM>;
80
64
  restoreMany<BM extends BaseModel>(model: BaseModelCtor<BM>, where: Where<BM>): Promise<void>;
65
+ private __getInstance;
81
66
  query(sql: string | {
82
67
  query: string;
83
68
  values: unknown[];
@@ -13,24 +13,18 @@ class Db {
13
13
  this.__tx = tx;
14
14
  }
15
15
  // find methods
16
- async findOneOrNull(model, filters, options = {}) {
16
+ findOneOrNull(model, filters, options = {}) {
17
17
  const { scopes, order, paranoid = true } = options;
18
18
  const scopedModel = scopes?.length ? model.scope(...scopes) : model;
19
19
  const baseOptions = this.__getFindOneBaseOptions(paranoid);
20
- let instance;
21
20
  if (typeof filters === 'number') {
22
- instance = await scopedModel.findByPk(filters, { ...baseOptions, ...getInclude(model) });
21
+ return scopedModel.findByPk(filters, { ...baseOptions, ...getInclude(model) });
23
22
  }
24
- else {
25
- instance = await scopedModel.findOne({
26
- ...baseOptions,
27
- ...getInclude(model, { where: filters }),
28
- order: getFinalOrder(order),
29
- });
30
- }
31
- if (!instance)
32
- return null;
33
- return processInstance(model, instance);
23
+ return scopedModel.findOne({
24
+ ...baseOptions,
25
+ ...getInclude(model, { where: filters }),
26
+ order: getFinalOrder(order),
27
+ });
34
28
  }
35
29
  async findOne(model, filters, options = {}) {
36
30
  const instance = await this.findOneOrNull(model, filters, options);
@@ -54,7 +48,6 @@ class Db {
54
48
  async findMany(model, options = {}) {
55
49
  const baseOptions = this.__getFindManyBaseOptions(model, options);
56
50
  const { page, pageSize } = options;
57
- let instances;
58
51
  if (page && pageSize) {
59
52
  const idRows = await model.findAll({
60
53
  ...baseOptions,
@@ -65,12 +58,9 @@ class Db {
65
58
  limit: pageSize,
66
59
  });
67
60
  const ids = idRows.map((row) => row.id);
68
- instances = await model.findAll({ ...baseOptions, where: { id: { [_1.Ops.in]: ids } } });
69
- }
70
- else {
71
- instances = await model.findAll(baseOptions);
61
+ return model.findAll({ ...baseOptions, where: { id: { [_1.Ops.in]: ids } } });
72
62
  }
73
- return processInstances(model, instances);
63
+ return model.findAll(baseOptions);
74
64
  }
75
65
  async count(model, options = {}) {
76
66
  const baseOptions = this.__getFindManyBaseOptions(model, options);
@@ -153,12 +143,12 @@ class Db {
153
143
  return newInstances.length;
154
144
  });
155
145
  }
156
- updateOne(model, idOrParams, params) {
146
+ // update methods
147
+ updateOne(model, target, params) {
157
148
  return handleDbError(async () => {
158
- const id = typeof idOrParams === 'number' ? idOrParams : idOrParams.id;
159
- const finalParams = typeof idOrParams === 'number' ? params : idOrParams;
160
- await model.update(finalParams, { where: { id }, transaction: this.__tx });
161
- return this.findOne(model, id);
149
+ const instance = await this.__getInstance(model, target);
150
+ await instance.update(params, { transaction: this.__tx });
151
+ return this.findOne(model, instance.id);
162
152
  });
163
153
  }
164
154
  updateMany(model, where, params) {
@@ -168,22 +158,23 @@ class Db {
168
158
  });
169
159
  }
170
160
  // delete methods
171
- deleteOne(model, id) {
172
- return this.__deleteOne(model, id, false);
161
+ deleteOne(model, target) {
162
+ return this.__deleteOne(model, target, false);
173
163
  }
174
164
  deleteMany(model, where) {
175
165
  return this.__deleteMany(model, where, false);
176
166
  }
177
- destroyOne(model, id) {
178
- return this.__deleteOne(model, id, true);
167
+ destroyOne(model, target) {
168
+ return this.__deleteOne(model, target, true);
179
169
  }
180
170
  destroyMany(model, where) {
181
171
  return this.__deleteMany(model, where, true);
182
172
  }
183
- __deleteOne(model, id, force) {
173
+ __deleteOne(model, target, force) {
184
174
  return handleDbError(async () => {
185
- await model.destroy({ where: { id }, force, transaction: this.__tx });
186
- return this.findOneOrNull(model, id, { paranoid: false });
175
+ const instance = await this.__getInstance(model, target);
176
+ await instance.destroy({ force, transaction: this.__tx });
177
+ return this.findOneOrNull(model, instance.id, { paranoid: false });
187
178
  });
188
179
  }
189
180
  __deleteMany(model, where, force) {
@@ -192,10 +183,11 @@ class Db {
192
183
  });
193
184
  }
194
185
  // restore methods
195
- restoreOne(model, id) {
186
+ restoreOne(model, target) {
196
187
  return handleDbError(async () => {
197
- await model.restore({ where: { id }, transaction: this.__tx });
198
- return this.findOne(model, id);
188
+ const instance = await this.__getInstance(model, target, false);
189
+ await instance.restore({ transaction: this.__tx });
190
+ return this.findOne(model, instance.id);
199
191
  });
200
192
  }
201
193
  restoreMany(model, where) {
@@ -204,6 +196,11 @@ class Db {
204
196
  });
205
197
  }
206
198
  // helpers methods
199
+ __getInstance(model, target, paranoid = true) {
200
+ if (target && typeof target === 'object' && 'id' in target)
201
+ return target;
202
+ return this.findOne(model, target, { paranoid });
203
+ }
207
204
  query(sql) {
208
205
  const dbClient = (0, db_client_1.getDbClient)();
209
206
  return dbClient.query(sql, { transaction: this.__tx });
@@ -304,24 +301,6 @@ function getFinalOrder(order, config = {}) {
304
301
  });
305
302
  return [...finalOrder, ...(!config.attributes ? [['createdAt', 'DESC']] : [])];
306
303
  }
307
- function processInstance(model, instance) {
308
- for (const [relName] of Object.entries(model.Relations)) {
309
- const relInstance = instance[relName];
310
- if (!relInstance)
311
- continue;
312
- const relModel = model.Relations[relName].getModelFn();
313
- if (Array.isArray(relInstance)) {
314
- relInstance.forEach((instance) => processInstance(relModel, instance));
315
- }
316
- else {
317
- processInstance(relModel, relInstance);
318
- }
319
- }
320
- return instance.toJSON();
321
- }
322
- function processInstances(model, instances) {
323
- return instances.map((instance) => processInstance(model, instance));
324
- }
325
304
  async function handleDbError(operation) {
326
305
  try {
327
306
  return await operation();
@@ -41,7 +41,7 @@ function callController(controller, validate, appVersion, authConfig) {
41
41
  data = result.instances;
42
42
  totalCount = result.totalCount;
43
43
  }
44
- await setImageUrls(data);
44
+ await setFilesUrls(data);
45
45
  const jsonBody = {
46
46
  data: data || null,
47
47
  totalCount: typeof totalCount === 'number' ? totalCount : null,
@@ -54,8 +54,10 @@ function callController(controller, validate, appVersion, authConfig) {
54
54
  function hasInstancesAndTotalCount(obj) {
55
55
  return typeof obj === 'object' && obj !== null && 'instances' in obj && 'totalCount' in obj;
56
56
  }
57
- async function setImageUrls(data) {
58
- const targets = [];
57
+ async function setFilesUrls(data) {
58
+ const singularSuffixes = ['Image', 'Video'];
59
+ const pluralSuffixes = ['Images', 'Videos'];
60
+ const entries = [];
59
61
  const visited = new WeakSet();
60
62
  function collect(node) {
61
63
  if (!node)
@@ -69,16 +71,43 @@ async function setImageUrls(data) {
69
71
  if (visited.has(node))
70
72
  return;
71
73
  visited.add(node);
72
- if (typeof node.image === 'string' && node.image.length)
73
- targets.push(node);
74
+ for (const [key, value] of Object.entries(node)) {
75
+ if (typeof value === 'string' && value.length) {
76
+ if (singularSuffixes.some((s) => key === s.toLowerCase() || (key.length > s.length && key.endsWith(s)))) {
77
+ entries.push({ node, field: key, type: 'singular' });
78
+ }
79
+ }
80
+ else if (Array.isArray(value) && value.length && value.every((v) => typeof v === 'string')) {
81
+ if (pluralSuffixes.some((s) => key === s.toLowerCase() || (key.length > s.length && key.endsWith(s)))) {
82
+ entries.push({ node, field: key, type: 'plural' });
83
+ }
84
+ }
85
+ }
74
86
  Object.values(node).forEach(collect);
75
87
  }
76
88
  collect(data);
77
- if (!targets.length)
89
+ if (!entries.length)
78
90
  return;
79
- const uniqueImages = Array.from(new Set(targets.map((target) => target.image)));
80
- const urls = await Promise.all(uniqueImages.map((image) => helpers_1.FileStorage.GenerateDownloadUrl(image)));
81
- const map = new Map();
82
- uniqueImages.forEach((image, i) => map.set(image, urls[i]));
83
- targets.forEach((target) => (target.imageUrl = map.get(target.image)));
91
+ const allFileKeys = new Set();
92
+ for (const { node, field, type } of entries) {
93
+ if (type === 'singular') {
94
+ allFileKeys.add(node[field]);
95
+ }
96
+ else {
97
+ for (const v of node[field])
98
+ allFileKeys.add(v);
99
+ }
100
+ }
101
+ const uniqueKeys = Array.from(allFileKeys);
102
+ const urls = await Promise.all(uniqueKeys.map((key) => helpers_1.FileStorage.GenerateDownloadUrl(key)));
103
+ const urlMap = new Map();
104
+ uniqueKeys.forEach((key, i) => urlMap.set(key, urls[i]));
105
+ for (const { node, field, type } of entries) {
106
+ if (type === 'singular') {
107
+ node[`${field}Url`] = urlMap.get(node[field]);
108
+ }
109
+ else {
110
+ node[`${field}Urls`] = node[field].map((v) => urlMap.get(v));
111
+ }
112
+ }
84
113
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pangea-server",
3
3
  "description": "",
4
- "version": "3.3.70",
4
+ "version": "3.3.72",
5
5
  "files": [
6
6
  "dist"
7
7
  ],