@lightdash/common 0.2438.0 → 0.2439.0

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.
Files changed (52) hide show
  1. package/dist/cjs/.tsbuildinfo +1 -1
  2. package/dist/cjs/authorization/space/spaceAccessResolver.d.ts +4 -0
  3. package/dist/cjs/authorization/space/spaceAccessResolver.d.ts.map +1 -0
  4. package/dist/cjs/authorization/space/spaceAccessResolver.js +104 -0
  5. package/dist/cjs/authorization/space/spaceAccessResolver.js.map +1 -0
  6. package/dist/cjs/authorization/space/spaceAccessResolver.test.d.ts +2 -0
  7. package/dist/cjs/authorization/space/spaceAccessResolver.test.d.ts.map +1 -0
  8. package/dist/cjs/authorization/space/spaceAccessResolver.test.js +486 -0
  9. package/dist/cjs/authorization/space/spaceAccessResolver.test.js.map +1 -0
  10. package/dist/cjs/index.d.ts +1 -0
  11. package/dist/cjs/index.d.ts.map +1 -1
  12. package/dist/cjs/index.js +1 -0
  13. package/dist/cjs/index.js.map +1 -1
  14. package/dist/cjs/types/space.d.ts +38 -0
  15. package/dist/cjs/types/space.d.ts.map +1 -1
  16. package/dist/cjs/types/space.js +12 -1
  17. package/dist/cjs/types/space.js.map +1 -1
  18. package/dist/esm/.tsbuildinfo +1 -1
  19. package/dist/esm/authorization/space/spaceAccessResolver.d.ts +4 -0
  20. package/dist/esm/authorization/space/spaceAccessResolver.d.ts.map +1 -0
  21. package/dist/esm/authorization/space/spaceAccessResolver.js +100 -0
  22. package/dist/esm/authorization/space/spaceAccessResolver.js.map +1 -0
  23. package/dist/esm/authorization/space/spaceAccessResolver.test.d.ts +2 -0
  24. package/dist/esm/authorization/space/spaceAccessResolver.test.d.ts.map +1 -0
  25. package/dist/esm/authorization/space/spaceAccessResolver.test.js +484 -0
  26. package/dist/esm/authorization/space/spaceAccessResolver.test.js.map +1 -0
  27. package/dist/esm/index.d.ts +1 -0
  28. package/dist/esm/index.d.ts.map +1 -1
  29. package/dist/esm/index.js +1 -0
  30. package/dist/esm/index.js.map +1 -1
  31. package/dist/esm/types/space.d.ts +38 -0
  32. package/dist/esm/types/space.d.ts.map +1 -1
  33. package/dist/esm/types/space.js +11 -0
  34. package/dist/esm/types/space.js.map +1 -1
  35. package/dist/types/.tsbuildinfo +1 -1
  36. package/dist/types/authorization/space/spaceAccessResolver.d.ts +4 -0
  37. package/dist/types/authorization/space/spaceAccessResolver.d.ts.map +1 -0
  38. package/dist/types/authorization/space/spaceAccessResolver.js +100 -0
  39. package/dist/types/authorization/space/spaceAccessResolver.js.map +1 -0
  40. package/dist/types/authorization/space/spaceAccessResolver.test.d.ts +2 -0
  41. package/dist/types/authorization/space/spaceAccessResolver.test.d.ts.map +1 -0
  42. package/dist/types/authorization/space/spaceAccessResolver.test.js +484 -0
  43. package/dist/types/authorization/space/spaceAccessResolver.test.js.map +1 -0
  44. package/dist/types/index.d.ts +1 -0
  45. package/dist/types/index.d.ts.map +1 -1
  46. package/dist/types/index.js +1 -0
  47. package/dist/types/index.js.map +1 -1
  48. package/dist/types/types/space.d.ts +38 -0
  49. package/dist/types/types/space.d.ts.map +1 -1
  50. package/dist/types/types/space.js +11 -0
  51. package/dist/types/types/space.js.map +1 -1
  52. package/package.json +1 -1
@@ -0,0 +1,4 @@
1
+ import { type SpaceAccessInput, type SpaceShare } from '../../types/space';
2
+ export type SpaceAccess = Pick<SpaceShare, 'userUuid' | 'role' | 'hasDirectAccess' | 'inheritedFrom' | 'projectRole' | 'inheritedRole'>;
3
+ export declare const resolveSpaceAccess: (input: SpaceAccessInput) => SpaceAccess[];
4
+ //# sourceMappingURL=spaceAccessResolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spaceAccessResolver.d.ts","sourceRoot":"","sources":["../../../../src/authorization/space/spaceAccessResolver.ts"],"names":[],"mappings":"AAOA,OAAO,EAOH,KAAK,gBAAgB,EACrB,KAAK,UAAU,EAClB,MAAM,mBAAmB,CAAC;AAS3B,MAAM,MAAM,WAAW,GAAG,IAAI,CAC1B,UAAU,EACR,UAAU,GACV,MAAM,GACN,iBAAiB,GACjB,eAAe,GACf,aAAa,GACb,eAAe,CACpB,CAAC;AA8JF,eAAO,MAAM,kBAAkB,UAAW,gBAAgB,KAAG,WAAW,EAavE,CAAC"}
@@ -0,0 +1,100 @@
1
+ import { ProjectMemberRole, } from '../../types/projectMemberRole';
2
+ import { DirectSpaceAccessOrigin, ProjectSpaceAccessOrigin, SpaceMemberRole, } from '../../types/space';
3
+ import { convertOrganizationRoleToProjectRole, convertProjectRoleToSpaceRole, convertSpaceRoleToProjectRole, getHighestProjectRole, getHighestSpaceRole, } from '../../utils/projectMemberRole';
4
+ const getUserOrganizationRole = (organizationAccess, userUuid) => {
5
+ const userOrgAccess = organizationAccess.filter((a) => a.userUuid === userUuid);
6
+ return {
7
+ type: 'organization',
8
+ role: userOrgAccess.length > 0
9
+ ? convertOrganizationRoleToProjectRole(userOrgAccess[0].role)
10
+ : undefined,
11
+ };
12
+ };
13
+ const getUserProjectRole = (projectAccess, userUuid) => {
14
+ const userProjectAccess = projectAccess.filter((a) => a.userUuid === userUuid &&
15
+ a.from === ProjectSpaceAccessOrigin.PROJECT_MEMBERSHIP);
16
+ return {
17
+ type: 'project',
18
+ role: userProjectAccess.length > 0
19
+ ? userProjectAccess[0].role
20
+ : undefined,
21
+ };
22
+ };
23
+ const getUserProjectGroupRoles = (projectAccess, userUuid) => {
24
+ const userProjectGroups = projectAccess.filter((a) => a.userUuid === userUuid &&
25
+ a.from === ProjectSpaceAccessOrigin.GROUP_MEMBERSHIP);
26
+ return userProjectGroups.map((entry) => ({
27
+ type: 'group',
28
+ role: entry.role,
29
+ }));
30
+ };
31
+ const getUserDirectGroupAccess = (directAccess, userUuid) => {
32
+ const userDirectGroups = directAccess.filter((a) => a.userUuid === userUuid &&
33
+ a.from === DirectSpaceAccessOrigin.GROUP_ACCESS);
34
+ return userDirectGroups.map((entry) => ({
35
+ type: 'space_group',
36
+ role: convertSpaceRoleToProjectRole(entry.role),
37
+ }));
38
+ };
39
+ const getSpaceRole = (highestRole, userDirectAccess, isPrivate) => {
40
+ const userAccessEntries = userDirectAccess.filter((a) => a.from === DirectSpaceAccessOrigin.USER_ACCESS);
41
+ const groupAccessEntries = userDirectAccess.filter((a) => a.from === DirectSpaceAccessOrigin.GROUP_ACCESS);
42
+ const hasDirectAccess = userDirectAccess.length > 0;
43
+ if (highestRole === ProjectMemberRole.ADMIN) {
44
+ return SpaceMemberRole.ADMIN;
45
+ }
46
+ if (hasDirectAccess) {
47
+ // If user has explicit user role in space, use that; otherwise use highest group role
48
+ const userSpaceRole = userAccessEntries.length > 0
49
+ ? userAccessEntries[0].role
50
+ : undefined;
51
+ return (userSpaceRole ??
52
+ getHighestSpaceRole(groupAccessEntries.map((e) => e.role)));
53
+ }
54
+ if (!isPrivate) {
55
+ return convertProjectRoleToSpaceRole(highestRole);
56
+ }
57
+ return undefined;
58
+ };
59
+ const resolveUserSpaceAccess = (userUuid, input) => {
60
+ const { isPrivate, directAccess, projectAccess, organizationAccess } = input;
61
+ const organizationRole = getUserOrganizationRole(organizationAccess, userUuid);
62
+ const projectRole = getUserProjectRole(projectAccess, userUuid);
63
+ const groupRoles = getUserProjectGroupRoles(projectAccess, userUuid);
64
+ const spaceGroupAccessRoles = getUserDirectGroupAccess(directAccess, userUuid);
65
+ // Compute highest role across all sources
66
+ const highestRole = getHighestProjectRole([
67
+ organizationRole,
68
+ projectRole,
69
+ ...groupRoles,
70
+ ...spaceGroupAccessRoles,
71
+ ]);
72
+ if (!highestRole)
73
+ return undefined;
74
+ const userDirectAccess = directAccess.filter((a) => a.userUuid === userUuid);
75
+ const spaceRole = getSpaceRole(highestRole.role, userDirectAccess, isPrivate);
76
+ if (!spaceRole)
77
+ return undefined;
78
+ // Compute highest project role (org + direct project membership only)
79
+ const highestProjectRole = getHighestProjectRole([
80
+ organizationRole,
81
+ projectRole,
82
+ ]);
83
+ return {
84
+ userUuid,
85
+ role: spaceRole,
86
+ hasDirectAccess: userDirectAccess.length > 0,
87
+ inheritedRole: highestRole.role,
88
+ inheritedFrom: highestRole.type,
89
+ projectRole: highestProjectRole?.role,
90
+ };
91
+ };
92
+ export const resolveSpaceAccess = (input) => {
93
+ const { directAccess, projectAccess, organizationAccess } = input;
94
+ // Collect all unique user UUIDs
95
+ const uniqueUserUuids = new Set([...directAccess, ...projectAccess, ...organizationAccess].map((e) => e.userUuid));
96
+ return Array.from(uniqueUserUuids)
97
+ .map((userUuid) => resolveUserSpaceAccess(userUuid, input))
98
+ .filter((share) => share !== undefined);
99
+ };
100
+ //# sourceMappingURL=spaceAccessResolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spaceAccessResolver.js","sourceRoot":"","sources":["../../../../src/authorization/space/spaceAccessResolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=spaceAccessResolver.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spaceAccessResolver.test.d.ts","sourceRoot":"","sources":["../../../../src/authorization/space/spaceAccessResolver.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,484 @@
1
+ import { OrganizationMemberRole } from '../../types/organizationMemberProfile';
2
+ import { ProjectMemberRole } from '../../types/projectMemberRole';
3
+ import { DirectSpaceAccessOrigin, ProjectSpaceAccessOrigin, SpaceMemberRole, } from '../../types/space';
4
+ import { resolveSpaceAccess } from './spaceAccessResolver';
5
+ const makeInput = (overrides = {}) => ({
6
+ spaceUuid: 'space-1',
7
+ isPrivate: false,
8
+ directAccess: [],
9
+ projectAccess: [],
10
+ organizationAccess: [],
11
+ ...overrides,
12
+ });
13
+ describe('resolveSpaceAccess', () => {
14
+ it('returns empty array for empty inputs', () => {
15
+ const result = resolveSpaceAccess(makeInput());
16
+ expect(result).toEqual([]);
17
+ });
18
+ describe('admin override', () => {
19
+ it('org admin gets space ADMIN', () => {
20
+ const result = resolveSpaceAccess(makeInput({
21
+ organizationAccess: [
22
+ {
23
+ userUuid: 'user-1',
24
+ spaceUuid: 'space-1',
25
+ role: OrganizationMemberRole.ADMIN,
26
+ },
27
+ ],
28
+ }));
29
+ expect(result).toHaveLength(1);
30
+ expect(result[0].role).toBe(SpaceMemberRole.ADMIN);
31
+ expect(result[0].inheritedFrom).toBe('organization');
32
+ });
33
+ it('project admin gets space ADMIN', () => {
34
+ const result = resolveSpaceAccess(makeInput({
35
+ organizationAccess: [
36
+ {
37
+ userUuid: 'user-1',
38
+ spaceUuid: 'space-1',
39
+ role: OrganizationMemberRole.MEMBER,
40
+ },
41
+ ],
42
+ projectAccess: [
43
+ {
44
+ userUuid: 'user-1',
45
+ spaceUuid: 'space-1',
46
+ role: ProjectMemberRole.ADMIN,
47
+ from: ProjectSpaceAccessOrigin.PROJECT_MEMBERSHIP,
48
+ },
49
+ ],
50
+ }));
51
+ expect(result).toHaveLength(1);
52
+ expect(result[0].role).toBe(SpaceMemberRole.ADMIN);
53
+ });
54
+ it('group admin (project group) gets space ADMIN', () => {
55
+ const result = resolveSpaceAccess(makeInput({
56
+ organizationAccess: [
57
+ {
58
+ userUuid: 'user-1',
59
+ spaceUuid: 'space-1',
60
+ role: OrganizationMemberRole.MEMBER,
61
+ },
62
+ ],
63
+ projectAccess: [
64
+ {
65
+ userUuid: 'user-1',
66
+ spaceUuid: 'space-1',
67
+ role: ProjectMemberRole.ADMIN,
68
+ from: ProjectSpaceAccessOrigin.GROUP_MEMBERSHIP,
69
+ },
70
+ ],
71
+ }));
72
+ expect(result).toHaveLength(1);
73
+ expect(result[0].role).toBe(SpaceMemberRole.ADMIN);
74
+ });
75
+ it('admin can access private space even without direct access', () => {
76
+ const result = resolveSpaceAccess(makeInput({
77
+ isPrivate: true,
78
+ organizationAccess: [
79
+ {
80
+ userUuid: 'user-1',
81
+ spaceUuid: 'space-1',
82
+ role: OrganizationMemberRole.ADMIN,
83
+ },
84
+ ],
85
+ }));
86
+ expect(result).toHaveLength(1);
87
+ expect(result[0].role).toBe(SpaceMemberRole.ADMIN);
88
+ });
89
+ });
90
+ describe('direct access', () => {
91
+ it('USER_ACCESS role used directly', () => {
92
+ const result = resolveSpaceAccess(makeInput({
93
+ organizationAccess: [
94
+ {
95
+ userUuid: 'user-1',
96
+ spaceUuid: 'space-1',
97
+ role: OrganizationMemberRole.VIEWER,
98
+ },
99
+ ],
100
+ directAccess: [
101
+ {
102
+ userUuid: 'user-1',
103
+ spaceUuid: 'space-1',
104
+ role: SpaceMemberRole.EDITOR,
105
+ from: DirectSpaceAccessOrigin.USER_ACCESS,
106
+ },
107
+ ],
108
+ }));
109
+ expect(result).toHaveLength(1);
110
+ expect(result[0].role).toBe(SpaceMemberRole.EDITOR);
111
+ expect(result[0].hasDirectAccess).toBe(true);
112
+ });
113
+ it('GROUP_ACCESS role used when no user role', () => {
114
+ const result = resolveSpaceAccess(makeInput({
115
+ organizationAccess: [
116
+ {
117
+ userUuid: 'user-1',
118
+ spaceUuid: 'space-1',
119
+ role: OrganizationMemberRole.VIEWER,
120
+ },
121
+ ],
122
+ directAccess: [
123
+ {
124
+ userUuid: 'user-1',
125
+ spaceUuid: 'space-1',
126
+ role: SpaceMemberRole.EDITOR,
127
+ from: DirectSpaceAccessOrigin.GROUP_ACCESS,
128
+ },
129
+ ],
130
+ }));
131
+ expect(result).toHaveLength(1);
132
+ expect(result[0].role).toBe(SpaceMemberRole.EDITOR);
133
+ expect(result[0].hasDirectAccess).toBe(true);
134
+ });
135
+ it('user + group direct access: user role wins when higher', () => {
136
+ const result = resolveSpaceAccess(makeInput({
137
+ organizationAccess: [
138
+ {
139
+ userUuid: 'user-1',
140
+ spaceUuid: 'space-1',
141
+ role: OrganizationMemberRole.VIEWER,
142
+ },
143
+ ],
144
+ directAccess: [
145
+ {
146
+ userUuid: 'user-1',
147
+ spaceUuid: 'space-1',
148
+ role: SpaceMemberRole.EDITOR,
149
+ from: DirectSpaceAccessOrigin.USER_ACCESS,
150
+ },
151
+ {
152
+ userUuid: 'user-1',
153
+ spaceUuid: 'space-1',
154
+ role: SpaceMemberRole.VIEWER,
155
+ from: DirectSpaceAccessOrigin.GROUP_ACCESS,
156
+ },
157
+ ],
158
+ }));
159
+ expect(result).toHaveLength(1);
160
+ // User access takes precedence over group access
161
+ expect(result[0].role).toBe(SpaceMemberRole.EDITOR);
162
+ });
163
+ });
164
+ describe('public space inheritance', () => {
165
+ it('viewer gets viewer space role', () => {
166
+ const result = resolveSpaceAccess(makeInput({
167
+ isPrivate: false,
168
+ organizationAccess: [
169
+ {
170
+ userUuid: 'user-1',
171
+ spaceUuid: 'space-1',
172
+ role: OrganizationMemberRole.VIEWER,
173
+ },
174
+ ],
175
+ }));
176
+ expect(result).toHaveLength(1);
177
+ expect(result[0].role).toBe(SpaceMemberRole.VIEWER);
178
+ expect(result[0].hasDirectAccess).toBe(false);
179
+ expect(result[0].inheritedFrom).toBe('organization');
180
+ });
181
+ it('editor gets editor space role', () => {
182
+ const result = resolveSpaceAccess(makeInput({
183
+ isPrivate: false,
184
+ organizationAccess: [
185
+ {
186
+ userUuid: 'user-1',
187
+ spaceUuid: 'space-1',
188
+ role: OrganizationMemberRole.EDITOR,
189
+ },
190
+ ],
191
+ }));
192
+ expect(result).toHaveLength(1);
193
+ expect(result[0].role).toBe(SpaceMemberRole.EDITOR);
194
+ });
195
+ it('developer gets editor space role', () => {
196
+ const result = resolveSpaceAccess(makeInput({
197
+ isPrivate: false,
198
+ organizationAccess: [
199
+ {
200
+ userUuid: 'user-1',
201
+ spaceUuid: 'space-1',
202
+ role: OrganizationMemberRole.DEVELOPER,
203
+ },
204
+ ],
205
+ }));
206
+ expect(result).toHaveLength(1);
207
+ expect(result[0].role).toBe(SpaceMemberRole.EDITOR);
208
+ });
209
+ it('interactive_viewer gets viewer space role', () => {
210
+ const result = resolveSpaceAccess(makeInput({
211
+ isPrivate: false,
212
+ organizationAccess: [
213
+ {
214
+ userUuid: 'user-1',
215
+ spaceUuid: 'space-1',
216
+ role: OrganizationMemberRole.INTERACTIVE_VIEWER,
217
+ },
218
+ ],
219
+ }));
220
+ expect(result).toHaveLength(1);
221
+ expect(result[0].role).toBe(SpaceMemberRole.VIEWER);
222
+ });
223
+ });
224
+ describe('private space exclusion', () => {
225
+ it('non-admin without direct access excluded from private space', () => {
226
+ const result = resolveSpaceAccess(makeInput({
227
+ isPrivate: true,
228
+ organizationAccess: [
229
+ {
230
+ userUuid: 'user-1',
231
+ spaceUuid: 'space-1',
232
+ role: OrganizationMemberRole.EDITOR,
233
+ },
234
+ ],
235
+ }));
236
+ expect(result).toHaveLength(0);
237
+ });
238
+ it('private space with direct access works', () => {
239
+ const result = resolveSpaceAccess(makeInput({
240
+ isPrivate: true,
241
+ organizationAccess: [
242
+ {
243
+ userUuid: 'user-1',
244
+ spaceUuid: 'space-1',
245
+ role: OrganizationMemberRole.VIEWER,
246
+ },
247
+ ],
248
+ directAccess: [
249
+ {
250
+ userUuid: 'user-1',
251
+ spaceUuid: 'space-1',
252
+ role: SpaceMemberRole.EDITOR,
253
+ from: DirectSpaceAccessOrigin.USER_ACCESS,
254
+ },
255
+ ],
256
+ }));
257
+ expect(result).toHaveLength(1);
258
+ expect(result[0].role).toBe(SpaceMemberRole.EDITOR);
259
+ });
260
+ });
261
+ describe('org MEMBER role', () => {
262
+ it('org MEMBER with no other access is excluded', () => {
263
+ const result = resolveSpaceAccess(makeInput({
264
+ isPrivate: false,
265
+ organizationAccess: [
266
+ {
267
+ userUuid: 'user-1',
268
+ spaceUuid: 'space-1',
269
+ role: OrganizationMemberRole.MEMBER,
270
+ },
271
+ ],
272
+ }));
273
+ // MEMBER converts to undefined project role, so no highest role → excluded
274
+ expect(result).toHaveLength(0);
275
+ });
276
+ it('org MEMBER with project access is included', () => {
277
+ const result = resolveSpaceAccess(makeInput({
278
+ isPrivate: false,
279
+ organizationAccess: [
280
+ {
281
+ userUuid: 'user-1',
282
+ spaceUuid: 'space-1',
283
+ role: OrganizationMemberRole.MEMBER,
284
+ },
285
+ ],
286
+ projectAccess: [
287
+ {
288
+ userUuid: 'user-1',
289
+ spaceUuid: 'space-1',
290
+ role: ProjectMemberRole.EDITOR,
291
+ from: ProjectSpaceAccessOrigin.PROJECT_MEMBERSHIP,
292
+ },
293
+ ],
294
+ }));
295
+ expect(result).toHaveLength(1);
296
+ expect(result[0].role).toBe(SpaceMemberRole.EDITOR);
297
+ });
298
+ });
299
+ describe('multiple group roles', () => {
300
+ it('highest group role wins', () => {
301
+ const result = resolveSpaceAccess(makeInput({
302
+ isPrivate: false,
303
+ organizationAccess: [
304
+ {
305
+ userUuid: 'user-1',
306
+ spaceUuid: 'space-1',
307
+ role: OrganizationMemberRole.MEMBER,
308
+ },
309
+ ],
310
+ projectAccess: [
311
+ {
312
+ userUuid: 'user-1',
313
+ spaceUuid: 'space-1',
314
+ role: ProjectMemberRole.VIEWER,
315
+ from: ProjectSpaceAccessOrigin.GROUP_MEMBERSHIP,
316
+ },
317
+ {
318
+ userUuid: 'user-1',
319
+ spaceUuid: 'space-1',
320
+ role: ProjectMemberRole.EDITOR,
321
+ from: ProjectSpaceAccessOrigin.GROUP_MEMBERSHIP,
322
+ },
323
+ ],
324
+ }));
325
+ expect(result).toHaveLength(1);
326
+ expect(result[0].role).toBe(SpaceMemberRole.EDITOR);
327
+ });
328
+ });
329
+ describe('inheritedFrom metadata', () => {
330
+ it('reports organization when org role is highest', () => {
331
+ const result = resolveSpaceAccess(makeInput({
332
+ organizationAccess: [
333
+ {
334
+ userUuid: 'user-1',
335
+ spaceUuid: 'space-1',
336
+ role: OrganizationMemberRole.EDITOR,
337
+ },
338
+ ],
339
+ }));
340
+ expect(result[0].inheritedFrom).toBe('organization');
341
+ });
342
+ it('reports project when project role is highest', () => {
343
+ const result = resolveSpaceAccess(makeInput({
344
+ organizationAccess: [
345
+ {
346
+ userUuid: 'user-1',
347
+ spaceUuid: 'space-1',
348
+ role: OrganizationMemberRole.VIEWER,
349
+ },
350
+ ],
351
+ projectAccess: [
352
+ {
353
+ userUuid: 'user-1',
354
+ spaceUuid: 'space-1',
355
+ role: ProjectMemberRole.EDITOR,
356
+ from: ProjectSpaceAccessOrigin.PROJECT_MEMBERSHIP,
357
+ },
358
+ ],
359
+ }));
360
+ expect(result[0].inheritedFrom).toBe('project');
361
+ });
362
+ it('reports group when group project role is highest', () => {
363
+ const result = resolveSpaceAccess(makeInput({
364
+ organizationAccess: [
365
+ {
366
+ userUuid: 'user-1',
367
+ spaceUuid: 'space-1',
368
+ role: OrganizationMemberRole.VIEWER,
369
+ },
370
+ ],
371
+ projectAccess: [
372
+ {
373
+ userUuid: 'user-1',
374
+ spaceUuid: 'space-1',
375
+ role: ProjectMemberRole.DEVELOPER,
376
+ from: ProjectSpaceAccessOrigin.GROUP_MEMBERSHIP,
377
+ },
378
+ ],
379
+ }));
380
+ expect(result[0].inheritedFrom).toBe('group');
381
+ });
382
+ it('reports space_group when space group access role is highest', () => {
383
+ const result = resolveSpaceAccess(makeInput({
384
+ organizationAccess: [
385
+ {
386
+ userUuid: 'user-1',
387
+ spaceUuid: 'space-1',
388
+ role: OrganizationMemberRole.VIEWER,
389
+ },
390
+ ],
391
+ directAccess: [
392
+ {
393
+ userUuid: 'user-1',
394
+ spaceUuid: 'space-1',
395
+ role: SpaceMemberRole.EDITOR,
396
+ from: DirectSpaceAccessOrigin.GROUP_ACCESS,
397
+ },
398
+ ],
399
+ }));
400
+ expect(result[0].inheritedFrom).toBe('space_group');
401
+ });
402
+ });
403
+ describe('projectRole field', () => {
404
+ it('only considers org + direct project membership (not groups)', () => {
405
+ const result = resolveSpaceAccess(makeInput({
406
+ organizationAccess: [
407
+ {
408
+ userUuid: 'user-1',
409
+ spaceUuid: 'space-1',
410
+ role: OrganizationMemberRole.VIEWER,
411
+ },
412
+ ],
413
+ projectAccess: [
414
+ {
415
+ userUuid: 'user-1',
416
+ spaceUuid: 'space-1',
417
+ role: ProjectMemberRole.DEVELOPER,
418
+ from: ProjectSpaceAccessOrigin.GROUP_MEMBERSHIP,
419
+ },
420
+ ],
421
+ }));
422
+ // projectRole should be VIEWER (from org), not DEVELOPER (from group)
423
+ expect(result[0].projectRole).toBe(ProjectMemberRole.VIEWER);
424
+ });
425
+ it('includes direct project membership in projectRole', () => {
426
+ const result = resolveSpaceAccess(makeInput({
427
+ organizationAccess: [
428
+ {
429
+ userUuid: 'user-1',
430
+ spaceUuid: 'space-1',
431
+ role: OrganizationMemberRole.VIEWER,
432
+ },
433
+ ],
434
+ projectAccess: [
435
+ {
436
+ userUuid: 'user-1',
437
+ spaceUuid: 'space-1',
438
+ role: ProjectMemberRole.EDITOR,
439
+ from: ProjectSpaceAccessOrigin.PROJECT_MEMBERSHIP,
440
+ },
441
+ ],
442
+ }));
443
+ expect(result[0].projectRole).toBe(ProjectMemberRole.EDITOR);
444
+ });
445
+ });
446
+ describe('multiple users', () => {
447
+ it('resolves access for multiple users independently', () => {
448
+ const orgAccess = [
449
+ {
450
+ userUuid: 'user-1',
451
+ spaceUuid: 'space-1',
452
+ role: OrganizationMemberRole.EDITOR,
453
+ },
454
+ {
455
+ userUuid: 'user-2',
456
+ spaceUuid: 'space-1',
457
+ role: OrganizationMemberRole.VIEWER,
458
+ },
459
+ ];
460
+ const directAccess = [
461
+ {
462
+ userUuid: 'user-2',
463
+ spaceUuid: 'space-1',
464
+ role: SpaceMemberRole.ADMIN,
465
+ from: DirectSpaceAccessOrigin.USER_ACCESS,
466
+ },
467
+ ];
468
+ const projectAccess = [];
469
+ const result = resolveSpaceAccess(makeInput({
470
+ organizationAccess: orgAccess,
471
+ directAccess,
472
+ projectAccess,
473
+ }));
474
+ expect(result).toHaveLength(2);
475
+ const user1 = result.find((r) => r.userUuid === 'user-1');
476
+ const user2 = result.find((r) => r.userUuid === 'user-2');
477
+ expect(user1?.role).toBe(SpaceMemberRole.EDITOR);
478
+ expect(user1?.hasDirectAccess).toBe(false);
479
+ expect(user2?.role).toBe(SpaceMemberRole.ADMIN);
480
+ expect(user2?.hasDirectAccess).toBe(true);
481
+ });
482
+ });
483
+ });
484
+ //# sourceMappingURL=spaceAccessResolver.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spaceAccessResolver.test.js","sourceRoot":"","sources":["../../../../src/authorization/space/spaceAccessResolver.test.ts"],"names":[],"mappings":"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"}
@@ -17,6 +17,7 @@ export * from './authorization/parseAccount';
17
17
  export * from './authorization/roleToScopeMapping';
18
18
  export * from './authorization/scopes';
19
19
  export * from './authorization/serviceAccountAbility';
20
+ export * from './authorization/space/spaceAccessResolver';
20
21
  export * from './authorization/types';
21
22
  export * from './compiler/compilationReport';
22
23
  export * from './compiler/exploreCompiler';