@qrvey/assets-sharing 0.3.3 → 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.
- package/__test__/hasAdminRole.test.ts +146 -47
- package/dist/cjs/quser/services/hasAdminRole.js +9 -5
- package/dist/cjs/quser/services/hasAdminRole.js.map +1 -1
- package/dist/esm/index.mjs +9 -5
- package/dist/esm/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/quser/services/hasAdminRole.ts +11 -5
|
@@ -5,13 +5,19 @@ const loginType = 'qrveyLogin';
|
|
|
5
5
|
|
|
6
6
|
describe('Check if has admin role.', () => {
|
|
7
7
|
beforeEach(() => {
|
|
8
|
+
// User Exist
|
|
9
|
+
jest.spyOn(UserRepository.prototype, 'getOne').mockResolvedValue(
|
|
10
|
+
{} as any,
|
|
11
|
+
);
|
|
12
|
+
|
|
13
|
+
// User has no admin role
|
|
8
14
|
jest.spyOn(UserRepository.prototype, 'getList').mockResolvedValue({
|
|
9
15
|
count: 0,
|
|
10
16
|
items: [],
|
|
11
17
|
} as any);
|
|
12
18
|
});
|
|
13
19
|
|
|
14
|
-
test('
|
|
20
|
+
test('Does not have access when: Only API Key', async () => {
|
|
15
21
|
const body = {
|
|
16
22
|
apiKey: 'api-key',
|
|
17
23
|
};
|
|
@@ -19,163 +25,224 @@ describe('Check if has admin role.', () => {
|
|
|
19
25
|
expect(result).toBe(false);
|
|
20
26
|
});
|
|
21
27
|
|
|
22
|
-
test('
|
|
28
|
+
test('Does not have access when: API Key and Non existing userId', async () => {
|
|
29
|
+
jest.spyOn(UserRepository.prototype, 'getOne').mockResolvedValue(null);
|
|
30
|
+
|
|
23
31
|
const body = {
|
|
24
32
|
apiKey: 'api-key',
|
|
25
|
-
userId: 'user
|
|
33
|
+
userId: 'non-existing-user',
|
|
26
34
|
};
|
|
27
35
|
const result = await hasAdminRole(body);
|
|
28
|
-
expect(result).toBe(
|
|
36
|
+
expect(result).toBe(false);
|
|
29
37
|
});
|
|
30
38
|
|
|
31
|
-
test('Has access
|
|
39
|
+
test('Has access when: API Key and Existing userId', async () => {
|
|
32
40
|
const body = {
|
|
33
41
|
apiKey: 'api-key',
|
|
34
|
-
userId: 'user
|
|
35
|
-
clientId: 'user-id',
|
|
42
|
+
userId: 'existing-user',
|
|
36
43
|
};
|
|
37
44
|
const result = await hasAdminRole(body);
|
|
38
45
|
expect(result).toBe(true);
|
|
39
46
|
});
|
|
40
47
|
|
|
41
|
-
test('Has access
|
|
48
|
+
test('Has access when: API Key, org:0 and Existing userId', async () => {
|
|
42
49
|
const body = {
|
|
43
50
|
apiKey: 'api-key',
|
|
44
|
-
userId: 'user
|
|
45
|
-
clientId: 'user-id',
|
|
51
|
+
userId: 'existing-user',
|
|
46
52
|
orgId: ORGANIZATION_QRVEY,
|
|
47
53
|
};
|
|
48
54
|
const result = await hasAdminRole(body);
|
|
49
55
|
expect(result).toBe(true);
|
|
50
56
|
});
|
|
51
57
|
|
|
52
|
-
test('
|
|
58
|
+
test('Does not have access when: API Key, Existing userId and Non existing clientId', async () => {
|
|
53
59
|
const body = {
|
|
54
60
|
apiKey: 'api-key',
|
|
55
|
-
userId: 'user
|
|
56
|
-
clientId: 'user
|
|
57
|
-
orgId: 'another-org',
|
|
61
|
+
userId: 'existing-user',
|
|
62
|
+
clientId: 'non-existing-user',
|
|
58
63
|
};
|
|
59
64
|
const result = await hasAdminRole(body);
|
|
60
65
|
expect(result).toBe(false);
|
|
61
66
|
});
|
|
62
67
|
|
|
63
|
-
test('Has
|
|
68
|
+
test('Has access when: API Key, Existing userId and existing clientId', async () => {
|
|
69
|
+
const body = {
|
|
70
|
+
apiKey: 'api-key',
|
|
71
|
+
userId: 'existing-user',
|
|
72
|
+
clientId: 'existing-user',
|
|
73
|
+
};
|
|
74
|
+
const result = await hasAdminRole(body);
|
|
75
|
+
expect(result).toBe(true);
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
test('Has access when: API Key, no Admin userId and admin clientId', async () => {
|
|
64
79
|
jest.spyOn(UserRepository.prototype, 'getList').mockResolvedValue({
|
|
65
80
|
count: 1,
|
|
66
81
|
items: [{}],
|
|
67
82
|
} as any);
|
|
83
|
+
|
|
68
84
|
const body = {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
85
|
+
apiKey: 'api-key',
|
|
86
|
+
userId: 'existing-user',
|
|
87
|
+
clientId: 'admin-user',
|
|
72
88
|
};
|
|
73
89
|
const result = await hasAdminRole(body);
|
|
74
|
-
expect(result).toBe(
|
|
90
|
+
expect(result).toBe(true);
|
|
75
91
|
});
|
|
76
92
|
|
|
77
|
-
test('
|
|
93
|
+
test('Does not have access when: API Key, org:0 and Existing userId', async () => {
|
|
78
94
|
const body = {
|
|
79
|
-
|
|
80
|
-
|
|
95
|
+
apiKey: 'api-key',
|
|
96
|
+
userId: 'existing-user',
|
|
81
97
|
orgId: 'another-org',
|
|
82
98
|
};
|
|
83
99
|
const result = await hasAdminRole(body);
|
|
84
100
|
expect(result).toBe(false);
|
|
85
101
|
});
|
|
86
102
|
|
|
87
|
-
test('
|
|
103
|
+
test('Does not have access when: InComposer only (need userId)', async () => {
|
|
88
104
|
const body = {
|
|
89
|
-
|
|
90
|
-
clientId: 'another-id',
|
|
105
|
+
loginType,
|
|
91
106
|
};
|
|
92
107
|
const result = await hasAdminRole(body);
|
|
93
108
|
expect(result).toBe(false);
|
|
94
109
|
});
|
|
95
110
|
|
|
96
|
-
test('Has access
|
|
111
|
+
test('Has access when: InComposer, org:0 and Admin userId', async () => {
|
|
97
112
|
jest.spyOn(UserRepository.prototype, 'getList').mockResolvedValue({
|
|
98
113
|
count: 1,
|
|
99
114
|
items: [{}],
|
|
100
115
|
} as any);
|
|
116
|
+
|
|
101
117
|
const body = {
|
|
102
|
-
userId: 'admin-user',
|
|
103
118
|
loginType,
|
|
119
|
+
userId: 'admin-user',
|
|
120
|
+
orgId: ORGANIZATION_QRVEY,
|
|
104
121
|
};
|
|
105
122
|
const result = await hasAdminRole(body);
|
|
106
123
|
expect(result).toBe(true);
|
|
107
124
|
});
|
|
108
125
|
|
|
109
|
-
test('
|
|
126
|
+
test('Does not have access when: InComposer, org:0 and non Admin userId', async () => {
|
|
110
127
|
const body = {
|
|
111
|
-
|
|
128
|
+
loginType,
|
|
129
|
+
userId: 'non-admin-user',
|
|
130
|
+
orgId: ORGANIZATION_QRVEY,
|
|
112
131
|
};
|
|
113
132
|
const result = await hasAdminRole(body);
|
|
114
133
|
expect(result).toBe(false);
|
|
115
134
|
});
|
|
116
135
|
|
|
117
|
-
test('
|
|
136
|
+
test('Does not have access when: org:0 and Admin userId only', async () => {
|
|
137
|
+
jest.spyOn(UserRepository.prototype, 'getList').mockResolvedValue({
|
|
138
|
+
count: 1,
|
|
139
|
+
items: [{}],
|
|
140
|
+
} as any);
|
|
141
|
+
|
|
118
142
|
const body = {
|
|
119
143
|
userId: 'admin-user',
|
|
120
|
-
|
|
144
|
+
orgId: ORGANIZATION_QRVEY,
|
|
121
145
|
};
|
|
122
146
|
const result = await hasAdminRole(body);
|
|
123
147
|
expect(result).toBe(false);
|
|
124
148
|
});
|
|
125
149
|
|
|
126
|
-
test('Has
|
|
150
|
+
test('Has access when: org:0, Admin userId and Admin ClientId (same as userId)', async () => {
|
|
151
|
+
jest.spyOn(UserRepository.prototype, 'getList').mockResolvedValue({
|
|
152
|
+
count: 1,
|
|
153
|
+
items: [{}],
|
|
154
|
+
} as any);
|
|
155
|
+
|
|
127
156
|
const body = {
|
|
128
157
|
userId: 'admin-user',
|
|
129
|
-
clientId: '
|
|
130
|
-
orgId:
|
|
158
|
+
clientId: 'admin-user',
|
|
159
|
+
orgId: ORGANIZATION_QRVEY,
|
|
131
160
|
};
|
|
132
161
|
const result = await hasAdminRole(body);
|
|
133
|
-
expect(result).toBe(
|
|
162
|
+
expect(result).toBe(true);
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
test('Has access when: org:0, Admin userId and Another Admin ClientId', async () => {
|
|
166
|
+
jest.spyOn(UserRepository.prototype, 'getList').mockResolvedValue({
|
|
167
|
+
count: 1,
|
|
168
|
+
items: [{}],
|
|
169
|
+
} as any);
|
|
170
|
+
|
|
171
|
+
const body = {
|
|
172
|
+
userId: 'admin-user',
|
|
173
|
+
clientId: 'another-admin-user',
|
|
174
|
+
orgId: ORGANIZATION_QRVEY,
|
|
175
|
+
};
|
|
176
|
+
const result = await hasAdminRole(body);
|
|
177
|
+
expect(result).toBe(true);
|
|
134
178
|
});
|
|
135
179
|
|
|
136
|
-
test('
|
|
180
|
+
test('Does not have access when: org:0, Admin userId and Non Admin ClientId', async () => {
|
|
137
181
|
const body = {
|
|
138
182
|
userId: 'admin-user',
|
|
139
|
-
clientId: '
|
|
183
|
+
clientId: 'non-admin-user',
|
|
140
184
|
orgId: ORGANIZATION_QRVEY,
|
|
141
185
|
};
|
|
142
186
|
const result = await hasAdminRole(body);
|
|
143
187
|
expect(result).toBe(false);
|
|
144
188
|
});
|
|
145
189
|
|
|
146
|
-
test('Has
|
|
190
|
+
test('Has access when: org:0, non Admin userId and Admin ClientId', async () => {
|
|
147
191
|
jest.spyOn(UserRepository.prototype, 'getList').mockResolvedValue({
|
|
148
192
|
count: 1,
|
|
149
193
|
items: [{}],
|
|
150
194
|
} as any);
|
|
195
|
+
|
|
151
196
|
const body = {
|
|
152
|
-
userId: 'admin-user',
|
|
197
|
+
userId: 'non-admin-user',
|
|
198
|
+
clientId: 'admin-user',
|
|
153
199
|
orgId: ORGANIZATION_QRVEY,
|
|
154
|
-
loginType,
|
|
155
200
|
};
|
|
156
201
|
const result = await hasAdminRole(body);
|
|
157
202
|
expect(result).toBe(true);
|
|
158
203
|
});
|
|
159
204
|
|
|
160
|
-
test('
|
|
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',
|
|
209
|
+
orgId: ORGANIZATION_QRVEY,
|
|
210
|
+
};
|
|
211
|
+
const result = await hasAdminRole(body);
|
|
212
|
+
expect(result).toBe(false);
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
test('Does not have access when: InComposer, Another org, Admin userId', async () => {
|
|
161
216
|
jest.spyOn(UserRepository.prototype, 'getList').mockResolvedValue({
|
|
162
217
|
count: 1,
|
|
163
218
|
items: [{}],
|
|
164
219
|
} as any);
|
|
220
|
+
|
|
165
221
|
const body = {
|
|
166
222
|
userId: 'admin-user',
|
|
167
|
-
|
|
168
|
-
|
|
223
|
+
orgId: 'another-org',
|
|
224
|
+
loginType,
|
|
169
225
|
};
|
|
170
226
|
const result = await hasAdminRole(body);
|
|
171
|
-
expect(result).toBe(
|
|
227
|
+
expect(result).toBe(false);
|
|
172
228
|
});
|
|
173
229
|
|
|
174
|
-
test('
|
|
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);
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
test('Does not have access when: Another org, Admin userId and Admin clientId', async () => {
|
|
175
241
|
jest.spyOn(UserRepository.prototype, 'getList').mockResolvedValue({
|
|
176
242
|
count: 1,
|
|
177
243
|
items: [{}],
|
|
178
244
|
} as any);
|
|
245
|
+
|
|
179
246
|
const body = {
|
|
180
247
|
userId: 'admin-user',
|
|
181
248
|
clientId: 'admin-user',
|
|
@@ -185,14 +252,46 @@ describe('Check if has admin role.', () => {
|
|
|
185
252
|
expect(result).toBe(false);
|
|
186
253
|
});
|
|
187
254
|
|
|
188
|
-
test('
|
|
255
|
+
test('Does not have access when: Another org, Admin userId and another Admin clientId', async () => {
|
|
189
256
|
jest.spyOn(UserRepository.prototype, 'getList').mockResolvedValue({
|
|
190
257
|
count: 1,
|
|
191
258
|
items: [{}],
|
|
192
259
|
} as any);
|
|
260
|
+
|
|
193
261
|
const body = {
|
|
194
262
|
userId: 'admin-user',
|
|
195
|
-
|
|
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',
|
|
196
295
|
};
|
|
197
296
|
const result = await hasAdminRole(body);
|
|
198
297
|
expect(result).toBe(false);
|
|
@@ -20,18 +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 existingUser = await this.userRepository.getOne(userId);
|
|
23
24
|
const isMasterKey = apiKey && (orgId === undefined || orgId === constants_1.ORGANIZATION_QRVEY);
|
|
24
|
-
if (isMasterKey)
|
|
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)
|
|
25
32
|
return true;
|
|
26
33
|
const inComposer = (0, util_1.isComposer)(loginType || '');
|
|
27
34
|
const isExternal = (!clientId && !inComposer) ||
|
|
28
35
|
(orgId && orgId !== constants_1.ORGANIZATION_QRVEY);
|
|
29
36
|
if (isExternal)
|
|
30
37
|
return false;
|
|
31
|
-
|
|
32
|
-
data: { identifier: clientId !== null && clientId !== void 0 ? clientId : userId, role: 'administrator' },
|
|
33
|
-
});
|
|
34
|
-
if (user.items.length > 0)
|
|
38
|
+
if (isAdmin)
|
|
35
39
|
return true;
|
|
36
40
|
return false;
|
|
37
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,
|
|
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"}
|
package/dist/esm/index.mjs
CHANGED
|
@@ -575,17 +575,21 @@ var HasAdminRole = class {
|
|
|
575
575
|
} = {}) {
|
|
576
576
|
if (!userId)
|
|
577
577
|
return false;
|
|
578
|
+
const existingUser = await this.userRepository.getOne(userId);
|
|
578
579
|
const isMasterKey = apiKey && (orgId === void 0 || orgId === ORGANIZATION_QRVEY);
|
|
579
|
-
if (isMasterKey)
|
|
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
589
|
const isExternal = !clientId && !inComposer || orgId && orgId !== ORGANIZATION_QRVEY;
|
|
583
590
|
if (isExternal)
|
|
584
591
|
return false;
|
|
585
|
-
|
|
586
|
-
data: { identifier: clientId != null ? clientId : userId, role: "administrator" }
|
|
587
|
-
});
|
|
588
|
-
if (user.items.length > 0)
|
|
592
|
+
if (isAdmin)
|
|
589
593
|
return true;
|
|
590
594
|
return false;
|
|
591
595
|
}
|
package/dist/esm/index.mjs.map
CHANGED
|
@@ -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 && (orgId === undefined || orgId === ORGANIZATION_QRVEY);\n if (isMasterKey) 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 const user = await this.userRepository.getList({\n data: { identifier: clientId ?? 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
|
@@ -26,9 +26,18 @@ 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
31
|
apiKey && (orgId === undefined || orgId === ORGANIZATION_QRVEY);
|
|
31
|
-
if (isMasterKey
|
|
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;
|
|
32
41
|
|
|
33
42
|
const inComposer = isComposer(loginType || '');
|
|
34
43
|
const isExternal =
|
|
@@ -36,10 +45,7 @@ export class HasAdminRole {
|
|
|
36
45
|
(orgId && orgId !== ORGANIZATION_QRVEY);
|
|
37
46
|
if (isExternal) return false;
|
|
38
47
|
|
|
39
|
-
|
|
40
|
-
data: { identifier: clientId ?? userId, role: 'administrator' },
|
|
41
|
-
});
|
|
42
|
-
if (user.items.length > 0) return true;
|
|
48
|
+
if (isAdmin) return true;
|
|
43
49
|
|
|
44
50
|
return false;
|
|
45
51
|
}
|