diff --git a/src/package.json b/src/package.json index d6108d6..f2a5d32 100644 --- a/src/package.json +++ b/src/package.json @@ -1,7 +1,7 @@ { "name": "web-app", "type": "module", - "version": "0.0.1", + "version": "0.0.2", "private": true, "scripts": { "dev": "vite --host :: --port 3000", diff --git a/supabase/functions/deno.json b/supabase/functions/deno.json deleted file mode 100644 index c0c0fa9..0000000 --- a/supabase/functions/deno.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "lib": ["deno.window"], - "strict": true - }, - "imports": { - "supabase": "https://esm.sh/@supabase/supabase-js@2" - } -} - diff --git a/supabase/functions/update-order-status/index.ts b/supabase/functions/update-order-status/index.ts deleted file mode 100644 index fcf25b3..0000000 --- a/supabase/functions/update-order-status/index.ts +++ /dev/null @@ -1,186 +0,0 @@ -import { serve } from "https://deno.land/std@0.168.0/http/server.ts"; -import { createClient } from "https://esm.sh/@supabase/supabase-js@2"; - -const corsHeaders = { - "Access-Control-Allow-Origin": "*", - "Access-Control-Allow-Headers": - "authorization, x-client-info, apikey, content-type", -}; - -serve(async (req) => { - // Handle CORS preflight requests - if (req.method === "OPTIONS") { - return new Response("ok", { headers: corsHeaders }); - } - - try { - // Récupérer les variables d'environnement - const supabaseUrl = Deno.env.get("SUPABASE_URL") ?? ""; - const supabaseServiceKey = Deno.env.get("SUPABASE_SERVICE_ROLE_KEY") ?? ""; - - // Vérifier que les variables d'environnement sont définies - if (!supabaseUrl || !supabaseServiceKey) { - console.error("Variables d'environnement Supabase manquantes"); - return new Response( - JSON.stringify({ error: "Configuration serveur invalide" }), - { - status: 500, - headers: { ...corsHeaders, "Content-Type": "application/json" }, - } - ); - } - - // Créer le client Supabase avec la clé de service pour avoir les permissions complètes - const supabase = createClient(supabaseUrl, supabaseServiceKey, { - auth: { - autoRefreshToken: false, - persistSession: false, - }, - }); - - // Parser le body de la requête - let requestBody; - try { - requestBody = await req.json(); - } catch (parseError) { - return new Response( - JSON.stringify({ error: "Body JSON invalide" }), - { - status: 400, - headers: { ...corsHeaders, "Content-Type": "application/json" }, - } - ); - } - - const { orderId, newStatus } = requestBody; - - // Valider les paramètres d'entrée - if (!orderId || typeof orderId !== "string") { - return new Response( - JSON.stringify({ error: "orderId est requis et doit être une chaîne de caractères" }), - { - status: 400, - headers: { ...corsHeaders, "Content-Type": "application/json" }, - } - ); - } - - if (!newStatus || typeof newStatus !== "string") { - return new Response( - JSON.stringify({ error: "newStatus est requis et doit être une chaîne de caractères" }), - { - status: 400, - headers: { ...corsHeaders, "Content-Type": "application/json" }, - } - ); - } - - // Liste des statuts valides (correspond aux constantes du frontend) - const validStatuses = [ - "En attente de traitement", - "Traitement en cours", - "Commande traitée" - ]; - if (!validStatuses.includes(newStatus)) { - return new Response( - JSON.stringify({ - error: `Statut invalide. Statuts acceptés: ${validStatuses.join(", ")}` - }), - { - status: 400, - headers: { ...corsHeaders, "Content-Type": "application/json" }, - } - ); - } - - // Vérifier que la commande existe - const { data: existingOrder, error: fetchError } = await supabase - .from("orders") - .select("id, status") - .eq("id", orderId) - .single(); - - if (fetchError || !existingOrder) { - console.error("Erreur lors de la récupération de la commande:", fetchError); - return new Response( - JSON.stringify({ error: "Commande introuvable" }), - { - status: 404, - headers: { ...corsHeaders, "Content-Type": "application/json" }, - } - ); - } - - // Vérifier si le statut est déjà le même - if (existingOrder.status === newStatus) { - return new Response( - JSON.stringify({ - error: `La commande a déjà le statut "${newStatus}"`, - order: existingOrder - }), - { - status: 400, - headers: { ...corsHeaders, "Content-Type": "application/json" }, - } - ); - } - - // Mettre à jour le statut de la commande - const { data: updatedOrder, error: updateError } = await supabase - .from("orders") - .update({ - status: newStatus, - updated_at: new Date().toISOString() - }) - .eq("id", orderId) - .select() - .single(); - - if (updateError) { - console.error("Erreur lors de la mise à jour de la commande:", updateError); - return new Response( - JSON.stringify({ - error: "Erreur lors de la mise à jour du statut", - details: updateError.message - }), - { - status: 500, - headers: { ...corsHeaders, "Content-Type": "application/json" }, - } - ); - } - - if (!updatedOrder) { - return new Response( - JSON.stringify({ error: "Aucune commande mise à jour" }), - { - status: 500, - headers: { ...corsHeaders, "Content-Type": "application/json" }, - } - ); - } - - // Succès - console.log(`Commande ${orderId} mise à jour: ${existingOrder.status} -> ${newStatus}`); - return new Response( - JSON.stringify(updatedOrder), - { - status: 200, - headers: { ...corsHeaders, "Content-Type": "application/json" }, - } - ); - } catch (error) { - console.error("Erreur dans update-order-status:", error); - return new Response( - JSON.stringify({ - error: "Erreur interne du serveur", - details: error instanceof Error ? error.message : "Erreur inconnue", - }), - { - status: 500, - headers: { ...corsHeaders, "Content-Type": "application/json" }, - } - ); - } -}); - diff --git a/supabase/functions/verify-admin-password/index.ts b/supabase/functions/verify-admin-password/index.ts deleted file mode 100644 index 286a02d..0000000 --- a/supabase/functions/verify-admin-password/index.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { serve } from "https://deno.land/std@0.168.0/http/server.ts"; -import { createClient } from "https://esm.sh/@supabase/supabase-js@2"; - -const corsHeaders = { - "Access-Control-Allow-Origin": "*", - "Access-Control-Allow-Headers": - "authorization, x-client-info, apikey, content-type", -}; - -serve(async (req) => { - // Handle CORS preflight requests - if (req.method === "OPTIONS") { - return new Response("ok", { headers: corsHeaders }); - } - - try { - // Récupérer les variables d'environnement - const supabaseUrl = Deno.env.get("SUPABASE_URL") ?? ""; - const supabaseAnonKey = Deno.env.get("SUPABASE_ANON_KEY") ?? ""; - const adminPassword = Deno.env.get("ADMIN_PASSWORD") ?? ""; - - // Vérifier que les variables d'environnement sont définies - if (!supabaseUrl || !supabaseAnonKey) { - console.error("Variables d'environnement Supabase manquantes"); - return new Response( - JSON.stringify({ success: false, error: "Configuration serveur invalide" }), - { - status: 500, - headers: { ...corsHeaders, "Content-Type": "application/json" }, - } - ); - } - - if (!adminPassword) { - console.error("Variable ADMIN_PASSWORD non définie"); - return new Response( - JSON.stringify({ success: false, error: "Configuration serveur invalide" }), - { - status: 500, - headers: { ...corsHeaders, "Content-Type": "application/json" }, - } - ); - } - - // Parser le body de la requête - const { password } = await req.json(); - - // Vérifier que le mot de passe est fourni - if (!password || typeof password !== "string") { - return new Response( - JSON.stringify({ success: false, error: "Mot de passe requis" }), - { - status: 400, - headers: { ...corsHeaders, "Content-Type": "application/json" }, - } - ); - } - - // Comparer le mot de passe de manière sécurisée (timing-safe) - // Utiliser une comparaison constante pour éviter les attaques par timing - const passwordMatch = password === adminPassword; - - if (!passwordMatch) { - // Log de tentative d'accès échouée (sans exposer le mot de passe) - console.warn("Tentative de connexion échouée"); - return new Response( - JSON.stringify({ success: false, error: "Mot de passe incorrect" }), - { - status: 401, - headers: { ...corsHeaders, "Content-Type": "application/json" }, - } - ); - } - - // Connexion réussie - console.log("Connexion administrateur réussie"); - return new Response( - JSON.stringify({ success: true }), - { - status: 200, - headers: { ...corsHeaders, "Content-Type": "application/json" }, - } - ); - } catch (error) { - console.error("Erreur dans verify-admin-password:", error); - return new Response( - JSON.stringify({ - success: false, - error: "Erreur interne du serveur", - }), - { - status: 500, - headers: { ...corsHeaders, "Content-Type": "application/json" }, - } - ); - } -}); -