diff --git a/wp-content/themes/ccat/app/composables/useUserSwitching.ts b/wp-content/themes/ccat/app/composables/useUserSwitching.ts index e294f68..be5ef1c 100644 --- a/wp-content/themes/ccat/app/composables/useUserSwitching.ts +++ b/wp-content/themes/ccat/app/composables/useUserSwitching.ts @@ -1,38 +1,48 @@ -export const useUserSwitching = () => { - const session = useUserSession(); +export function useUserSwitching() { + const toast = useToast(); + const { fetch: refreshUserSession } = useUserSession(); + const { session } = useUserSession(); - const isSwitched = computed(() => Boolean(session.data.value?.switchedBy)); + const isUserSwitched = computed(() => Boolean(session.value?.switchedBy)); - const switchTo = async (userId: string | number) => { - const response = await $fetch("/api/switch-to", { - method: "POST", - body: { userId }, - }); + async function userSwitchTo(userId: string | number) { + try { + const result = await $fetch<{ success: boolean; message?: string }>("/api/switch-to", { + method: "POST", + body: { userId }, + }); - if (response.success) { - await session.fetch(); - return response; + if (!result.success) { + throw new Error(result.message || "Switch failed"); + } + + await refreshUserSession(); + return result; } - - throw new Error(response.message || "Switch failed"); - }; - - const switchBack = async () => { - const response = await $fetch("/api/switch-back", { - method: "POST", - }); - - if (response.success) { - await session.fetch(); - return response; + catch (error) { + const message = error instanceof Error ? error.message : "Switch failed"; + toast.add({ title: "Échec du changement d'utilisateur", description: message, color: "error" }); + throw error; } + } - throw new Error(response.message || "Switch back failed"); - }; + async function userSwitchBack() { + try { + const result = await $fetch<{ success: boolean; message?: string }>("/api/switch-back", { + method: "POST", + }); + if (!result.success) { + throw new Error(result.message || "Échec du retour à l'utilisateur précédent"); + } + await refreshUserSession(); + return result; + } + catch (error) { + const message = error instanceof Error ? error.message : "Échec du retour à l'utilisateur précédent"; + toast.add({ title: "Échec du changement d'utilisateur", description: message, color: "error" }); + throw error; + } + } - return { - isSwitched, - switchTo, - switchBack, - }; -}; + return { isUserSwitched, userSwitchTo, userSwitchBack }; +} diff --git a/wp-content/themes/ccat/server/api/switch-back.post.ts b/wp-content/themes/ccat/server/api/switch-back.post.ts index 5efcc06..0ce8f08 100644 --- a/wp-content/themes/ccat/server/api/switch-back.post.ts +++ b/wp-content/themes/ccat/server/api/switch-back.post.ts @@ -3,17 +3,14 @@ import { defineEventHandler } from "h3"; export default defineEventHandler(async (event) => { try { const response = await useGraphqlMutation("userSwitchBack"); - if (response.errors?.length) { - throw new Error(response.errors[0]?.message || "Switch back failed"); + throw new Error(response.errors[0]?.message); } - await clearUserSession(event); - return { success: true }; } catch (error) { - const message = error instanceof Error ? error.message : "Switch back failed"; + const message = error instanceof Error ? error.message : "Échec du retour à l'utilisateur précédent"; return { success: false, message }; } }); diff --git a/wp-content/themes/ccat/server/api/switch-to.post.ts b/wp-content/themes/ccat/server/api/switch-to.post.ts index bc500fe..50d13ae 100644 --- a/wp-content/themes/ccat/server/api/switch-to.post.ts +++ b/wp-content/themes/ccat/server/api/switch-to.post.ts @@ -2,32 +2,29 @@ import { defineEventHandler, readBody } from "h3"; export default defineEventHandler(async (event) => { const { userId } = await readBody(event); - try { const currentSession = await getUserSession(event); if (!currentSession?.user) { - throw new Error("Authentication required"); + throw new Error("Authentication requise"); } - const response = await useGraphqlMutation("userSwitchTo", { userId }); - if (response.errors?.length) { - throw new Error(response.errors[0]?.message || "Switch failed"); + throw new Error(response.errors[0]?.message); + } + if (!response.data.userSwitchTo) { + throw new Error("Le changement d'utilisateur a échoué"); } - const { authToken, refreshToken, user } = response.data.userSwitchTo; - await setUserSession(event, { user, secure: { authToken, refreshToken }, loggedInAt: new Date().toISOString(), switchedBy: currentSession.user.id, }); - return { success: true }; } catch (error) { - const message = error instanceof Error ? error.message : "Switch failed"; + const message = error instanceof Error ? error.message : "Le changement d'utilisateur a échoué"; return { success: false, message }; } -}); \ No newline at end of file +}); diff --git a/wp-content/themes/ccat/server/api/login.gql b/wp-content/themes/ccat/server/graphql/login.gql similarity index 95% rename from wp-content/themes/ccat/server/api/login.gql rename to wp-content/themes/ccat/server/graphql/login.gql index 49678a2..9c650e9 100644 --- a/wp-content/themes/ccat/server/api/login.gql +++ b/wp-content/themes/ccat/server/graphql/login.gql @@ -3,6 +3,7 @@ mutation login($email: String!, $password: String!) { authToken refreshToken user { + id email } } diff --git a/wp-content/themes/ccat/server/graphql/userSwitchTo.gql b/wp-content/themes/ccat/server/graphql/userSwitchTo.gql index d5bd436..9eac404 100644 --- a/wp-content/themes/ccat/server/graphql/userSwitchTo.gql +++ b/wp-content/themes/ccat/server/graphql/userSwitchTo.gql @@ -4,14 +4,7 @@ mutation userSwitchTo($userId: ID!) { refreshToken user { id - databaseId - username email - firstName - lastName - avatar { - url - } } } } \ No newline at end of file diff --git a/wp-content/themes/ccat/shared/auth.d.ts b/wp-content/themes/ccat/shared/auth.d.ts index bb2c010..852711f 100644 --- a/wp-content/themes/ccat/shared/auth.d.ts +++ b/wp-content/themes/ccat/shared/auth.d.ts @@ -1,11 +1,13 @@ // auth.d.ts declare module "#auth-utils" { interface User { + id: number; email: string; } interface UserSession { loggedInAt: string; + switchedBy?: number; } interface SecureSessionData {