generated from pascalmartineau/wp-skeleton
feat: better user switching code
All checks were successful
Deploy WordPress and Nuxt / deploy (push) Successful in 1m0s
All checks were successful
Deploy WordPress and Nuxt / deploy (push) Successful in 1m0s
This commit is contained in:
@@ -1,38 +1,48 @@
|
|||||||
export const useUserSwitching = () => {
|
export function useUserSwitching() {
|
||||||
const session = useUserSession();
|
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) => {
|
async function userSwitchTo(userId: string | number) {
|
||||||
const response = await $fetch("/api/switch-to", {
|
try {
|
||||||
|
const result = await $fetch<{ success: boolean; message?: string }>("/api/switch-to", {
|
||||||
method: "POST",
|
method: "POST",
|
||||||
body: { userId },
|
body: { userId },
|
||||||
});
|
});
|
||||||
|
|
||||||
if (response.success) {
|
if (!result.success) {
|
||||||
await session.fetch();
|
throw new Error(result.message || "Switch failed");
|
||||||
return response;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new Error(response.message || "Switch failed");
|
await refreshUserSession();
|
||||||
};
|
return result;
|
||||||
|
}
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const switchBack = async () => {
|
async function userSwitchBack() {
|
||||||
const response = await $fetch("/api/switch-back", {
|
try {
|
||||||
|
const result = await $fetch<{ success: boolean; message?: string }>("/api/switch-back", {
|
||||||
method: "POST",
|
method: "POST",
|
||||||
});
|
});
|
||||||
|
if (!result.success) {
|
||||||
if (response.success) {
|
throw new Error(result.message || "Échec du retour à l'utilisateur précédent");
|
||||||
await session.fetch();
|
}
|
||||||
return response;
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new Error(response.message || "Switch back failed");
|
return { isUserSwitched, userSwitchTo, userSwitchBack };
|
||||||
};
|
}
|
||||||
|
|
||||||
return {
|
|
||||||
isSwitched,
|
|
||||||
switchTo,
|
|
||||||
switchBack,
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|||||||
@@ -3,17 +3,14 @@ import { defineEventHandler } from "h3";
|
|||||||
export default defineEventHandler(async (event) => {
|
export default defineEventHandler(async (event) => {
|
||||||
try {
|
try {
|
||||||
const response = await useGraphqlMutation("userSwitchBack");
|
const response = await useGraphqlMutation("userSwitchBack");
|
||||||
|
|
||||||
if (response.errors?.length) {
|
if (response.errors?.length) {
|
||||||
throw new Error(response.errors[0]?.message || "Switch back failed");
|
throw new Error(response.errors[0]?.message);
|
||||||
}
|
}
|
||||||
|
|
||||||
await clearUserSession(event);
|
await clearUserSession(event);
|
||||||
|
|
||||||
return { success: true };
|
return { success: true };
|
||||||
}
|
}
|
||||||
catch (error) {
|
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 };
|
return { success: false, message };
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -2,32 +2,29 @@ import { defineEventHandler, readBody } from "h3";
|
|||||||
|
|
||||||
export default defineEventHandler(async (event) => {
|
export default defineEventHandler(async (event) => {
|
||||||
const { userId } = await readBody(event);
|
const { userId } = await readBody(event);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const currentSession = await getUserSession(event);
|
const currentSession = await getUserSession(event);
|
||||||
if (!currentSession?.user) {
|
if (!currentSession?.user) {
|
||||||
throw new Error("Authentication required");
|
throw new Error("Authentication requise");
|
||||||
}
|
}
|
||||||
|
|
||||||
const response = await useGraphqlMutation("userSwitchTo", { userId });
|
const response = await useGraphqlMutation("userSwitchTo", { userId });
|
||||||
|
|
||||||
if (response.errors?.length) {
|
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;
|
const { authToken, refreshToken, user } = response.data.userSwitchTo;
|
||||||
|
|
||||||
await setUserSession(event, {
|
await setUserSession(event, {
|
||||||
user,
|
user,
|
||||||
secure: { authToken, refreshToken },
|
secure: { authToken, refreshToken },
|
||||||
loggedInAt: new Date().toISOString(),
|
loggedInAt: new Date().toISOString(),
|
||||||
switchedBy: currentSession.user.id,
|
switchedBy: currentSession.user.id,
|
||||||
});
|
});
|
||||||
|
|
||||||
return { success: true };
|
return { success: true };
|
||||||
}
|
}
|
||||||
catch (error) {
|
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 };
|
return { success: false, message };
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -3,6 +3,7 @@ mutation login($email: String!, $password: String!) {
|
|||||||
authToken
|
authToken
|
||||||
refreshToken
|
refreshToken
|
||||||
user {
|
user {
|
||||||
|
id
|
||||||
email
|
email
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4,14 +4,7 @@ mutation userSwitchTo($userId: ID!) {
|
|||||||
refreshToken
|
refreshToken
|
||||||
user {
|
user {
|
||||||
id
|
id
|
||||||
databaseId
|
|
||||||
username
|
|
||||||
email
|
email
|
||||||
firstName
|
|
||||||
lastName
|
|
||||||
avatar {
|
|
||||||
url
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
2
wp-content/themes/ccat/shared/auth.d.ts
vendored
2
wp-content/themes/ccat/shared/auth.d.ts
vendored
@@ -1,11 +1,13 @@
|
|||||||
// auth.d.ts
|
// auth.d.ts
|
||||||
declare module "#auth-utils" {
|
declare module "#auth-utils" {
|
||||||
interface User {
|
interface User {
|
||||||
|
id: number;
|
||||||
email: string;
|
email: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface UserSession {
|
interface UserSession {
|
||||||
loggedInAt: string;
|
loggedInAt: string;
|
||||||
|
switchedBy?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface SecureSessionData {
|
interface SecureSessionData {
|
||||||
|
|||||||
Reference in New Issue
Block a user