+
Roadmap -
Mentions légales
Copyright Peaceultime - 2024
diff --git a/pages/admin/index.vue b/pages/admin/index.vue
index 1a701d8..fca8639 100644
--- a/pages/admin/index.vue
+++ b/pages/admin/index.vue
@@ -135,6 +135,27 @@ async function editPermissions(user: User)
});
}
}
+async function logout(user: User)
+{
+ try
+ {
+ await $fetch(`/api/admin/user/${user.id}/logout`, {
+ method: 'POST',
+ });
+
+ user.session.length = 0;
+
+ toaster.add({
+ duration: 10000, type: 'success', content: 'L\'utilisateur vient d\'être déconnecté.', timer: true,
+ });
+ }
+ catch(e)
+ {
+ toaster.add({
+ duration: 10000, type: 'error', content: (e as any).message, timer: true,
+ });
+ }
+}
@@ -178,7 +199,7 @@ async function editPermissions(user: User)
-
+
diff --git a/pages/explore/edit/index.vue b/pages/explore/edit/index.vue
index d41ae25..5968eda 100644
--- a/pages/explore/edit/index.vue
+++ b/pages/explore/edit/index.vue
@@ -1,164 +1,173 @@
-
+
+ d[any] - Modification
+
-
-
-
-
- Accueil
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
Modifications non enregistrées
+
+
+
+
+
+
+
+
-
-
-
-
-
-
- Supprimer {{ selected.title }} et tous ces enfants ?
-
-
-
+
+
+
+
+
+ Modifications non enregistrées
+
+
+
+
+
+
+
+ Supprimer {{ selected.title }} et tous ces enfants ?
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.value.title }}
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
d[any] - Modification de {{ selected.title }}
+
+
+
+
+
+
+ /{{ selected.parent !== '' ? selected.parent + '/' : '' }} {
+ if(selected && selected.customPath)
+ {
+ selected.name = parsePath(selected.name);
+ rebuildPath(selected.children, getPath(selected));
+ }
+ }" class="mx-0"/>
+ /{{ getPath(selected) }}
-
-
- {{ item.value.title }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
d[any] - Modification de {{ selected.title }}
-
-
-
-
-
-
- /{{ selected.parent !== '' ? selected.parent + '/' : '' }} {
- if(selected && selected.customPath)
- {
- selected.name = parsePath(selected.name);
- rebuildPath(selected.children, getPath(selected));
- }
- }" class="mx-0"/>
- /{{ getPath(selected) }}
-
-
-
-
-
-
-
- {{ contentError }}
-
-
-
-
-
-
-
-
-
-
-
- Editeur de graphe en cours de développement
-
-
- Modifier le contenu : console.log(e)" />
-
+
+
+
+
+
+ {{ contentError }}
+
+
+
+
+
+
+
+
+
+
+
+ Editeur de graphe en cours de développement
+
+
+ Modifier le contenu : console.log(e)" />
+
+
-
+
@@ -188,6 +197,7 @@ definePageMeta({
});
const router = useRouter();
+const open = ref(true);
const toaster = useToast();
const saveStatus = ref<'idle' | 'pending' | 'success' | 'error'>('idle');
diff --git a/server/api/admin/user/[id]/logout.post.ts b/server/api/admin/user/[id]/logout.post.ts
new file mode 100644
index 0000000..7e5ff3b
--- /dev/null
+++ b/server/api/admin/user/[id]/logout.post.ts
@@ -0,0 +1,40 @@
+import { hasPermissions } from "~/shared/auth.util";
+import useDatabase from '~/composables/useDatabase';
+import { and, eq, notInArray } from "drizzle-orm";
+import { z } from "zod";
+import { userSessionsTable } from "~/db/schema";
+
+const schema = z.array(z.string());
+
+export default defineEventHandler(async (e) => {
+ const session = await getUserSession(e);
+
+ if(!session || !session.user || !hasPermissions(session.user.permissions, ['admin']))
+ {
+ throw createError({
+ statusCode: 401,
+ message: 'Unauthorized',
+ });
+ }
+
+ const param = getRouterParam(e, 'id');
+
+ if(!param)
+ {
+ throw createError({
+ statusCode: 403,
+ message: 'Forbidden',
+ });
+ }
+
+ try {
+ const id = parseInt(param, 10);
+
+ const db = useDatabase();
+ db.delete(userSessionsTable).where(eq(userSessionsTable.user_id, id)).run();
+ } catch(e) {
+ console.error(e);
+
+ throw e;
+ }
+});
\ No newline at end of file