@qrvey/assets-sharing 0.3.2 → 0.3.4

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.
@@ -4,7 +4,20 @@ import { UserRepository } from '../src/quser/implementations/user.repository';
4
4
  const loginType = 'qrveyLogin';
5
5
 
6
6
  describe('Check if has admin role.', () => {
7
- test('Has access with API Key only.', async () => {
7
+ beforeEach(() => {
8
+ // User Exist
9
+ jest.spyOn(UserRepository.prototype, 'getOne').mockResolvedValue(
10
+ {} as any,
11
+ );
12
+
13
+ // User has no admin role
14
+ jest.spyOn(UserRepository.prototype, 'getList').mockResolvedValue({
15
+ count: 0,
16
+ items: [],
17
+ } as any);
18
+ });
19
+
20
+ test('Does not have access when: Only API Key', async () => {
8
21
  const body = {
9
22
  apiKey: 'api-key',
10
23
  };
@@ -12,188 +25,273 @@ describe('Check if has admin role.', () => {
12
25
  expect(result).toBe(false);
13
26
  });
14
27
 
15
- test('Has access with API Key and userId.', async () => {
28
+ test('Does not have access when: API Key and Non existing userId', async () => {
29
+ jest.spyOn(UserRepository.prototype, 'getOne').mockResolvedValue(null);
30
+
16
31
  const body = {
17
32
  apiKey: 'api-key',
18
- userId: 'user-id',
33
+ userId: 'non-existing-user',
19
34
  };
20
35
  const result = await hasAdminRole(body);
21
- expect(result).toBe(true);
36
+ expect(result).toBe(false);
22
37
  });
23
38
 
24
- test('Has access with API Key, userId and same clientId as userId.', async () => {
39
+ test('Has access when: API Key and Existing userId', async () => {
25
40
  const body = {
26
41
  apiKey: 'api-key',
27
- userId: 'user-id',
28
- clientId: 'user-id',
42
+ userId: 'existing-user',
29
43
  };
30
44
  const result = await hasAdminRole(body);
31
45
  expect(result).toBe(true);
32
46
  });
33
47
 
34
- test('Has access with API Key, userId, clientId and org:0.', async () => {
48
+ test('Has access when: API Key, org:0 and Existing userId', async () => {
35
49
  const body = {
36
50
  apiKey: 'api-key',
37
- userId: 'user-id',
38
- clientId: 'user-id',
51
+ userId: 'existing-user',
39
52
  orgId: ORGANIZATION_QRVEY,
40
53
  };
41
54
  const result = await hasAdminRole(body);
42
55
  expect(result).toBe(true);
43
56
  });
44
57
 
45
- test('Has access with API Key, userId, clientId and org:0.', async () => {
58
+ test('Does not have access when: API Key, Existing userId and Non existing clientId', async () => {
46
59
  const body = {
47
- userId: 'user-id',
48
- clientId: 'other-id',
49
- orgId: ORGANIZATION_QRVEY,
60
+ apiKey: 'api-key',
61
+ userId: 'existing-user',
62
+ clientId: 'non-existing-user',
50
63
  };
51
64
  const result = await hasAdminRole(body);
52
65
  expect(result).toBe(false);
53
66
  });
54
67
 
55
- test('Has no access with another org and apiKey.', async () => {
68
+ test('Has access when: API Key, Existing userId and existing clientId', async () => {
56
69
  const body = {
57
70
  apiKey: 'api-key',
58
- userId: 'user-id',
59
- clientId: 'user-id',
60
- orgId: 'Another-Org',
71
+ userId: 'existing-user',
72
+ clientId: 'existing-user',
61
73
  };
62
74
  const result = await hasAdminRole(body);
63
- expect(result).toBe(false);
75
+ expect(result).toBe(true);
64
76
  });
65
77
 
66
- test('Has no access with another org.', async () => {
78
+ test('Has access when: API Key, no Admin userId and admin clientId', async () => {
79
+ jest.spyOn(UserRepository.prototype, 'getList').mockResolvedValue({
80
+ count: 1,
81
+ items: [{}],
82
+ } as any);
83
+
67
84
  const body = {
68
- userId: 'user-id',
69
- clientId: 'user-id',
70
- orgId: 'Another-Org',
85
+ apiKey: 'api-key',
86
+ userId: 'existing-user',
87
+ clientId: 'admin-user',
71
88
  };
72
89
  const result = await hasAdminRole(body);
73
- expect(result).toBe(false);
90
+ expect(result).toBe(true);
74
91
  });
75
92
 
76
- test('Has no access with another clientId and org.', async () => {
93
+ test('Does not have access when: API Key, org:0 and Existing userId', async () => {
77
94
  const body = {
78
- userId: 'user-id',
79
- clientId: 'another-id',
95
+ apiKey: 'api-key',
96
+ userId: 'existing-user',
80
97
  orgId: 'another-org',
81
98
  };
82
99
  const result = await hasAdminRole(body);
83
100
  expect(result).toBe(false);
84
101
  });
85
102
 
86
- test('Has no access with another clientId.', async () => {
103
+ test('Does not have access when: InComposer only (need userId)', async () => {
87
104
  const body = {
88
- userId: 'user-id',
89
- clientId: 'another-id',
105
+ loginType,
90
106
  };
91
107
  const result = await hasAdminRole(body);
92
108
  expect(result).toBe(false);
93
109
  });
94
110
 
95
- test('Has access with admin user.', async () => {
111
+ test('Has access when: InComposer, org:0 and Admin userId', async () => {
96
112
  jest.spyOn(UserRepository.prototype, 'getList').mockResolvedValue({
97
113
  count: 1,
98
114
  items: [{}],
99
115
  } as any);
116
+
100
117
  const body = {
101
- userId: 'admin-user',
102
118
  loginType,
119
+ userId: 'admin-user',
120
+ orgId: ORGANIZATION_QRVEY,
103
121
  };
104
122
  const result = await hasAdminRole(body);
105
123
  expect(result).toBe(true);
106
124
  });
107
125
 
108
- test('Has no access with other user.', async () => {
126
+ test('Does not have access when: InComposer, org:0 and non Admin userId', async () => {
127
+ const body = {
128
+ loginType,
129
+ userId: 'non-admin-user',
130
+ orgId: ORGANIZATION_QRVEY,
131
+ };
132
+ const result = await hasAdminRole(body);
133
+ expect(result).toBe(false);
134
+ });
135
+
136
+ test('Does not have access when: org:0 and Admin userId only', async () => {
109
137
  jest.spyOn(UserRepository.prototype, 'getList').mockResolvedValue({
110
- count: 0,
111
- items: [],
138
+ count: 1,
139
+ items: [{}],
112
140
  } as any);
141
+
113
142
  const body = {
114
- userId: 'other-user',
143
+ userId: 'admin-user',
144
+ orgId: ORGANIZATION_QRVEY,
115
145
  };
116
146
  const result = await hasAdminRole(body);
117
147
  expect(result).toBe(false);
118
148
  });
119
149
 
120
- test('Has no access even with admin user but, with another client.', async () => {
150
+ test('Has access when: org:0, Admin userId and Admin ClientId (same as userId)', async () => {
121
151
  jest.spyOn(UserRepository.prototype, 'getList').mockResolvedValue({
122
152
  count: 1,
123
153
  items: [{}],
124
154
  } as any);
155
+
125
156
  const body = {
126
157
  userId: 'admin-user',
127
- clientId: 'other-user',
158
+ clientId: 'admin-user',
159
+ orgId: ORGANIZATION_QRVEY,
128
160
  };
129
161
  const result = await hasAdminRole(body);
130
- expect(result).toBe(false);
162
+ expect(result).toBe(true);
131
163
  });
132
164
 
133
- test('Has no access even with admin user but, with another client and org.', async () => {
165
+ test('Has access when: org:0, Admin userId and Another Admin ClientId', async () => {
134
166
  jest.spyOn(UserRepository.prototype, 'getList').mockResolvedValue({
135
167
  count: 1,
136
168
  items: [{}],
137
169
  } as any);
170
+
138
171
  const body = {
139
172
  userId: 'admin-user',
140
- clientId: 'other-user',
141
- orgId: 'other-org',
173
+ clientId: 'another-admin-user',
174
+ orgId: ORGANIZATION_QRVEY,
175
+ };
176
+ const result = await hasAdminRole(body);
177
+ expect(result).toBe(true);
178
+ });
179
+
180
+ test('Does not have access when: org:0, Admin userId and Non Admin ClientId', async () => {
181
+ const body = {
182
+ userId: 'admin-user',
183
+ clientId: 'non-admin-user',
184
+ orgId: ORGANIZATION_QRVEY,
142
185
  };
143
186
  const result = await hasAdminRole(body);
144
187
  expect(result).toBe(false);
145
188
  });
146
189
 
147
- test('Has no access even with admin user but, with another client and org0.', async () => {
190
+ test('Has access when: org:0, non Admin userId and Admin ClientId', async () => {
148
191
  jest.spyOn(UserRepository.prototype, 'getList').mockResolvedValue({
149
192
  count: 1,
150
193
  items: [{}],
151
194
  } as any);
195
+
152
196
  const body = {
153
- userId: 'admin-user',
154
- clientId: 'other-user',
197
+ userId: 'non-admin-user',
198
+ clientId: 'admin-user',
199
+ orgId: ORGANIZATION_QRVEY,
200
+ };
201
+ const result = await hasAdminRole(body);
202
+ expect(result).toBe(true);
203
+ });
204
+
205
+ test('Does not have access when: org:0, non Admin userId and non Admin ClientId', async () => {
206
+ const body = {
207
+ userId: 'non-admin-user',
208
+ clientId: 'another-non-admin-user',
155
209
  orgId: ORGANIZATION_QRVEY,
156
210
  };
157
211
  const result = await hasAdminRole(body);
158
212
  expect(result).toBe(false);
159
213
  });
160
214
 
161
- test('Has admin level if is in composer', async () => {
215
+ test('Does not have access when: InComposer, Another org, Admin userId', async () => {
162
216
  jest.spyOn(UserRepository.prototype, 'getList').mockResolvedValue({
163
217
  count: 1,
164
218
  items: [{}],
165
219
  } as any);
220
+
166
221
  const body = {
167
222
  userId: 'admin-user',
168
- orgId: ORGANIZATION_QRVEY,
223
+ orgId: 'another-org',
169
224
  loginType,
170
225
  };
171
226
  const result = await hasAdminRole(body);
172
- expect(result).toBe(true);
227
+ expect(result).toBe(false);
228
+ });
229
+
230
+ test('Does not have access when: InComposer, Another org, non Admin userId', async () => {
231
+ const body = {
232
+ userId: 'non-admin-user',
233
+ orgId: 'another-org',
234
+ loginType,
235
+ };
236
+ const result = await hasAdminRole(body);
237
+ expect(result).toBe(false);
173
238
  });
174
239
 
175
- test('Has admin level if is not in composer with clientId', async () => {
240
+ test('Does not have access when: Another org, Admin userId and Admin clientId', async () => {
176
241
  jest.spyOn(UserRepository.prototype, 'getList').mockResolvedValue({
177
242
  count: 1,
178
243
  items: [{}],
179
244
  } as any);
245
+
180
246
  const body = {
181
247
  userId: 'admin-user',
182
248
  clientId: 'admin-user',
183
- orgId: ORGANIZATION_QRVEY,
249
+ orgId: 'another-org',
184
250
  };
185
251
  const result = await hasAdminRole(body);
186
- expect(result).toBe(true);
252
+ expect(result).toBe(false);
187
253
  });
188
254
 
189
- test('Has not admin level if is not in composer and not clientId', async () => {
255
+ test('Does not have access when: Another org, Admin userId and another Admin clientId', async () => {
190
256
  jest.spyOn(UserRepository.prototype, 'getList').mockResolvedValue({
191
257
  count: 1,
192
258
  items: [{}],
193
259
  } as any);
260
+
194
261
  const body = {
195
262
  userId: 'admin-user',
196
- orgId: ORGANIZATION_QRVEY,
263
+ clientId: 'another-admin-user',
264
+ orgId: 'another-org',
265
+ };
266
+ const result = await hasAdminRole(body);
267
+ expect(result).toBe(false);
268
+ });
269
+
270
+ test('Does not have access when: Another org, Admin userId and non Admin clientId', async () => {
271
+ const body = {
272
+ userId: 'admin-user',
273
+ clientId: 'non-admin-user',
274
+ orgId: 'another-org',
275
+ };
276
+ const result = await hasAdminRole(body);
277
+ expect(result).toBe(false);
278
+ });
279
+
280
+ test('Does not have access when: Another org, non Admin userId and Admin clientId', async () => {
281
+ const body = {
282
+ userId: 'non-admin-user',
283
+ clientId: 'admin-user',
284
+ orgId: 'another-org',
285
+ };
286
+ const result = await hasAdminRole(body);
287
+ expect(result).toBe(false);
288
+ });
289
+
290
+ test('Does not have access when: Another org, non Admin userId and non Admin clientId', async () => {
291
+ const body = {
292
+ userId: 'non-admin-user',
293
+ clientId: 'another-non-admin-user',
294
+ orgId: 'another-org',
197
295
  };
198
296
  const result = await hasAdminRole(body);
199
297
  expect(result).toBe(false);
@@ -20,21 +20,22 @@ let HasAdminRole = class HasAdminRole {
20
20
  async execute({ apiKey, clientId, orgId, userId, loginType, } = {}) {
21
21
  if (!userId)
22
22
  return false;
23
- const isMasterKey = apiKey &&
24
- (clientId === userId || !clientId) &&
25
- (orgId === undefined || orgId === constants_1.ORGANIZATION_QRVEY);
26
- if (isMasterKey)
23
+ const existingUser = await this.userRepository.getOne(userId);
24
+ const isMasterKey = apiKey && (orgId === undefined || orgId === constants_1.ORGANIZATION_QRVEY);
25
+ if (isMasterKey && existingUser && (!clientId || clientId === userId))
26
+ return true;
27
+ const user = await this.userRepository.getList({
28
+ data: { identifier: clientId !== null && clientId !== void 0 ? clientId : userId, role: 'administrator' },
29
+ });
30
+ const isAdmin = user.items.length > 0;
31
+ if (isMasterKey && isAdmin)
27
32
  return true;
28
33
  const inComposer = (0, util_1.isComposer)(loginType || '');
29
34
  const isExternal = (!clientId && !inComposer) ||
30
- (clientId && clientId !== userId) ||
31
35
  (orgId && orgId !== constants_1.ORGANIZATION_QRVEY);
32
36
  if (isExternal)
33
37
  return false;
34
- const user = await this.userRepository.getList({
35
- data: { identifier: userId, role: 'administrator' },
36
- });
37
- if (user.items.length > 0)
38
+ if (isAdmin)
38
39
  return true;
39
40
  return false;
40
41
  }
@@ -1 +1 @@
1
- {"version":3,"file":"hasAdminRole.js","sourceRoot":"","sources":["../../../../src/quser/services/hasAdminRole.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,uCAA8C;AAE9C,sDAA4D;AAC5D,4CAA+C;AAIxC,IAAM,YAAY,GAAlB,MAAM,YAAY;IACrB,YAEqB,cAAuC;QAAvC,mBAAc,GAAd,cAAc,CAAyB;IACzD,CAAC;IAEG,KAAK,CAAC,OAAO,CAAC,EACjB,MAAM,EACN,QAAQ,EACR,KAAK,EACL,MAAM,EACN,SAAS,MAOT,EAAE;QACF,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAE1B,MAAM,WAAW,GACb,MAAM;YACN,CAAC,QAAQ,KAAK,MAAM,IAAI,CAAC,QAAQ,CAAC;YAClC,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,8BAAkB,CAAC,CAAC;QAC1D,IAAI,WAAW;YAAE,OAAO,IAAI,CAAC;QAE7B,MAAM,UAAU,GAAG,IAAA,iBAAU,EAAC,SAAS,IAAI,EAAE,CAAC,CAAC;QAC/C,MAAM,UAAU,GACZ,CAAC,CAAC,QAAQ,IAAI,CAAC,UAAU,CAAC;YAC1B,CAAC,QAAQ,IAAI,QAAQ,KAAK,MAAM,CAAC;YACjC,CAAC,KAAK,IAAI,KAAK,KAAK,8BAAkB,CAAC,CAAC;QAC5C,IAAI,UAAU;YAAE,OAAO,KAAK,CAAC;QAE7B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;YAC3C,IAAI,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE;SACtD,CAAC,CAAC;QACH,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAEvC,OAAO,KAAK,CAAC;IACjB,CAAC;CACJ,CAAA;AAzCY,oCAAY;uBAAZ,YAAY;IADxB,IAAA,qBAAU,GAAE;IAGJ,WAAA,IAAA,iBAAM,EAAC,gBAAgB,CAAC,CAAA;GAFpB,YAAY,CAyCxB"}
1
+ {"version":3,"file":"hasAdminRole.js","sourceRoot":"","sources":["../../../../src/quser/services/hasAdminRole.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,uCAA8C;AAE9C,sDAA4D;AAC5D,4CAA+C;AAIxC,IAAM,YAAY,GAAlB,MAAM,YAAY;IACrB,YAEqB,cAAuC;QAAvC,mBAAc,GAAd,cAAc,CAAyB;IACzD,CAAC;IAEG,KAAK,CAAC,OAAO,CAAC,EACjB,MAAM,EACN,QAAQ,EACR,KAAK,EACL,MAAM,EACN,SAAS,MAOT,EAAE;QACF,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAE1B,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9D,MAAM,WAAW,GACb,MAAM,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,8BAAkB,CAAC,CAAC;QACpE,IAAI,WAAW,IAAI,YAAY,IAAI,CAAC,CAAC,QAAQ,IAAI,QAAQ,KAAK,MAAM,CAAC;YACjE,OAAO,IAAI,CAAC;QAEhB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;YAC3C,IAAI,EAAE,EAAE,UAAU,EAAE,QAAQ,aAAR,QAAQ,cAAR,QAAQ,GAAI,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE;SAClE,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QAEtC,IAAI,WAAW,IAAI,OAAO;YAAE,OAAO,IAAI,CAAC;QAExC,MAAM,UAAU,GAAG,IAAA,iBAAU,EAAC,SAAS,IAAI,EAAE,CAAC,CAAC;QAC/C,MAAM,UAAU,GACZ,CAAC,CAAC,QAAQ,IAAI,CAAC,UAAU,CAAC;YAC1B,CAAC,KAAK,IAAI,KAAK,KAAK,8BAAkB,CAAC,CAAC;QAC5C,IAAI,UAAU;YAAE,OAAO,KAAK,CAAC;QAE7B,IAAI,OAAO;YAAE,OAAO,IAAI,CAAC;QAEzB,OAAO,KAAK,CAAC;IACjB,CAAC;CACJ,CAAA;AA5CY,oCAAY;uBAAZ,YAAY;IADxB,IAAA,qBAAU,GAAE;IAGJ,WAAA,IAAA,iBAAM,EAAC,gBAAgB,CAAC,CAAA;GAFpB,YAAY,CA4CxB"}
@@ -575,17 +575,21 @@ var HasAdminRole = class {
575
575
  } = {}) {
576
576
  if (!userId)
577
577
  return false;
578
- const isMasterKey = apiKey && (clientId === userId || !clientId) && (orgId === void 0 || orgId === ORGANIZATION_QRVEY);
579
- if (isMasterKey)
578
+ const existingUser = await this.userRepository.getOne(userId);
579
+ const isMasterKey = apiKey && (orgId === void 0 || orgId === ORGANIZATION_QRVEY);
580
+ if (isMasterKey && existingUser && (!clientId || clientId === userId))
581
+ return true;
582
+ const user = await this.userRepository.getList({
583
+ data: { identifier: clientId != null ? clientId : userId, role: "administrator" }
584
+ });
585
+ const isAdmin = user.items.length > 0;
586
+ if (isMasterKey && isAdmin)
580
587
  return true;
581
588
  const inComposer = isComposer(loginType || "");
582
- const isExternal = !clientId && !inComposer || clientId && clientId !== userId || orgId && orgId !== ORGANIZATION_QRVEY;
589
+ const isExternal = !clientId && !inComposer || orgId && orgId !== ORGANIZATION_QRVEY;
583
590
  if (isExternal)
584
591
  return false;
585
- const user = await this.userRepository.getList({
586
- data: { identifier: userId, role: "administrator" }
587
- });
588
- if (user.items.length > 0)
592
+ if (isAdmin)
589
593
  return true;
590
594
  return false;
591
595
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/context.ts","../../src/quser/implementations/group.model.ts","../../src/common/constants.ts","../../src/common/persistence/base.ts","../../src/common/persistence/poolClient.ts","../../src/quser/implementations/group.repository.ts","../../src/quser/implementations/user.model.ts","../../src/quser/implementations/user.repository.ts","../../src/sharing/implementations/details.model.ts","../../src/sharing/implementations/details.repository.ts","../../src/sharing/implementations/dm.model.ts","../../src/sharing/implementations/dm.repository.ts","../../src/sharing/implementations/dx.model.ts","../../src/sharing/implementations/dx.repository.ts","../../src/sharing/implementations/sharing.model.ts","../../src/sharing/implementations/sharing.repository.ts","../../src/quser/services/fromTokenToUser.ts","../../src/common/util.ts","../../src/quser/entities/user.ts","../../src/quser/services/hasAdminRole.ts","../../src/sharing/services/checkUserAccessLevel.ts","../../src/sharing/entities/details.ts","../../src/sharing/services/delete.ts","../../src/sharing/services/list.ts","../../src/sharing/services/upsert.ts","../../src/sharing/entities/sharing.ts"],"names":["ASSET_TYPE","SHARED_ORIGIN","SHARE_TYPE","ACCESS_LEVEL","CrudSchema","inject","injectable"],"mappings":"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","sourcesContent":["import 'reflect-metadata';\nimport { Context } from './context';\nimport { FromTokenToUser } from './quser/services/fromTokenToUser';\nimport { HasAdminRole } from './quser/services/hasAdminRole';\nimport { CheckUserAccessLevel } from './sharing/services/checkUserAccessLevel';\nimport { DeleteSharing } from './sharing/services/delete';\nimport { ListSharing } from './sharing/services/list';\nimport { UpsertSharing } from './sharing/services/upsert';\n\nexport const api = {\n upsert: (...args: Parameters<UpsertSharing['execute']>) =>\n Context.resolve(UpsertSharing).execute(...args),\n list: (...args: Parameters<ListSharing['execute']>) =>\n Context.resolve(ListSharing).execute(...args),\n delete: (...args: Parameters<DeleteSharing['execute']>) =>\n Context.resolve(DeleteSharing).execute(...args),\n};\n\nexport const checkUserAccessLevel = (\n ...args: Parameters<CheckUserAccessLevel['execute']>\n) => Context.resolve(CheckUserAccessLevel).execute(...args);\n\nexport const fromTokenToUser = (\n ...args: Parameters<FromTokenToUser['execute']>\n) => Context.resolve(FromTokenToUser).execute(...args);\n\nexport const hasAdminRole = (...args: Parameters<HasAdminRole['execute']>) =>\n Context.resolve(HasAdminRole).execute(...args);\n\nexport {\n ACCESS_LEVEL,\n ASSET_TYPE,\n ORGANIZATION_QRVEY,\n SHARED_ORIGIN,\n SHARE_TYPE,\n} from './common/constants';\n\nexport { GetSharingList } from './sharing/entities/types/details.type';\n","import { container } from 'tsyringe';\n\nimport { GroupRepository } from './quser/implementations/group.repository';\nimport { UserRepository } from './quser/implementations/user.repository';\nimport { type RoleRepositoryInterface } from './quser/interfaces/rolesRepository.interface';\nimport { type UserRepositoryInterface } from './quser/interfaces/userRepository.interface';\nimport { SharingDetailsRepository } from './sharing/implementations/details.repository';\nimport { DownloadManagerRepository } from './sharing/implementations/dm.repository';\nimport { DashboardRepository } from './sharing/implementations/dx.repository';\nimport { SharingRepository } from './sharing/implementations/sharing.repository';\nimport { type DashboardRepositoryInterface } from './sharing/interfaces/dashboardRepository.interface';\nimport { type SharingDetailsRepositoryInterface } from './sharing/interfaces/detailsRepository.interface';\nimport { type DownloadManagerRepositoryInterface } from './sharing/interfaces/downloadManagerRepository.interface';\nimport { type SharingRepositoryInterface } from './sharing/interfaces/sharingRepository.interface';\n\ncontainer.register<SharingRepositoryInterface>(\n 'SharingRepository',\n SharingRepository,\n);\ncontainer.register<SharingDetailsRepositoryInterface>(\n 'SharingDetailsRepository',\n SharingDetailsRepository,\n);\ncontainer.register<UserRepositoryInterface>('UserRepository', UserRepository);\ncontainer.register<RoleRepositoryInterface>('RoleRepository', GroupRepository);\ncontainer.register<DashboardRepositoryInterface>(\n 'dxRepository',\n DashboardRepository,\n);\ncontainer.register<DownloadManagerRepositoryInterface>(\n 'dmRepository',\n DownloadManagerRepository,\n);\n\nexport const Context = container;\n","import { CrudSchema } from '@qrvey/data-persistence';\n\nimport { DATABASE_INFO } from '../../common/constants';\n\nexport class GroupModel extends CrudSchema {\n static table = {\n name: `${DATABASE_INFO.SERVER_PREFIX}Groups`,\n alias: 'qv_groups',\n };\n\n static columns = {\n groupid: {\n type: 'string',\n },\n };\n\n static schema = DATABASE_INFO.DATA_PERSISTENCE_SCHEMA;\n}\n","export const ENVIRONMENT = {\n SERVER_PREFIX: process.env.SERVER_PREFIX,\n TABLE_PREFIX: process.env.TABLE_PREFIX,\n};\n\nexport const DATABASE_INFO = {\n DATA_PERSISTENCE_SCHEMA: 'admin',\n SERVER_PREFIX: ENVIRONMENT.SERVER_PREFIX,\n TABLE_PREFIX: ENVIRONMENT.TABLE_PREFIX,\n};\n\nexport const ORGANIZATION_QRVEY = 'org:0';\n\nexport enum ASSET_TYPE {\n DX = 'DX', // DASHBOARD X (Next Gen)\n DM = 'DM', // DOWNLOAD MANAGER\n}\n\nexport enum SHARED_ORIGIN {\n INTERNAL = 'INTERNAL', // for org:0\n EXTERNAL = 'EXTERNAL', // for orgs different that 0\n UNKNOWN = 'UNKNOWN', // without orgId\n}\n\nexport enum SHARE_TYPE {\n USER = 'USER',\n ROLE = 'ROLE',\n ORGANIZATION = 'ORGANIZATION',\n}\n\n/**\n * Access levels for assets.\n * Those are calculated with Base 2, so:\n * - NONE = 0 (undefined)\n * - CAN_USE = 1 (2^0)\n * - CAN_EDIT = 2 (2^1)\n * - ADMIN = 4 (2^2)\n * - (Future) SUPER = 8 (2^3)\n */\nexport enum ACCESS_LEVEL {\n NONE = 0,\n CAN_USE = 1,\n CAN_EDIT = 2,\n ADMIN = 4,\n}\n\nexport const LIMIT_PER_PAGE = 10;\n","import { CrudService, buildFilter } from '@qrvey/data-persistence';\n\nimport { getPoolClient } from './poolClient';\n\nexport class BaseRepository extends CrudService<any> {\n constructor(schema: any) {\n super(schema, getPoolClient());\n }\n\n filter(attribute: string, value: any, operator?: string) {\n return buildFilter(attribute, value, operator);\n }\n}\n","import { getDbPool } from '@qrvey/data-persistence';\n\nlet poolClient: any;\nexport function getPoolClient() {\n if (!poolClient) poolClient = getDbPool();\n return poolClient;\n}\n","import { GroupModel } from './group.model';\nimport { BaseRepository } from '../../common/persistence/base';\nimport { RoleRepositoryInterface } from '../interfaces/rolesRepository.interface';\n\nexport class GroupRepository\n extends BaseRepository\n implements RoleRepositoryInterface\n{\n constructor() {\n super(GroupModel);\n }\n\n async getOne(identifier: string): Promise<{ groupid: string } | null> {\n const params = {\n filters: [this.filter('groupid', identifier)],\n };\n const response = await super.findItem(params);\n return response as { groupid: string };\n }\n}\n","import { CrudSchema } from '@qrvey/data-persistence';\n\nimport { DATABASE_INFO } from '../../common/constants';\n\nexport class UserModel extends CrudSchema {\n static table = {\n name: `${DATABASE_INFO.SERVER_PREFIX}Users`,\n alias: 'qv_users',\n };\n\n static columns = {\n userid: {\n type: 'string',\n primary: true,\n columnId: true,\n },\n groups: {\n type: 'array',\n },\n };\n\n static schema = DATABASE_INFO.DATA_PERSISTENCE_SCHEMA;\n}\n","import { UserModel } from './user.model';\nimport { ListInput, ListOutput } from '../../common/common.type';\nimport { BaseRepository } from '../../common/persistence/base';\nimport { BaseUser } from '../entities/types/user.type';\nimport { UserRepositoryInterface } from '../interfaces/userRepository.interface';\n\nexport class UserRepository\n extends BaseRepository\n implements UserRepositoryInterface\n{\n constructor() {\n super(UserModel);\n }\n\n async getOne(identifier: string): Promise<BaseUser | null> {\n const params = {\n filters: [this.filter('userid', identifier)],\n };\n const response = await super.findItem(params);\n return response as BaseUser;\n }\n\n async getList(\n options: ListInput<{ identifier: string; role?: string }>,\n ): Promise<ListOutput<BaseUser>> {\n const params = {\n filters: [\n this.filter('userid', options.data.identifier),\n this.filter('groups', options.data.role, 'CONTAINS'),\n ],\n };\n const response = await super.find(params);\n return response as ListOutput<BaseUser>;\n }\n}\n","import { CrudSchema } from '@qrvey/data-persistence';\n\nimport { DATABASE_INFO } from '../../common/constants';\n\nexport class SharingDetailsModel extends CrudSchema {\n static table = {\n name: `${DATABASE_INFO.SERVER_PREFIX}_sharing_details`,\n alias: `${DATABASE_INFO.TABLE_PREFIX}_sharing_details`,\n };\n\n static columns = {\n sharing_details_id: { type: 'string', primary: true },\n asset_id: { type: 'string' },\n access_level: { type: 'numeric' },\n org_id: { type: 'string' },\n shared_with: { type: 'string' },\n shared_type: { type: 'string' },\n shared_email: { type: 'string' },\n share_origin: { type: 'string' },\n created_at: { type: 'date' },\n updated_at: { type: 'date' },\n deleted_at: { type: 'date' },\n };\n\n static indexes = {\n sharingDetailsOrgId: {\n name: 'sharing_details_org_id_index',\n columns: [\n 'org_id',\n 'asset_id',\n 'sharing_details_id',\n 'shared_with',\n 'shared_type',\n 'shared_email',\n 'share_origin',\n ],\n },\n sharingDetailsSharedWithAccessLevel: {\n name: 'sharing_details_shared_with_access_level_index',\n columns: [\n 'shared_with',\n 'access_level',\n 'asset_id',\n 'sharing_details_id',\n 'org_id',\n 'shared_type',\n 'shared_email',\n 'share_origin',\n ],\n },\n sharingDetailsAccessLevelSharedWithOrgId: {\n name: 'sharing_details_access_level_shared_with_org_id_index',\n columns: [\n 'access_level',\n 'shared_with',\n 'org_id',\n 'asset_id',\n 'sharing_details_id',\n 'shared_type',\n 'shared_email',\n 'share_origin',\n ],\n },\n sharingDetailsAccessLevelOrgId: {\n name: 'sharing_details_access_level_org_id_index',\n columns: [\n 'access_level',\n 'org_id',\n 'asset_id',\n 'sharing_details_id',\n 'shared_with',\n 'shared_type',\n 'shared_email',\n 'share_origin',\n ],\n },\n sharingDetailsAssetId: {\n name: 'sharing_details_asset_id_index',\n columns: [\n 'asset_id',\n 'sharing_details_id',\n 'org_id',\n 'shared_with',\n 'shared_type',\n 'shared_email',\n 'share_origin',\n ],\n },\n };\n\n static schema = DATABASE_INFO.DATA_PERSISTENCE_SCHEMA;\n static usePool = true;\n}\n","import { IFilter } from '@qrvey/data-persistence';\n\nimport { SharingDetailsModel } from './details.model';\nimport {\n ListInput,\n ListOutput,\n Pagination,\n ParamsFromTokenToUser,\n} from '../../common/common.type';\nimport { LIMIT_PER_PAGE, ORGANIZATION_QRVEY } from '../../common/constants';\nimport { BaseRepository } from '../../common/persistence/base';\nimport { SharingDetailsTable } from '../entities/types/details.type';\nimport { SharingDetailsRepositoryInterface } from '../interfaces/detailsRepository.interface';\n\nexport class SharingDetailsRepository\n extends BaseRepository\n implements SharingDetailsRepositoryInterface\n{\n constructor() {\n super(SharingDetailsModel);\n }\n\n async getOne(sharingDetailId: string): Promise<SharingDetailsTable | null> {\n const params = {\n filters: [this.filter('sharing_details_id', sharingDetailId)],\n };\n const response = await super.findItem(params);\n return response as SharingDetailsTable;\n }\n\n async getBySharedWith(\n assetId: string,\n sharedWith: string,\n ): Promise<SharingDetailsTable | null> {\n const filterList = [\n this.filter('asset_id', assetId),\n this.filter('shared_with', sharedWith),\n ];\n const params = {\n filters: filterList,\n };\n const response = await super.findItem(params);\n return response as SharingDetailsTable;\n }\n\n async getList(\n options: ListInput<{ assetId: string; user?: ParamsFromTokenToUser }>,\n ): Promise<ListOutput<SharingDetailsTable>> {\n const assetIndex = SharingDetailsModel.indexes.sharingDetailsAssetId;\n const pagination = this.getPagination(options.pagination);\n const params: {\n pagination: any;\n index: any;\n filters?: any;\n sorting?: any;\n } = {\n pagination,\n index: {\n indexName: assetIndex.name,\n columns: assetIndex.columns,\n },\n };\n\n const filterList = [this.filter('asset_id', options.data.assetId)];\n if (options.filters) {\n options.filters.forEach((filter) => {\n filterList.push(this.filter(filter.column, filter.value));\n });\n }\n params.filters = filterList;\n\n if (options.data.user) {\n const currentFilter = this.getUserFilter(\n options.data.user,\n filterList,\n );\n params.filters = currentFilter;\n }\n\n if (options.sorting) params.sorting = options.sorting;\n\n const response = await super.find(params);\n return response as ListOutput<SharingDetailsTable>;\n }\n\n async create(details: SharingDetailsTable): Promise<SharingDetailsTable> {\n const response = (await super.create(details)) as SharingDetailsTable;\n return response;\n }\n\n async patch(\n sharingDetailId: string,\n details: SharingDetailsTable,\n ): Promise<boolean> {\n await super.update(\n [this.filter('sharing_details_id', sharingDetailId)],\n details,\n );\n return true;\n }\n\n async delete(sharingDetailId: string): Promise<boolean> {\n await super.remove([\n this.filter('sharing_details_id', sharingDetailId),\n ]);\n return true;\n }\n\n private getPagination(options?: Pagination): Pagination {\n return {\n limit: options?.limit ?? LIMIT_PER_PAGE,\n from: options?.from ?? undefined,\n };\n }\n\n private getUserFilter(\n user: ParamsFromTokenToUser,\n currentFilters?: IFilter[],\n ) {\n const { userId, roles } = user;\n const orgId = user.orgId === '' ? ORGANIZATION_QRVEY : user.orgId; //Review if this is right\n const sharing = {\n OR: [\n {\n AND: [\n this.buildFilter('shared_with', userId),\n this.buildFilter('shared_type', 'USER'),\n this.buildFilter('org_id', orgId),\n ],\n },\n {\n AND: [\n this.buildFilter('shared_with', orgId),\n this.buildFilter('shared_type', 'ORGANIZATION'),\n this.buildFilter('org_id', orgId),\n ],\n },\n ],\n };\n if (roles && roles?.length > 0) {\n sharing.OR.push({\n AND: [\n this.buildFilter('shared_with', roles, 'IN'),\n this.buildFilter('shared_type', 'ROLE'),\n this.buildFilter('org_id', orgId),\n ],\n });\n }\n const filter = [];\n if (currentFilters) filter.push(...currentFilters);\n filter.push(sharing);\n return { AND: filter };\n }\n}\n","import { CrudSchema } from '@qrvey/data-persistence';\n\nimport { DATABASE_INFO } from '../../common/constants';\n\nexport class DownloadManagerSchema extends CrudSchema {\n static table = {\n name: `${DATABASE_INFO.SERVER_PREFIX}DownloadManager`,\n alias: `${DATABASE_INFO.TABLE_PREFIX}_download_manager`,\n };\n\n static columns = {\n downloadManagerId: {\n primary: true,\n type: 'String',\n columnId: true,\n },\n };\n\n static schema = 'exports';\n static usePool = true;\n}\n","import { DownloadManagerSchema } from './dm.model';\nimport { BaseRepository } from '../../common/persistence/base';\nimport { DownloadManagerRepositoryInterface } from '../interfaces/downloadManagerRepository.interface';\n\nexport class DownloadManagerRepository\n extends BaseRepository\n implements DownloadManagerRepositoryInterface\n{\n constructor() {\n super(DownloadManagerSchema);\n }\n\n async get(\n identifier: string,\n ): Promise<{ downloadManagerId: string } | null> {\n const filterList = [this.filter('downloadManagerId', identifier)];\n const params = {\n filters: filterList,\n };\n const response = await super.findItem(params);\n return response as { downloadManagerId: string };\n }\n}\n","import { CrudSchema } from '@qrvey/data-persistence';\n\nimport { DATABASE_INFO } from '../../common/constants';\n\nexport class DashboardSchema extends CrudSchema {\n static table = {\n name: `${DATABASE_INFO.SERVER_PREFIX}_dx_dashboard`,\n alias: `${DATABASE_INFO.TABLE_PREFIX}_dashboard`,\n };\n\n static columns = {\n ResourceUID: { type: 'string', primary: true },\n dashboardId: { type: 'string' },\n contentId: { type: 'string' },\n userId: { type: 'string' },\n ownerId: { type: 'string' },\n appId: { type: 'string' },\n qvAttributes: { type: 'object' },\n };\n\n static indexes = {\n ResourceUID: {\n name: 'MetadataByResource',\n columns: ['Metadata', 'ResourceUID'],\n },\n };\n\n static schema = 'dashboard_x';\n static usePool = true;\n}\n","import { DashboardSchema } from './dx.model';\nimport { BaseRepository } from '../../common/persistence/base';\nimport { DashboardRepositoryInterface } from '../interfaces/dashboardRepository.interface';\n\nexport class DashboardRepository\n extends BaseRepository\n implements DashboardRepositoryInterface\n{\n constructor() {\n super(DashboardSchema);\n }\n\n async get(identifier: string): Promise<{ dashboardId: string } | null> {\n const uid = `DASHBOARD=${identifier}&BRANCH=MAIN`;\n const filterList = [this.filter('ResourceUID', uid)];\n const params = {\n filters: filterList,\n };\n const response = await super.findItem(params);\n return response as { dashboardId: string };\n }\n}\n","import { CrudSchema } from '@qrvey/data-persistence';\n\nimport { DATABASE_INFO } from '../../common/constants';\n\nexport class SharingModel extends CrudSchema {\n static table = {\n name: `${DATABASE_INFO.SERVER_PREFIX}_sharing`,\n alias: `${DATABASE_INFO.TABLE_PREFIX}_sharing`,\n };\n\n static columns = {\n asset_id: { type: 'string', primary: true },\n asset_type: { type: 'string' },\n created_at: { type: 'date' },\n updated_at: { type: 'date' },\n deleted_at: { type: 'date' },\n qvAttributes: { type: 'object' },\n };\n\n static indexes = {\n sharingAssetIdAssetType: {\n name: 'sharing_asset_id_asset_type_index',\n columns: ['asset_id', 'asset_type'],\n },\n sharingAssetType: {\n name: 'sharing_asset_type_index',\n columns: ['asset_type'],\n },\n };\n\n static schema = DATABASE_INFO.DATA_PERSISTENCE_SCHEMA;\n static usePool = true;\n}\n","import { SharingModel } from './sharing.model';\nimport { BaseRepository } from '../../common/persistence/base';\nimport { SharingTable } from '../entities/types/sharing.type';\nimport { SharingRepositoryInterface } from '../interfaces/sharingRepository.interface';\n\nexport class SharingRepository\n extends BaseRepository\n implements SharingRepositoryInterface\n{\n constructor() {\n super(SharingModel);\n }\n\n async getOne(assetId: string): Promise<SharingTable | null> {\n const params = {\n filters: [this.filter('asset_id', assetId)],\n };\n const response = await super.findItem(params);\n return response as SharingTable;\n }\n\n async create(sharing: SharingTable): Promise<SharingTable> {\n const response = (await super.create(sharing)) as SharingTable;\n return response;\n }\n\n async patch(assetId: string, sharing: SharingTable): Promise<boolean> {\n await super.update([this.filter('asset_id', assetId)], sharing);\n return true;\n }\n\n async delete(assetId: string): Promise<boolean> {\n await super.remove([this.filter('asset_id', assetId)]);\n return true;\n }\n}\n","import { inject, injectable } from 'tsyringe';\n\nimport { ParamsFromTokenToUser } from '../../common/common.type';\nimport { ORGANIZATION_QRVEY } from '../../common/constants';\nimport { isComposer } from '../../common/util';\nimport { UserToken } from '../entities/types/user.type';\nimport { User } from '../entities/user';\nimport { UserRepositoryInterface } from '../interfaces/userRepository.interface';\n\n@injectable()\nexport class FromTokenToUser {\n constructor(\n @inject('UserRepository')\n private readonly userRepository: UserRepositoryInterface,\n ) {}\n\n public async execute({\n body,\n }: {\n body: UserToken;\n }): Promise<ParamsFromTokenToUser> {\n const current = await this.userRepository.getOne(\n body.clientId || body.userId,\n );\n if (current) {\n const user = new User(current);\n return {\n userId: user.getUserId,\n roles: user.getGroups,\n orgId: body.orgId ?? ORGANIZATION_QRVEY,\n };\n }\n\n const inComposer = isComposer(body.loginType || '');\n if (!inComposer) {\n return {\n userId: body.clientId || '',\n roles: body.roles || [],\n orgId: body.orgId || '',\n };\n }\n\n return {\n userId: '',\n roles: [],\n orgId: '',\n };\n }\n}\n","enum LOGIN_TYPES {\n composer = 'qrveyLogin',\n openIdComposer = 'OPENID_CREATORS',\n}\n\nexport function isComposer(type: string): boolean {\n return type === LOGIN_TYPES.composer || type === LOGIN_TYPES.openIdComposer;\n}\n","import { BaseUser } from './types/user.type';\n\nexport class User {\n private userId: string;\n private email: string;\n private groups: string[];\n private organization: string;\n\n constructor(params: BaseUser) {\n this.userId = params.userid;\n this.email = params.email;\n this.groups = params.groups;\n this.organization = params.organization;\n }\n\n public get getUserId(): string {\n return this.userId;\n }\n\n public get getEmail(): string {\n return this.email;\n }\n\n public get getGroups(): string[] {\n return this.groups;\n }\n\n public get getOrganization(): string {\n return this.organization;\n }\n}\n","import { inject, injectable } from 'tsyringe';\n\nimport { ORGANIZATION_QRVEY } from '../../common/constants';\nimport { isComposer } from '../../common/util';\nimport { UserRepositoryInterface } from '../interfaces/userRepository.interface';\n\n@injectable()\nexport class HasAdminRole {\n constructor(\n @inject('UserRepository')\n private readonly userRepository: UserRepositoryInterface,\n ) {}\n\n public async execute({\n apiKey,\n clientId,\n orgId,\n userId,\n loginType,\n }: {\n apiKey?: string;\n clientId?: string;\n orgId?: string;\n userId?: string;\n loginType?: string;\n } = {}): Promise<boolean> {\n if (!userId) return false;\n\n const isMasterKey =\n apiKey &&\n (clientId === userId || !clientId) &&\n (orgId === undefined || orgId === ORGANIZATION_QRVEY);\n if (isMasterKey) return true;\n\n const inComposer = isComposer(loginType || '');\n const isExternal =\n (!clientId && !inComposer) ||\n (clientId && clientId !== userId) ||\n (orgId && orgId !== ORGANIZATION_QRVEY);\n if (isExternal) return false;\n\n const user = await this.userRepository.getList({\n data: { identifier: userId, role: 'administrator' },\n });\n if (user.items.length > 0) return true;\n\n return false;\n }\n}\n","import { inject, injectable } from 'tsyringe';\n\nimport { ACCESS_LEVEL, SHARE_TYPE } from '../../common/constants';\nimport { fromTokenToUser } from '../../index';\nimport { SharingDetail } from '../entities/details';\nimport { SharingDetailsRepositoryInterface } from '../interfaces/detailsRepository.interface';\n\n@injectable()\nexport class CheckUserAccessLevel {\n constructor(\n @inject('SharingDetailsRepository')\n private readonly detailsRepository: SharingDetailsRepositoryInterface,\n ) {}\n\n public async execute({\n userId,\n assetId,\n clientId,\n loginType,\n roles,\n orgId,\n }: {\n assetId: string;\n userId: string;\n clientId?: string;\n loginType?: string;\n roles?: string[];\n orgId?: string;\n }): Promise<{ level: ACCESS_LEVEL; levelAsText: string }> {\n const user = await fromTokenToUser({\n body: { userId, clientId, roles, orgId, loginType },\n });\n const details = await this.detailsRepository.getList({\n data: { assetId, user },\n sorting: [{ column: 'access_level', direction: 'DESC' }],\n });\n if (details.items.length === 0)\n return { level: ACCESS_LEVEL.NONE, levelAsText: 'NONE' };\n\n const priority = {\n [SHARE_TYPE.USER]: 3,\n [SHARE_TYPE.ROLE]: 2,\n [SHARE_TYPE.ORGANIZATION]: 1,\n };\n const priorityDetail = details.items.reduce((best, current) => {\n const bestPriority = priority[best.shared_type as SHARE_TYPE];\n const currentPriority = priority[current.shared_type as SHARE_TYPE];\n const isBetter =\n currentPriority > bestPriority ||\n (currentPriority === bestPriority &&\n current.access_level > best.access_level);\n\n if (isBetter) return current;\n return best;\n });\n\n const currentDetail = SharingDetail.parse(priorityDetail);\n return {\n level: currentDetail.getAccessLevel,\n levelAsText: currentDetail.getAccessLevelAsText,\n };\n }\n}\n","import { getId } from '@qrvey/id-generator';\n\nimport {\n BaseSharingDetails,\n CreateSharingDetails,\n ResponseSharingDetails,\n SharingDetailsTable,\n UpdateSharingDetails,\n} from './types/details.type';\nimport {\n ACCESS_LEVEL,\n SHARED_ORIGIN,\n SHARE_TYPE,\n} from '../../common/constants';\n\nexport class SharingDetail {\n private sharingDetailsId: string;\n private assetId: string;\n private accessLevel: ACCESS_LEVEL;\n private accessLevelAsText: string;\n private orgId: string;\n private sharedWith: string;\n private sharedType: SHARE_TYPE;\n private sharedOrigin: SHARED_ORIGIN;\n private sharedEmail?: string;\n private createdAt: string;\n private updatedAt: string;\n private deletedAt?: string;\n\n constructor(params: BaseSharingDetails) {\n this.sharingDetailsId = params.sharingDetailsId;\n this.assetId = params.assetId;\n this.accessLevel = params.accessLevel;\n this.accessLevelAsText = this.convertAccessLevelToText(\n params.accessLevel,\n );\n this.orgId = params.orgId;\n this.sharedWith = params.sharedWith;\n this.sharedType = params.sharedType;\n this.sharedEmail = params.sharedEmail;\n this.sharedOrigin = params.sharedOrigin;\n this.createdAt = params.createdAt;\n this.updatedAt = params.updatedAt;\n this.deletedAt = params.deletedAt;\n }\n\n static create(params: CreateSharingDetails): SharingDetail {\n const now = new Date().toISOString();\n const obj: BaseSharingDetails = {\n ...params,\n sharingDetailsId: params.sharedId ?? getId(),\n createdAt: now,\n updatedAt: now,\n };\n return new SharingDetail(obj);\n }\n\n static parse(params: SharingDetailsTable): SharingDetail {\n return new SharingDetail({\n sharingDetailsId: params.sharing_details_id,\n assetId: params.asset_id,\n accessLevel: params.access_level as ACCESS_LEVEL,\n orgId: params.org_id,\n sharedWith: params.shared_with,\n sharedType: params.shared_type as SHARE_TYPE,\n sharedEmail: params.shared_email,\n sharedOrigin: params.share_origin as SHARED_ORIGIN,\n createdAt: params.created_at,\n updatedAt: params.updated_at,\n deletedAt: params.deleted_at,\n });\n }\n\n update(params: UpdateSharingDetails) {\n if (params.accessLevel || params.accessLevel === 0)\n this.accessLevel = params.accessLevel;\n if (params.sharedEmail) this.sharedEmail = params.sharedEmail;\n this.updatedAt = new Date().toISOString();\n }\n\n toTable(): SharingDetailsTable {\n return {\n sharing_details_id: this.sharingDetailsId,\n asset_id: this.assetId,\n access_level: this.accessLevel,\n org_id: this.orgId,\n shared_with: this.sharedWith,\n shared_type: this.sharedType,\n shared_email: this.sharedEmail,\n share_origin: this.sharedOrigin,\n created_at: this.createdAt,\n updated_at: this.updatedAt,\n deleted_at: this.deletedAt,\n };\n }\n\n toPlain(): BaseSharingDetails {\n return {\n sharingDetailsId: this.sharingDetailsId,\n assetId: this.assetId,\n accessLevel: this.accessLevel,\n orgId: this.orgId,\n sharedWith: this.sharedWith,\n sharedType: this.sharedType,\n sharedEmail: this.sharedEmail,\n sharedOrigin: this.sharedOrigin,\n createdAt: this.createdAt,\n updatedAt: this.updatedAt,\n deletedAt: this.deletedAt,\n };\n }\n\n toJSON(): ResponseSharingDetails {\n return {\n sharedId: this.sharingDetailsId,\n assetId: this.assetId,\n accessLevel: this.accessLevel,\n accessLevelAsText: this.accessLevelAsText,\n orgId: this.orgId,\n sharedWith: this.sharedWith,\n sharedType: this.sharedType,\n sharedEmail: this.sharedEmail,\n sharedOrigin: this.sharedOrigin,\n createdAt: this.createdAt,\n updatedAt: this.updatedAt,\n };\n }\n\n public get getSharingDetailsId(): string {\n return this.sharingDetailsId;\n }\n\n public get getAccessLevel(): ACCESS_LEVEL {\n return this.accessLevel;\n }\n\n public get getAccessLevelAsText(): string {\n return this.accessLevelAsText;\n }\n\n private convertAccessLevelToText(level: number): string {\n return ACCESS_LEVEL[level] ?? 'UNKNOWN';\n }\n}\n","import { inject, injectable } from 'tsyringe';\n\nimport { SharingRepositoryInterface } from '../interfaces/sharingRepository.interface';\n\nexport interface Delete {\n assetId: string;\n}\n\n@injectable()\nexport class DeleteSharing {\n constructor(\n @inject('SharingRepository')\n private readonly sharingRepository: SharingRepositoryInterface,\n ) {}\n\n public async execute({ body }: { body: Delete }): Promise<boolean | null> {\n const { assetId } = body;\n const sharing = await this.sharingRepository.getOne(assetId);\n\n if (!sharing) return null;\n const detailSharing = await this.sharingRepository.delete(assetId);\n return detailSharing;\n }\n}\n","import { inject, injectable } from 'tsyringe';\n\nimport { Sorting } from '../../common/common.type';\nimport { SharingDetail } from '../entities/details';\nimport {\n GetSharingList,\n ListSharingDetails,\n SharingDetailsTable,\n} from '../entities/types/details.type';\nimport { SharingDetailsRepositoryInterface } from '../interfaces/detailsRepository.interface';\nimport { SharingRepositoryInterface } from '../interfaces/sharingRepository.interface';\n\n@injectable()\nexport class ListSharing {\n constructor(\n @inject('SharingRepository')\n private readonly sharingRepository: SharingRepositoryInterface,\n @inject('SharingDetailsRepository')\n private readonly detailsRepository: SharingDetailsRepositoryInterface,\n ) {}\n\n public async execute({\n body,\n }: {\n body: GetSharingList;\n }): Promise<ListSharingDetails | null> {\n const {\n data: { assetId },\n pagination,\n } = body;\n const sharing = await this.sharingRepository.getOne(assetId);\n\n if (!sharing) return null;\n\n const sorting: Array<Sorting> =\n body.sorting && body.sorting?.length > 0\n ? body.sorting\n : [{ column: 'created_at', direction: 'ASC' }];\n\n const detailSharing = await this.detailsRepository.getList({\n data: { assetId },\n pagination,\n sorting,\n });\n const items = detailSharing.items.map((item) =>\n SharingDetail.parse(item as SharingDetailsTable).toJSON(),\n );\n return {\n ...detailSharing,\n items,\n };\n }\n}\n","import { inject, injectable } from 'tsyringe';\n\nimport {\n ACCESS_LEVEL,\n ASSET_TYPE,\n ORGANIZATION_QRVEY,\n SHARED_ORIGIN,\n SHARE_TYPE,\n} from '../../common/constants';\nimport { RoleRepositoryInterface } from '../../quser/interfaces/rolesRepository.interface';\nimport { UserRepositoryInterface } from '../../quser/interfaces/userRepository.interface';\nimport { SharingDetail } from '../entities/details';\nimport { Sharing } from '../entities/sharing';\nimport { ResponseSharingDetails } from '../entities/types/details.type';\nimport { DashboardRepositoryInterface } from '../interfaces/dashboardRepository.interface';\nimport { SharingDetailsRepositoryInterface } from '../interfaces/detailsRepository.interface';\nimport { DownloadManagerRepositoryInterface } from '../interfaces/downloadManagerRepository.interface';\nimport { SharingRepositoryInterface } from '../interfaces/sharingRepository.interface';\n\ninterface SharingWith {\n sharedId?: string;\n sharedWith: string;\n sharedOrigin: SHARED_ORIGIN;\n accessLevel: ACCESS_LEVEL;\n orgId?: string;\n sharedEmail?: string;\n sharedType: SHARE_TYPE;\n}\n\nexport interface UpsertInterface {\n assetId: string;\n assetType: ASSET_TYPE;\n add?: Array<SharingWith>;\n remove?: Array<{\n sharedId: string;\n }>;\n}\n\n@injectable()\nexport class UpsertSharing {\n constructor(\n @inject('SharingRepository')\n private readonly sharingRepository: SharingRepositoryInterface,\n @inject('SharingDetailsRepository')\n private readonly detailsRepository: SharingDetailsRepositoryInterface,\n @inject('dxRepository')\n private readonly dxRepository: DashboardRepositoryInterface,\n @inject('dmRepository')\n private readonly dmRepository: DownloadManagerRepositoryInterface,\n @inject('UserRepository')\n private readonly userRepository: UserRepositoryInterface,\n @inject('RoleRepository')\n private readonly roleRepository: RoleRepositoryInterface,\n ) {}\n\n public async execute({\n body,\n }: {\n body: UpsertInterface;\n }): Promise<ResponseSharingDetails[]> {\n const assetId = body.assetId;\n\n const isValidAsset = await this.validateIfAssetExists(\n assetId,\n body.assetType,\n );\n if (!isValidAsset)\n throw new Error(`Asset with ID ${assetId} not found`);\n\n const sharing = await this.sharingRepository.getOne(assetId);\n let currentSharing: Sharing;\n if (sharing) {\n currentSharing = Sharing.parse(sharing);\n } else {\n const createSharing = {\n assetId,\n assetType: body.assetType,\n };\n currentSharing = Sharing.create(createSharing);\n await this.sharingRepository.create(currentSharing.toTable());\n }\n\n let updatedList: SharingDetail[] = [];\n if (body.add) updatedList = await this.addDetails(assetId, body.add);\n if (body.remove) await this.removeDetails(body.remove);\n\n currentSharing.update();\n await this.sharingRepository.patch(\n currentSharing.getAssetId,\n currentSharing.toTable(),\n );\n return updatedList.map((detail) => detail.toJSON());\n }\n\n private async validateIfAssetExists(\n assetId: string,\n assetType: ASSET_TYPE,\n ): Promise<boolean> {\n switch (assetType) {\n case ASSET_TYPE.DX: {\n const result = await this.dxRepository.get(assetId);\n if (result) return true;\n return false;\n }\n case ASSET_TYPE.DM: {\n return true;\n }\n\n default:\n return false;\n }\n }\n\n private async addDetails(\n assetId: string,\n list: Required<UpsertInterface>['add'],\n ): Promise<SharingDetail[]> {\n const sharingList: SharingDetail[] = [];\n for (const detail of list) {\n const currentDetail = await this.addSpecificDetail(assetId, detail);\n if (currentDetail) sharingList.push(currentDetail);\n }\n return sharingList;\n }\n\n private async addSpecificDetail(\n assetId: string,\n detail: SharingWith,\n ): Promise<SharingDetail | null> {\n let currentDetail: SharingDetail;\n const isValid = await this.validateIfSharedWithExist(detail);\n if (!isValid) return null;\n\n let sharingDetail = await this.detailsRepository.getBySharedWith(\n assetId,\n detail.sharedWith,\n );\n if (!sharingDetail && detail.sharedId) {\n sharingDetail = await this.detailsRepository.getOne(\n detail.sharedId,\n );\n }\n\n if (sharingDetail) {\n currentDetail = SharingDetail.parse(sharingDetail);\n currentDetail.update(detail);\n await this.detailsRepository.patch(\n currentDetail.getSharingDetailsId,\n currentDetail.toTable(),\n );\n } else {\n const createDetails = {\n assetId: assetId,\n orgId: detail.orgId ?? ORGANIZATION_QRVEY, //TODO If shareOrigin is INTERNAL then `ORGANIZATION_QRVEY` else fail\n ...detail,\n };\n currentDetail = SharingDetail.create(createDetails);\n await this.detailsRepository.create(currentDetail.toTable());\n }\n return currentDetail;\n }\n\n private async validateIfSharedWithExist(\n detail: SharingWith,\n ): Promise<boolean> {\n if (\n detail.sharedOrigin === SHARED_ORIGIN.EXTERNAL ||\n detail.sharedOrigin === SHARED_ORIGIN.UNKNOWN\n )\n return true;\n\n const isQrveyOrg =\n detail.sharedType === SHARE_TYPE.ORGANIZATION &&\n detail.sharedWith === ORGANIZATION_QRVEY;\n if (isQrveyOrg) return true; // NOTE: If more Internal Organization arrive, need to change this validation\n\n if (detail.sharedType === SHARE_TYPE.USER) {\n const user = await this.userRepository.getOne(detail.sharedWith);\n if (user) return true;\n }\n\n if (detail.sharedType === SHARE_TYPE.ROLE) {\n const role = await this.roleRepository.getOne(detail.sharedWith);\n if (role) return true;\n }\n\n return false;\n }\n\n private async removeDetails(\n list: Required<UpsertInterface>['remove'],\n ): Promise<void> {\n for (const detail of list) {\n await this.detailsRepository.delete(detail.sharedId);\n }\n }\n}\n","import {\n BaseSharing,\n CreateSharing,\n ResponseSharing,\n SharingTable,\n} from './types/sharing.type';\nimport { ASSET_TYPE } from '../../common/constants';\n\nexport class Sharing {\n private assetId: string;\n private assetType: ASSET_TYPE;\n private createdAt: string;\n private updatedAt: string;\n private deletedAt?: string;\n\n constructor(params: BaseSharing) {\n this.assetId = params.assetId;\n this.assetType = params.assetType;\n this.createdAt = params.createdAt;\n this.updatedAt = params.updatedAt;\n this.deletedAt = params.deletedAt;\n }\n\n static create(params: CreateSharing): Sharing {\n const now = new Date().toISOString();\n const obj: BaseSharing = {\n ...params,\n createdAt: now,\n updatedAt: now,\n };\n return new Sharing(obj);\n }\n\n static parse(params: SharingTable): Sharing {\n return new Sharing({\n assetId: params.asset_id,\n assetType: params.asset_type as ASSET_TYPE,\n createdAt: params.created_at,\n updatedAt: params.updated_at,\n deletedAt: params.deleted_at,\n });\n }\n\n update() {\n this.updatedAt = new Date().toISOString();\n }\n\n toTable(): SharingTable {\n return {\n asset_id: this.assetId,\n asset_type: this.assetType,\n created_at: this.createdAt,\n updated_at: this.updatedAt,\n deleted_at: this.deletedAt,\n };\n }\n\n toPlain(): BaseSharing {\n return {\n assetId: this.assetId,\n assetType: this.assetType,\n createdAt: this.createdAt,\n updatedAt: this.updatedAt,\n deletedAt: this.deletedAt,\n };\n }\n\n toJSON(): ResponseSharing {\n return {\n assetId: this.assetId,\n assetType: this.assetType,\n createdAt: this.createdAt,\n updatedAt: this.updatedAt,\n };\n }\n\n public get getAssetId(): string {\n return this.assetId;\n }\n\n public get getAssetType(): string {\n return this.assetType;\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/context.ts","../../src/quser/implementations/group.model.ts","../../src/common/constants.ts","../../src/common/persistence/base.ts","../../src/common/persistence/poolClient.ts","../../src/quser/implementations/group.repository.ts","../../src/quser/implementations/user.model.ts","../../src/quser/implementations/user.repository.ts","../../src/sharing/implementations/details.model.ts","../../src/sharing/implementations/details.repository.ts","../../src/sharing/implementations/dm.model.ts","../../src/sharing/implementations/dm.repository.ts","../../src/sharing/implementations/dx.model.ts","../../src/sharing/implementations/dx.repository.ts","../../src/sharing/implementations/sharing.model.ts","../../src/sharing/implementations/sharing.repository.ts","../../src/quser/services/fromTokenToUser.ts","../../src/common/util.ts","../../src/quser/entities/user.ts","../../src/quser/services/hasAdminRole.ts","../../src/sharing/services/checkUserAccessLevel.ts","../../src/sharing/entities/details.ts","../../src/sharing/services/delete.ts","../../src/sharing/services/list.ts","../../src/sharing/services/upsert.ts","../../src/sharing/entities/sharing.ts"],"names":["ASSET_TYPE","SHARED_ORIGIN","SHARE_TYPE","ACCESS_LEVEL","CrudSchema","inject","injectable"],"mappings":"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","sourcesContent":["import 'reflect-metadata';\nimport { Context } from './context';\nimport { FromTokenToUser } from './quser/services/fromTokenToUser';\nimport { HasAdminRole } from './quser/services/hasAdminRole';\nimport { CheckUserAccessLevel } from './sharing/services/checkUserAccessLevel';\nimport { DeleteSharing } from './sharing/services/delete';\nimport { ListSharing } from './sharing/services/list';\nimport { UpsertSharing } from './sharing/services/upsert';\n\nexport const api = {\n upsert: (...args: Parameters<UpsertSharing['execute']>) =>\n Context.resolve(UpsertSharing).execute(...args),\n list: (...args: Parameters<ListSharing['execute']>) =>\n Context.resolve(ListSharing).execute(...args),\n delete: (...args: Parameters<DeleteSharing['execute']>) =>\n Context.resolve(DeleteSharing).execute(...args),\n};\n\nexport const checkUserAccessLevel = (\n ...args: Parameters<CheckUserAccessLevel['execute']>\n) => Context.resolve(CheckUserAccessLevel).execute(...args);\n\nexport const fromTokenToUser = (\n ...args: Parameters<FromTokenToUser['execute']>\n) => Context.resolve(FromTokenToUser).execute(...args);\n\nexport const hasAdminRole = (...args: Parameters<HasAdminRole['execute']>) =>\n Context.resolve(HasAdminRole).execute(...args);\n\nexport {\n ACCESS_LEVEL,\n ASSET_TYPE,\n ORGANIZATION_QRVEY,\n SHARED_ORIGIN,\n SHARE_TYPE,\n} from './common/constants';\n\nexport { GetSharingList } from './sharing/entities/types/details.type';\n","import { container } from 'tsyringe';\n\nimport { GroupRepository } from './quser/implementations/group.repository';\nimport { UserRepository } from './quser/implementations/user.repository';\nimport { type RoleRepositoryInterface } from './quser/interfaces/rolesRepository.interface';\nimport { type UserRepositoryInterface } from './quser/interfaces/userRepository.interface';\nimport { SharingDetailsRepository } from './sharing/implementations/details.repository';\nimport { DownloadManagerRepository } from './sharing/implementations/dm.repository';\nimport { DashboardRepository } from './sharing/implementations/dx.repository';\nimport { SharingRepository } from './sharing/implementations/sharing.repository';\nimport { type DashboardRepositoryInterface } from './sharing/interfaces/dashboardRepository.interface';\nimport { type SharingDetailsRepositoryInterface } from './sharing/interfaces/detailsRepository.interface';\nimport { type DownloadManagerRepositoryInterface } from './sharing/interfaces/downloadManagerRepository.interface';\nimport { type SharingRepositoryInterface } from './sharing/interfaces/sharingRepository.interface';\n\ncontainer.register<SharingRepositoryInterface>(\n 'SharingRepository',\n SharingRepository,\n);\ncontainer.register<SharingDetailsRepositoryInterface>(\n 'SharingDetailsRepository',\n SharingDetailsRepository,\n);\ncontainer.register<UserRepositoryInterface>('UserRepository', UserRepository);\ncontainer.register<RoleRepositoryInterface>('RoleRepository', GroupRepository);\ncontainer.register<DashboardRepositoryInterface>(\n 'dxRepository',\n DashboardRepository,\n);\ncontainer.register<DownloadManagerRepositoryInterface>(\n 'dmRepository',\n DownloadManagerRepository,\n);\n\nexport const Context = container;\n","import { CrudSchema } from '@qrvey/data-persistence';\n\nimport { DATABASE_INFO } from '../../common/constants';\n\nexport class GroupModel extends CrudSchema {\n static table = {\n name: `${DATABASE_INFO.SERVER_PREFIX}Groups`,\n alias: 'qv_groups',\n };\n\n static columns = {\n groupid: {\n type: 'string',\n },\n };\n\n static schema = DATABASE_INFO.DATA_PERSISTENCE_SCHEMA;\n}\n","export const ENVIRONMENT = {\n SERVER_PREFIX: process.env.SERVER_PREFIX,\n TABLE_PREFIX: process.env.TABLE_PREFIX,\n};\n\nexport const DATABASE_INFO = {\n DATA_PERSISTENCE_SCHEMA: 'admin',\n SERVER_PREFIX: ENVIRONMENT.SERVER_PREFIX,\n TABLE_PREFIX: ENVIRONMENT.TABLE_PREFIX,\n};\n\nexport const ORGANIZATION_QRVEY = 'org:0';\n\nexport enum ASSET_TYPE {\n DX = 'DX', // DASHBOARD X (Next Gen)\n DM = 'DM', // DOWNLOAD MANAGER\n}\n\nexport enum SHARED_ORIGIN {\n INTERNAL = 'INTERNAL', // for org:0\n EXTERNAL = 'EXTERNAL', // for orgs different that 0\n UNKNOWN = 'UNKNOWN', // without orgId\n}\n\nexport enum SHARE_TYPE {\n USER = 'USER',\n ROLE = 'ROLE',\n ORGANIZATION = 'ORGANIZATION',\n}\n\n/**\n * Access levels for assets.\n * Those are calculated with Base 2, so:\n * - NONE = 0 (undefined)\n * - CAN_USE = 1 (2^0)\n * - CAN_EDIT = 2 (2^1)\n * - ADMIN = 4 (2^2)\n * - (Future) SUPER = 8 (2^3)\n */\nexport enum ACCESS_LEVEL {\n NONE = 0,\n CAN_USE = 1,\n CAN_EDIT = 2,\n ADMIN = 4,\n}\n\nexport const LIMIT_PER_PAGE = 10;\n","import { CrudService, buildFilter } from '@qrvey/data-persistence';\n\nimport { getPoolClient } from './poolClient';\n\nexport class BaseRepository extends CrudService<any> {\n constructor(schema: any) {\n super(schema, getPoolClient());\n }\n\n filter(attribute: string, value: any, operator?: string) {\n return buildFilter(attribute, value, operator);\n }\n}\n","import { getDbPool } from '@qrvey/data-persistence';\n\nlet poolClient: any;\nexport function getPoolClient() {\n if (!poolClient) poolClient = getDbPool();\n return poolClient;\n}\n","import { GroupModel } from './group.model';\nimport { BaseRepository } from '../../common/persistence/base';\nimport { RoleRepositoryInterface } from '../interfaces/rolesRepository.interface';\n\nexport class GroupRepository\n extends BaseRepository\n implements RoleRepositoryInterface\n{\n constructor() {\n super(GroupModel);\n }\n\n async getOne(identifier: string): Promise<{ groupid: string } | null> {\n const params = {\n filters: [this.filter('groupid', identifier)],\n };\n const response = await super.findItem(params);\n return response as { groupid: string };\n }\n}\n","import { CrudSchema } from '@qrvey/data-persistence';\n\nimport { DATABASE_INFO } from '../../common/constants';\n\nexport class UserModel extends CrudSchema {\n static table = {\n name: `${DATABASE_INFO.SERVER_PREFIX}Users`,\n alias: 'qv_users',\n };\n\n static columns = {\n userid: {\n type: 'string',\n primary: true,\n columnId: true,\n },\n groups: {\n type: 'array',\n },\n };\n\n static schema = DATABASE_INFO.DATA_PERSISTENCE_SCHEMA;\n}\n","import { UserModel } from './user.model';\nimport { ListInput, ListOutput } from '../../common/common.type';\nimport { BaseRepository } from '../../common/persistence/base';\nimport { BaseUser } from '../entities/types/user.type';\nimport { UserRepositoryInterface } from '../interfaces/userRepository.interface';\n\nexport class UserRepository\n extends BaseRepository\n implements UserRepositoryInterface\n{\n constructor() {\n super(UserModel);\n }\n\n async getOne(identifier: string): Promise<BaseUser | null> {\n const params = {\n filters: [this.filter('userid', identifier)],\n };\n const response = await super.findItem(params);\n return response as BaseUser;\n }\n\n async getList(\n options: ListInput<{ identifier: string; role?: string }>,\n ): Promise<ListOutput<BaseUser>> {\n const params = {\n filters: [\n this.filter('userid', options.data.identifier),\n this.filter('groups', options.data.role, 'CONTAINS'),\n ],\n };\n const response = await super.find(params);\n return response as ListOutput<BaseUser>;\n }\n}\n","import { CrudSchema } from '@qrvey/data-persistence';\n\nimport { DATABASE_INFO } from '../../common/constants';\n\nexport class SharingDetailsModel extends CrudSchema {\n static table = {\n name: `${DATABASE_INFO.SERVER_PREFIX}_sharing_details`,\n alias: `${DATABASE_INFO.TABLE_PREFIX}_sharing_details`,\n };\n\n static columns = {\n sharing_details_id: { type: 'string', primary: true },\n asset_id: { type: 'string' },\n access_level: { type: 'numeric' },\n org_id: { type: 'string' },\n shared_with: { type: 'string' },\n shared_type: { type: 'string' },\n shared_email: { type: 'string' },\n share_origin: { type: 'string' },\n created_at: { type: 'date' },\n updated_at: { type: 'date' },\n deleted_at: { type: 'date' },\n };\n\n static indexes = {\n sharingDetailsOrgId: {\n name: 'sharing_details_org_id_index',\n columns: [\n 'org_id',\n 'asset_id',\n 'sharing_details_id',\n 'shared_with',\n 'shared_type',\n 'shared_email',\n 'share_origin',\n ],\n },\n sharingDetailsSharedWithAccessLevel: {\n name: 'sharing_details_shared_with_access_level_index',\n columns: [\n 'shared_with',\n 'access_level',\n 'asset_id',\n 'sharing_details_id',\n 'org_id',\n 'shared_type',\n 'shared_email',\n 'share_origin',\n ],\n },\n sharingDetailsAccessLevelSharedWithOrgId: {\n name: 'sharing_details_access_level_shared_with_org_id_index',\n columns: [\n 'access_level',\n 'shared_with',\n 'org_id',\n 'asset_id',\n 'sharing_details_id',\n 'shared_type',\n 'shared_email',\n 'share_origin',\n ],\n },\n sharingDetailsAccessLevelOrgId: {\n name: 'sharing_details_access_level_org_id_index',\n columns: [\n 'access_level',\n 'org_id',\n 'asset_id',\n 'sharing_details_id',\n 'shared_with',\n 'shared_type',\n 'shared_email',\n 'share_origin',\n ],\n },\n sharingDetailsAssetId: {\n name: 'sharing_details_asset_id_index',\n columns: [\n 'asset_id',\n 'sharing_details_id',\n 'org_id',\n 'shared_with',\n 'shared_type',\n 'shared_email',\n 'share_origin',\n ],\n },\n };\n\n static schema = DATABASE_INFO.DATA_PERSISTENCE_SCHEMA;\n static usePool = true;\n}\n","import { IFilter } from '@qrvey/data-persistence';\n\nimport { SharingDetailsModel } from './details.model';\nimport {\n ListInput,\n ListOutput,\n Pagination,\n ParamsFromTokenToUser,\n} from '../../common/common.type';\nimport { LIMIT_PER_PAGE, ORGANIZATION_QRVEY } from '../../common/constants';\nimport { BaseRepository } from '../../common/persistence/base';\nimport { SharingDetailsTable } from '../entities/types/details.type';\nimport { SharingDetailsRepositoryInterface } from '../interfaces/detailsRepository.interface';\n\nexport class SharingDetailsRepository\n extends BaseRepository\n implements SharingDetailsRepositoryInterface\n{\n constructor() {\n super(SharingDetailsModel);\n }\n\n async getOne(sharingDetailId: string): Promise<SharingDetailsTable | null> {\n const params = {\n filters: [this.filter('sharing_details_id', sharingDetailId)],\n };\n const response = await super.findItem(params);\n return response as SharingDetailsTable;\n }\n\n async getBySharedWith(\n assetId: string,\n sharedWith: string,\n ): Promise<SharingDetailsTable | null> {\n const filterList = [\n this.filter('asset_id', assetId),\n this.filter('shared_with', sharedWith),\n ];\n const params = {\n filters: filterList,\n };\n const response = await super.findItem(params);\n return response as SharingDetailsTable;\n }\n\n async getList(\n options: ListInput<{ assetId: string; user?: ParamsFromTokenToUser }>,\n ): Promise<ListOutput<SharingDetailsTable>> {\n const assetIndex = SharingDetailsModel.indexes.sharingDetailsAssetId;\n const pagination = this.getPagination(options.pagination);\n const params: {\n pagination: any;\n index: any;\n filters?: any;\n sorting?: any;\n } = {\n pagination,\n index: {\n indexName: assetIndex.name,\n columns: assetIndex.columns,\n },\n };\n\n const filterList = [this.filter('asset_id', options.data.assetId)];\n if (options.filters) {\n options.filters.forEach((filter) => {\n filterList.push(this.filter(filter.column, filter.value));\n });\n }\n params.filters = filterList;\n\n if (options.data.user) {\n const currentFilter = this.getUserFilter(\n options.data.user,\n filterList,\n );\n params.filters = currentFilter;\n }\n\n if (options.sorting) params.sorting = options.sorting;\n\n const response = await super.find(params);\n return response as ListOutput<SharingDetailsTable>;\n }\n\n async create(details: SharingDetailsTable): Promise<SharingDetailsTable> {\n const response = (await super.create(details)) as SharingDetailsTable;\n return response;\n }\n\n async patch(\n sharingDetailId: string,\n details: SharingDetailsTable,\n ): Promise<boolean> {\n await super.update(\n [this.filter('sharing_details_id', sharingDetailId)],\n details,\n );\n return true;\n }\n\n async delete(sharingDetailId: string): Promise<boolean> {\n await super.remove([\n this.filter('sharing_details_id', sharingDetailId),\n ]);\n return true;\n }\n\n private getPagination(options?: Pagination): Pagination {\n return {\n limit: options?.limit ?? LIMIT_PER_PAGE,\n from: options?.from ?? undefined,\n };\n }\n\n private getUserFilter(\n user: ParamsFromTokenToUser,\n currentFilters?: IFilter[],\n ) {\n const { userId, roles } = user;\n const orgId = user.orgId === '' ? ORGANIZATION_QRVEY : user.orgId; //Review if this is right\n const sharing = {\n OR: [\n {\n AND: [\n this.buildFilter('shared_with', userId),\n this.buildFilter('shared_type', 'USER'),\n this.buildFilter('org_id', orgId),\n ],\n },\n {\n AND: [\n this.buildFilter('shared_with', orgId),\n this.buildFilter('shared_type', 'ORGANIZATION'),\n this.buildFilter('org_id', orgId),\n ],\n },\n ],\n };\n if (roles && roles?.length > 0) {\n sharing.OR.push({\n AND: [\n this.buildFilter('shared_with', roles, 'IN'),\n this.buildFilter('shared_type', 'ROLE'),\n this.buildFilter('org_id', orgId),\n ],\n });\n }\n const filter = [];\n if (currentFilters) filter.push(...currentFilters);\n filter.push(sharing);\n return { AND: filter };\n }\n}\n","import { CrudSchema } from '@qrvey/data-persistence';\n\nimport { DATABASE_INFO } from '../../common/constants';\n\nexport class DownloadManagerSchema extends CrudSchema {\n static table = {\n name: `${DATABASE_INFO.SERVER_PREFIX}DownloadManager`,\n alias: `${DATABASE_INFO.TABLE_PREFIX}_download_manager`,\n };\n\n static columns = {\n downloadManagerId: {\n primary: true,\n type: 'String',\n columnId: true,\n },\n };\n\n static schema = 'exports';\n static usePool = true;\n}\n","import { DownloadManagerSchema } from './dm.model';\nimport { BaseRepository } from '../../common/persistence/base';\nimport { DownloadManagerRepositoryInterface } from '../interfaces/downloadManagerRepository.interface';\n\nexport class DownloadManagerRepository\n extends BaseRepository\n implements DownloadManagerRepositoryInterface\n{\n constructor() {\n super(DownloadManagerSchema);\n }\n\n async get(\n identifier: string,\n ): Promise<{ downloadManagerId: string } | null> {\n const filterList = [this.filter('downloadManagerId', identifier)];\n const params = {\n filters: filterList,\n };\n const response = await super.findItem(params);\n return response as { downloadManagerId: string };\n }\n}\n","import { CrudSchema } from '@qrvey/data-persistence';\n\nimport { DATABASE_INFO } from '../../common/constants';\n\nexport class DashboardSchema extends CrudSchema {\n static table = {\n name: `${DATABASE_INFO.SERVER_PREFIX}_dx_dashboard`,\n alias: `${DATABASE_INFO.TABLE_PREFIX}_dashboard`,\n };\n\n static columns = {\n ResourceUID: { type: 'string', primary: true },\n dashboardId: { type: 'string' },\n contentId: { type: 'string' },\n userId: { type: 'string' },\n ownerId: { type: 'string' },\n appId: { type: 'string' },\n qvAttributes: { type: 'object' },\n };\n\n static indexes = {\n ResourceUID: {\n name: 'MetadataByResource',\n columns: ['Metadata', 'ResourceUID'],\n },\n };\n\n static schema = 'dashboard_x';\n static usePool = true;\n}\n","import { DashboardSchema } from './dx.model';\nimport { BaseRepository } from '../../common/persistence/base';\nimport { DashboardRepositoryInterface } from '../interfaces/dashboardRepository.interface';\n\nexport class DashboardRepository\n extends BaseRepository\n implements DashboardRepositoryInterface\n{\n constructor() {\n super(DashboardSchema);\n }\n\n async get(identifier: string): Promise<{ dashboardId: string } | null> {\n const uid = `DASHBOARD=${identifier}&BRANCH=MAIN`;\n const filterList = [this.filter('ResourceUID', uid)];\n const params = {\n filters: filterList,\n };\n const response = await super.findItem(params);\n return response as { dashboardId: string };\n }\n}\n","import { CrudSchema } from '@qrvey/data-persistence';\n\nimport { DATABASE_INFO } from '../../common/constants';\n\nexport class SharingModel extends CrudSchema {\n static table = {\n name: `${DATABASE_INFO.SERVER_PREFIX}_sharing`,\n alias: `${DATABASE_INFO.TABLE_PREFIX}_sharing`,\n };\n\n static columns = {\n asset_id: { type: 'string', primary: true },\n asset_type: { type: 'string' },\n created_at: { type: 'date' },\n updated_at: { type: 'date' },\n deleted_at: { type: 'date' },\n qvAttributes: { type: 'object' },\n };\n\n static indexes = {\n sharingAssetIdAssetType: {\n name: 'sharing_asset_id_asset_type_index',\n columns: ['asset_id', 'asset_type'],\n },\n sharingAssetType: {\n name: 'sharing_asset_type_index',\n columns: ['asset_type'],\n },\n };\n\n static schema = DATABASE_INFO.DATA_PERSISTENCE_SCHEMA;\n static usePool = true;\n}\n","import { SharingModel } from './sharing.model';\nimport { BaseRepository } from '../../common/persistence/base';\nimport { SharingTable } from '../entities/types/sharing.type';\nimport { SharingRepositoryInterface } from '../interfaces/sharingRepository.interface';\n\nexport class SharingRepository\n extends BaseRepository\n implements SharingRepositoryInterface\n{\n constructor() {\n super(SharingModel);\n }\n\n async getOne(assetId: string): Promise<SharingTable | null> {\n const params = {\n filters: [this.filter('asset_id', assetId)],\n };\n const response = await super.findItem(params);\n return response as SharingTable;\n }\n\n async create(sharing: SharingTable): Promise<SharingTable> {\n const response = (await super.create(sharing)) as SharingTable;\n return response;\n }\n\n async patch(assetId: string, sharing: SharingTable): Promise<boolean> {\n await super.update([this.filter('asset_id', assetId)], sharing);\n return true;\n }\n\n async delete(assetId: string): Promise<boolean> {\n await super.remove([this.filter('asset_id', assetId)]);\n return true;\n }\n}\n","import { inject, injectable } from 'tsyringe';\n\nimport { ParamsFromTokenToUser } from '../../common/common.type';\nimport { ORGANIZATION_QRVEY } from '../../common/constants';\nimport { isComposer } from '../../common/util';\nimport { UserToken } from '../entities/types/user.type';\nimport { User } from '../entities/user';\nimport { UserRepositoryInterface } from '../interfaces/userRepository.interface';\n\n@injectable()\nexport class FromTokenToUser {\n constructor(\n @inject('UserRepository')\n private readonly userRepository: UserRepositoryInterface,\n ) {}\n\n public async execute({\n body,\n }: {\n body: UserToken;\n }): Promise<ParamsFromTokenToUser> {\n const current = await this.userRepository.getOne(\n body.clientId || body.userId,\n );\n if (current) {\n const user = new User(current);\n return {\n userId: user.getUserId,\n roles: user.getGroups,\n orgId: body.orgId ?? ORGANIZATION_QRVEY,\n };\n }\n\n const inComposer = isComposer(body.loginType || '');\n if (!inComposer) {\n return {\n userId: body.clientId || '',\n roles: body.roles || [],\n orgId: body.orgId || '',\n };\n }\n\n return {\n userId: '',\n roles: [],\n orgId: '',\n };\n }\n}\n","enum LOGIN_TYPES {\n composer = 'qrveyLogin',\n openIdComposer = 'OPENID_CREATORS',\n}\n\nexport function isComposer(type: string): boolean {\n return type === LOGIN_TYPES.composer || type === LOGIN_TYPES.openIdComposer;\n}\n","import { BaseUser } from './types/user.type';\n\nexport class User {\n private userId: string;\n private email: string;\n private groups: string[];\n private organization: string;\n\n constructor(params: BaseUser) {\n this.userId = params.userid;\n this.email = params.email;\n this.groups = params.groups;\n this.organization = params.organization;\n }\n\n public get getUserId(): string {\n return this.userId;\n }\n\n public get getEmail(): string {\n return this.email;\n }\n\n public get getGroups(): string[] {\n return this.groups;\n }\n\n public get getOrganization(): string {\n return this.organization;\n }\n}\n","import { inject, injectable } from 'tsyringe';\n\nimport { ORGANIZATION_QRVEY } from '../../common/constants';\nimport { isComposer } from '../../common/util';\nimport { UserRepositoryInterface } from '../interfaces/userRepository.interface';\n\n@injectable()\nexport class HasAdminRole {\n constructor(\n @inject('UserRepository')\n private readonly userRepository: UserRepositoryInterface,\n ) {}\n\n public async execute({\n apiKey,\n clientId,\n orgId,\n userId,\n loginType,\n }: {\n apiKey?: string;\n clientId?: string;\n orgId?: string;\n userId?: string;\n loginType?: string;\n } = {}): Promise<boolean> {\n if (!userId) return false;\n\n const existingUser = await this.userRepository.getOne(userId);\n const isMasterKey =\n apiKey && (orgId === undefined || orgId === ORGANIZATION_QRVEY);\n if (isMasterKey && existingUser && (!clientId || clientId === userId))\n return true;\n\n const user = await this.userRepository.getList({\n data: { identifier: clientId ?? userId, role: 'administrator' },\n });\n const isAdmin = user.items.length > 0;\n\n if (isMasterKey && isAdmin) return true;\n\n const inComposer = isComposer(loginType || '');\n const isExternal =\n (!clientId && !inComposer) ||\n (orgId && orgId !== ORGANIZATION_QRVEY);\n if (isExternal) return false;\n\n if (isAdmin) return true;\n\n return false;\n }\n}\n","import { inject, injectable } from 'tsyringe';\n\nimport { ACCESS_LEVEL, SHARE_TYPE } from '../../common/constants';\nimport { fromTokenToUser } from '../../index';\nimport { SharingDetail } from '../entities/details';\nimport { SharingDetailsRepositoryInterface } from '../interfaces/detailsRepository.interface';\n\n@injectable()\nexport class CheckUserAccessLevel {\n constructor(\n @inject('SharingDetailsRepository')\n private readonly detailsRepository: SharingDetailsRepositoryInterface,\n ) {}\n\n public async execute({\n userId,\n assetId,\n clientId,\n loginType,\n roles,\n orgId,\n }: {\n assetId: string;\n userId: string;\n clientId?: string;\n loginType?: string;\n roles?: string[];\n orgId?: string;\n }): Promise<{ level: ACCESS_LEVEL; levelAsText: string }> {\n const user = await fromTokenToUser({\n body: { userId, clientId, roles, orgId, loginType },\n });\n const details = await this.detailsRepository.getList({\n data: { assetId, user },\n sorting: [{ column: 'access_level', direction: 'DESC' }],\n });\n if (details.items.length === 0)\n return { level: ACCESS_LEVEL.NONE, levelAsText: 'NONE' };\n\n const priority = {\n [SHARE_TYPE.USER]: 3,\n [SHARE_TYPE.ROLE]: 2,\n [SHARE_TYPE.ORGANIZATION]: 1,\n };\n const priorityDetail = details.items.reduce((best, current) => {\n const bestPriority = priority[best.shared_type as SHARE_TYPE];\n const currentPriority = priority[current.shared_type as SHARE_TYPE];\n const isBetter =\n currentPriority > bestPriority ||\n (currentPriority === bestPriority &&\n current.access_level > best.access_level);\n\n if (isBetter) return current;\n return best;\n });\n\n const currentDetail = SharingDetail.parse(priorityDetail);\n return {\n level: currentDetail.getAccessLevel,\n levelAsText: currentDetail.getAccessLevelAsText,\n };\n }\n}\n","import { getId } from '@qrvey/id-generator';\n\nimport {\n BaseSharingDetails,\n CreateSharingDetails,\n ResponseSharingDetails,\n SharingDetailsTable,\n UpdateSharingDetails,\n} from './types/details.type';\nimport {\n ACCESS_LEVEL,\n SHARED_ORIGIN,\n SHARE_TYPE,\n} from '../../common/constants';\n\nexport class SharingDetail {\n private sharingDetailsId: string;\n private assetId: string;\n private accessLevel: ACCESS_LEVEL;\n private accessLevelAsText: string;\n private orgId: string;\n private sharedWith: string;\n private sharedType: SHARE_TYPE;\n private sharedOrigin: SHARED_ORIGIN;\n private sharedEmail?: string;\n private createdAt: string;\n private updatedAt: string;\n private deletedAt?: string;\n\n constructor(params: BaseSharingDetails) {\n this.sharingDetailsId = params.sharingDetailsId;\n this.assetId = params.assetId;\n this.accessLevel = params.accessLevel;\n this.accessLevelAsText = this.convertAccessLevelToText(\n params.accessLevel,\n );\n this.orgId = params.orgId;\n this.sharedWith = params.sharedWith;\n this.sharedType = params.sharedType;\n this.sharedEmail = params.sharedEmail;\n this.sharedOrigin = params.sharedOrigin;\n this.createdAt = params.createdAt;\n this.updatedAt = params.updatedAt;\n this.deletedAt = params.deletedAt;\n }\n\n static create(params: CreateSharingDetails): SharingDetail {\n const now = new Date().toISOString();\n const obj: BaseSharingDetails = {\n ...params,\n sharingDetailsId: params.sharedId ?? getId(),\n createdAt: now,\n updatedAt: now,\n };\n return new SharingDetail(obj);\n }\n\n static parse(params: SharingDetailsTable): SharingDetail {\n return new SharingDetail({\n sharingDetailsId: params.sharing_details_id,\n assetId: params.asset_id,\n accessLevel: params.access_level as ACCESS_LEVEL,\n orgId: params.org_id,\n sharedWith: params.shared_with,\n sharedType: params.shared_type as SHARE_TYPE,\n sharedEmail: params.shared_email,\n sharedOrigin: params.share_origin as SHARED_ORIGIN,\n createdAt: params.created_at,\n updatedAt: params.updated_at,\n deletedAt: params.deleted_at,\n });\n }\n\n update(params: UpdateSharingDetails) {\n if (params.accessLevel || params.accessLevel === 0)\n this.accessLevel = params.accessLevel;\n if (params.sharedEmail) this.sharedEmail = params.sharedEmail;\n this.updatedAt = new Date().toISOString();\n }\n\n toTable(): SharingDetailsTable {\n return {\n sharing_details_id: this.sharingDetailsId,\n asset_id: this.assetId,\n access_level: this.accessLevel,\n org_id: this.orgId,\n shared_with: this.sharedWith,\n shared_type: this.sharedType,\n shared_email: this.sharedEmail,\n share_origin: this.sharedOrigin,\n created_at: this.createdAt,\n updated_at: this.updatedAt,\n deleted_at: this.deletedAt,\n };\n }\n\n toPlain(): BaseSharingDetails {\n return {\n sharingDetailsId: this.sharingDetailsId,\n assetId: this.assetId,\n accessLevel: this.accessLevel,\n orgId: this.orgId,\n sharedWith: this.sharedWith,\n sharedType: this.sharedType,\n sharedEmail: this.sharedEmail,\n sharedOrigin: this.sharedOrigin,\n createdAt: this.createdAt,\n updatedAt: this.updatedAt,\n deletedAt: this.deletedAt,\n };\n }\n\n toJSON(): ResponseSharingDetails {\n return {\n sharedId: this.sharingDetailsId,\n assetId: this.assetId,\n accessLevel: this.accessLevel,\n accessLevelAsText: this.accessLevelAsText,\n orgId: this.orgId,\n sharedWith: this.sharedWith,\n sharedType: this.sharedType,\n sharedEmail: this.sharedEmail,\n sharedOrigin: this.sharedOrigin,\n createdAt: this.createdAt,\n updatedAt: this.updatedAt,\n };\n }\n\n public get getSharingDetailsId(): string {\n return this.sharingDetailsId;\n }\n\n public get getAccessLevel(): ACCESS_LEVEL {\n return this.accessLevel;\n }\n\n public get getAccessLevelAsText(): string {\n return this.accessLevelAsText;\n }\n\n private convertAccessLevelToText(level: number): string {\n return ACCESS_LEVEL[level] ?? 'UNKNOWN';\n }\n}\n","import { inject, injectable } from 'tsyringe';\n\nimport { SharingRepositoryInterface } from '../interfaces/sharingRepository.interface';\n\nexport interface Delete {\n assetId: string;\n}\n\n@injectable()\nexport class DeleteSharing {\n constructor(\n @inject('SharingRepository')\n private readonly sharingRepository: SharingRepositoryInterface,\n ) {}\n\n public async execute({ body }: { body: Delete }): Promise<boolean | null> {\n const { assetId } = body;\n const sharing = await this.sharingRepository.getOne(assetId);\n\n if (!sharing) return null;\n const detailSharing = await this.sharingRepository.delete(assetId);\n return detailSharing;\n }\n}\n","import { inject, injectable } from 'tsyringe';\n\nimport { Sorting } from '../../common/common.type';\nimport { SharingDetail } from '../entities/details';\nimport {\n GetSharingList,\n ListSharingDetails,\n SharingDetailsTable,\n} from '../entities/types/details.type';\nimport { SharingDetailsRepositoryInterface } from '../interfaces/detailsRepository.interface';\nimport { SharingRepositoryInterface } from '../interfaces/sharingRepository.interface';\n\n@injectable()\nexport class ListSharing {\n constructor(\n @inject('SharingRepository')\n private readonly sharingRepository: SharingRepositoryInterface,\n @inject('SharingDetailsRepository')\n private readonly detailsRepository: SharingDetailsRepositoryInterface,\n ) {}\n\n public async execute({\n body,\n }: {\n body: GetSharingList;\n }): Promise<ListSharingDetails | null> {\n const {\n data: { assetId },\n pagination,\n } = body;\n const sharing = await this.sharingRepository.getOne(assetId);\n\n if (!sharing) return null;\n\n const sorting: Array<Sorting> =\n body.sorting && body.sorting?.length > 0\n ? body.sorting\n : [{ column: 'created_at', direction: 'ASC' }];\n\n const detailSharing = await this.detailsRepository.getList({\n data: { assetId },\n pagination,\n sorting,\n });\n const items = detailSharing.items.map((item) =>\n SharingDetail.parse(item as SharingDetailsTable).toJSON(),\n );\n return {\n ...detailSharing,\n items,\n };\n }\n}\n","import { inject, injectable } from 'tsyringe';\n\nimport {\n ACCESS_LEVEL,\n ASSET_TYPE,\n ORGANIZATION_QRVEY,\n SHARED_ORIGIN,\n SHARE_TYPE,\n} from '../../common/constants';\nimport { RoleRepositoryInterface } from '../../quser/interfaces/rolesRepository.interface';\nimport { UserRepositoryInterface } from '../../quser/interfaces/userRepository.interface';\nimport { SharingDetail } from '../entities/details';\nimport { Sharing } from '../entities/sharing';\nimport { ResponseSharingDetails } from '../entities/types/details.type';\nimport { DashboardRepositoryInterface } from '../interfaces/dashboardRepository.interface';\nimport { SharingDetailsRepositoryInterface } from '../interfaces/detailsRepository.interface';\nimport { DownloadManagerRepositoryInterface } from '../interfaces/downloadManagerRepository.interface';\nimport { SharingRepositoryInterface } from '../interfaces/sharingRepository.interface';\n\ninterface SharingWith {\n sharedId?: string;\n sharedWith: string;\n sharedOrigin: SHARED_ORIGIN;\n accessLevel: ACCESS_LEVEL;\n orgId?: string;\n sharedEmail?: string;\n sharedType: SHARE_TYPE;\n}\n\nexport interface UpsertInterface {\n assetId: string;\n assetType: ASSET_TYPE;\n add?: Array<SharingWith>;\n remove?: Array<{\n sharedId: string;\n }>;\n}\n\n@injectable()\nexport class UpsertSharing {\n constructor(\n @inject('SharingRepository')\n private readonly sharingRepository: SharingRepositoryInterface,\n @inject('SharingDetailsRepository')\n private readonly detailsRepository: SharingDetailsRepositoryInterface,\n @inject('dxRepository')\n private readonly dxRepository: DashboardRepositoryInterface,\n @inject('dmRepository')\n private readonly dmRepository: DownloadManagerRepositoryInterface,\n @inject('UserRepository')\n private readonly userRepository: UserRepositoryInterface,\n @inject('RoleRepository')\n private readonly roleRepository: RoleRepositoryInterface,\n ) {}\n\n public async execute({\n body,\n }: {\n body: UpsertInterface;\n }): Promise<ResponseSharingDetails[]> {\n const assetId = body.assetId;\n\n const isValidAsset = await this.validateIfAssetExists(\n assetId,\n body.assetType,\n );\n if (!isValidAsset)\n throw new Error(`Asset with ID ${assetId} not found`);\n\n const sharing = await this.sharingRepository.getOne(assetId);\n let currentSharing: Sharing;\n if (sharing) {\n currentSharing = Sharing.parse(sharing);\n } else {\n const createSharing = {\n assetId,\n assetType: body.assetType,\n };\n currentSharing = Sharing.create(createSharing);\n await this.sharingRepository.create(currentSharing.toTable());\n }\n\n let updatedList: SharingDetail[] = [];\n if (body.add) updatedList = await this.addDetails(assetId, body.add);\n if (body.remove) await this.removeDetails(body.remove);\n\n currentSharing.update();\n await this.sharingRepository.patch(\n currentSharing.getAssetId,\n currentSharing.toTable(),\n );\n return updatedList.map((detail) => detail.toJSON());\n }\n\n private async validateIfAssetExists(\n assetId: string,\n assetType: ASSET_TYPE,\n ): Promise<boolean> {\n switch (assetType) {\n case ASSET_TYPE.DX: {\n const result = await this.dxRepository.get(assetId);\n if (result) return true;\n return false;\n }\n case ASSET_TYPE.DM: {\n return true;\n }\n\n default:\n return false;\n }\n }\n\n private async addDetails(\n assetId: string,\n list: Required<UpsertInterface>['add'],\n ): Promise<SharingDetail[]> {\n const sharingList: SharingDetail[] = [];\n for (const detail of list) {\n const currentDetail = await this.addSpecificDetail(assetId, detail);\n if (currentDetail) sharingList.push(currentDetail);\n }\n return sharingList;\n }\n\n private async addSpecificDetail(\n assetId: string,\n detail: SharingWith,\n ): Promise<SharingDetail | null> {\n let currentDetail: SharingDetail;\n const isValid = await this.validateIfSharedWithExist(detail);\n if (!isValid) return null;\n\n let sharingDetail = await this.detailsRepository.getBySharedWith(\n assetId,\n detail.sharedWith,\n );\n if (!sharingDetail && detail.sharedId) {\n sharingDetail = await this.detailsRepository.getOne(\n detail.sharedId,\n );\n }\n\n if (sharingDetail) {\n currentDetail = SharingDetail.parse(sharingDetail);\n currentDetail.update(detail);\n await this.detailsRepository.patch(\n currentDetail.getSharingDetailsId,\n currentDetail.toTable(),\n );\n } else {\n const createDetails = {\n assetId: assetId,\n orgId: detail.orgId ?? ORGANIZATION_QRVEY, //TODO If shareOrigin is INTERNAL then `ORGANIZATION_QRVEY` else fail\n ...detail,\n };\n currentDetail = SharingDetail.create(createDetails);\n await this.detailsRepository.create(currentDetail.toTable());\n }\n return currentDetail;\n }\n\n private async validateIfSharedWithExist(\n detail: SharingWith,\n ): Promise<boolean> {\n if (\n detail.sharedOrigin === SHARED_ORIGIN.EXTERNAL ||\n detail.sharedOrigin === SHARED_ORIGIN.UNKNOWN\n )\n return true;\n\n const isQrveyOrg =\n detail.sharedType === SHARE_TYPE.ORGANIZATION &&\n detail.sharedWith === ORGANIZATION_QRVEY;\n if (isQrveyOrg) return true; // NOTE: If more Internal Organization arrive, need to change this validation\n\n if (detail.sharedType === SHARE_TYPE.USER) {\n const user = await this.userRepository.getOne(detail.sharedWith);\n if (user) return true;\n }\n\n if (detail.sharedType === SHARE_TYPE.ROLE) {\n const role = await this.roleRepository.getOne(detail.sharedWith);\n if (role) return true;\n }\n\n return false;\n }\n\n private async removeDetails(\n list: Required<UpsertInterface>['remove'],\n ): Promise<void> {\n for (const detail of list) {\n await this.detailsRepository.delete(detail.sharedId);\n }\n }\n}\n","import {\n BaseSharing,\n CreateSharing,\n ResponseSharing,\n SharingTable,\n} from './types/sharing.type';\nimport { ASSET_TYPE } from '../../common/constants';\n\nexport class Sharing {\n private assetId: string;\n private assetType: ASSET_TYPE;\n private createdAt: string;\n private updatedAt: string;\n private deletedAt?: string;\n\n constructor(params: BaseSharing) {\n this.assetId = params.assetId;\n this.assetType = params.assetType;\n this.createdAt = params.createdAt;\n this.updatedAt = params.updatedAt;\n this.deletedAt = params.deletedAt;\n }\n\n static create(params: CreateSharing): Sharing {\n const now = new Date().toISOString();\n const obj: BaseSharing = {\n ...params,\n createdAt: now,\n updatedAt: now,\n };\n return new Sharing(obj);\n }\n\n static parse(params: SharingTable): Sharing {\n return new Sharing({\n assetId: params.asset_id,\n assetType: params.asset_type as ASSET_TYPE,\n createdAt: params.created_at,\n updatedAt: params.updated_at,\n deletedAt: params.deleted_at,\n });\n }\n\n update() {\n this.updatedAt = new Date().toISOString();\n }\n\n toTable(): SharingTable {\n return {\n asset_id: this.assetId,\n asset_type: this.assetType,\n created_at: this.createdAt,\n updated_at: this.updatedAt,\n deleted_at: this.deletedAt,\n };\n }\n\n toPlain(): BaseSharing {\n return {\n assetId: this.assetId,\n assetType: this.assetType,\n createdAt: this.createdAt,\n updatedAt: this.updatedAt,\n deletedAt: this.deletedAt,\n };\n }\n\n toJSON(): ResponseSharing {\n return {\n assetId: this.assetId,\n assetType: this.assetType,\n createdAt: this.createdAt,\n updatedAt: this.updatedAt,\n };\n }\n\n public get getAssetId(): string {\n return this.assetId;\n }\n\n public get getAssetType(): string {\n return this.assetType;\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qrvey/assets-sharing",
3
- "version": "0.3.2",
3
+ "version": "0.3.4",
4
4
  "types": "dist/types/index.d.ts",
5
5
  "main": "dist/cjs/index.js",
6
6
  "exports": {
@@ -26,23 +26,26 @@ export class HasAdminRole {
26
26
  } = {}): Promise<boolean> {
27
27
  if (!userId) return false;
28
28
 
29
+ const existingUser = await this.userRepository.getOne(userId);
29
30
  const isMasterKey =
30
- apiKey &&
31
- (clientId === userId || !clientId) &&
32
- (orgId === undefined || orgId === ORGANIZATION_QRVEY);
33
- if (isMasterKey) return true;
31
+ apiKey && (orgId === undefined || orgId === ORGANIZATION_QRVEY);
32
+ if (isMasterKey && existingUser && (!clientId || clientId === userId))
33
+ return true;
34
+
35
+ const user = await this.userRepository.getList({
36
+ data: { identifier: clientId ?? userId, role: 'administrator' },
37
+ });
38
+ const isAdmin = user.items.length > 0;
39
+
40
+ if (isMasterKey && isAdmin) return true;
34
41
 
35
42
  const inComposer = isComposer(loginType || '');
36
43
  const isExternal =
37
44
  (!clientId && !inComposer) ||
38
- (clientId && clientId !== userId) ||
39
45
  (orgId && orgId !== ORGANIZATION_QRVEY);
40
46
  if (isExternal) return false;
41
47
 
42
- const user = await this.userRepository.getList({
43
- data: { identifier: userId, role: 'administrator' },
44
- });
45
- if (user.items.length > 0) return true;
48
+ if (isAdmin) return true;
46
49
 
47
50
  return false;
48
51
  }