// Ce script doit être déployé comme un Cloudflare Worker avec une route comme "monlien.com/s/*" // Remplace ces variables par tes vraies valeurs Firebase // Tu dois les définir comme des variables d'environnement (secrets) dans ton Worker Cloudflare pour la sécurité. // Pour l'exemple, elles sont ici, mais NE PAS les laisser en clair en production. const FIREBASE_API_KEY = "VOTRE_CLE_API_FIREBASE"; // Clé API Firebase const PROJECT_ID = "VOTRE_ID_DE_PROJET_FIREBASE"; // ID de projet Google Cloud/Firebase // L'ID de l'application (du fichier index.html) const APP_ID = "default-app-id"; // Remplace 'default-app-id' si tu l'as modifié dans index.html /** * Fonction principale du Cloudflare Worker pour gérer les requêtes entrantes. */ addEventListener('fetch', event => { event.respondWith(handleRequest(event.request)); }); async function handleRequest(request) { const url = new URL(request.url); const path = url.pathname; // 1. Vérifie si le chemin correspond à notre format de lien court /s/slug // Le Worker devrait être configuré avec une route /s/*, mais on vérifie le chemin pour être sûr. if (!path.startsWith('/s/')) { // Renvoie une erreur 404 si ce n'est pas un chemin de redirection return new Response('Lien non trouvé ou chemin invalide (Slug manquant).', { status: 404 }); } // Extrait le slug (par exemple, 'xyz' de '/s/xyz') const slug = path.substring(3); if (!slug) { return new Response('Slug de lien manquant.', { status: 404 }); } try { // 2. Construit l'URL de l'API REST de Firestore pour récupérer le document // Chemin du document: artifacts//public/data/short_links/ const firestoreUrl = `https://firestore.googleapis.com/v1/projects/${PROJECT_ID}/databases/(default)/documents/artifacts/${APP_ID}/public/data/short_links/${slug}?key=${FIREBASE_API_KEY}`; // Configuration de la requête pour lire le document const firestoreResponse = await fetch(firestoreUrl); if (!firestoreResponse.ok) { console.error(`Erreur Firestore pour le slug ${slug}: ${firestoreResponse.status}`); // Si Firestore renvoie 404 (document non trouvé) ou autre erreur return new Response('Lien court introuvable dans la base de données.', { status: 404 }); } const data = await firestoreResponse.json(); // 3. Vérifie si le champ 'longUrl' existe const longUrl = data.fields?.longUrl?.stringValue; if (!longUrl) { // Le document existe, mais le champ URL est manquant ou invalide return new Response('Le lien est invalide ou vide.', { status: 404 }); } // 4. Redirection (la magie sans pub !) // On utilise le code de statut HTTP 302 (Found) pour une redirection temporaire. return Response.redirect(longUrl, 302); } catch (error) { // Gère les erreurs de réseau ou d'API console.error("Erreur critique lors de la tentative de redirection:", error); return new Response('Erreur interne du serveur lors de la redirection.', { status: 500 }); } }