From 990d5003336e2acdabf5451c777fa094dbf4219a Mon Sep 17 00:00:00 2001 From: Balu Babu Date: Mon, 4 Dec 2023 13:52:07 +0530 Subject: [PATCH] chore: updated all tests in team-collection module --- .../team-collection/team-collection.model.ts | 1 - .../team-collection.service.spec.ts | 291 +++++++++++++++--- .../team-collection.service.ts | 3 + .../src/user-collection/input-type.args.ts | 22 ++ .../user-collection.resolver.ts | 21 ++ .../user-collection.service.ts | 49 +++ 6 files changed, 350 insertions(+), 37 deletions(-) diff --git a/packages/hoppscotch-backend/src/team-collection/team-collection.model.ts b/packages/hoppscotch-backend/src/team-collection/team-collection.model.ts index df1edac10..d34a290f8 100644 --- a/packages/hoppscotch-backend/src/team-collection/team-collection.model.ts +++ b/packages/hoppscotch-backend/src/team-collection/team-collection.model.ts @@ -23,7 +23,6 @@ export class TeamCollection { nullable: true, }) parentID: string; - teamID: string; } @ObjectType() diff --git a/packages/hoppscotch-backend/src/team-collection/team-collection.service.spec.ts b/packages/hoppscotch-backend/src/team-collection/team-collection.service.spec.ts index 076c30408..0e4983a9b 100644 --- a/packages/hoppscotch-backend/src/team-collection/team-collection.service.spec.ts +++ b/packages/hoppscotch-backend/src/team-collection/team-collection.service.spec.ts @@ -1,6 +1,7 @@ import { Team, TeamCollection as DBTeamCollection } from '@prisma/client'; import { mockDeep, mockReset } from 'jest-mock-extended'; import { + TEAM_COLL_DATA_INVALID, TEAM_COLL_DEST_SAME, TEAM_COLL_INVALID_JSON, TEAM_COLL_IS_PARENT_COLL, @@ -17,6 +18,7 @@ import { PrismaService } from 'src/prisma/prisma.service'; import { PubSubService } from 'src/pubsub/pubsub.service'; import { AuthUser } from 'src/types/AuthUser'; import { TeamCollectionService } from './team-collection.service'; +import { TeamCollection } from './team-collection.model'; const mockPrisma = mockDeep(); const mockPubSub = mockDeep(); @@ -51,35 +53,60 @@ const rootTeamCollection: DBTeamCollection = { id: '123', orderIndex: 1, parentID: null, + data: {}, title: 'Root Collection 1', teamID: team.id, createdOn: currentTime, updatedOn: currentTime, }; +const rootTeamCollectionsCasted: TeamCollection = { + id: rootTeamCollection.id, + title: rootTeamCollection.title, + parentID: rootTeamCollection.parentID, + data: JSON.stringify(rootTeamCollection.data), +}; + const rootTeamCollection_2: DBTeamCollection = { id: 'erv', orderIndex: 2, parentID: null, + data: {}, title: 'Root Collection 1', teamID: team.id, createdOn: currentTime, updatedOn: currentTime, }; +const rootTeamCollection_2Casted: TeamCollection = { + id: 'erv', + parentID: null, + data: JSON.stringify(rootTeamCollection_2.data), + title: 'Root Collection 1', +}; + const childTeamCollection: DBTeamCollection = { id: 'rfe', orderIndex: 1, parentID: rootTeamCollection.id, + data: {}, title: 'Child Collection 1', teamID: team.id, createdOn: currentTime, updatedOn: currentTime, }; +const childTeamCollectionCasted: TeamCollection = { + id: 'rfe', + parentID: rootTeamCollection.id, + data: JSON.stringify(childTeamCollection.data), + title: 'Child Collection 1', +}; + const childTeamCollection_2: DBTeamCollection = { id: 'bgdz', orderIndex: 1, + data: {}, parentID: rootTeamCollection_2.id, title: 'Child Collection 1', teamID: team.id, @@ -87,11 +114,20 @@ const childTeamCollection_2: DBTeamCollection = { updatedOn: currentTime, }; +const childTeamCollection_2Casted: TeamCollection = { + id: 'bgdz', + data: JSON.stringify(childTeamCollection_2.data), + parentID: rootTeamCollection_2.id, + title: 'Child Collection 1', +}; + const rootTeamCollectionList: DBTeamCollection[] = [ { id: 'fdv', orderIndex: 1, parentID: null, + data: {}, + title: 'Root Collection 1', teamID: team.id, createdOn: currentTime, @@ -102,6 +138,8 @@ const rootTeamCollectionList: DBTeamCollection[] = [ orderIndex: 2, parentID: null, title: 'Root Collection 1', + data: {}, + teamID: team.id, createdOn: currentTime, updatedOn: currentTime, @@ -111,6 +149,8 @@ const rootTeamCollectionList: DBTeamCollection[] = [ orderIndex: 3, parentID: null, title: 'Root Collection 1', + data: {}, + teamID: team.id, createdOn: currentTime, updatedOn: currentTime, @@ -119,6 +159,8 @@ const rootTeamCollectionList: DBTeamCollection[] = [ id: 'bre3', orderIndex: 4, parentID: null, + data: {}, + title: 'Root Collection 1', teamID: team.id, createdOn: currentTime, @@ -129,6 +171,8 @@ const rootTeamCollectionList: DBTeamCollection[] = [ orderIndex: 5, parentID: null, title: 'Root Collection 1', + data: {}, + teamID: team.id, createdOn: currentTime, updatedOn: currentTime, @@ -139,6 +183,8 @@ const rootTeamCollectionList: DBTeamCollection[] = [ parentID: null, title: 'Root Collection 1', teamID: team.id, + data: {}, + createdOn: currentTime, updatedOn: currentTime, }, @@ -148,6 +194,8 @@ const rootTeamCollectionList: DBTeamCollection[] = [ parentID: null, title: 'Root Collection 1', teamID: team.id, + data: {}, + createdOn: currentTime, updatedOn: currentTime, }, @@ -156,6 +204,7 @@ const rootTeamCollectionList: DBTeamCollection[] = [ orderIndex: 8, parentID: null, title: 'Root Collection 1', + data: {}, teamID: team.id, createdOn: currentTime, updatedOn: currentTime, @@ -165,6 +214,7 @@ const rootTeamCollectionList: DBTeamCollection[] = [ orderIndex: 9, parentID: null, title: 'Root Collection 1', + data: {}, teamID: team.id, createdOn: currentTime, updatedOn: currentTime, @@ -175,17 +225,83 @@ const rootTeamCollectionList: DBTeamCollection[] = [ parentID: null, title: 'Root Collection 1', teamID: team.id, + data: {}, createdOn: currentTime, updatedOn: currentTime, }, ]; +const rootTeamCollectionListCasted: TeamCollection[] = [ + { + id: 'fdv', + parentID: null, + title: 'Root Collection 1', + data: JSON.stringify(rootTeamCollection.data), + }, + { + id: 'fbbg', + parentID: null, + title: 'Root Collection 1', + data: JSON.stringify(rootTeamCollection.data), + }, + { + id: 'fgbfg', + parentID: null, + title: 'Root Collection 1', + data: JSON.stringify(rootTeamCollection.data), + }, + { + id: 'bre3', + parentID: null, + data: JSON.stringify(rootTeamCollection.data), + title: 'Root Collection 1', + }, + { + id: 'hghgf', + parentID: null, + title: 'Root Collection 1', + data: JSON.stringify(rootTeamCollection.data), + }, + { + id: '123', + parentID: null, + title: 'Root Collection 1', + data: JSON.stringify(rootTeamCollection.data), + }, + { + id: '54tyh', + parentID: null, + title: 'Root Collection 1', + data: JSON.stringify(rootTeamCollection.data), + }, + { + id: '234re', + parentID: null, + title: 'Root Collection 1', + data: JSON.stringify(rootTeamCollection.data), + }, + { + id: '34rtg', + parentID: null, + title: 'Root Collection 1', + data: JSON.stringify(rootTeamCollection.data), + }, + { + id: '45tgh', + parentID: null, + title: 'Root Collection 1', + data: JSON.stringify(rootTeamCollection.data), + }, +]; + const childTeamCollectionList: DBTeamCollection[] = [ { id: '123', orderIndex: 1, parentID: rootTeamCollection.id, title: 'Root Collection 1', + data: {}, + teamID: team.id, createdOn: currentTime, updatedOn: currentTime, @@ -195,6 +311,8 @@ const childTeamCollectionList: DBTeamCollection[] = [ orderIndex: 2, parentID: rootTeamCollection.id, title: 'Root Collection 1', + data: {}, + teamID: team.id, createdOn: currentTime, updatedOn: currentTime, @@ -204,6 +322,8 @@ const childTeamCollectionList: DBTeamCollection[] = [ orderIndex: 3, parentID: rootTeamCollection.id, title: 'Root Collection 1', + data: {}, + teamID: team.id, createdOn: currentTime, updatedOn: currentTime, @@ -212,6 +332,8 @@ const childTeamCollectionList: DBTeamCollection[] = [ id: '567', orderIndex: 4, parentID: rootTeamCollection.id, + data: {}, + title: 'Root Collection 1', teamID: team.id, createdOn: currentTime, @@ -221,6 +343,8 @@ const childTeamCollectionList: DBTeamCollection[] = [ id: '123', orderIndex: 5, parentID: rootTeamCollection.id, + data: {}, + title: 'Root Collection 1', teamID: team.id, createdOn: currentTime, @@ -230,6 +354,8 @@ const childTeamCollectionList: DBTeamCollection[] = [ id: '678', orderIndex: 6, parentID: rootTeamCollection.id, + data: {}, + title: 'Root Collection 1', teamID: team.id, createdOn: currentTime, @@ -239,6 +365,8 @@ const childTeamCollectionList: DBTeamCollection[] = [ id: '789', orderIndex: 7, parentID: rootTeamCollection.id, + data: {}, + title: 'Root Collection 1', teamID: team.id, createdOn: currentTime, @@ -248,6 +376,8 @@ const childTeamCollectionList: DBTeamCollection[] = [ id: '890', orderIndex: 8, parentID: rootTeamCollection.id, + data: {}, + title: 'Root Collection 1', teamID: team.id, createdOn: currentTime, @@ -257,6 +387,7 @@ const childTeamCollectionList: DBTeamCollection[] = [ id: '012', orderIndex: 9, parentID: rootTeamCollection.id, + data: {}, title: 'Root Collection 1', teamID: team.id, createdOn: currentTime, @@ -266,6 +397,8 @@ const childTeamCollectionList: DBTeamCollection[] = [ id: '0bhu', orderIndex: 10, parentID: rootTeamCollection.id, + data: {}, + title: 'Root Collection 1', teamID: team.id, createdOn: currentTime, @@ -273,6 +406,75 @@ const childTeamCollectionList: DBTeamCollection[] = [ }, ]; +const childTeamCollectionListCasted: TeamCollection[] = [ + { + id: '123', + parentID: rootTeamCollection.id, + title: 'Root Collection 1', + data: JSON.stringify({}), + }, + { + id: '345', + parentID: rootTeamCollection.id, + title: 'Root Collection 1', + data: JSON.stringify({}), + }, + { + id: '456', + parentID: rootTeamCollection.id, + title: 'Root Collection 1', + data: JSON.stringify({}), + }, + { + id: '567', + parentID: rootTeamCollection.id, + data: JSON.stringify({}), + + title: 'Root Collection 1', + }, + { + id: '123', + parentID: rootTeamCollection.id, + data: JSON.stringify({}), + + title: 'Root Collection 1', + }, + { + id: '678', + parentID: rootTeamCollection.id, + data: JSON.stringify({}), + + title: 'Root Collection 1', + }, + { + id: '789', + parentID: rootTeamCollection.id, + data: JSON.stringify({}), + + title: 'Root Collection 1', + }, + { + id: '890', + parentID: rootTeamCollection.id, + data: JSON.stringify({}), + + title: 'Root Collection 1', + }, + { + id: '012', + parentID: rootTeamCollection.id, + data: JSON.stringify({}), + title: 'Root Collection 1', + }, + { + id: '0bhu', + parentID: rootTeamCollection.id, + data: JSON.stringify({}), + + title: 'Root Collection 1', + }, +]; + beforeEach(() => { mockReset(mockPrisma); mockPubSub.publish.mockClear(); @@ -311,7 +513,7 @@ describe('getParentOfCollection', () => { const result = await teamCollectionService.getParentOfCollection( childTeamCollection.id, ); - expect(result).toEqual(rootTeamCollection); + expect(result).toEqual(rootTeamCollectionsCasted); }); test('should return null successfully for a root collection with valid collectionID', async () => { @@ -347,7 +549,7 @@ describe('getChildrenOfCollection', () => { null, 10, ); - expect(result).toEqual(childTeamCollectionList); + expect(result).toEqual(childTeamCollectionListCasted); }); test('should return a list of 3 child collections successfully with cursor being equal to the 7th item in the list', async () => { @@ -363,9 +565,9 @@ describe('getChildrenOfCollection', () => { 10, ); expect(result).toEqual([ - { ...childTeamCollectionList[7] }, - { ...childTeamCollectionList[8] }, - { ...childTeamCollectionList[9] }, + { ...childTeamCollectionListCasted[7] }, + { ...childTeamCollectionListCasted[8] }, + { ...childTeamCollectionListCasted[9] }, ]); }); @@ -392,7 +594,7 @@ describe('getTeamRootCollections', () => { null, 10, ); - expect(result).toEqual(rootTeamCollectionList); + expect(result).toEqual(rootTeamCollectionListCasted); }); test('should return a list of 3 root collections successfully with cursor being equal to the 7th item in the list', async () => { @@ -408,9 +610,9 @@ describe('getTeamRootCollections', () => { 10, ); expect(result).toEqual([ - { ...rootTeamCollectionList[7] }, - { ...rootTeamCollectionList[8] }, - { ...rootTeamCollectionList[9] }, + { ...rootTeamCollectionListCasted[7] }, + { ...rootTeamCollectionListCasted[8] }, + { ...rootTeamCollectionListCasted[9] }, ]); }); @@ -464,6 +666,7 @@ describe('createCollection', () => { const result = await teamCollectionService.createCollection( rootTeamCollection.teamID, 'ab', + JSON.stringify(rootTeamCollection.data), rootTeamCollection.id, ); expect(result).toEqualLeft(TEAM_COLL_SHORT_TITLE); @@ -478,11 +681,27 @@ describe('createCollection', () => { const result = await teamCollectionService.createCollection( rootTeamCollection.teamID, 'abcd', + JSON.stringify(rootTeamCollection.data), rootTeamCollection.id, ); expect(result).toEqualLeft(TEAM_NOT_OWNER); }); + test('should throw TEAM_COLL_DATA_INVALID when parent TeamCollection does not belong to the team', async () => { + // isOwnerCheck + mockPrisma.teamCollection.findFirstOrThrow.mockResolvedValueOnce( + rootTeamCollection, + ); + + const result = await teamCollectionService.createCollection( + rootTeamCollection.teamID, + 'abcd', + '{', + rootTeamCollection.id, + ); + expect(result).toEqualLeft(TEAM_COLL_DATA_INVALID); + }); + test('should successfully create a new root TeamCollection with valid inputs', async () => { // isOwnerCheck mockPrisma.teamCollection.findFirstOrThrow.mockResolvedValueOnce( @@ -496,9 +715,10 @@ describe('createCollection', () => { const result = await teamCollectionService.createCollection( rootTeamCollection.teamID, 'abcdefg', + JSON.stringify(rootTeamCollection.data), rootTeamCollection.id, ); - expect(result).toEqualRight(rootTeamCollection); + expect(result).toEqualRight(rootTeamCollectionsCasted); }); test('should successfully create a new child TeamCollection with valid inputs', async () => { @@ -514,9 +734,10 @@ describe('createCollection', () => { const result = await teamCollectionService.createCollection( childTeamCollection.teamID, childTeamCollection.title, + JSON.stringify(rootTeamCollection.data), rootTeamCollection.id, ); - expect(result).toEqualRight(childTeamCollection); + expect(result).toEqualRight(childTeamCollectionCasted); }); test('should send pubsub message to "team_coll//coll_added" if child TeamCollection is created successfully', async () => { @@ -532,11 +753,13 @@ describe('createCollection', () => { const result = await teamCollectionService.createCollection( childTeamCollection.teamID, childTeamCollection.title, + JSON.stringify(rootTeamCollection.data), + rootTeamCollection.id, ); expect(mockPubSub.publish).toHaveBeenCalledWith( `team_coll/${childTeamCollection.teamID}/coll_added`, - childTeamCollection, + childTeamCollectionCasted, ); }); @@ -553,11 +776,13 @@ describe('createCollection', () => { const result = await teamCollectionService.createCollection( rootTeamCollection.teamID, 'abcdefg', + JSON.stringify(rootTeamCollection.data), + rootTeamCollection.id, ); expect(mockPubSub.publish).toHaveBeenCalledWith( `team_coll/${rootTeamCollection.teamID}/coll_added`, - rootTeamCollection, + rootTeamCollectionsCasted, ); }); }); @@ -587,7 +812,7 @@ describe('renameCollection', () => { 'NewTitle', ); expect(result).toEqualRight({ - ...rootTeamCollection, + ...rootTeamCollectionsCasted, title: 'NewTitle', }); }); @@ -625,7 +850,7 @@ describe('renameCollection', () => { expect(mockPubSub.publish).toHaveBeenCalledWith( `team_coll/${rootTeamCollection.teamID}/coll_updated`, { - ...rootTeamCollection, + ...rootTeamCollectionsCasted, title: 'NewTitle', }, ); @@ -832,9 +1057,8 @@ describe('moveCollection', () => { null, ); expect(result).toEqualRight({ - ...childTeamCollection, + ...childTeamCollectionCasted, parentID: null, - orderIndex: 2, }); }); @@ -890,9 +1114,8 @@ describe('moveCollection', () => { expect(mockPubSub.publish).toHaveBeenCalledWith( `team_coll/${childTeamCollection.teamID}/coll_moved`, { - ...childTeamCollection, + ...childTeamCollectionCasted, parentID: null, - orderIndex: 2, }, ); }); @@ -931,9 +1154,8 @@ describe('moveCollection', () => { childTeamCollection_2.id, ); expect(result).toEqualRight({ - ...rootTeamCollection, - parentID: childTeamCollection_2.id, - orderIndex: 1, + ...rootTeamCollectionsCasted, + parentID: childTeamCollection_2Casted.id, }); }); @@ -973,9 +1195,8 @@ describe('moveCollection', () => { expect(mockPubSub.publish).toHaveBeenCalledWith( `team_coll/${childTeamCollection_2.teamID}/coll_moved`, { - ...rootTeamCollection, - parentID: childTeamCollection_2.id, - orderIndex: 1, + ...rootTeamCollectionsCasted, + parentID: childTeamCollection_2Casted.id, }, ); }); @@ -1014,9 +1235,8 @@ describe('moveCollection', () => { childTeamCollection_2.id, ); expect(result).toEqualRight({ - ...childTeamCollection, - parentID: childTeamCollection_2.id, - orderIndex: 1, + ...childTeamCollectionCasted, + parentID: childTeamCollection_2Casted.id, }); }); @@ -1056,9 +1276,8 @@ describe('moveCollection', () => { expect(mockPubSub.publish).toHaveBeenCalledWith( `team_coll/${childTeamCollection.teamID}/coll_moved`, { - ...childTeamCollection, - parentID: childTeamCollection_2.id, - orderIndex: 1, + ...childTeamCollectionCasted, + parentID: childTeamCollection_2Casted.id, }, ); }); @@ -1154,7 +1373,7 @@ describe('updateCollectionOrder', () => { expect(mockPubSub.publish).toHaveBeenCalledWith( `team_coll/${childTeamCollectionList[4].teamID}/coll_order_updated`, { - collection: rootTeamCollectionList[4], + collection: rootTeamCollectionListCasted[4], nextCollection: null, }, ); @@ -1235,8 +1454,8 @@ describe('updateCollectionOrder', () => { expect(mockPubSub.publish).toHaveBeenCalledWith( `team_coll/${childTeamCollectionList[2].teamID}/coll_order_updated`, { - collection: childTeamCollectionList[4], - nextCollection: childTeamCollectionList[2], + collection: childTeamCollectionListCasted[4], + nextCollection: childTeamCollectionListCasted[2], }, ); }); @@ -1302,7 +1521,7 @@ describe('importCollectionsFromJSON', () => { ); expect(mockPubSub.publish).toHaveBeenCalledWith( `team_coll/${rootTeamCollection.teamID}/coll_added`, - rootTeamCollection, + rootTeamCollectionsCasted, ); }); }); @@ -1421,7 +1640,7 @@ describe('replaceCollectionsWithJSON', () => { ); expect(mockPubSub.publish).toHaveBeenCalledWith( `team_coll/${rootTeamCollection.teamID}/coll_added`, - rootTeamCollection, + rootTeamCollectionsCasted, ); }); }); diff --git a/packages/hoppscotch-backend/src/team-collection/team-collection.service.ts b/packages/hoppscotch-backend/src/team-collection/team-collection.service.ts index 3841d57e9..603e28f4a 100644 --- a/packages/hoppscotch-backend/src/team-collection/team-collection.service.ts +++ b/packages/hoppscotch-backend/src/team-collection/team-collection.service.ts @@ -1016,6 +1016,9 @@ export class TeamCollectionService { newTitle: string = null, ) { try { + const isTitleValid = isValidLength(newTitle, this.TITLE_LENGTH); + if (!isTitleValid) return E.left(TEAM_COLL_SHORT_TITLE); + if (collectionData) { const jsonReq = stringToJson(collectionData); if (E.isLeft(jsonReq)) return E.left(TEAM_COLL_DATA_INVALID); diff --git a/packages/hoppscotch-backend/src/user-collection/input-type.args.ts b/packages/hoppscotch-backend/src/user-collection/input-type.args.ts index 0280e0785..cfa8927f1 100644 --- a/packages/hoppscotch-backend/src/user-collection/input-type.args.ts +++ b/packages/hoppscotch-backend/src/user-collection/input-type.args.ts @@ -107,3 +107,25 @@ export class ImportUserCollectionsFromJSONArgs { }) parentCollectionID?: string; } + +@ArgsType() +export class UpdateUserCollectionsArgs { + @Field(() => ID, { + name: 'userCollectionID', + description: 'ID of the user collection', + }) + userCollectionID: string; + + @Field({ + name: 'newTitle', + description: 'The updated title of the user collection', + nullable: true, + }) + newTitle: string; + + @Field({ + name: 'data', + description: 'JSON string representing the collection data', + }) + data: string; +} diff --git a/packages/hoppscotch-backend/src/user-collection/user-collection.resolver.ts b/packages/hoppscotch-backend/src/user-collection/user-collection.resolver.ts index 95a5356d4..6a8a41226 100644 --- a/packages/hoppscotch-backend/src/user-collection/user-collection.resolver.ts +++ b/packages/hoppscotch-backend/src/user-collection/user-collection.resolver.ts @@ -30,6 +30,7 @@ import { MoveUserCollectionArgs, RenameUserCollectionsArgs, UpdateUserCollectionArgs, + UpdateUserCollectionsArgs, } from './input-type.args'; import { ReqType } from 'src/types/RequestTypes'; import * as E from 'fp-ts/Either'; @@ -369,6 +370,26 @@ export class UserCollectionResolver { return importedCollection.right; } + @Mutation(() => UserCollection, { + description: 'Update a UserCollection', + }) + @UseGuards(GqlAuthGuard) + async updateUserCollection( + @GqlUser() user: AuthUser, + @Args() args: UpdateUserCollectionsArgs, + ) { + const updatedUserCollection = + await this.userCollectionService.updateUserCollection( + args.newTitle, + args.data, + args.userCollectionID, + user.uid, + ); + + if (E.isLeft(updatedUserCollection)) throwErr(updatedUserCollection.left); + return updatedUserCollection.right; + } + // Subscriptions @Subscription(() => UserCollection, { description: 'Listen for User Collection Creation', diff --git a/packages/hoppscotch-backend/src/user-collection/user-collection.service.ts b/packages/hoppscotch-backend/src/user-collection/user-collection.service.ts index 445e0377e..b69cf3486 100644 --- a/packages/hoppscotch-backend/src/user-collection/user-collection.service.ts +++ b/packages/hoppscotch-backend/src/user-collection/user-collection.service.ts @@ -1079,4 +1079,53 @@ export class UserCollectionService { return E.right(true); } + + /** + * Update a UserCollection + * + * @param newTitle The new title of collection + * @param userCollectionID The Collection Id + * @param userID The User UID + * @returns An Either of the updated UserCollection + */ + async updateUserCollection( + newTitle: string = null, + collectionData: string, + userCollectionID: string, + userID: string, + ) { + if (collectionData) { + const jsonReq = stringToJson(collectionData); + if (E.isLeft(jsonReq)) return E.left(USER_COLL_DATA_INVALID); + collectionData = jsonReq.right; + } + + const isTitleValid = isValidLength(newTitle, this.TITLE_LENGTH); + if (!isTitleValid) return E.left(USER_COLL_SHORT_TITLE); + + // Check to see is the collection belongs to the user + const isOwner = await this.isOwnerCheck(userCollectionID, userID); + if (O.isNone(isOwner)) return E.left(USER_NOT_OWNER); + + try { + const updatedUserCollection = await this.prisma.userCollection.update({ + where: { + id: userCollectionID, + }, + data: { + data: collectionData, + title: newTitle ?? undefined, + }, + }); + + this.pubsub.publish( + `user_coll/${updatedUserCollection.userUid}/updated`, + this.cast(updatedUserCollection), + ); + + return E.right(this.cast(updatedUserCollection)); + } catch (error) { + return E.left(USER_COLL_NOT_FOUND); + } + } }