Add access control rework

This commit is contained in:
2026-04-02 03:18:37 +02:00
parent 314a26325f
commit 37cac95b38
111 changed files with 5355 additions and 1892 deletions

View File

@@ -0,0 +1,44 @@
export const ROOM_PERMISSION_KEYS = [
'manageServer',
'manageRoles',
'manageChannels',
'manageIcon',
'kickMembers',
'banMembers',
'manageBans',
'deleteMessages',
'joinVoice',
'shareScreen',
'uploadFiles'
] as const;
export type RoomPermissionKey = typeof ROOM_PERMISSION_KEYS[number];
export type PermissionState = 'allow' | 'deny' | 'inherit';
export type ChannelPermissionTargetType = 'role' | 'user';
export type RoomPermissionMatrix = Partial<Record<RoomPermissionKey, PermissionState>>;
export interface RoomRole {
id: string;
name: string;
color?: string;
position: number;
isSystem?: boolean;
permissions?: RoomPermissionMatrix;
}
export interface RoomRoleAssignment {
userId: string;
oderId?: string;
roleIds: string[];
}
export interface ChannelPermissionOverride {
channelId: string;
targetType: ChannelPermissionTargetType;
targetId: string;
permission: RoomPermissionKey;
value: PermissionState;
}

View File

@@ -1,5 +1,6 @@
export * from './user.models';
export * from './room.models';
export * from './access-control.models';
export * from './message.models';
export * from './moderation.models';
export * from './voice-state.models';

View File

@@ -1,4 +1,9 @@
import type { RoomMember } from './user.models';
import type {
ChannelPermissionOverride,
RoomRole,
RoomRoleAssignment
} from './access-control.models';
export type ChannelType = 'text' | 'voice';
@@ -23,9 +28,13 @@ export interface Room {
maxUsers?: number;
icon?: string;
iconUpdatedAt?: number;
slowModeInterval?: number;
permissions?: RoomPermissions;
channels?: Channel[];
members?: RoomMember[];
roles?: RoomRole[];
roleAssignments?: RoomRoleAssignment[];
channelPermissions?: ChannelPermissionOverride[];
sourceId?: string;
sourceName?: string;
sourceUrl?: string;

View File

@@ -1,4 +1,8 @@
import type { CameraState, VoiceState, ScreenShareState } from './voice-state.models';
import type {
CameraState,
VoiceState,
ScreenShareState
} from './voice-state.models';
export type UserStatus = 'online' | 'away' | 'busy' | 'offline';
@@ -29,6 +33,7 @@ export interface RoomMember {
displayName: string;
avatarUrl?: string;
role: UserRole;
roleIds?: string[];
joinedAt: number;
lastSeenAt: number;
}