Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 

47 lignes
1.2 KiB

  1. import { SessionWithTokens, authOptions } from "@/config/authConfig";
  2. import { getServerSession } from "next-auth";
  3. import { headers } from "next/headers";
  4. import { redirect } from "next/navigation";
  5. export const serverFetch: typeof fetch = async (input, init) => {
  6. // eslint-disable-next-line @typescript-eslint/no-explicit-any
  7. const session = await getServerSession<any, SessionWithTokens>(authOptions);
  8. const accessToken = session?.accessToken;
  9. return fetch(input, {
  10. ...init,
  11. headers: {
  12. ...init?.headers,
  13. ...(accessToken
  14. ? {
  15. Authorization: `Bearer ${accessToken}`,
  16. }
  17. : {}),
  18. },
  19. });
  20. };
  21. type FetchParams = Parameters<typeof fetch>;
  22. export async function serverFetchJson<T>(...args: FetchParams) {
  23. const response = await serverFetch(...args);
  24. if (response.ok) {
  25. return response.json() as T;
  26. } else {
  27. switch (response.status) {
  28. case 401:
  29. signOutUser();
  30. default:
  31. throw Error("Something went wrong fetching data in server.");
  32. }
  33. }
  34. }
  35. export const signOutUser = () => {
  36. const headersList = headers();
  37. const referer = headersList.get("referer");
  38. redirect(
  39. `/logout${referer ? `?callbackUrl=${encodeURIComponent(referer)}` : ""}`,
  40. );
  41. };