@qrvey/assets-sharing 0.3.2 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4,6 +4,13 @@ import { UserRepository } from '../src/quser/implementations/user.repository';
4
4
  const loginType = 'qrveyLogin';
5
5
 
6
6
  describe('Check if has admin role.', () => {
7
+ beforeEach(() => {
8
+ jest.spyOn(UserRepository.prototype, 'getList').mockResolvedValue({
9
+ count: 0,
10
+ items: [],
11
+ } as any);
12
+ });
13
+
7
14
  test('Has access with API Key only.', async () => {
8
15
  const body = {
9
16
  apiKey: 'api-key',
@@ -42,32 +49,26 @@ describe('Check if has admin role.', () => {
42
49
  expect(result).toBe(true);
43
50
  });
44
51
 
45
- test('Has access with API Key, userId, clientId and org:0.', async () => {
46
- const body = {
47
- userId: 'user-id',
48
- clientId: 'other-id',
49
- orgId: ORGANIZATION_QRVEY,
50
- };
51
- const result = await hasAdminRole(body);
52
- expect(result).toBe(false);
53
- });
54
-
55
52
  test('Has no access with another org and apiKey.', async () => {
56
53
  const body = {
57
54
  apiKey: 'api-key',
58
55
  userId: 'user-id',
59
56
  clientId: 'user-id',
60
- orgId: 'Another-Org',
57
+ orgId: 'another-org',
61
58
  };
62
59
  const result = await hasAdminRole(body);
63
60
  expect(result).toBe(false);
64
61
  });
65
62
 
66
63
  test('Has no access with another org.', async () => {
64
+ jest.spyOn(UserRepository.prototype, 'getList').mockResolvedValue({
65
+ count: 1,
66
+ items: [{}],
67
+ } as any);
67
68
  const body = {
68
69
  userId: 'user-id',
69
70
  clientId: 'user-id',
70
- orgId: 'Another-Org',
71
+ orgId: 'another-org',
71
72
  };
72
73
  const result = await hasAdminRole(body);
73
74
  expect(result).toBe(false);
@@ -106,10 +107,6 @@ describe('Check if has admin role.', () => {
106
107
  });
107
108
 
108
109
  test('Has no access with other user.', async () => {
109
- jest.spyOn(UserRepository.prototype, 'getList').mockResolvedValue({
110
- count: 0,
111
- items: [],
112
- } as any);
113
110
  const body = {
114
111
  userId: 'other-user',
115
112
  };
@@ -118,10 +115,6 @@ describe('Check if has admin role.', () => {
118
115
  });
119
116
 
120
117
  test('Has no access even with admin user but, with another client.', async () => {
121
- jest.spyOn(UserRepository.prototype, 'getList').mockResolvedValue({
122
- count: 1,
123
- items: [{}],
124
- } as any);
125
118
  const body = {
126
119
  userId: 'admin-user',
127
120
  clientId: 'other-user',
@@ -131,10 +124,6 @@ describe('Check if has admin role.', () => {
131
124
  });
132
125
 
133
126
  test('Has no access even with admin user but, with another client and org.', async () => {
134
- jest.spyOn(UserRepository.prototype, 'getList').mockResolvedValue({
135
- count: 1,
136
- items: [{}],
137
- } as any);
138
127
  const body = {
139
128
  userId: 'admin-user',
140
129
  clientId: 'other-user',
@@ -145,10 +134,6 @@ describe('Check if has admin role.', () => {
145
134
  });
146
135
 
147
136
  test('Has no access even with admin user but, with another client and org0.', async () => {
148
- jest.spyOn(UserRepository.prototype, 'getList').mockResolvedValue({
149
- count: 1,
150
- items: [{}],
151
- } as any);
152
137
  const body = {
153
138
  userId: 'admin-user',
154
139
  clientId: 'other-user',
@@ -172,20 +157,34 @@ describe('Check if has admin role.', () => {
172
157
  expect(result).toBe(true);
173
158
  });
174
159
 
175
- test('Has admin level if is not in composer with clientId', async () => {
160
+ test('Has admin level if is not in composer with admin clientId', async () => {
176
161
  jest.spyOn(UserRepository.prototype, 'getList').mockResolvedValue({
177
162
  count: 1,
178
163
  items: [{}],
179
164
  } as any);
180
165
  const body = {
181
166
  userId: 'admin-user',
182
- clientId: 'admin-user',
167
+ clientId: 'another-admin-user',
183
168
  orgId: ORGANIZATION_QRVEY,
184
169
  };
185
170
  const result = await hasAdminRole(body);
186
171
  expect(result).toBe(true);
187
172
  });
188
173
 
174
+ test('Has not admin level if is not in composer with admin clientId but with another org', async () => {
175
+ jest.spyOn(UserRepository.prototype, 'getList').mockResolvedValue({
176
+ count: 1,
177
+ items: [{}],
178
+ } as any);
179
+ const body = {
180
+ userId: 'admin-user',
181
+ clientId: 'admin-user',
182
+ orgId: 'another-org',
183
+ };
184
+ const result = await hasAdminRole(body);
185
+ expect(result).toBe(false);
186
+ });
187
+
189
188
  test('Has not admin level if is not in composer and not clientId', async () => {
190
189
  jest.spyOn(UserRepository.prototype, 'getList').mockResolvedValue({
191
190
  count: 1,
@@ -20,19 +20,16 @@ let HasAdminRole = class HasAdminRole {
20
20
  async execute({ apiKey, clientId, orgId, userId, loginType, } = {}) {
21
21
  if (!userId)
22
22
  return false;
23
- const isMasterKey = apiKey &&
24
- (clientId === userId || !clientId) &&
25
- (orgId === undefined || orgId === constants_1.ORGANIZATION_QRVEY);
23
+ const isMasterKey = apiKey && (orgId === undefined || orgId === constants_1.ORGANIZATION_QRVEY);
26
24
  if (isMasterKey)
27
25
  return true;
28
26
  const inComposer = (0, util_1.isComposer)(loginType || '');
29
27
  const isExternal = (!clientId && !inComposer) ||
30
- (clientId && clientId !== userId) ||
31
28
  (orgId && orgId !== constants_1.ORGANIZATION_QRVEY);
32
29
  if (isExternal)
33
30
  return false;
34
31
  const user = await this.userRepository.getList({
35
- data: { identifier: userId, role: 'administrator' },
32
+ data: { identifier: clientId !== null && clientId !== void 0 ? clientId : userId, role: 'administrator' },
36
33
  });
37
34
  if (user.items.length > 0)
38
35
  return true;
@@ -1 +1 @@
1
- {"version":3,"file":"hasAdminRole.js","sourceRoot":"","sources":["../../../../src/quser/services/hasAdminRole.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,uCAA8C;AAE9C,sDAA4D;AAC5D,4CAA+C;AAIxC,IAAM,YAAY,GAAlB,MAAM,YAAY;IACrB,YAEqB,cAAuC;QAAvC,mBAAc,GAAd,cAAc,CAAyB;IACzD,CAAC;IAEG,KAAK,CAAC,OAAO,CAAC,EACjB,MAAM,EACN,QAAQ,EACR,KAAK,EACL,MAAM,EACN,SAAS,MAOT,EAAE;QACF,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAE1B,MAAM,WAAW,GACb,MAAM;YACN,CAAC,QAAQ,KAAK,MAAM,IAAI,CAAC,QAAQ,CAAC;YAClC,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,8BAAkB,CAAC,CAAC;QAC1D,IAAI,WAAW;YAAE,OAAO,IAAI,CAAC;QAE7B,MAAM,UAAU,GAAG,IAAA,iBAAU,EAAC,SAAS,IAAI,EAAE,CAAC,CAAC;QAC/C,MAAM,UAAU,GACZ,CAAC,CAAC,QAAQ,IAAI,CAAC,UAAU,CAAC;YAC1B,CAAC,QAAQ,IAAI,QAAQ,KAAK,MAAM,CAAC;YACjC,CAAC,KAAK,IAAI,KAAK,KAAK,8BAAkB,CAAC,CAAC;QAC5C,IAAI,UAAU;YAAE,OAAO,KAAK,CAAC;QAE7B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;YAC3C,IAAI,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE;SACtD,CAAC,CAAC;QACH,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAEvC,OAAO,KAAK,CAAC;IACjB,CAAC;CACJ,CAAA;AAzCY,oCAAY;uBAAZ,YAAY;IADxB,IAAA,qBAAU,GAAE;IAGJ,WAAA,IAAA,iBAAM,EAAC,gBAAgB,CAAC,CAAA;GAFpB,YAAY,CAyCxB"}
1
+ {"version":3,"file":"hasAdminRole.js","sourceRoot":"","sources":["../../../../src/quser/services/hasAdminRole.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,uCAA8C;AAE9C,sDAA4D;AAC5D,4CAA+C;AAIxC,IAAM,YAAY,GAAlB,MAAM,YAAY;IACrB,YAEqB,cAAuC;QAAvC,mBAAc,GAAd,cAAc,CAAyB;IACzD,CAAC;IAEG,KAAK,CAAC,OAAO,CAAC,EACjB,MAAM,EACN,QAAQ,EACR,KAAK,EACL,MAAM,EACN,SAAS,MAOT,EAAE;QACF,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAE1B,MAAM,WAAW,GACb,MAAM,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,8BAAkB,CAAC,CAAC;QACpE,IAAI,WAAW;YAAE,OAAO,IAAI,CAAC;QAE7B,MAAM,UAAU,GAAG,IAAA,iBAAU,EAAC,SAAS,IAAI,EAAE,CAAC,CAAC;QAC/C,MAAM,UAAU,GACZ,CAAC,CAAC,QAAQ,IAAI,CAAC,UAAU,CAAC;YAC1B,CAAC,KAAK,IAAI,KAAK,KAAK,8BAAkB,CAAC,CAAC;QAC5C,IAAI,UAAU;YAAE,OAAO,KAAK,CAAC;QAE7B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;YAC3C,IAAI,EAAE,EAAE,UAAU,EAAE,QAAQ,aAAR,QAAQ,cAAR,QAAQ,GAAI,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE;SAClE,CAAC,CAAC;QACH,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAEvC,OAAO,KAAK,CAAC;IACjB,CAAC;CACJ,CAAA;AAtCY,oCAAY;uBAAZ,YAAY;IADxB,IAAA,qBAAU,GAAE;IAGJ,WAAA,IAAA,iBAAM,EAAC,gBAAgB,CAAC,CAAA;GAFpB,YAAY,CAsCxB"}
@@ -575,15 +575,15 @@ var HasAdminRole = class {
575
575
  } = {}) {
576
576
  if (!userId)
577
577
  return false;
578
- const isMasterKey = apiKey && (clientId === userId || !clientId) && (orgId === void 0 || orgId === ORGANIZATION_QRVEY);
578
+ const isMasterKey = apiKey && (orgId === void 0 || orgId === ORGANIZATION_QRVEY);
579
579
  if (isMasterKey)
580
580
  return true;
581
581
  const inComposer = isComposer(loginType || "");
582
- const isExternal = !clientId && !inComposer || clientId && clientId !== userId || orgId && orgId !== ORGANIZATION_QRVEY;
582
+ const isExternal = !clientId && !inComposer || orgId && orgId !== ORGANIZATION_QRVEY;
583
583
  if (isExternal)
584
584
  return false;
585
585
  const user = await this.userRepository.getList({
586
- data: { identifier: userId, role: "administrator" }
586
+ data: { identifier: clientId != null ? clientId : userId, role: "administrator" }
587
587
  });
588
588
  if (user.items.length > 0)
589
589
  return true;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/context.ts","../../src/quser/implementations/group.model.ts","../../src/common/constants.ts","../../src/common/persistence/base.ts","../../src/common/persistence/poolClient.ts","../../src/quser/implementations/group.repository.ts","../../src/quser/implementations/user.model.ts","../../src/quser/implementations/user.repository.ts","../../src/sharing/implementations/details.model.ts","../../src/sharing/implementations/details.repository.ts","../../src/sharing/implementations/dm.model.ts","../../src/sharing/implementations/dm.repository.ts","../../src/sharing/implementations/dx.model.ts","../../src/sharing/implementations/dx.repository.ts","../../src/sharing/implementations/sharing.model.ts","../../src/sharing/implementations/sharing.repository.ts","../../src/quser/services/fromTokenToUser.ts","../../src/common/util.ts","../../src/quser/entities/user.ts","../../src/quser/services/hasAdminRole.ts","../../src/sharing/services/checkUserAccessLevel.ts","../../src/sharing/entities/details.ts","../../src/sharing/services/delete.ts","../../src/sharing/services/list.ts","../../src/sharing/services/upsert.ts","../../src/sharing/entities/sharing.ts"],"names":["ASSET_TYPE","SHARED_ORIGIN","SHARE_TYPE","ACCESS_LEVEL","CrudSchema","inject","injectable"],"mappings":"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","sourcesContent":["import 'reflect-metadata';\nimport { Context } from './context';\nimport { FromTokenToUser } from './quser/services/fromTokenToUser';\nimport { HasAdminRole } from './quser/services/hasAdminRole';\nimport { CheckUserAccessLevel } from './sharing/services/checkUserAccessLevel';\nimport { DeleteSharing } from './sharing/services/delete';\nimport { ListSharing } from './sharing/services/list';\nimport { UpsertSharing } from './sharing/services/upsert';\n\nexport const api = {\n upsert: (...args: Parameters<UpsertSharing['execute']>) =>\n Context.resolve(UpsertSharing).execute(...args),\n list: (...args: Parameters<ListSharing['execute']>) =>\n Context.resolve(ListSharing).execute(...args),\n delete: (...args: Parameters<DeleteSharing['execute']>) =>\n Context.resolve(DeleteSharing).execute(...args),\n};\n\nexport const checkUserAccessLevel = (\n ...args: Parameters<CheckUserAccessLevel['execute']>\n) => Context.resolve(CheckUserAccessLevel).execute(...args);\n\nexport const fromTokenToUser = (\n ...args: Parameters<FromTokenToUser['execute']>\n) => Context.resolve(FromTokenToUser).execute(...args);\n\nexport const hasAdminRole = (...args: Parameters<HasAdminRole['execute']>) =>\n Context.resolve(HasAdminRole).execute(...args);\n\nexport {\n ACCESS_LEVEL,\n ASSET_TYPE,\n ORGANIZATION_QRVEY,\n SHARED_ORIGIN,\n SHARE_TYPE,\n} from './common/constants';\n\nexport { GetSharingList } from './sharing/entities/types/details.type';\n","import { container } from 'tsyringe';\n\nimport { GroupRepository } from './quser/implementations/group.repository';\nimport { UserRepository } from './quser/implementations/user.repository';\nimport { type RoleRepositoryInterface } from './quser/interfaces/rolesRepository.interface';\nimport { type UserRepositoryInterface } from './quser/interfaces/userRepository.interface';\nimport { SharingDetailsRepository } from './sharing/implementations/details.repository';\nimport { DownloadManagerRepository } from './sharing/implementations/dm.repository';\nimport { DashboardRepository } from './sharing/implementations/dx.repository';\nimport { SharingRepository } from './sharing/implementations/sharing.repository';\nimport { type DashboardRepositoryInterface } from './sharing/interfaces/dashboardRepository.interface';\nimport { type SharingDetailsRepositoryInterface } from './sharing/interfaces/detailsRepository.interface';\nimport { type DownloadManagerRepositoryInterface } from './sharing/interfaces/downloadManagerRepository.interface';\nimport { type SharingRepositoryInterface } from './sharing/interfaces/sharingRepository.interface';\n\ncontainer.register<SharingRepositoryInterface>(\n 'SharingRepository',\n SharingRepository,\n);\ncontainer.register<SharingDetailsRepositoryInterface>(\n 'SharingDetailsRepository',\n SharingDetailsRepository,\n);\ncontainer.register<UserRepositoryInterface>('UserRepository', UserRepository);\ncontainer.register<RoleRepositoryInterface>('RoleRepository', GroupRepository);\ncontainer.register<DashboardRepositoryInterface>(\n 'dxRepository',\n DashboardRepository,\n);\ncontainer.register<DownloadManagerRepositoryInterface>(\n 'dmRepository',\n DownloadManagerRepository,\n);\n\nexport const Context = container;\n","import { CrudSchema } from '@qrvey/data-persistence';\n\nimport { DATABASE_INFO } from '../../common/constants';\n\nexport class GroupModel extends CrudSchema {\n static table = {\n name: `${DATABASE_INFO.SERVER_PREFIX}Groups`,\n alias: 'qv_groups',\n };\n\n static columns = {\n groupid: {\n type: 'string',\n },\n };\n\n static schema = DATABASE_INFO.DATA_PERSISTENCE_SCHEMA;\n}\n","export const ENVIRONMENT = {\n SERVER_PREFIX: process.env.SERVER_PREFIX,\n TABLE_PREFIX: process.env.TABLE_PREFIX,\n};\n\nexport const DATABASE_INFO = {\n DATA_PERSISTENCE_SCHEMA: 'admin',\n SERVER_PREFIX: ENVIRONMENT.SERVER_PREFIX,\n TABLE_PREFIX: ENVIRONMENT.TABLE_PREFIX,\n};\n\nexport const ORGANIZATION_QRVEY = 'org:0';\n\nexport enum ASSET_TYPE {\n DX = 'DX', // DASHBOARD X (Next Gen)\n DM = 'DM', // DOWNLOAD MANAGER\n}\n\nexport enum SHARED_ORIGIN {\n INTERNAL = 'INTERNAL', // for org:0\n EXTERNAL = 'EXTERNAL', // for orgs different that 0\n UNKNOWN = 'UNKNOWN', // without orgId\n}\n\nexport enum SHARE_TYPE {\n USER = 'USER',\n ROLE = 'ROLE',\n ORGANIZATION = 'ORGANIZATION',\n}\n\n/**\n * Access levels for assets.\n * Those are calculated with Base 2, so:\n * - NONE = 0 (undefined)\n * - CAN_USE = 1 (2^0)\n * - CAN_EDIT = 2 (2^1)\n * - ADMIN = 4 (2^2)\n * - (Future) SUPER = 8 (2^3)\n */\nexport enum ACCESS_LEVEL {\n NONE = 0,\n CAN_USE = 1,\n CAN_EDIT = 2,\n ADMIN = 4,\n}\n\nexport const LIMIT_PER_PAGE = 10;\n","import { CrudService, buildFilter } from '@qrvey/data-persistence';\n\nimport { getPoolClient } from './poolClient';\n\nexport class BaseRepository extends CrudService<any> {\n constructor(schema: any) {\n super(schema, getPoolClient());\n }\n\n filter(attribute: string, value: any, operator?: string) {\n return buildFilter(attribute, value, operator);\n }\n}\n","import { getDbPool } from '@qrvey/data-persistence';\n\nlet poolClient: any;\nexport function getPoolClient() {\n if (!poolClient) poolClient = getDbPool();\n return poolClient;\n}\n","import { GroupModel } from './group.model';\nimport { BaseRepository } from '../../common/persistence/base';\nimport { RoleRepositoryInterface } from '../interfaces/rolesRepository.interface';\n\nexport class GroupRepository\n extends BaseRepository\n implements RoleRepositoryInterface\n{\n constructor() {\n super(GroupModel);\n }\n\n async getOne(identifier: string): Promise<{ groupid: string } | null> {\n const params = {\n filters: [this.filter('groupid', identifier)],\n };\n const response = await super.findItem(params);\n return response as { groupid: string };\n }\n}\n","import { CrudSchema } from '@qrvey/data-persistence';\n\nimport { DATABASE_INFO } from '../../common/constants';\n\nexport class UserModel extends CrudSchema {\n static table = {\n name: `${DATABASE_INFO.SERVER_PREFIX}Users`,\n alias: 'qv_users',\n };\n\n static columns = {\n userid: {\n type: 'string',\n primary: true,\n columnId: true,\n },\n groups: {\n type: 'array',\n },\n };\n\n static schema = DATABASE_INFO.DATA_PERSISTENCE_SCHEMA;\n}\n","import { UserModel } from './user.model';\nimport { ListInput, ListOutput } from '../../common/common.type';\nimport { BaseRepository } from '../../common/persistence/base';\nimport { BaseUser } from '../entities/types/user.type';\nimport { UserRepositoryInterface } from '../interfaces/userRepository.interface';\n\nexport class UserRepository\n extends BaseRepository\n implements UserRepositoryInterface\n{\n constructor() {\n super(UserModel);\n }\n\n async getOne(identifier: string): Promise<BaseUser | null> {\n const params = {\n filters: [this.filter('userid', identifier)],\n };\n const response = await super.findItem(params);\n return response as BaseUser;\n }\n\n async getList(\n options: ListInput<{ identifier: string; role?: string }>,\n ): Promise<ListOutput<BaseUser>> {\n const params = {\n filters: [\n this.filter('userid', options.data.identifier),\n this.filter('groups', options.data.role, 'CONTAINS'),\n ],\n };\n const response = await super.find(params);\n return response as ListOutput<BaseUser>;\n }\n}\n","import { CrudSchema } from '@qrvey/data-persistence';\n\nimport { DATABASE_INFO } from '../../common/constants';\n\nexport class SharingDetailsModel extends CrudSchema {\n static table = {\n name: `${DATABASE_INFO.SERVER_PREFIX}_sharing_details`,\n alias: `${DATABASE_INFO.TABLE_PREFIX}_sharing_details`,\n };\n\n static columns = {\n sharing_details_id: { type: 'string', primary: true },\n asset_id: { type: 'string' },\n access_level: { type: 'numeric' },\n org_id: { type: 'string' },\n shared_with: { type: 'string' },\n shared_type: { type: 'string' },\n shared_email: { type: 'string' },\n share_origin: { type: 'string' },\n created_at: { type: 'date' },\n updated_at: { type: 'date' },\n deleted_at: { type: 'date' },\n };\n\n static indexes = {\n sharingDetailsOrgId: {\n name: 'sharing_details_org_id_index',\n columns: [\n 'org_id',\n 'asset_id',\n 'sharing_details_id',\n 'shared_with',\n 'shared_type',\n 'shared_email',\n 'share_origin',\n ],\n },\n sharingDetailsSharedWithAccessLevel: {\n name: 'sharing_details_shared_with_access_level_index',\n columns: [\n 'shared_with',\n 'access_level',\n 'asset_id',\n 'sharing_details_id',\n 'org_id',\n 'shared_type',\n 'shared_email',\n 'share_origin',\n ],\n },\n sharingDetailsAccessLevelSharedWithOrgId: {\n name: 'sharing_details_access_level_shared_with_org_id_index',\n columns: [\n 'access_level',\n 'shared_with',\n 'org_id',\n 'asset_id',\n 'sharing_details_id',\n 'shared_type',\n 'shared_email',\n 'share_origin',\n ],\n },\n sharingDetailsAccessLevelOrgId: {\n name: 'sharing_details_access_level_org_id_index',\n columns: [\n 'access_level',\n 'org_id',\n 'asset_id',\n 'sharing_details_id',\n 'shared_with',\n 'shared_type',\n 'shared_email',\n 'share_origin',\n ],\n },\n sharingDetailsAssetId: {\n name: 'sharing_details_asset_id_index',\n columns: [\n 'asset_id',\n 'sharing_details_id',\n 'org_id',\n 'shared_with',\n 'shared_type',\n 'shared_email',\n 'share_origin',\n ],\n },\n };\n\n static schema = DATABASE_INFO.DATA_PERSISTENCE_SCHEMA;\n static usePool = true;\n}\n","import { IFilter } from '@qrvey/data-persistence';\n\nimport { SharingDetailsModel } from './details.model';\nimport {\n ListInput,\n ListOutput,\n Pagination,\n ParamsFromTokenToUser,\n} from '../../common/common.type';\nimport { LIMIT_PER_PAGE, ORGANIZATION_QRVEY } from '../../common/constants';\nimport { BaseRepository } from '../../common/persistence/base';\nimport { SharingDetailsTable } from '../entities/types/details.type';\nimport { SharingDetailsRepositoryInterface } from '../interfaces/detailsRepository.interface';\n\nexport class SharingDetailsRepository\n extends BaseRepository\n implements SharingDetailsRepositoryInterface\n{\n constructor() {\n super(SharingDetailsModel);\n }\n\n async getOne(sharingDetailId: string): Promise<SharingDetailsTable | null> {\n const params = {\n filters: [this.filter('sharing_details_id', sharingDetailId)],\n };\n const response = await super.findItem(params);\n return response as SharingDetailsTable;\n }\n\n async getBySharedWith(\n assetId: string,\n sharedWith: string,\n ): Promise<SharingDetailsTable | null> {\n const filterList = [\n this.filter('asset_id', assetId),\n this.filter('shared_with', sharedWith),\n ];\n const params = {\n filters: filterList,\n };\n const response = await super.findItem(params);\n return response as SharingDetailsTable;\n }\n\n async getList(\n options: ListInput<{ assetId: string; user?: ParamsFromTokenToUser }>,\n ): Promise<ListOutput<SharingDetailsTable>> {\n const assetIndex = SharingDetailsModel.indexes.sharingDetailsAssetId;\n const pagination = this.getPagination(options.pagination);\n const params: {\n pagination: any;\n index: any;\n filters?: any;\n sorting?: any;\n } = {\n pagination,\n index: {\n indexName: assetIndex.name,\n columns: assetIndex.columns,\n },\n };\n\n const filterList = [this.filter('asset_id', options.data.assetId)];\n if (options.filters) {\n options.filters.forEach((filter) => {\n filterList.push(this.filter(filter.column, filter.value));\n });\n }\n params.filters = filterList;\n\n if (options.data.user) {\n const currentFilter = this.getUserFilter(\n options.data.user,\n filterList,\n );\n params.filters = currentFilter;\n }\n\n if (options.sorting) params.sorting = options.sorting;\n\n const response = await super.find(params);\n return response as ListOutput<SharingDetailsTable>;\n }\n\n async create(details: SharingDetailsTable): Promise<SharingDetailsTable> {\n const response = (await super.create(details)) as SharingDetailsTable;\n return response;\n }\n\n async patch(\n sharingDetailId: string,\n details: SharingDetailsTable,\n ): Promise<boolean> {\n await super.update(\n [this.filter('sharing_details_id', sharingDetailId)],\n details,\n );\n return true;\n }\n\n async delete(sharingDetailId: string): Promise<boolean> {\n await super.remove([\n this.filter('sharing_details_id', sharingDetailId),\n ]);\n return true;\n }\n\n private getPagination(options?: Pagination): Pagination {\n return {\n limit: options?.limit ?? LIMIT_PER_PAGE,\n from: options?.from ?? undefined,\n };\n }\n\n private getUserFilter(\n user: ParamsFromTokenToUser,\n currentFilters?: IFilter[],\n ) {\n const { userId, roles } = user;\n const orgId = user.orgId === '' ? ORGANIZATION_QRVEY : user.orgId; //Review if this is right\n const sharing = {\n OR: [\n {\n AND: [\n this.buildFilter('shared_with', userId),\n this.buildFilter('shared_type', 'USER'),\n this.buildFilter('org_id', orgId),\n ],\n },\n {\n AND: [\n this.buildFilter('shared_with', orgId),\n this.buildFilter('shared_type', 'ORGANIZATION'),\n this.buildFilter('org_id', orgId),\n ],\n },\n ],\n };\n if (roles && roles?.length > 0) {\n sharing.OR.push({\n AND: [\n this.buildFilter('shared_with', roles, 'IN'),\n this.buildFilter('shared_type', 'ROLE'),\n this.buildFilter('org_id', orgId),\n ],\n });\n }\n const filter = [];\n if (currentFilters) filter.push(...currentFilters);\n filter.push(sharing);\n return { AND: filter };\n }\n}\n","import { CrudSchema } from '@qrvey/data-persistence';\n\nimport { DATABASE_INFO } from '../../common/constants';\n\nexport class DownloadManagerSchema extends CrudSchema {\n static table = {\n name: `${DATABASE_INFO.SERVER_PREFIX}DownloadManager`,\n alias: `${DATABASE_INFO.TABLE_PREFIX}_download_manager`,\n };\n\n static columns = {\n downloadManagerId: {\n primary: true,\n type: 'String',\n columnId: true,\n },\n };\n\n static schema = 'exports';\n static usePool = true;\n}\n","import { DownloadManagerSchema } from './dm.model';\nimport { BaseRepository } from '../../common/persistence/base';\nimport { DownloadManagerRepositoryInterface } from '../interfaces/downloadManagerRepository.interface';\n\nexport class DownloadManagerRepository\n extends BaseRepository\n implements DownloadManagerRepositoryInterface\n{\n constructor() {\n super(DownloadManagerSchema);\n }\n\n async get(\n identifier: string,\n ): Promise<{ downloadManagerId: string } | null> {\n const filterList = [this.filter('downloadManagerId', identifier)];\n const params = {\n filters: filterList,\n };\n const response = await super.findItem(params);\n return response as { downloadManagerId: string };\n }\n}\n","import { CrudSchema } from '@qrvey/data-persistence';\n\nimport { DATABASE_INFO } from '../../common/constants';\n\nexport class DashboardSchema extends CrudSchema {\n static table = {\n name: `${DATABASE_INFO.SERVER_PREFIX}_dx_dashboard`,\n alias: `${DATABASE_INFO.TABLE_PREFIX}_dashboard`,\n };\n\n static columns = {\n ResourceUID: { type: 'string', primary: true },\n dashboardId: { type: 'string' },\n contentId: { type: 'string' },\n userId: { type: 'string' },\n ownerId: { type: 'string' },\n appId: { type: 'string' },\n qvAttributes: { type: 'object' },\n };\n\n static indexes = {\n ResourceUID: {\n name: 'MetadataByResource',\n columns: ['Metadata', 'ResourceUID'],\n },\n };\n\n static schema = 'dashboard_x';\n static usePool = true;\n}\n","import { DashboardSchema } from './dx.model';\nimport { BaseRepository } from '../../common/persistence/base';\nimport { DashboardRepositoryInterface } from '../interfaces/dashboardRepository.interface';\n\nexport class DashboardRepository\n extends BaseRepository\n implements DashboardRepositoryInterface\n{\n constructor() {\n super(DashboardSchema);\n }\n\n async get(identifier: string): Promise<{ dashboardId: string } | null> {\n const uid = `DASHBOARD=${identifier}&BRANCH=MAIN`;\n const filterList = [this.filter('ResourceUID', uid)];\n const params = {\n filters: filterList,\n };\n const response = await super.findItem(params);\n return response as { dashboardId: string };\n }\n}\n","import { CrudSchema } from '@qrvey/data-persistence';\n\nimport { DATABASE_INFO } from '../../common/constants';\n\nexport class SharingModel extends CrudSchema {\n static table = {\n name: `${DATABASE_INFO.SERVER_PREFIX}_sharing`,\n alias: `${DATABASE_INFO.TABLE_PREFIX}_sharing`,\n };\n\n static columns = {\n asset_id: { type: 'string', primary: true },\n asset_type: { type: 'string' },\n created_at: { type: 'date' },\n updated_at: { type: 'date' },\n deleted_at: { type: 'date' },\n qvAttributes: { type: 'object' },\n };\n\n static indexes = {\n sharingAssetIdAssetType: {\n name: 'sharing_asset_id_asset_type_index',\n columns: ['asset_id', 'asset_type'],\n },\n sharingAssetType: {\n name: 'sharing_asset_type_index',\n columns: ['asset_type'],\n },\n };\n\n static schema = DATABASE_INFO.DATA_PERSISTENCE_SCHEMA;\n static usePool = true;\n}\n","import { SharingModel } from './sharing.model';\nimport { BaseRepository } from '../../common/persistence/base';\nimport { SharingTable } from '../entities/types/sharing.type';\nimport { SharingRepositoryInterface } from '../interfaces/sharingRepository.interface';\n\nexport class SharingRepository\n extends BaseRepository\n implements SharingRepositoryInterface\n{\n constructor() {\n super(SharingModel);\n }\n\n async getOne(assetId: string): Promise<SharingTable | null> {\n const params = {\n filters: [this.filter('asset_id', assetId)],\n };\n const response = await super.findItem(params);\n return response as SharingTable;\n }\n\n async create(sharing: SharingTable): Promise<SharingTable> {\n const response = (await super.create(sharing)) as SharingTable;\n return response;\n }\n\n async patch(assetId: string, sharing: SharingTable): Promise<boolean> {\n await super.update([this.filter('asset_id', assetId)], sharing);\n return true;\n }\n\n async delete(assetId: string): Promise<boolean> {\n await super.remove([this.filter('asset_id', assetId)]);\n return true;\n }\n}\n","import { inject, injectable } from 'tsyringe';\n\nimport { ParamsFromTokenToUser } from '../../common/common.type';\nimport { ORGANIZATION_QRVEY } from '../../common/constants';\nimport { isComposer } from '../../common/util';\nimport { UserToken } from '../entities/types/user.type';\nimport { User } from '../entities/user';\nimport { UserRepositoryInterface } from '../interfaces/userRepository.interface';\n\n@injectable()\nexport class FromTokenToUser {\n constructor(\n @inject('UserRepository')\n private readonly userRepository: UserRepositoryInterface,\n ) {}\n\n public async execute({\n body,\n }: {\n body: UserToken;\n }): Promise<ParamsFromTokenToUser> {\n const current = await this.userRepository.getOne(\n body.clientId || body.userId,\n );\n if (current) {\n const user = new User(current);\n return {\n userId: user.getUserId,\n roles: user.getGroups,\n orgId: body.orgId ?? ORGANIZATION_QRVEY,\n };\n }\n\n const inComposer = isComposer(body.loginType || '');\n if (!inComposer) {\n return {\n userId: body.clientId || '',\n roles: body.roles || [],\n orgId: body.orgId || '',\n };\n }\n\n return {\n userId: '',\n roles: [],\n orgId: '',\n };\n }\n}\n","enum LOGIN_TYPES {\n composer = 'qrveyLogin',\n openIdComposer = 'OPENID_CREATORS',\n}\n\nexport function isComposer(type: string): boolean {\n return type === LOGIN_TYPES.composer || type === LOGIN_TYPES.openIdComposer;\n}\n","import { BaseUser } from './types/user.type';\n\nexport class User {\n private userId: string;\n private email: string;\n private groups: string[];\n private organization: string;\n\n constructor(params: BaseUser) {\n this.userId = params.userid;\n this.email = params.email;\n this.groups = params.groups;\n this.organization = params.organization;\n }\n\n public get getUserId(): string {\n return this.userId;\n }\n\n public get getEmail(): string {\n return this.email;\n }\n\n public get getGroups(): string[] {\n return this.groups;\n }\n\n public get getOrganization(): string {\n return this.organization;\n }\n}\n","import { inject, injectable } from 'tsyringe';\n\nimport { ORGANIZATION_QRVEY } from '../../common/constants';\nimport { isComposer } from '../../common/util';\nimport { UserRepositoryInterface } from '../interfaces/userRepository.interface';\n\n@injectable()\nexport class HasAdminRole {\n constructor(\n @inject('UserRepository')\n private readonly userRepository: UserRepositoryInterface,\n ) {}\n\n public async execute({\n apiKey,\n clientId,\n orgId,\n userId,\n loginType,\n }: {\n apiKey?: string;\n clientId?: string;\n orgId?: string;\n userId?: string;\n loginType?: string;\n } = {}): Promise<boolean> {\n if (!userId) return false;\n\n const isMasterKey =\n apiKey &&\n (clientId === userId || !clientId) &&\n (orgId === undefined || orgId === ORGANIZATION_QRVEY);\n if (isMasterKey) return true;\n\n const inComposer = isComposer(loginType || '');\n const isExternal =\n (!clientId && !inComposer) ||\n (clientId && clientId !== userId) ||\n (orgId && orgId !== ORGANIZATION_QRVEY);\n if (isExternal) return false;\n\n const user = await this.userRepository.getList({\n data: { identifier: userId, role: 'administrator' },\n });\n if (user.items.length > 0) return true;\n\n return false;\n }\n}\n","import { inject, injectable } from 'tsyringe';\n\nimport { ACCESS_LEVEL, SHARE_TYPE } from '../../common/constants';\nimport { fromTokenToUser } from '../../index';\nimport { SharingDetail } from '../entities/details';\nimport { SharingDetailsRepositoryInterface } from '../interfaces/detailsRepository.interface';\n\n@injectable()\nexport class CheckUserAccessLevel {\n constructor(\n @inject('SharingDetailsRepository')\n private readonly detailsRepository: SharingDetailsRepositoryInterface,\n ) {}\n\n public async execute({\n userId,\n assetId,\n clientId,\n loginType,\n roles,\n orgId,\n }: {\n assetId: string;\n userId: string;\n clientId?: string;\n loginType?: string;\n roles?: string[];\n orgId?: string;\n }): Promise<{ level: ACCESS_LEVEL; levelAsText: string }> {\n const user = await fromTokenToUser({\n body: { userId, clientId, roles, orgId, loginType },\n });\n const details = await this.detailsRepository.getList({\n data: { assetId, user },\n sorting: [{ column: 'access_level', direction: 'DESC' }],\n });\n if (details.items.length === 0)\n return { level: ACCESS_LEVEL.NONE, levelAsText: 'NONE' };\n\n const priority = {\n [SHARE_TYPE.USER]: 3,\n [SHARE_TYPE.ROLE]: 2,\n [SHARE_TYPE.ORGANIZATION]: 1,\n };\n const priorityDetail = details.items.reduce((best, current) => {\n const bestPriority = priority[best.shared_type as SHARE_TYPE];\n const currentPriority = priority[current.shared_type as SHARE_TYPE];\n const isBetter =\n currentPriority > bestPriority ||\n (currentPriority === bestPriority &&\n current.access_level > best.access_level);\n\n if (isBetter) return current;\n return best;\n });\n\n const currentDetail = SharingDetail.parse(priorityDetail);\n return {\n level: currentDetail.getAccessLevel,\n levelAsText: currentDetail.getAccessLevelAsText,\n };\n }\n}\n","import { getId } from '@qrvey/id-generator';\n\nimport {\n BaseSharingDetails,\n CreateSharingDetails,\n ResponseSharingDetails,\n SharingDetailsTable,\n UpdateSharingDetails,\n} from './types/details.type';\nimport {\n ACCESS_LEVEL,\n SHARED_ORIGIN,\n SHARE_TYPE,\n} from '../../common/constants';\n\nexport class SharingDetail {\n private sharingDetailsId: string;\n private assetId: string;\n private accessLevel: ACCESS_LEVEL;\n private accessLevelAsText: string;\n private orgId: string;\n private sharedWith: string;\n private sharedType: SHARE_TYPE;\n private sharedOrigin: SHARED_ORIGIN;\n private sharedEmail?: string;\n private createdAt: string;\n private updatedAt: string;\n private deletedAt?: string;\n\n constructor(params: BaseSharingDetails) {\n this.sharingDetailsId = params.sharingDetailsId;\n this.assetId = params.assetId;\n this.accessLevel = params.accessLevel;\n this.accessLevelAsText = this.convertAccessLevelToText(\n params.accessLevel,\n );\n this.orgId = params.orgId;\n this.sharedWith = params.sharedWith;\n this.sharedType = params.sharedType;\n this.sharedEmail = params.sharedEmail;\n this.sharedOrigin = params.sharedOrigin;\n this.createdAt = params.createdAt;\n this.updatedAt = params.updatedAt;\n this.deletedAt = params.deletedAt;\n }\n\n static create(params: CreateSharingDetails): SharingDetail {\n const now = new Date().toISOString();\n const obj: BaseSharingDetails = {\n ...params,\n sharingDetailsId: params.sharedId ?? getId(),\n createdAt: now,\n updatedAt: now,\n };\n return new SharingDetail(obj);\n }\n\n static parse(params: SharingDetailsTable): SharingDetail {\n return new SharingDetail({\n sharingDetailsId: params.sharing_details_id,\n assetId: params.asset_id,\n accessLevel: params.access_level as ACCESS_LEVEL,\n orgId: params.org_id,\n sharedWith: params.shared_with,\n sharedType: params.shared_type as SHARE_TYPE,\n sharedEmail: params.shared_email,\n sharedOrigin: params.share_origin as SHARED_ORIGIN,\n createdAt: params.created_at,\n updatedAt: params.updated_at,\n deletedAt: params.deleted_at,\n });\n }\n\n update(params: UpdateSharingDetails) {\n if (params.accessLevel || params.accessLevel === 0)\n this.accessLevel = params.accessLevel;\n if (params.sharedEmail) this.sharedEmail = params.sharedEmail;\n this.updatedAt = new Date().toISOString();\n }\n\n toTable(): SharingDetailsTable {\n return {\n sharing_details_id: this.sharingDetailsId,\n asset_id: this.assetId,\n access_level: this.accessLevel,\n org_id: this.orgId,\n shared_with: this.sharedWith,\n shared_type: this.sharedType,\n shared_email: this.sharedEmail,\n share_origin: this.sharedOrigin,\n created_at: this.createdAt,\n updated_at: this.updatedAt,\n deleted_at: this.deletedAt,\n };\n }\n\n toPlain(): BaseSharingDetails {\n return {\n sharingDetailsId: this.sharingDetailsId,\n assetId: this.assetId,\n accessLevel: this.accessLevel,\n orgId: this.orgId,\n sharedWith: this.sharedWith,\n sharedType: this.sharedType,\n sharedEmail: this.sharedEmail,\n sharedOrigin: this.sharedOrigin,\n createdAt: this.createdAt,\n updatedAt: this.updatedAt,\n deletedAt: this.deletedAt,\n };\n }\n\n toJSON(): ResponseSharingDetails {\n return {\n sharedId: this.sharingDetailsId,\n assetId: this.assetId,\n accessLevel: this.accessLevel,\n accessLevelAsText: this.accessLevelAsText,\n orgId: this.orgId,\n sharedWith: this.sharedWith,\n sharedType: this.sharedType,\n sharedEmail: this.sharedEmail,\n sharedOrigin: this.sharedOrigin,\n createdAt: this.createdAt,\n updatedAt: this.updatedAt,\n };\n }\n\n public get getSharingDetailsId(): string {\n return this.sharingDetailsId;\n }\n\n public get getAccessLevel(): ACCESS_LEVEL {\n return this.accessLevel;\n }\n\n public get getAccessLevelAsText(): string {\n return this.accessLevelAsText;\n }\n\n private convertAccessLevelToText(level: number): string {\n return ACCESS_LEVEL[level] ?? 'UNKNOWN';\n }\n}\n","import { inject, injectable } from 'tsyringe';\n\nimport { SharingRepositoryInterface } from '../interfaces/sharingRepository.interface';\n\nexport interface Delete {\n assetId: string;\n}\n\n@injectable()\nexport class DeleteSharing {\n constructor(\n @inject('SharingRepository')\n private readonly sharingRepository: SharingRepositoryInterface,\n ) {}\n\n public async execute({ body }: { body: Delete }): Promise<boolean | null> {\n const { assetId } = body;\n const sharing = await this.sharingRepository.getOne(assetId);\n\n if (!sharing) return null;\n const detailSharing = await this.sharingRepository.delete(assetId);\n return detailSharing;\n }\n}\n","import { inject, injectable } from 'tsyringe';\n\nimport { Sorting } from '../../common/common.type';\nimport { SharingDetail } from '../entities/details';\nimport {\n GetSharingList,\n ListSharingDetails,\n SharingDetailsTable,\n} from '../entities/types/details.type';\nimport { SharingDetailsRepositoryInterface } from '../interfaces/detailsRepository.interface';\nimport { SharingRepositoryInterface } from '../interfaces/sharingRepository.interface';\n\n@injectable()\nexport class ListSharing {\n constructor(\n @inject('SharingRepository')\n private readonly sharingRepository: SharingRepositoryInterface,\n @inject('SharingDetailsRepository')\n private readonly detailsRepository: SharingDetailsRepositoryInterface,\n ) {}\n\n public async execute({\n body,\n }: {\n body: GetSharingList;\n }): Promise<ListSharingDetails | null> {\n const {\n data: { assetId },\n pagination,\n } = body;\n const sharing = await this.sharingRepository.getOne(assetId);\n\n if (!sharing) return null;\n\n const sorting: Array<Sorting> =\n body.sorting && body.sorting?.length > 0\n ? body.sorting\n : [{ column: 'created_at', direction: 'ASC' }];\n\n const detailSharing = await this.detailsRepository.getList({\n data: { assetId },\n pagination,\n sorting,\n });\n const items = detailSharing.items.map((item) =>\n SharingDetail.parse(item as SharingDetailsTable).toJSON(),\n );\n return {\n ...detailSharing,\n items,\n };\n }\n}\n","import { inject, injectable } from 'tsyringe';\n\nimport {\n ACCESS_LEVEL,\n ASSET_TYPE,\n ORGANIZATION_QRVEY,\n SHARED_ORIGIN,\n SHARE_TYPE,\n} from '../../common/constants';\nimport { RoleRepositoryInterface } from '../../quser/interfaces/rolesRepository.interface';\nimport { UserRepositoryInterface } from '../../quser/interfaces/userRepository.interface';\nimport { SharingDetail } from '../entities/details';\nimport { Sharing } from '../entities/sharing';\nimport { ResponseSharingDetails } from '../entities/types/details.type';\nimport { DashboardRepositoryInterface } from '../interfaces/dashboardRepository.interface';\nimport { SharingDetailsRepositoryInterface } from '../interfaces/detailsRepository.interface';\nimport { DownloadManagerRepositoryInterface } from '../interfaces/downloadManagerRepository.interface';\nimport { SharingRepositoryInterface } from '../interfaces/sharingRepository.interface';\n\ninterface SharingWith {\n sharedId?: string;\n sharedWith: string;\n sharedOrigin: SHARED_ORIGIN;\n accessLevel: ACCESS_LEVEL;\n orgId?: string;\n sharedEmail?: string;\n sharedType: SHARE_TYPE;\n}\n\nexport interface UpsertInterface {\n assetId: string;\n assetType: ASSET_TYPE;\n add?: Array<SharingWith>;\n remove?: Array<{\n sharedId: string;\n }>;\n}\n\n@injectable()\nexport class UpsertSharing {\n constructor(\n @inject('SharingRepository')\n private readonly sharingRepository: SharingRepositoryInterface,\n @inject('SharingDetailsRepository')\n private readonly detailsRepository: SharingDetailsRepositoryInterface,\n @inject('dxRepository')\n private readonly dxRepository: DashboardRepositoryInterface,\n @inject('dmRepository')\n private readonly dmRepository: DownloadManagerRepositoryInterface,\n @inject('UserRepository')\n private readonly userRepository: UserRepositoryInterface,\n @inject('RoleRepository')\n private readonly roleRepository: RoleRepositoryInterface,\n ) {}\n\n public async execute({\n body,\n }: {\n body: UpsertInterface;\n }): Promise<ResponseSharingDetails[]> {\n const assetId = body.assetId;\n\n const isValidAsset = await this.validateIfAssetExists(\n assetId,\n body.assetType,\n );\n if (!isValidAsset)\n throw new Error(`Asset with ID ${assetId} not found`);\n\n const sharing = await this.sharingRepository.getOne(assetId);\n let currentSharing: Sharing;\n if (sharing) {\n currentSharing = Sharing.parse(sharing);\n } else {\n const createSharing = {\n assetId,\n assetType: body.assetType,\n };\n currentSharing = Sharing.create(createSharing);\n await this.sharingRepository.create(currentSharing.toTable());\n }\n\n let updatedList: SharingDetail[] = [];\n if (body.add) updatedList = await this.addDetails(assetId, body.add);\n if (body.remove) await this.removeDetails(body.remove);\n\n currentSharing.update();\n await this.sharingRepository.patch(\n currentSharing.getAssetId,\n currentSharing.toTable(),\n );\n return updatedList.map((detail) => detail.toJSON());\n }\n\n private async validateIfAssetExists(\n assetId: string,\n assetType: ASSET_TYPE,\n ): Promise<boolean> {\n switch (assetType) {\n case ASSET_TYPE.DX: {\n const result = await this.dxRepository.get(assetId);\n if (result) return true;\n return false;\n }\n case ASSET_TYPE.DM: {\n return true;\n }\n\n default:\n return false;\n }\n }\n\n private async addDetails(\n assetId: string,\n list: Required<UpsertInterface>['add'],\n ): Promise<SharingDetail[]> {\n const sharingList: SharingDetail[] = [];\n for (const detail of list) {\n const currentDetail = await this.addSpecificDetail(assetId, detail);\n if (currentDetail) sharingList.push(currentDetail);\n }\n return sharingList;\n }\n\n private async addSpecificDetail(\n assetId: string,\n detail: SharingWith,\n ): Promise<SharingDetail | null> {\n let currentDetail: SharingDetail;\n const isValid = await this.validateIfSharedWithExist(detail);\n if (!isValid) return null;\n\n let sharingDetail = await this.detailsRepository.getBySharedWith(\n assetId,\n detail.sharedWith,\n );\n if (!sharingDetail && detail.sharedId) {\n sharingDetail = await this.detailsRepository.getOne(\n detail.sharedId,\n );\n }\n\n if (sharingDetail) {\n currentDetail = SharingDetail.parse(sharingDetail);\n currentDetail.update(detail);\n await this.detailsRepository.patch(\n currentDetail.getSharingDetailsId,\n currentDetail.toTable(),\n );\n } else {\n const createDetails = {\n assetId: assetId,\n orgId: detail.orgId ?? ORGANIZATION_QRVEY, //TODO If shareOrigin is INTERNAL then `ORGANIZATION_QRVEY` else fail\n ...detail,\n };\n currentDetail = SharingDetail.create(createDetails);\n await this.detailsRepository.create(currentDetail.toTable());\n }\n return currentDetail;\n }\n\n private async validateIfSharedWithExist(\n detail: SharingWith,\n ): Promise<boolean> {\n if (\n detail.sharedOrigin === SHARED_ORIGIN.EXTERNAL ||\n detail.sharedOrigin === SHARED_ORIGIN.UNKNOWN\n )\n return true;\n\n const isQrveyOrg =\n detail.sharedType === SHARE_TYPE.ORGANIZATION &&\n detail.sharedWith === ORGANIZATION_QRVEY;\n if (isQrveyOrg) return true; // NOTE: If more Internal Organization arrive, need to change this validation\n\n if (detail.sharedType === SHARE_TYPE.USER) {\n const user = await this.userRepository.getOne(detail.sharedWith);\n if (user) return true;\n }\n\n if (detail.sharedType === SHARE_TYPE.ROLE) {\n const role = await this.roleRepository.getOne(detail.sharedWith);\n if (role) return true;\n }\n\n return false;\n }\n\n private async removeDetails(\n list: Required<UpsertInterface>['remove'],\n ): Promise<void> {\n for (const detail of list) {\n await this.detailsRepository.delete(detail.sharedId);\n }\n }\n}\n","import {\n BaseSharing,\n CreateSharing,\n ResponseSharing,\n SharingTable,\n} from './types/sharing.type';\nimport { ASSET_TYPE } from '../../common/constants';\n\nexport class Sharing {\n private assetId: string;\n private assetType: ASSET_TYPE;\n private createdAt: string;\n private updatedAt: string;\n private deletedAt?: string;\n\n constructor(params: BaseSharing) {\n this.assetId = params.assetId;\n this.assetType = params.assetType;\n this.createdAt = params.createdAt;\n this.updatedAt = params.updatedAt;\n this.deletedAt = params.deletedAt;\n }\n\n static create(params: CreateSharing): Sharing {\n const now = new Date().toISOString();\n const obj: BaseSharing = {\n ...params,\n createdAt: now,\n updatedAt: now,\n };\n return new Sharing(obj);\n }\n\n static parse(params: SharingTable): Sharing {\n return new Sharing({\n assetId: params.asset_id,\n assetType: params.asset_type as ASSET_TYPE,\n createdAt: params.created_at,\n updatedAt: params.updated_at,\n deletedAt: params.deleted_at,\n });\n }\n\n update() {\n this.updatedAt = new Date().toISOString();\n }\n\n toTable(): SharingTable {\n return {\n asset_id: this.assetId,\n asset_type: this.assetType,\n created_at: this.createdAt,\n updated_at: this.updatedAt,\n deleted_at: this.deletedAt,\n };\n }\n\n toPlain(): BaseSharing {\n return {\n assetId: this.assetId,\n assetType: this.assetType,\n createdAt: this.createdAt,\n updatedAt: this.updatedAt,\n deletedAt: this.deletedAt,\n };\n }\n\n toJSON(): ResponseSharing {\n return {\n assetId: this.assetId,\n assetType: this.assetType,\n createdAt: this.createdAt,\n updatedAt: this.updatedAt,\n };\n }\n\n public get getAssetId(): string {\n return this.assetId;\n }\n\n public get getAssetType(): string {\n return this.assetType;\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/context.ts","../../src/quser/implementations/group.model.ts","../../src/common/constants.ts","../../src/common/persistence/base.ts","../../src/common/persistence/poolClient.ts","../../src/quser/implementations/group.repository.ts","../../src/quser/implementations/user.model.ts","../../src/quser/implementations/user.repository.ts","../../src/sharing/implementations/details.model.ts","../../src/sharing/implementations/details.repository.ts","../../src/sharing/implementations/dm.model.ts","../../src/sharing/implementations/dm.repository.ts","../../src/sharing/implementations/dx.model.ts","../../src/sharing/implementations/dx.repository.ts","../../src/sharing/implementations/sharing.model.ts","../../src/sharing/implementations/sharing.repository.ts","../../src/quser/services/fromTokenToUser.ts","../../src/common/util.ts","../../src/quser/entities/user.ts","../../src/quser/services/hasAdminRole.ts","../../src/sharing/services/checkUserAccessLevel.ts","../../src/sharing/entities/details.ts","../../src/sharing/services/delete.ts","../../src/sharing/services/list.ts","../../src/sharing/services/upsert.ts","../../src/sharing/entities/sharing.ts"],"names":["ASSET_TYPE","SHARED_ORIGIN","SHARE_TYPE","ACCESS_LEVEL","CrudSchema","inject","injectable"],"mappings":"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","sourcesContent":["import 'reflect-metadata';\nimport { Context } from './context';\nimport { FromTokenToUser } from './quser/services/fromTokenToUser';\nimport { HasAdminRole } from './quser/services/hasAdminRole';\nimport { CheckUserAccessLevel } from './sharing/services/checkUserAccessLevel';\nimport { DeleteSharing } from './sharing/services/delete';\nimport { ListSharing } from './sharing/services/list';\nimport { UpsertSharing } from './sharing/services/upsert';\n\nexport const api = {\n upsert: (...args: Parameters<UpsertSharing['execute']>) =>\n Context.resolve(UpsertSharing).execute(...args),\n list: (...args: Parameters<ListSharing['execute']>) =>\n Context.resolve(ListSharing).execute(...args),\n delete: (...args: Parameters<DeleteSharing['execute']>) =>\n Context.resolve(DeleteSharing).execute(...args),\n};\n\nexport const checkUserAccessLevel = (\n ...args: Parameters<CheckUserAccessLevel['execute']>\n) => Context.resolve(CheckUserAccessLevel).execute(...args);\n\nexport const fromTokenToUser = (\n ...args: Parameters<FromTokenToUser['execute']>\n) => Context.resolve(FromTokenToUser).execute(...args);\n\nexport const hasAdminRole = (...args: Parameters<HasAdminRole['execute']>) =>\n Context.resolve(HasAdminRole).execute(...args);\n\nexport {\n ACCESS_LEVEL,\n ASSET_TYPE,\n ORGANIZATION_QRVEY,\n SHARED_ORIGIN,\n SHARE_TYPE,\n} from './common/constants';\n\nexport { GetSharingList } from './sharing/entities/types/details.type';\n","import { container } from 'tsyringe';\n\nimport { GroupRepository } from './quser/implementations/group.repository';\nimport { UserRepository } from './quser/implementations/user.repository';\nimport { type RoleRepositoryInterface } from './quser/interfaces/rolesRepository.interface';\nimport { type UserRepositoryInterface } from './quser/interfaces/userRepository.interface';\nimport { SharingDetailsRepository } from './sharing/implementations/details.repository';\nimport { DownloadManagerRepository } from './sharing/implementations/dm.repository';\nimport { DashboardRepository } from './sharing/implementations/dx.repository';\nimport { SharingRepository } from './sharing/implementations/sharing.repository';\nimport { type DashboardRepositoryInterface } from './sharing/interfaces/dashboardRepository.interface';\nimport { type SharingDetailsRepositoryInterface } from './sharing/interfaces/detailsRepository.interface';\nimport { type DownloadManagerRepositoryInterface } from './sharing/interfaces/downloadManagerRepository.interface';\nimport { type SharingRepositoryInterface } from './sharing/interfaces/sharingRepository.interface';\n\ncontainer.register<SharingRepositoryInterface>(\n 'SharingRepository',\n SharingRepository,\n);\ncontainer.register<SharingDetailsRepositoryInterface>(\n 'SharingDetailsRepository',\n SharingDetailsRepository,\n);\ncontainer.register<UserRepositoryInterface>('UserRepository', UserRepository);\ncontainer.register<RoleRepositoryInterface>('RoleRepository', GroupRepository);\ncontainer.register<DashboardRepositoryInterface>(\n 'dxRepository',\n DashboardRepository,\n);\ncontainer.register<DownloadManagerRepositoryInterface>(\n 'dmRepository',\n DownloadManagerRepository,\n);\n\nexport const Context = container;\n","import { CrudSchema } from '@qrvey/data-persistence';\n\nimport { DATABASE_INFO } from '../../common/constants';\n\nexport class GroupModel extends CrudSchema {\n static table = {\n name: `${DATABASE_INFO.SERVER_PREFIX}Groups`,\n alias: 'qv_groups',\n };\n\n static columns = {\n groupid: {\n type: 'string',\n },\n };\n\n static schema = DATABASE_INFO.DATA_PERSISTENCE_SCHEMA;\n}\n","export const ENVIRONMENT = {\n SERVER_PREFIX: process.env.SERVER_PREFIX,\n TABLE_PREFIX: process.env.TABLE_PREFIX,\n};\n\nexport const DATABASE_INFO = {\n DATA_PERSISTENCE_SCHEMA: 'admin',\n SERVER_PREFIX: ENVIRONMENT.SERVER_PREFIX,\n TABLE_PREFIX: ENVIRONMENT.TABLE_PREFIX,\n};\n\nexport const ORGANIZATION_QRVEY = 'org:0';\n\nexport enum ASSET_TYPE {\n DX = 'DX', // DASHBOARD X (Next Gen)\n DM = 'DM', // DOWNLOAD MANAGER\n}\n\nexport enum SHARED_ORIGIN {\n INTERNAL = 'INTERNAL', // for org:0\n EXTERNAL = 'EXTERNAL', // for orgs different that 0\n UNKNOWN = 'UNKNOWN', // without orgId\n}\n\nexport enum SHARE_TYPE {\n USER = 'USER',\n ROLE = 'ROLE',\n ORGANIZATION = 'ORGANIZATION',\n}\n\n/**\n * Access levels for assets.\n * Those are calculated with Base 2, so:\n * - NONE = 0 (undefined)\n * - CAN_USE = 1 (2^0)\n * - CAN_EDIT = 2 (2^1)\n * - ADMIN = 4 (2^2)\n * - (Future) SUPER = 8 (2^3)\n */\nexport enum ACCESS_LEVEL {\n NONE = 0,\n CAN_USE = 1,\n CAN_EDIT = 2,\n ADMIN = 4,\n}\n\nexport const LIMIT_PER_PAGE = 10;\n","import { CrudService, buildFilter } from '@qrvey/data-persistence';\n\nimport { getPoolClient } from './poolClient';\n\nexport class BaseRepository extends CrudService<any> {\n constructor(schema: any) {\n super(schema, getPoolClient());\n }\n\n filter(attribute: string, value: any, operator?: string) {\n return buildFilter(attribute, value, operator);\n }\n}\n","import { getDbPool } from '@qrvey/data-persistence';\n\nlet poolClient: any;\nexport function getPoolClient() {\n if (!poolClient) poolClient = getDbPool();\n return poolClient;\n}\n","import { GroupModel } from './group.model';\nimport { BaseRepository } from '../../common/persistence/base';\nimport { RoleRepositoryInterface } from '../interfaces/rolesRepository.interface';\n\nexport class GroupRepository\n extends BaseRepository\n implements RoleRepositoryInterface\n{\n constructor() {\n super(GroupModel);\n }\n\n async getOne(identifier: string): Promise<{ groupid: string } | null> {\n const params = {\n filters: [this.filter('groupid', identifier)],\n };\n const response = await super.findItem(params);\n return response as { groupid: string };\n }\n}\n","import { CrudSchema } from '@qrvey/data-persistence';\n\nimport { DATABASE_INFO } from '../../common/constants';\n\nexport class UserModel extends CrudSchema {\n static table = {\n name: `${DATABASE_INFO.SERVER_PREFIX}Users`,\n alias: 'qv_users',\n };\n\n static columns = {\n userid: {\n type: 'string',\n primary: true,\n columnId: true,\n },\n groups: {\n type: 'array',\n },\n };\n\n static schema = DATABASE_INFO.DATA_PERSISTENCE_SCHEMA;\n}\n","import { UserModel } from './user.model';\nimport { ListInput, ListOutput } from '../../common/common.type';\nimport { BaseRepository } from '../../common/persistence/base';\nimport { BaseUser } from '../entities/types/user.type';\nimport { UserRepositoryInterface } from '../interfaces/userRepository.interface';\n\nexport class UserRepository\n extends BaseRepository\n implements UserRepositoryInterface\n{\n constructor() {\n super(UserModel);\n }\n\n async getOne(identifier: string): Promise<BaseUser | null> {\n const params = {\n filters: [this.filter('userid', identifier)],\n };\n const response = await super.findItem(params);\n return response as BaseUser;\n }\n\n async getList(\n options: ListInput<{ identifier: string; role?: string }>,\n ): Promise<ListOutput<BaseUser>> {\n const params = {\n filters: [\n this.filter('userid', options.data.identifier),\n this.filter('groups', options.data.role, 'CONTAINS'),\n ],\n };\n const response = await super.find(params);\n return response as ListOutput<BaseUser>;\n }\n}\n","import { CrudSchema } from '@qrvey/data-persistence';\n\nimport { DATABASE_INFO } from '../../common/constants';\n\nexport class SharingDetailsModel extends CrudSchema {\n static table = {\n name: `${DATABASE_INFO.SERVER_PREFIX}_sharing_details`,\n alias: `${DATABASE_INFO.TABLE_PREFIX}_sharing_details`,\n };\n\n static columns = {\n sharing_details_id: { type: 'string', primary: true },\n asset_id: { type: 'string' },\n access_level: { type: 'numeric' },\n org_id: { type: 'string' },\n shared_with: { type: 'string' },\n shared_type: { type: 'string' },\n shared_email: { type: 'string' },\n share_origin: { type: 'string' },\n created_at: { type: 'date' },\n updated_at: { type: 'date' },\n deleted_at: { type: 'date' },\n };\n\n static indexes = {\n sharingDetailsOrgId: {\n name: 'sharing_details_org_id_index',\n columns: [\n 'org_id',\n 'asset_id',\n 'sharing_details_id',\n 'shared_with',\n 'shared_type',\n 'shared_email',\n 'share_origin',\n ],\n },\n sharingDetailsSharedWithAccessLevel: {\n name: 'sharing_details_shared_with_access_level_index',\n columns: [\n 'shared_with',\n 'access_level',\n 'asset_id',\n 'sharing_details_id',\n 'org_id',\n 'shared_type',\n 'shared_email',\n 'share_origin',\n ],\n },\n sharingDetailsAccessLevelSharedWithOrgId: {\n name: 'sharing_details_access_level_shared_with_org_id_index',\n columns: [\n 'access_level',\n 'shared_with',\n 'org_id',\n 'asset_id',\n 'sharing_details_id',\n 'shared_type',\n 'shared_email',\n 'share_origin',\n ],\n },\n sharingDetailsAccessLevelOrgId: {\n name: 'sharing_details_access_level_org_id_index',\n columns: [\n 'access_level',\n 'org_id',\n 'asset_id',\n 'sharing_details_id',\n 'shared_with',\n 'shared_type',\n 'shared_email',\n 'share_origin',\n ],\n },\n sharingDetailsAssetId: {\n name: 'sharing_details_asset_id_index',\n columns: [\n 'asset_id',\n 'sharing_details_id',\n 'org_id',\n 'shared_with',\n 'shared_type',\n 'shared_email',\n 'share_origin',\n ],\n },\n };\n\n static schema = DATABASE_INFO.DATA_PERSISTENCE_SCHEMA;\n static usePool = true;\n}\n","import { IFilter } from '@qrvey/data-persistence';\n\nimport { SharingDetailsModel } from './details.model';\nimport {\n ListInput,\n ListOutput,\n Pagination,\n ParamsFromTokenToUser,\n} from '../../common/common.type';\nimport { LIMIT_PER_PAGE, ORGANIZATION_QRVEY } from '../../common/constants';\nimport { BaseRepository } from '../../common/persistence/base';\nimport { SharingDetailsTable } from '../entities/types/details.type';\nimport { SharingDetailsRepositoryInterface } from '../interfaces/detailsRepository.interface';\n\nexport class SharingDetailsRepository\n extends BaseRepository\n implements SharingDetailsRepositoryInterface\n{\n constructor() {\n super(SharingDetailsModel);\n }\n\n async getOne(sharingDetailId: string): Promise<SharingDetailsTable | null> {\n const params = {\n filters: [this.filter('sharing_details_id', sharingDetailId)],\n };\n const response = await super.findItem(params);\n return response as SharingDetailsTable;\n }\n\n async getBySharedWith(\n assetId: string,\n sharedWith: string,\n ): Promise<SharingDetailsTable | null> {\n const filterList = [\n this.filter('asset_id', assetId),\n this.filter('shared_with', sharedWith),\n ];\n const params = {\n filters: filterList,\n };\n const response = await super.findItem(params);\n return response as SharingDetailsTable;\n }\n\n async getList(\n options: ListInput<{ assetId: string; user?: ParamsFromTokenToUser }>,\n ): Promise<ListOutput<SharingDetailsTable>> {\n const assetIndex = SharingDetailsModel.indexes.sharingDetailsAssetId;\n const pagination = this.getPagination(options.pagination);\n const params: {\n pagination: any;\n index: any;\n filters?: any;\n sorting?: any;\n } = {\n pagination,\n index: {\n indexName: assetIndex.name,\n columns: assetIndex.columns,\n },\n };\n\n const filterList = [this.filter('asset_id', options.data.assetId)];\n if (options.filters) {\n options.filters.forEach((filter) => {\n filterList.push(this.filter(filter.column, filter.value));\n });\n }\n params.filters = filterList;\n\n if (options.data.user) {\n const currentFilter = this.getUserFilter(\n options.data.user,\n filterList,\n );\n params.filters = currentFilter;\n }\n\n if (options.sorting) params.sorting = options.sorting;\n\n const response = await super.find(params);\n return response as ListOutput<SharingDetailsTable>;\n }\n\n async create(details: SharingDetailsTable): Promise<SharingDetailsTable> {\n const response = (await super.create(details)) as SharingDetailsTable;\n return response;\n }\n\n async patch(\n sharingDetailId: string,\n details: SharingDetailsTable,\n ): Promise<boolean> {\n await super.update(\n [this.filter('sharing_details_id', sharingDetailId)],\n details,\n );\n return true;\n }\n\n async delete(sharingDetailId: string): Promise<boolean> {\n await super.remove([\n this.filter('sharing_details_id', sharingDetailId),\n ]);\n return true;\n }\n\n private getPagination(options?: Pagination): Pagination {\n return {\n limit: options?.limit ?? LIMIT_PER_PAGE,\n from: options?.from ?? undefined,\n };\n }\n\n private getUserFilter(\n user: ParamsFromTokenToUser,\n currentFilters?: IFilter[],\n ) {\n const { userId, roles } = user;\n const orgId = user.orgId === '' ? ORGANIZATION_QRVEY : user.orgId; //Review if this is right\n const sharing = {\n OR: [\n {\n AND: [\n this.buildFilter('shared_with', userId),\n this.buildFilter('shared_type', 'USER'),\n this.buildFilter('org_id', orgId),\n ],\n },\n {\n AND: [\n this.buildFilter('shared_with', orgId),\n this.buildFilter('shared_type', 'ORGANIZATION'),\n this.buildFilter('org_id', orgId),\n ],\n },\n ],\n };\n if (roles && roles?.length > 0) {\n sharing.OR.push({\n AND: [\n this.buildFilter('shared_with', roles, 'IN'),\n this.buildFilter('shared_type', 'ROLE'),\n this.buildFilter('org_id', orgId),\n ],\n });\n }\n const filter = [];\n if (currentFilters) filter.push(...currentFilters);\n filter.push(sharing);\n return { AND: filter };\n }\n}\n","import { CrudSchema } from '@qrvey/data-persistence';\n\nimport { DATABASE_INFO } from '../../common/constants';\n\nexport class DownloadManagerSchema extends CrudSchema {\n static table = {\n name: `${DATABASE_INFO.SERVER_PREFIX}DownloadManager`,\n alias: `${DATABASE_INFO.TABLE_PREFIX}_download_manager`,\n };\n\n static columns = {\n downloadManagerId: {\n primary: true,\n type: 'String',\n columnId: true,\n },\n };\n\n static schema = 'exports';\n static usePool = true;\n}\n","import { DownloadManagerSchema } from './dm.model';\nimport { BaseRepository } from '../../common/persistence/base';\nimport { DownloadManagerRepositoryInterface } from '../interfaces/downloadManagerRepository.interface';\n\nexport class DownloadManagerRepository\n extends BaseRepository\n implements DownloadManagerRepositoryInterface\n{\n constructor() {\n super(DownloadManagerSchema);\n }\n\n async get(\n identifier: string,\n ): Promise<{ downloadManagerId: string } | null> {\n const filterList = [this.filter('downloadManagerId', identifier)];\n const params = {\n filters: filterList,\n };\n const response = await super.findItem(params);\n return response as { downloadManagerId: string };\n }\n}\n","import { CrudSchema } from '@qrvey/data-persistence';\n\nimport { DATABASE_INFO } from '../../common/constants';\n\nexport class DashboardSchema extends CrudSchema {\n static table = {\n name: `${DATABASE_INFO.SERVER_PREFIX}_dx_dashboard`,\n alias: `${DATABASE_INFO.TABLE_PREFIX}_dashboard`,\n };\n\n static columns = {\n ResourceUID: { type: 'string', primary: true },\n dashboardId: { type: 'string' },\n contentId: { type: 'string' },\n userId: { type: 'string' },\n ownerId: { type: 'string' },\n appId: { type: 'string' },\n qvAttributes: { type: 'object' },\n };\n\n static indexes = {\n ResourceUID: {\n name: 'MetadataByResource',\n columns: ['Metadata', 'ResourceUID'],\n },\n };\n\n static schema = 'dashboard_x';\n static usePool = true;\n}\n","import { DashboardSchema } from './dx.model';\nimport { BaseRepository } from '../../common/persistence/base';\nimport { DashboardRepositoryInterface } from '../interfaces/dashboardRepository.interface';\n\nexport class DashboardRepository\n extends BaseRepository\n implements DashboardRepositoryInterface\n{\n constructor() {\n super(DashboardSchema);\n }\n\n async get(identifier: string): Promise<{ dashboardId: string } | null> {\n const uid = `DASHBOARD=${identifier}&BRANCH=MAIN`;\n const filterList = [this.filter('ResourceUID', uid)];\n const params = {\n filters: filterList,\n };\n const response = await super.findItem(params);\n return response as { dashboardId: string };\n }\n}\n","import { CrudSchema } from '@qrvey/data-persistence';\n\nimport { DATABASE_INFO } from '../../common/constants';\n\nexport class SharingModel extends CrudSchema {\n static table = {\n name: `${DATABASE_INFO.SERVER_PREFIX}_sharing`,\n alias: `${DATABASE_INFO.TABLE_PREFIX}_sharing`,\n };\n\n static columns = {\n asset_id: { type: 'string', primary: true },\n asset_type: { type: 'string' },\n created_at: { type: 'date' },\n updated_at: { type: 'date' },\n deleted_at: { type: 'date' },\n qvAttributes: { type: 'object' },\n };\n\n static indexes = {\n sharingAssetIdAssetType: {\n name: 'sharing_asset_id_asset_type_index',\n columns: ['asset_id', 'asset_type'],\n },\n sharingAssetType: {\n name: 'sharing_asset_type_index',\n columns: ['asset_type'],\n },\n };\n\n static schema = DATABASE_INFO.DATA_PERSISTENCE_SCHEMA;\n static usePool = true;\n}\n","import { SharingModel } from './sharing.model';\nimport { BaseRepository } from '../../common/persistence/base';\nimport { SharingTable } from '../entities/types/sharing.type';\nimport { SharingRepositoryInterface } from '../interfaces/sharingRepository.interface';\n\nexport class SharingRepository\n extends BaseRepository\n implements SharingRepositoryInterface\n{\n constructor() {\n super(SharingModel);\n }\n\n async getOne(assetId: string): Promise<SharingTable | null> {\n const params = {\n filters: [this.filter('asset_id', assetId)],\n };\n const response = await super.findItem(params);\n return response as SharingTable;\n }\n\n async create(sharing: SharingTable): Promise<SharingTable> {\n const response = (await super.create(sharing)) as SharingTable;\n return response;\n }\n\n async patch(assetId: string, sharing: SharingTable): Promise<boolean> {\n await super.update([this.filter('asset_id', assetId)], sharing);\n return true;\n }\n\n async delete(assetId: string): Promise<boolean> {\n await super.remove([this.filter('asset_id', assetId)]);\n return true;\n }\n}\n","import { inject, injectable } from 'tsyringe';\n\nimport { ParamsFromTokenToUser } from '../../common/common.type';\nimport { ORGANIZATION_QRVEY } from '../../common/constants';\nimport { isComposer } from '../../common/util';\nimport { UserToken } from '../entities/types/user.type';\nimport { User } from '../entities/user';\nimport { UserRepositoryInterface } from '../interfaces/userRepository.interface';\n\n@injectable()\nexport class FromTokenToUser {\n constructor(\n @inject('UserRepository')\n private readonly userRepository: UserRepositoryInterface,\n ) {}\n\n public async execute({\n body,\n }: {\n body: UserToken;\n }): Promise<ParamsFromTokenToUser> {\n const current = await this.userRepository.getOne(\n body.clientId || body.userId,\n );\n if (current) {\n const user = new User(current);\n return {\n userId: user.getUserId,\n roles: user.getGroups,\n orgId: body.orgId ?? ORGANIZATION_QRVEY,\n };\n }\n\n const inComposer = isComposer(body.loginType || '');\n if (!inComposer) {\n return {\n userId: body.clientId || '',\n roles: body.roles || [],\n orgId: body.orgId || '',\n };\n }\n\n return {\n userId: '',\n roles: [],\n orgId: '',\n };\n }\n}\n","enum LOGIN_TYPES {\n composer = 'qrveyLogin',\n openIdComposer = 'OPENID_CREATORS',\n}\n\nexport function isComposer(type: string): boolean {\n return type === LOGIN_TYPES.composer || type === LOGIN_TYPES.openIdComposer;\n}\n","import { BaseUser } from './types/user.type';\n\nexport class User {\n private userId: string;\n private email: string;\n private groups: string[];\n private organization: string;\n\n constructor(params: BaseUser) {\n this.userId = params.userid;\n this.email = params.email;\n this.groups = params.groups;\n this.organization = params.organization;\n }\n\n public get getUserId(): string {\n return this.userId;\n }\n\n public get getEmail(): string {\n return this.email;\n }\n\n public get getGroups(): string[] {\n return this.groups;\n }\n\n public get getOrganization(): string {\n return this.organization;\n }\n}\n","import { inject, injectable } from 'tsyringe';\n\nimport { ORGANIZATION_QRVEY } from '../../common/constants';\nimport { isComposer } from '../../common/util';\nimport { UserRepositoryInterface } from '../interfaces/userRepository.interface';\n\n@injectable()\nexport class HasAdminRole {\n constructor(\n @inject('UserRepository')\n private readonly userRepository: UserRepositoryInterface,\n ) {}\n\n public async execute({\n apiKey,\n clientId,\n orgId,\n userId,\n loginType,\n }: {\n apiKey?: string;\n clientId?: string;\n orgId?: string;\n userId?: string;\n loginType?: string;\n } = {}): Promise<boolean> {\n if (!userId) return false;\n\n const 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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qrvey/assets-sharing",
3
- "version": "0.3.2",
3
+ "version": "0.3.3",
4
4
  "types": "dist/types/index.d.ts",
5
5
  "main": "dist/cjs/index.js",
6
6
  "exports": {
@@ -27,20 +27,17 @@ export class HasAdminRole {
27
27
  if (!userId) return false;
28
28
 
29
29
  const isMasterKey =
30
- apiKey &&
31
- (clientId === userId || !clientId) &&
32
- (orgId === undefined || orgId === ORGANIZATION_QRVEY);
30
+ apiKey && (orgId === undefined || orgId === ORGANIZATION_QRVEY);
33
31
  if (isMasterKey) return true;
34
32
 
35
33
  const inComposer = isComposer(loginType || '');
36
34
  const isExternal =
37
35
  (!clientId && !inComposer) ||
38
- (clientId && clientId !== userId) ||
39
36
  (orgId && orgId !== ORGANIZATION_QRVEY);
40
37
  if (isExternal) return false;
41
38
 
42
39
  const user = await this.userRepository.getList({
43
- data: { identifier: userId, role: 'administrator' },
40
+ data: { identifier: clientId ?? userId, role: 'administrator' },
44
41
  });
45
42
  if (user.items.length > 0) return true;
46
43