From c10925b84bd34ff042799ed613fe51d7c03e3770 Mon Sep 17 00:00:00 2001 From: Nell Date: Sun, 2 Aug 2026 13:11:11 +0200 Subject: [PATCH] init --- .../server/ServerSettingsDialog.vue | 76 ++++++++++++++++++- frontend/src/composables/usePermissions.ts | 9 +++ src/repositories/server.rs | 10 +++ src/routes/server/handlers.rs | 23 ++++++ src/routes/server/routes.rs | 4 + 5 files changed, 119 insertions(+), 3 deletions(-) diff --git a/frontend/src/components/server/ServerSettingsDialog.vue b/frontend/src/components/server/ServerSettingsDialog.vue index 83a1aad..c77943b 100644 --- a/frontend/src/components/server/ServerSettingsDialog.vue +++ b/frontend/src/components/server/ServerSettingsDialog.vue @@ -5,7 +5,7 @@ import {useServerStore} from '@/stores/server' import {useRoleStore} from '@/stores/role' import {useUserStore} from '@/stores/user' import {usePermissions} from '@/composables/usePermissions' -import {toServerPermissionMask, type ServerPermissionMask} from '@/types/permissions' +import {toServerPermissionMask, type ServerPermissionMask, type ServerUserPermission} from '@/types/permissions' import ServerPermissionEditor from '@/components/permissions/ServerPermissionEditor.vue' const props = defineProps<{modelValue: boolean; serverId: string; serverName: string}>() @@ -17,17 +17,21 @@ const permissionsApi = usePermissions() const {roles} = storeToRefs(roleStore) const activeTab = ref('general') const selectedRoleId = ref(null) +const selectedUserId = ref(null) const name = ref('') const loading = ref(false) const saving = ref(false) const error = ref(null) const roleForm = ref('') const rolePermissions = ref(toServerPermissionMask(0)) +const memberPermissions = ref(toServerPermissionMask(0)) +const userPermissions = ref>({}) const selectedRole = computed(() => roles.value.find(role => role.id === selectedRoleId.value) || null) const selectedMembers = computed(() => selectedRoleId.value ? roleStore.members[selectedRoleId.value] || [] : []) const availableUsers = computed(() => userStore.users.filter(user => !selectedMembers.value.some(member => member.id === user.id))) const memberToAdd = ref(null) +const selectedUser = computed(() => userStore.users.find(user => user.id === selectedUserId.value) || null) watch(() => props.modelValue, async open => { if (open) await load() @@ -44,13 +48,23 @@ watch(selectedRoleId, async roleId => { if ((e as Error & {status?: number}).status !== 404) error.value = e instanceof Error ? e.message : 'Erreur de chargement' } }) +watch(selectedUserId, userId => { + memberPermissions.value = userId && userPermissions.value[userId] + ? userPermissions.value[userId].permissions + : toServerPermissionMask(0) +}) async function load() { loading.value = true error.value = null name.value = props.serverName try { - await Promise.all([roleStore.fetchRoles(props.serverId), userStore.fetchUsers(props.serverId)]) + const [, , permissions] = await Promise.all([ + roleStore.fetchRoles(props.serverId), + userStore.fetchUsers(props.serverId), + permissionsApi.listServerUserPermissions(props.serverId), + ]) + userPermissions.value = Object.fromEntries(permissions.map(permission => [permission.user_id, permission])) } catch (e) { error.value = e instanceof Error ? e.message : 'Erreur de chargement' } finally { loading.value = false } } @@ -88,6 +102,25 @@ async function savePermissions(value: ServerPermissionMask) { try { await permissionsApi.setServerRolePermission(props.serverId, selectedRoleId.value, value); rolePermissions.value = value } catch (e) { error.value = e instanceof Error ? e.message : 'Erreur de permissions' } } +async function saveMemberPermissions(value: ServerPermissionMask) { + if (!selectedUserId.value) return + try { + const permission = await permissionsApi.setServerUserPermission(props.serverId, selectedUserId.value, value) + userPermissions.value[selectedUserId.value] = permission + memberPermissions.value = value + } catch (e) { error.value = e instanceof Error ? e.message : 'Erreur de permissions' } +} +async function resetMemberPermissions() { + if (!selectedUserId.value) return + try { + await permissionsApi.removeServerUserPermission(props.serverId, selectedUserId.value) + delete userPermissions.value[selectedUserId.value] + memberPermissions.value = toServerPermissionMask(0) + } catch (e) { + const status = (e as Error & {status?: number}).status + if (status !== 404) error.value = e instanceof Error ? e.message : 'Erreur de réinitialisation' + } +} -