Skip to content

Commit b9d196f

Browse files
authored
feat(uaa-integration): Filter activity types for UAA (#3369)
* feat(uaa-integration): Filter activity types for UAA * feat(uaa-integration): Fix lint errors * feat(uaa-integration): address PR comments * feat(uaa-integration): fix test * feat(uaa-integration): Fix another test * feat(uaa-integration): Fix lint issue * feat(uaa-integration): remove mutation from array
1 parent cbff7f1 commit b9d196f

File tree

4 files changed

+85
-26
lines changed

4 files changed

+85
-26
lines changed

src/api/Feed.js

+23-7
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import {
3535
FILE_ACTIVITY_TYPE_TASK,
3636
HTTP_STATUS_CODE_CONFLICT,
3737
IS_ERROR_DISPLAYED,
38+
PERMISSION_CAN_VIEW_ANNOTATIONS,
3839
TASK_NEW_APPROVED,
3940
TASK_NEW_COMPLETED,
4041
TASK_NEW_REJECTED,
@@ -518,13 +519,22 @@ class Feed extends Base {
518519

519520
const versionsPromise = shouldShowVersions ? this.fetchVersions() : Promise.resolve();
520521
const currentVersionPromise = shouldShowVersions ? this.fetchCurrentVersion() : Promise.resolve();
522+
523+
const annotationActivityType =
524+
shouldShowAnnotations && permissions[PERMISSION_CAN_VIEW_ANNOTATIONS]
525+
? [FILE_ACTIVITY_TYPE_ANNOTATION]
526+
: [];
527+
const appActivityActivityType = shouldShowAppActivity ? [FILE_ACTIVITY_TYPE_APP_ACTIVITY] : [];
528+
const taskActivityType = shouldShowTasks ? [FILE_ACTIVITY_TYPE_TASK] : [];
529+
const filteredActivityTypes = [
530+
...annotationActivityType,
531+
...appActivityActivityType,
532+
FILE_ACTIVITY_TYPE_COMMENT,
533+
...taskActivityType,
534+
];
535+
521536
const fileActivitiesPromise = shouldUseUAA
522-
? this.fetchFileActivities(permissions, [
523-
FILE_ACTIVITY_TYPE_ANNOTATION,
524-
FILE_ACTIVITY_TYPE_APP_ACTIVITY,
525-
FILE_ACTIVITY_TYPE_COMMENT,
526-
FILE_ACTIVITY_TYPE_TASK,
527-
])
537+
? this.fetchFileActivities(permissions, filteredActivityTypes, shouldShowReplies)
528538
: Promise.resolve();
529539

530540
const handleFeedItems = (feedItems: FeedItems) => {
@@ -675,9 +685,14 @@ class Feed extends Base {
675685
*
676686
* @param {BoxItemPermission} permissions - the file permissions
677687
* @param {FileActivityTypes[]} activityTypes - the activity types to filter by
688+
* @param {boolean} shouldShowReplies - specify if replies should be included in the response
678689
* @return {Promise} - the file comments
679690
*/
680-
fetchFileActivities(permissions: BoxItemPermission, activityTypes: FileActivityTypes[]): Promise<Object> {
691+
fetchFileActivities(
692+
permissions: BoxItemPermission,
693+
activityTypes: FileActivityTypes[],
694+
shouldShowReplies?: boolean = false,
695+
): Promise<Object> {
681696
this.fileActivitiesAPI = new FileActivitiesAPI(this.options);
682697
return new Promise(resolve => {
683698
this.fileActivitiesAPI.getActivities({
@@ -686,6 +701,7 @@ class Feed extends Base {
686701
permissions,
687702
successCallback: resolve,
688703
activityTypes,
704+
shouldShowReplies,
689705
});
690706
});
691707
}

src/api/FileActivities.js

+27-8
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,29 @@
55
*/
66

77
import Base from './Base';
8-
import { PERMISSION_CAN_COMMENT, PERMISSION_CAN_VIEW_ANNOTATIONS, ERROR_CODE_FETCH_ACTIVITY } from '../constants';
8+
import {
9+
ERROR_CODE_FETCH_ACTIVITY,
10+
FILE_ACTIVITY_TYPE_ANNOTATION,
11+
FILE_ACTIVITY_TYPE_COMMENT,
12+
PERMISSION_CAN_COMMENT,
13+
PERMISSION_CAN_VIEW_ANNOTATIONS,
14+
} from '../constants';
915
import type { BoxItemPermission } from '../common/types/core';
1016
import type { ElementsXhrError } from '../common/types/api';
1117
import type { FileActivity, FileActivityTypes } from '../common/types/feed';
1218

1319
// We only show the latest reply in the UI
1420
const REPLY_LIMIT = 1;
1521

16-
const getFileActivityQueryParams = (fileID: string, activityTypes?: FileActivityTypes[] = []) => {
22+
const getFileActivityQueryParams = (
23+
fileID: string,
24+
activityTypes?: FileActivityTypes[] = [],
25+
shouldShowReplies?: boolean = false,
26+
) => {
1727
const baseEndpoint = `/file_activities?file_id=${fileID}`;
1828
const hasActivityTypes = !!activityTypes && !!activityTypes.length;
19-
const enabledRepliesQueryParam = `&enable_replies=true&reply_limit=${REPLY_LIMIT}`;
29+
const enableReplies = shouldShowReplies ? 'true' : 'false';
30+
const enabledRepliesQueryParam = `&enable_replies=${enableReplies}&reply_limit=${REPLY_LIMIT}`;
2031
const activityTypeQueryParam = hasActivityTypes ? `&activity_types=${activityTypes.join()}` : '';
2132

2233
return `${baseEndpoint}${activityTypeQueryParam}${enabledRepliesQueryParam}`;
@@ -28,10 +39,11 @@ class FileActivities extends Base {
2839
*
2940
* @param {string} [id] - a box file id
3041
* @param {Array<FileActivityTypes>} activityTypes - optional. Array of File Activity types to filter by, returns all Activity Types if omitted.
42+
* @param {boolean} shouldShowReplies - optional. Specify if replies should be included in the response
3143
* @return {string} base url for files
3244
*/
33-
getFilteredUrl(id: string, activityTypes?: FileActivityTypes[]): string {
34-
return `${this.getBaseApiUrl()}${getFileActivityQueryParams(id, activityTypes)}`;
45+
getFilteredUrl(id: string, activityTypes?: FileActivityTypes[], shouldShowReplies?: boolean): string {
46+
return `${this.getBaseApiUrl()}${getFileActivityQueryParams(id, activityTypes, shouldShowReplies)}`;
3547
}
3648

3749
/**
@@ -42,6 +54,7 @@ class FileActivities extends Base {
4254
* @param {string} fileId - the file id
4355
* @param {BoxItemPermission} permissions - the permissions for the file
4456
* @param {number} repliesCount - number of replies to return, by default all replies are returned
57+
* @param {boolean} shouldShowReplies - specify if replies should be included in the response
4558
* @param {Function} successCallback - the success callback
4659
* @returns {void}
4760
*/
@@ -51,13 +64,15 @@ class FileActivities extends Base {
5164
fileID,
5265
permissions,
5366
repliesCount,
67+
shouldShowReplies,
5468
successCallback,
5569
}: {
5670
activityTypes: FileActivityTypes[],
5771
errorCallback: (e: ElementsXhrError, code: string) => void,
5872
fileID: string,
5973
permissions: BoxItemPermission,
6074
repliesCount?: number,
75+
shouldShowReplies?: boolean,
6176
successCallback: (activity: FileActivity) => void,
6277
}): void {
6378
this.errorCode = ERROR_CODE_FETCH_ACTIVITY;
@@ -66,8 +81,12 @@ class FileActivities extends Base {
6681
throw new Error('Missing file id!');
6782
}
6883

69-
this.checkApiCallValidity(PERMISSION_CAN_COMMENT, permissions, fileID);
70-
this.checkApiCallValidity(PERMISSION_CAN_VIEW_ANNOTATIONS, permissions, fileID);
84+
if (activityTypes.includes(FILE_ACTIVITY_TYPE_COMMENT)) {
85+
this.checkApiCallValidity(PERMISSION_CAN_COMMENT, permissions, fileID);
86+
}
87+
if (activityTypes.includes(FILE_ACTIVITY_TYPE_ANNOTATION)) {
88+
this.checkApiCallValidity(PERMISSION_CAN_VIEW_ANNOTATIONS, permissions, fileID);
89+
}
7190
} catch (e) {
7291
errorCallback(e, this.errorCode);
7392
return;
@@ -80,7 +99,7 @@ class FileActivities extends Base {
8099
requestData: {
81100
...(repliesCount ? { replies_count: repliesCount } : null),
82101
},
83-
url: this.getFilteredUrl(fileID, activityTypes),
102+
url: this.getFilteredUrl(fileID, activityTypes, shouldShowReplies),
84103
});
85104
}
86105
}

src/api/__tests__/Feed.test.js

+19-8
Original file line numberDiff line numberDiff line change
@@ -606,14 +606,24 @@ describe('api/Feed', () => {
606606
});
607607

608608
test('should use the file activities api if shouldUseUAA is true', done => {
609-
feed.feedItems(file, false, successCb, errorCb, errorCb, { shouldUseUAA: true });
609+
feed.feedItems(file, false, successCb, errorCb, errorCb, {
610+
shouldUseUAA: true,
611+
shouldShowAnnotations: true,
612+
shouldShowAppActivity: true,
613+
shouldShowTasks: true,
614+
shouldShowReplies: true,
615+
});
610616
setImmediate(() => {
611-
expect(feed.fetchFileActivities).toBeCalledWith(file.permissions, [
612-
FILE_ACTIVITY_TYPE_ANNOTATION,
613-
FILE_ACTIVITY_TYPE_APP_ACTIVITY,
614-
FILE_ACTIVITY_TYPE_COMMENT,
615-
FILE_ACTIVITY_TYPE_TASK,
616-
]);
617+
expect(feed.fetchFileActivities).toBeCalledWith(
618+
file.permissions,
619+
[
620+
FILE_ACTIVITY_TYPE_ANNOTATION,
621+
FILE_ACTIVITY_TYPE_APP_ACTIVITY,
622+
FILE_ACTIVITY_TYPE_COMMENT,
623+
FILE_ACTIVITY_TYPE_TASK,
624+
],
625+
true,
626+
);
617627
expect(feed.fetchComments).not.toBeCalled();
618628
expect(feed.fetchThreadedComments).not.toBeCalled();
619629
done();
@@ -842,7 +852,7 @@ describe('api/Feed', () => {
842852
});
843853

844854
test('should return a promise and call the file activities api', () => {
845-
const permissions = { can_edit: true, can_delete: true, can_resolve: true };
855+
const permissions = { can_edit: true, can_delete: true, can_resolve: true, can_view_annotations: true };
846856
const fileActivityItems = feed.fetchFileActivities(permissions, [
847857
FILE_ACTIVITY_TYPE_ANNOTATION,
848858
FILE_ACTIVITY_TYPE_APP_ACTIVITY,
@@ -860,6 +870,7 @@ describe('api/Feed', () => {
860870
errorCallback: expect.any(Function),
861871
fileID: feed.file.id,
862872
permissions,
873+
shouldShowReplies: false,
863874
successCallback: expect.any(Function),
864875
});
865876
expect(fileActivityItems).resolves.toEqual({ entries: mockFileActivities });

src/api/__tests__/FileActivities.test.js

+16-3
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,24 @@ describe('api/FileActivities', () => {
2626
`(
2727
'should return the filtered query parameters as $expected when $activityTypes is passed in',
2828
({ activityTypes, expected }) => {
29-
expect(fileActivities.getFilteredUrl('1', activityTypes)).toBe(
29+
expect(fileActivities.getFilteredUrl('1', activityTypes, true)).toBe(
3030
`https://api.box.com/2.0/file_activities?file_id=1${expected}&enable_replies=true&reply_limit=1`,
3131
);
3232
},
3333
);
34+
35+
test.each`
36+
enableReplies | expected
37+
${true} | ${'&enable_replies=true'}
38+
${false} | ${'&enable_replies=false'}
39+
`(
40+
'should return the enable_replies as $expected when $enableReplies is passed in',
41+
({ enableReplies, expected }) => {
42+
expect(fileActivities.getFilteredUrl('1', ['comment', 'annotation', 'task'], enableReplies)).toBe(
43+
`https://api.box.com/2.0/file_activities?file_id=1&activity_types=comment,annotation,task${expected}&reply_limit=1`,
44+
);
45+
},
46+
);
3447
});
3548

3649
describe('getActivities()', () => {
@@ -40,7 +53,6 @@ describe('api/FileActivities', () => {
4053
test('should call the underlying get method', () => {
4154
const permissions = {
4255
can_comment: true,
43-
can_view_annotations: true,
4456
};
4557

4658
fileActivities.getActivities({
@@ -49,6 +61,7 @@ describe('api/FileActivities', () => {
4961
permissions,
5062
successCallback,
5163
errorCallback,
64+
shouldShowReplies: true,
5265
});
5366

5467
expect(fileActivities.get).toBeCalledWith({
@@ -68,7 +81,7 @@ describe('api/FileActivities', () => {
6881
])('should reject with an error code for calls with invalid permissions %s', permissions => {
6982
fileActivities.getActivities({
7083
fileID: '123',
71-
activityTypes: ['comment', 'task'],
84+
activityTypes: ['annotation', 'comment', 'task'],
7285
permissions,
7386
successCallback,
7487
errorCallback,

0 commit comments

Comments
 (0)