From cb973cd3f9bba01761563e72f3447890499b8fab Mon Sep 17 00:00:00 2001 From: Ellen Wright Date: Wed, 24 Jun 2026 15:03:20 +0100 Subject: [PATCH 1/2] fix: stfc remove roles bug --- apps/backend/src/datasources/UserDataSource.ts | 1 + apps/backend/src/datasources/mockups/UserDataSource.ts | 3 +++ .../backend/src/datasources/postgres/UserDataSource.ts | 6 ++++++ .../backend/src/datasources/stfc/StfcUserDataSource.ts | 10 +++++++++- 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/apps/backend/src/datasources/UserDataSource.ts b/apps/backend/src/datasources/UserDataSource.ts index 0d293ed71d..e6d172c7c8 100644 --- a/apps/backend/src/datasources/UserDataSource.ts +++ b/apps/backend/src/datasources/UserDataSource.ts @@ -75,6 +75,7 @@ export interface UserDataSource { ): Promise; update(user: UpdateUserByIdArgs): Promise; setUserRoles(id: number, roles: number[]): Promise; + removeUserRoles(id: number, roles: number[]): Promise; setUserNotPlaceholder(id: number): Promise; checkScientistToProposal( userId: number, diff --git a/apps/backend/src/datasources/mockups/UserDataSource.ts b/apps/backend/src/datasources/mockups/UserDataSource.ts index a3c92032ee..34803d33a5 100644 --- a/apps/backend/src/datasources/mockups/UserDataSource.ts +++ b/apps/backend/src/datasources/mockups/UserDataSource.ts @@ -475,6 +475,9 @@ export class UserDataSourceMock implements UserDataSource { async setUserRoles(id: number, roles: number[]): Promise { // Do something here or remove the function. } + async removeUserRoles(id: number): Promise { + return; + } async getUserRoles(id: number): Promise { if (id == dummyUserOfficer.id) { return [ diff --git a/apps/backend/src/datasources/postgres/UserDataSource.ts b/apps/backend/src/datasources/postgres/UserDataSource.ts index 9669d969c4..9c68285bfc 100644 --- a/apps/backend/src/datasources/postgres/UserDataSource.ts +++ b/apps/backend/src/datasources/postgres/UserDataSource.ts @@ -151,6 +151,12 @@ export default class PostgresUserDataSource implements UserDataSource { }); } + async removeUserRoles(id: number): Promise { + return database.transaction(async (trx) => { + await trx('role_user').where('user_id', id).del(); + }); + } + async me(id: number): Promise { return database .select() diff --git a/apps/backend/src/datasources/stfc/StfcUserDataSource.ts b/apps/backend/src/datasources/stfc/StfcUserDataSource.ts index 5ca1e06e64..b120a692e5 100644 --- a/apps/backend/src/datasources/stfc/StfcUserDataSource.ts +++ b/apps/backend/src/datasources/stfc/StfcUserDataSource.ts @@ -415,7 +415,11 @@ export class StfcUserDataSource implements UserDataSource { (roleId) => !assignedRoleIds.has(roleId) && roleId !== userRole?.id ); - if (newRolesToAssign.length > 0) { + if (newRolesToAssign.length == 0) { + postgresUserDataSource.removeUserRoles(id); + this.stfcRolesCache.remove(String(id)); + this.uopRolesCache.remove(String(id)); + } else if (newRolesToAssign.length > 0) { await postgresUserDataSource.setUserRoles(id, newRolesToAssign); this.stfcRolesCache.remove(String(id)); this.uopRolesCache.remove(String(id)); @@ -522,6 +526,10 @@ export class StfcUserDataSource implements UserDataSource { throw new Error('Method not implemented.'); } + async removeUserRoles(id: number): Promise { + throw new Error('Method not implemented.'); + } + async me(id: number) { return this.getUser(id); } From 91bbcffade2cac892fda091f9ecd7928e66c2503 Mon Sep 17 00:00:00 2001 From: Ellen Wright Date: Fri, 26 Jun 2026 10:42:17 +0100 Subject: [PATCH 2/2] add await and implement removeUserRoles in stfcdatasource --- apps/backend/src/datasources/stfc/StfcUserDataSource.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/backend/src/datasources/stfc/StfcUserDataSource.ts b/apps/backend/src/datasources/stfc/StfcUserDataSource.ts index b120a692e5..1cbb3cc100 100644 --- a/apps/backend/src/datasources/stfc/StfcUserDataSource.ts +++ b/apps/backend/src/datasources/stfc/StfcUserDataSource.ts @@ -416,7 +416,7 @@ export class StfcUserDataSource implements UserDataSource { ); if (newRolesToAssign.length == 0) { - postgresUserDataSource.removeUserRoles(id); + this.removeUserRoles(id); this.stfcRolesCache.remove(String(id)); this.uopRolesCache.remove(String(id)); } else if (newRolesToAssign.length > 0) { @@ -527,7 +527,9 @@ export class StfcUserDataSource implements UserDataSource { } async removeUserRoles(id: number): Promise { - throw new Error('Method not implemented.'); + await postgresUserDataSource.removeUserRoles(id); + + return; } async me(id: number) {