Skip to content

Commit 39516aa

Browse files
Review responses and linting fixes
Better handling of access role / permission level in an enum, move some data manipulation methods to mapping service, and fix the tests.
1 parent 0b91710 commit 39516aa

File tree

13 files changed

+341
-282
lines changed

13 files changed

+341
-282
lines changed

src/app/core/services/edit/edit.service.spec.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { AccountService } from '@shared/services/account/account.service';
99
import { RecordRepo } from '@shared/services/api/record.repo';
1010
import { MessageService } from '@shared/services/message/message.service';
1111
import { DataService } from '@shared/services/data/data.service';
12+
import { ShareLinksApiService } from '@root/app/share-links/services/share-links-api.service';
1213
import { FolderPickerService } from '../folder-picker/folder-picker.service';
1314

1415
const mockDataService = {
@@ -22,6 +23,7 @@ describe('EditService', () => {
2223
let service: EditService;
2324
let apiService: jasmine.SpyObj<ApiService>;
2425
let accountService: jasmine.SpyObj<AccountService>;
26+
let shareLinksApiService: jasmine.SpyObj<ShareLinksApiService>;
2527
beforeEach(() => {
2628
apiService = jasmine.createSpyObj('ApiService', ['record']);
2729
apiService.record = {
@@ -32,6 +34,14 @@ describe('EditService', () => {
3234
accountService.getArchive.and.returnValue(
3335
new ArchiveVO({ archiveId: 123 }),
3436
);
37+
38+
shareLinksApiService = jasmine.createSpyObj('ShareLinksApiService', [
39+
'generateShareLink',
40+
'getShareLinksById',
41+
'updateShareLink',
42+
'deleteShareLink',
43+
]);
44+
3545
const config = cloneDeep(Testing.BASE_TEST_CONFIG);
3646
config.imports.push(NgbTooltipModule);
3747
TestBed.configureTestingModule({
@@ -42,6 +52,7 @@ describe('EditService', () => {
4252
{ provide: DataService, useValue: mockDataService },
4353
{ provide: ApiService, useValue: apiService },
4454
{ provide: AccountService, useValue: accountService },
55+
{ provide: ShareLinksApiService, useValue: shareLinksApiService },
4556
],
4657
});
4758

src/app/core/services/edit/edit.service.ts

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -256,18 +256,14 @@ export class EditService {
256256
const response: ShareResponse = await this.api.share.getShareLink(
257257
items[0],
258258
);
259-
let newShareLink: ShareLink;
260-
if (response.getShareByUrlVO()) {
261-
const shareResponse = await this.shareApi.getShareLinksById([response.getShareByUrlVO().shareby_urlId]);
262-
newShareLink = shareResponse[0];
263-
}
259+
const newShareLink = await this.fetchShareLinkFromResponse(response);
264260

265261
actionDeferred.resolve();
266262
this.dialog.open(SharingComponent, {
267263
data: {
268264
item: items[0],
269265
link: response.getShareByUrlVO(),
270-
newShare: newShareLink
266+
newShare: newShareLink,
271267
},
272268
});
273269
break;
@@ -427,7 +423,7 @@ export class EditService {
427423
});
428424
}
429425

430-
if (recordResponse) {
426+
if (recordResponse && recordResponse.length > 0) {
431427
const res = recordResponse[0];
432428

433429
const newData: RecordVOData = {
@@ -532,22 +528,26 @@ export class EditService {
532528

533529
async openShareDialog(item: ItemVO) {
534530
const response = await this.api.share.getShareLink(item);
535-
let newShareLink: ShareLink;
536-
if (response.getShareByUrlVO()) {
537-
const shareResponse = await this.shareApi.getShareLinksById([response.getShareByUrlVO().shareby_urlId]);
538-
newShareLink = shareResponse[0];
539-
}
531+
const newShareLink = await this.fetchShareLinkFromResponse(response);
540532
if (this.device.isMobile()) {
541533
try {
542534
this.dialog.open(SharingComponent, {
543535
panelClass: 'dialog',
544-
data: { item, link: response.getShareByUrlVO(), newShare: newShareLink},
536+
data: {
537+
item,
538+
link: response.getShareByUrlVO(),
539+
newShare: newShareLink,
540+
},
545541
});
546542
} catch (err) {}
547543
} else {
548544
try {
549545
this.dialog.open(SharingDialogComponent, {
550-
data: { item, link: response.getShareByUrlVO(), newShare: newShareLink},
546+
data: {
547+
item,
548+
link: response.getShareByUrlVO(),
549+
newShare: newShareLink,
550+
},
551551
width: '600px',
552552
panelClass: 'dialog',
553553
});
@@ -564,6 +564,18 @@ export class EditService {
564564
});
565565
}
566566

567+
private async fetchShareLinkFromResponse(
568+
response: ShareResponse,
569+
): Promise<ShareLink | undefined> {
570+
if (response.getShareByUrlVO()) {
571+
const shareResponse = await this.shareApi.getShareLinksById([
572+
response.getShareByUrlVO().shareby_urlId,
573+
]);
574+
return shareResponse[0];
575+
}
576+
return undefined;
577+
}
578+
567579
async openTagsDialog(item: ItemVO, type: string) {
568580
this.dialog.open(EditTagsComponent, {
569581
data: { item, type },

src/app/file-browser/components/share-link-dropdown/share-link-dropdown.component.spec.ts

Lines changed: 0 additions & 92 deletions
This file was deleted.

src/app/file-browser/components/share-link-dropdown/share-link-dropdown.component.ts

Lines changed: 0 additions & 34 deletions
This file was deleted.
Lines changed: 101 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
import { Subject } from 'rxjs';
22
import { ArchiveVO, ShareByUrlVO } from '@models/index';
3+
import { ShareLink } from '@root/app/share-links/models/share-link';
4+
import { Expiration } from '@root/app/share-links/services/share-link-mapping.service';
35

46
export class MockAccountService {
57
public archiveChange = new Subject();
68

79
public getArchive = () => new ArchiveVO({});
810
}
9-
export class MockApiService {
11+
export class MockShareLinksApiService {
1012
public static readonly initialData = {
1113
defaultAccessRole: 'access.role.viewer',
1214
createdDT: '2023-02-15T20:31:36',
@@ -15,24 +17,77 @@ export class MockApiService {
1517
status: 'status.generic.ok',
1618
};
1719
public static shareByUrlVO: ShareByUrlVO = new ShareByUrlVO(
18-
MockApiService.initialData,
20+
MockShareLinksApiService.initialData,
1921
);
2022

23+
public static mockShareLink: ShareLink = {
24+
id: '1',
25+
itemId: '1',
26+
itemType: 'record',
27+
token: 'example.com/test-token',
28+
permissionsLevel: 'viewer',
29+
accessRestrictions: 'none',
30+
maxUses: null,
31+
usesExpended: null,
32+
expirationTimestamp: null,
33+
createdAt: new Date('2023-02-15T20:31:36'),
34+
updatedAt: new Date('2023-02-15T20:31:36'),
35+
};
36+
2137
public share = {
2238
generateShareLink: async () => ({
23-
getShareByUrlVO: () => MockApiService.shareByUrlVO,
39+
getShareByUrlVO: () => MockShareLinksApiService.shareByUrlVO,
2440
}),
2541
updateShareLink: async (shareLink: ShareByUrlVO) => {
26-
MockApiService.shareByUrlVO = shareLink;
27-
return MockApiService.shareByUrlVO;
42+
MockShareLinksApiService.shareByUrlVO = shareLink;
43+
return MockShareLinksApiService.shareByUrlVO;
2844
},
2945
removeShareLink: async (_shareLink: ShareByUrlVO) => {
30-
MockApiService.reset();
46+
MockShareLinksApiService.reset();
3147
},
3248
};
3349

50+
// Mock for ShareLinksApiService methods
51+
public generateShareLink = async ({
52+
itemId,
53+
itemType,
54+
}: {
55+
itemId: string;
56+
itemType: 'record' | 'folder';
57+
}): Promise<ShareLink> => MockShareLinksApiService.mockShareLink;
58+
59+
public updateShareLink = async (
60+
shareLinkId: string,
61+
payload: Partial<ShareLink>,
62+
): Promise<ShareLink> => {
63+
MockShareLinksApiService.mockShareLink = {
64+
...MockShareLinksApiService.mockShareLink,
65+
...payload,
66+
};
67+
return MockShareLinksApiService.mockShareLink;
68+
};
69+
70+
public deleteShareLink = async (shareLinkId: string): Promise<void> => {
71+
MockShareLinksApiService.reset();
72+
};
73+
3474
public static reset(): void {
35-
MockApiService.shareByUrlVO = new ShareByUrlVO(MockApiService.initialData);
75+
MockShareLinksApiService.shareByUrlVO = new ShareByUrlVO(
76+
MockShareLinksApiService.initialData,
77+
);
78+
MockShareLinksApiService.mockShareLink = {
79+
id: '1',
80+
itemId: '1',
81+
itemType: 'record',
82+
token: 'example.com/test-token',
83+
permissionsLevel: 'viewer',
84+
accessRestrictions: 'none',
85+
maxUses: null,
86+
usesExpended: null,
87+
expirationTimestamp: null,
88+
createdAt: new Date('2023-02-15T20:31:36'),
89+
updatedAt: new Date('2023-02-15T20:31:36'),
90+
};
3691
}
3792
}
3893
export class MockRelationshipService {
@@ -41,4 +96,43 @@ export class MockRelationshipService {
4196
export class MockPromptService {
4297
public async confirm() {}
4398
}
99+
export class MockShareLinkMappingService {
100+
public calculateAccessRestrictions = (
101+
linkType: string,
102+
autoApprove: number,
103+
) => {
104+
if (linkType === 'public') {
105+
return 'none';
106+
}
107+
return 'restricted';
108+
};
109+
110+
public getExpirationFromExpirationTimestamp = (
111+
expirationTimestamp: Date,
112+
createdAt: Date,
113+
): Expiration => {
114+
if (!expirationTimestamp) {
115+
return Expiration.Never;
116+
}
117+
return Expiration.Never;
118+
};
119+
120+
public getExpiresDTFromExpiration = (
121+
expiration: Expiration,
122+
createdAt: Date,
123+
): string | null => {
124+
if (expiration === Expiration.Never) {
125+
return null;
126+
}
127+
return '2024-01-01T00:00:00';
128+
};
129+
}
130+
export class MockFeatureFlagService {
131+
public isEnabled = (flag: string): boolean => false;
132+
}
133+
export class MockGoogleAnalyticsService {
134+
public sendEvent = (params: any): void => {
135+
// No-op for tests
136+
};
137+
}
44138
export class NullDependency {}

0 commit comments

Comments
 (0)