Skip to content

Commit

Permalink
add user as viewer to room
Browse files Browse the repository at this point in the history
when rolechange is disabled, the user is still
added as admin (since there is otherwise no way
to make him admin)
  • Loading branch information
Metauriel committed Jan 29, 2025
1 parent 29c33a3 commit 1c209bd
Show file tree
Hide file tree
Showing 5 changed files with 55 additions and 7 deletions.
2 changes: 2 additions & 0 deletions apps/server/src/modules/room-membership/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,6 @@ export * from './do/room-membership.do';
export * from './room-membership.module';
export { RoomMembershipEntity, RoomMembershipRepo, RoomMembershipService };

export { RoomMembershipConfig } from './room-membership-config';

export { UserWithRoomRoles, RoomMembershipAuthorizable } from './do/room-membership-authorizable.do';
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export interface RoomMembershipConfig {
FEATURE_ROOMS_CHANGE_PERMISSIONS_ENABLED: boolean;
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { roomFactory } from '@modules/room/testing';
import { schoolFactory } from '@modules/school/testing';
import { UserService } from '@modules/user';
import { BadRequestException } from '@nestjs/common/exceptions';
import { ConfigService } from '@nestjs/config';
import { Test, TestingModule } from '@nestjs/testing';
import { RoleName } from '@shared/domain/interface';
import { roleFactory } from '@testing/factory/role.factory';
Expand All @@ -28,6 +29,7 @@ describe('RoomMembershipService', () => {
let roleService: DeepMocked<RoleService>;
let roomService: DeepMocked<RoomService>;
let userService: DeepMocked<UserService>;
let configService: DeepMocked<ConfigService>;

beforeAll(async () => {
module = await Test.createTestingModule({
Expand All @@ -54,6 +56,10 @@ describe('RoomMembershipService', () => {
provide: UserService,
useValue: createMock<UserService>(),
},
{
provide: ConfigService,
useValue: createMock<ConfigService>(),
},
],
}).compile();

Expand All @@ -63,6 +69,7 @@ describe('RoomMembershipService', () => {
roleService = module.get(RoleService);
roomService = module.get(RoomService);
userService = module.get(UserService);
configService = module.get(ConfigService);
});

afterAll(async () => {
Expand Down Expand Up @@ -113,6 +120,11 @@ describe('RoomMembershipService', () => {
schoolId: school.id,
});

configService.get.mockImplementation((key) => {
if (key === 'FEATURE_ROOMS_CHANGE_PERMISSIONS_ENABLED') return true;
return undefined;
});

roomMembershipRepo.findByRoomId.mockResolvedValue(roomMembership);

return {
Expand All @@ -123,14 +135,13 @@ describe('RoomMembershipService', () => {
};
};

it('should add user as admin to existing roomMembership', async () => {
// TODO: in the future, once room roles can be changed, this should become ROOMVIEWER
it('should add user to room as viewer', async () => {
const { user, room, group } = setup();

await service.addMembersToRoom(room.id, [user.id]);

expect(groupService.addUsersToGroup).toHaveBeenCalledWith(group.id, [
{ userId: user.id, roleName: RoleName.ROOMADMIN },
{ userId: user.id, roleName: RoleName.ROOMVIEWER },
]);
});

Expand All @@ -141,6 +152,29 @@ describe('RoomMembershipService', () => {

expect(userService.addSecondarySchoolToUsers).toHaveBeenCalledWith([user.id], room.schoolId);
});

describe('when role change is disabled', () => {
const setupWithRoleChangeDisabled = () => {
const { user, room, group } = setup();

configService.get.mockImplementation((key) => {
if (key === 'FEATURE_ROOMS_CHANGE_PERMISSIONS_ENABLED') return false;
return undefined;
});

return { user, room, group };
};

it('should add user to room as admin', async () => {
const { user, room, group } = setupWithRoleChangeDisabled();

await service.addMembersToRoom(room.id, [user.id]);

expect(groupService.addUsersToGroup).toHaveBeenCalledWith(group.id, [
{ userId: user.id, roleName: RoleName.ROOMADMIN },
]);
});
});
});
});

Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
import { ObjectId } from '@mikro-orm/mongodb';
import { Group, GroupService, GroupTypes } from '@modules/group';
import { RoleDto, RoleService } from '@modules/role';
import { RoomService } from '@modules/room/domain';
import { RoomService } from '@modules/room';
import { UserService } from '@modules/user';
import { BadRequestException, Injectable } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { RoleName } from '@shared/domain/interface';
import { EntityId } from '@shared/domain/types';
import { RoomMembershipAuthorizable, UserWithRoomRoles } from '../do/room-membership-authorizable.do';
import { RoomMembership } from '../do/room-membership.do';
import { RoomMembershipRepo } from '../repo/room-membership.repo';
import { RoomMembershipConfig } from '../room-membership-config';

@Injectable()
export class RoomMembershipService {
Expand All @@ -17,7 +19,8 @@ export class RoomMembershipService {
private readonly roomMembershipRepo: RoomMembershipRepo,
private readonly roleService: RoleService,
private readonly roomService: RoomService,
private readonly userService: UserService
private readonly userService: UserService,
private readonly configService: ConfigService<RoomMembershipConfig, true>
) {}

public async createNewRoomMembership(roomId: EntityId, ownerUserId: EntityId): Promise<RoomMembership> {
Expand Down Expand Up @@ -79,8 +82,12 @@ export class RoomMembershipService {
throw new Error('Room membership not found');
}

const roleName = this.configService.get('FEATURE_ROOMS_CHANGE_PERMISSIONS_ENABLED')
? RoleName.ROOMVIEWER
: RoleName.ROOMADMIN;

const userIdsAndRoles = userIds.map((userId) => {
return { userId, roleName: RoleName.ROOMADMIN };
return { userId, roleName };
});
await this.groupService.addUsersToGroup(roomMembership.userGroupId, userIdsAndRoles);

Expand Down
4 changes: 3 additions & 1 deletion apps/server/src/modules/server/server.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import { OauthConfig } from '@modules/oauth';
import { ProvisioningConfig } from '@modules/provisioning';
import { RocketChatUserConfig } from '@modules/rocketchat-user';
import { RoomConfig } from '@modules/room';
import { RoomMembershipConfig } from '@modules/room-membership';
import type { SchoolConfig } from '@modules/school';
import type { SharingConfig } from '@modules/sharing';
import type { ShdConfig } from '@modules/shd';
Expand Down Expand Up @@ -78,7 +79,8 @@ export interface ServerConfig
EncryptionConfig,
FilesStorageClientConfig,
ManagementMediaSourcesConfig,
ManagementServerConfig {
ManagementServerConfig,
RoomMembershipConfig {
NODE_ENV: NodeEnvType;
SC_DOMAIN: string;
HOST: string;
Expand Down

0 comments on commit 1c209bd

Please sign in to comment.