From d7bed4df6d1feffd788d9a2782e5d590185b80ff Mon Sep 17 00:00:00 2001 From: Julien Froidefond Date: Fri, 14 Feb 2025 21:40:04 +0100 Subject: [PATCH] refacto(db): remove localstorage service --- src/components/layout/ClientLayout.tsx | 10 - src/components/layout/Sidebar.tsx | 2 - src/components/settings/ClientSettings.tsx | 3 +- src/lib/services/auth.service.ts | 36 +--- src/lib/services/storage.service.ts | 221 --------------------- 5 files changed, 4 insertions(+), 268 deletions(-) delete mode 100644 src/lib/services/storage.service.ts diff --git a/src/components/layout/ClientLayout.tsx b/src/components/layout/ClientLayout.tsx index 593db05..bfca57f 100644 --- a/src/components/layout/ClientLayout.tsx +++ b/src/components/layout/ClientLayout.tsx @@ -17,16 +17,6 @@ export default function ClientLayout({ children }: { children: React.ReactNode } const router = useRouter(); const pathname = usePathname(); - // Vérification de l'authentification - useEffect(() => { - const isPublicRoute = publicRoutes.includes(pathname); - const isAuthenticated = authService.isAuthenticated(); - - if (!isAuthenticated && !isPublicRoute) { - router.push(`/login?from=${encodeURIComponent(pathname)}`); - } - }, [pathname, router]); - const handleCloseSidebar = () => { setIsSidebarOpen(false); }; diff --git a/src/components/layout/Sidebar.tsx b/src/components/layout/Sidebar.tsx index 21145a2..dd7b3a5 100644 --- a/src/components/layout/Sidebar.tsx +++ b/src/components/layout/Sidebar.tsx @@ -7,7 +7,6 @@ import { cn } from "@/lib/utils"; import { authService } from "@/lib/services/auth.service"; import { useEffect, useState, useCallback } from "react"; import { KomgaLibrary, KomgaSeries } from "@/types/komga"; -import { storageService } from "@/lib/services/storage.service"; interface SidebarProps { isOpen: boolean; @@ -99,7 +98,6 @@ export function Sidebar({ isOpen, onClose }: SidebarProps) { const handleLogout = () => { authService.logout(); - storageService.clearAll(); setLibraries([]); setFavorites([]); onClose(); diff --git a/src/components/settings/ClientSettings.tsx b/src/components/settings/ClientSettings.tsx index c2ec58e..5160464 100644 --- a/src/components/settings/ClientSettings.tsx +++ b/src/components/settings/ClientSettings.tsx @@ -1,9 +1,8 @@ "use client"; -import { useState, useEffect } from "react"; +import { useState } from "react"; import { Loader2, Network, Trash2 } from "lucide-react"; import { useRouter } from "next/navigation"; -import { storageService } from "@/lib/services/storage.service"; import { AuthError } from "@/types/auth"; import { useToast } from "@/components/ui/use-toast"; diff --git a/src/lib/services/auth.service.ts b/src/lib/services/auth.service.ts index 01f8c1e..ab8ccee 100644 --- a/src/lib/services/auth.service.ts +++ b/src/lib/services/auth.service.ts @@ -1,7 +1,6 @@ "use client"; import { AuthError } from "@/types/auth"; -import { storageService } from "./storage.service"; interface AuthUser { id: string; @@ -38,11 +37,6 @@ class AuthService { const data = await response.json(); throw data.error; } - - const data = await response.json(); - if (data.user) { - storageService.setUserData(data.user, remember); - } } catch (error) { if ((error as AuthError).code) { throw error; @@ -71,11 +65,6 @@ class AuthService { const data = await response.json(); throw data.error; } - - const data = await response.json(); - if (data.user) { - storageService.setUserData(data.user, false); - } } catch (error) { if ((error as AuthError).code) { throw error; @@ -91,28 +80,9 @@ class AuthService { * Déconnecte l'utilisateur */ async logout(): Promise { - try { - await fetch("/api/auth/logout", { - method: "POST", - }); - } finally { - storageService.clear(); - } - } - - /** - * Vérifie si l'utilisateur est connecté - */ - isAuthenticated(): boolean { - const user = storageService.getUserData(); - return !!user?.authenticated; - } - - /** - * Récupère l'utilisateur connecté - */ - getCurrentUser(): AuthUser | null { - return storageService.getUserData(); + await fetch("/api/auth/logout", { + method: "POST", + }); } } diff --git a/src/lib/services/storage.service.ts b/src/lib/services/storage.service.ts deleted file mode 100644 index 2c59615..0000000 --- a/src/lib/services/storage.service.ts +++ /dev/null @@ -1,221 +0,0 @@ -import { AuthConfig } from "@/types/auth"; -import { STORAGE_KEYS } from "@/lib/constants"; - -const { - CREDENTIALS: KOMGACREDENTIALS_KEY, - USER: USER_KEY, - TTL_CONFIG: TTL_CONFIG_KEY, - FAVORITES: FAVORITES_KEY, -} = STORAGE_KEYS; - -interface TTLConfig { - defaultTTL: number; - homeTTL: number; - librariesTTL: number; - seriesTTL: number; - booksTTL: number; - imagesTTL: number; -} - -export class StorageService { - private static instance: StorageService; - - private constructor() {} - - public static getInstance(): StorageService { - if (!StorageService.instance) { - StorageService.instance = new StorageService(); - } - return StorageService.instance; - } - - /** - * Stocke les credentials de manière sécurisée - */ - setKomgaConfig(config: AuthConfig, remember: boolean = false): void { - const storage = remember ? localStorage : sessionStorage; - - // Encodage basique des credentials en base64 - const encoded = btoa(JSON.stringify(config)); - console.log("StorageService - Stockage des credentials:", { - storage: remember ? "localStorage" : "sessionStorage", - config: { - serverUrl: config.serverUrl, - hasCredentials: !!config.credentials, - }, - }); - - storage.setItem(KOMGACREDENTIALS_KEY, encoded); - - // Définir aussi un cookie pour le middleware - const cookieValue = `${KOMGACREDENTIALS_KEY}=${encoded}; path=/; samesite=strict`; - const maxAge = remember ? `; max-age=${30 * 24 * 60 * 60}` : ""; - document.cookie = cookieValue + maxAge; - - console.log("StorageService - Cookie défini:", cookieValue + maxAge); - } - - /** - * Récupère les credentials stockés - */ - getCredentials(): AuthConfig | null { - if (typeof window === "undefined") return null; - - const storage = - localStorage.getItem(KOMGACREDENTIALS_KEY) || sessionStorage.getItem(KOMGACREDENTIALS_KEY); - console.log("StorageService - Lecture des credentials:", { - fromLocalStorage: !!localStorage.getItem(KOMGACREDENTIALS_KEY), - fromSessionStorage: !!sessionStorage.getItem(KOMGACREDENTIALS_KEY), - value: storage, - }); - - if (!storage) return null; - - try { - const config = JSON.parse(atob(storage)); - console.log("StorageService - Credentials décodés:", { - serverUrl: config.serverUrl, - hasCredentials: !!config.credentials, - }); - return config; - } catch (error) { - console.error("StorageService - Erreur de décodage des credentials:", error); - return null; - } - } - - /** - * Stocke les données utilisateur - */ - setUserData(data: T, remember: boolean = false): void { - const storage = remember ? localStorage : sessionStorage; - const encoded = btoa(JSON.stringify(data)); - storage.setItem(USER_KEY, encoded); - - // Définir aussi un cookie pour le middleware - document.cookie = `${USER_KEY}=${encoded}; path=/; samesite=strict; ${ - remember ? `max-age=${30 * 24 * 60 * 60}` : "" - }`; - } - - /** - * Récupère les données utilisateur - */ - getUserData(): T | null { - if (typeof window === "undefined") return null; - - const storage = localStorage.getItem(USER_KEY) || sessionStorage.getItem(USER_KEY); - if (!storage) return null; - - try { - return JSON.parse(atob(storage)); - } catch { - return null; - } - } - - /** - * Stocke la configuration des TTL - */ - setTTLConfig(config: TTLConfig): void { - localStorage.setItem(TTL_CONFIG_KEY, JSON.stringify(config)); - } - - /** - * Récupère la configuration des TTL - */ - getTTLConfig(): TTLConfig | null { - const stored = localStorage.getItem(TTL_CONFIG_KEY); - if (!stored) return null; - - try { - return JSON.parse(stored); - } catch { - return null; - } - } - - /** - * Efface toutes les données stockées - */ - clear(): void { - localStorage.removeItem(KOMGACREDENTIALS_KEY); - localStorage.removeItem(USER_KEY); - sessionStorage.removeItem(KOMGACREDENTIALS_KEY); - sessionStorage.removeItem(USER_KEY); - document.cookie = `${KOMGACREDENTIALS_KEY}=; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT`; - document.cookie = `${USER_KEY}=; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT`; - } - - getUser() { - try { - const userStr = localStorage.getItem(USER_KEY); - if (!userStr) return null; - return JSON.parse(atob(userStr)); - } catch (error) { - console.error("Erreur lors de la récupération de l'utilisateur:", error); - return null; - } - } - - clearAll() { - localStorage.removeItem(USER_KEY); - localStorage.removeItem(KOMGACREDENTIALS_KEY); - localStorage.removeItem(TTL_CONFIG_KEY); - } - - getKeys() { - return { - credentials: KOMGACREDENTIALS_KEY, - user: USER_KEY, - ttlConfig: TTL_CONFIG_KEY, - }; - } - - getFavorites(): string[] { - try { - const favorites = localStorage.getItem(FAVORITES_KEY); - return favorites ? JSON.parse(favorites) : []; - } catch (error) { - console.error("Erreur lors de la récupération des favoris:", error); - return []; - } - } - - addFavorite(seriesId: string): void { - try { - const favorites = this.getFavorites(); - if (!favorites.includes(seriesId)) { - favorites.push(seriesId); - localStorage.setItem(FAVORITES_KEY, JSON.stringify(favorites)); - } - } catch (error) { - console.error("Erreur lors de l'ajout aux favoris:", error); - } - } - - removeFavorite(seriesId: string): void { - try { - const favorites = this.getFavorites(); - const index = favorites.indexOf(seriesId); - if (index > -1) { - favorites.splice(index, 1); - localStorage.setItem(FAVORITES_KEY, JSON.stringify(favorites)); - } - } catch (error) { - console.error("Erreur lors de la suppression des favoris:", error); - } - } - - isFavorite(seriesId: string): boolean { - try { - const favorites = this.getFavorites(); - return favorites.includes(seriesId); - } catch (error) { - console.error("Erreur lors de la vérification des favoris:", error); - return false; - } - } -} - -export const storageService = StorageService.getInstance();