Pages - Routing Astro ====================== Vue d'ensemble des pages Astro et structure de routing. **Localisation** : ``frontend/src/pages/`` Routing File-Based ------------------ Astro utilise le routing basé sur fichiers : .. code-block:: text pages/ ├── index.astro → / ├── login.astro → /login ├── buildings/ │ └── index.astro → /buildings ├── owners.astro → /owners ├── units.astro → /units ├── expenses.astro → /expenses ├── meetings.astro → /meetings ├── documents.astro → /documents ├── reports.astro → /reports ├── settings.astro → /settings ├── profile.astro → /profile ├── admin/ │ ├── index.astro → /admin │ ├── users.astro → /admin/users │ ├── organizations.astro → /admin/organizations │ ├── subscriptions.astro → /admin/subscriptions │ └── seed.astro → /admin/seed ├── syndic/ │ └── index.astro → /syndic ├── accountant/ │ └── index.astro → /accountant └── owner/ ├── index.astro → /owner ├── units.astro → /owner/units ├── expenses.astro → /owner/expenses ├── documents.astro → /owner/documents ├── profile.astro → /owner/profile └── contact.astro → /owner/contact Structure Pages --------------- Anatomie Page Astro ^^^^^^^^^^^^^^^^^^^ .. code-block:: astro --- // --- Section Frontmatter (TypeScript) --- import Layout from '../layouts/Layout.astro'; import BuildingList from '../components/BuildingList.svelte'; // Protection authentification const token = Astro.cookies.get('koprogo_token'); if (!token) { return Astro.redirect('/login'); } // Données SSG (optionnel) const title = "Immeubles"; ---

Gestion des Immeubles

**Sections** : 1. **Frontmatter** (``---``) : Code TypeScript exécuté au build (SSG) ou requête (SSR) 2. **Template** : HTML statique + îles interactives Svelte Pages Publiques --------------- index.astro (/) ^^^^^^^^^^^^^^^ Page d'accueil, redirige vers dashboard si connecté. .. code-block:: astro --- const token = Astro.cookies.get('koprogo_token'); if (token) { return Astro.redirect('/dashboard'); } ---

KoproGo - Gestion de Copropriété SaaS

Se connecter
login.astro (/login) ^^^^^^^^^^^^^^^^^^^^ Page authentification avec formulaire JWT. .. code-block:: astro --- import Layout from '../layouts/Layout.astro'; import LoginForm from '../components/LoginForm.svelte'; ---
Pages Protégées (Authentification) ----------------------------------- **Pattern Protection** : .. code-block:: astro --- const token = Astro.cookies.get('koprogo_token'); if (!token) { return Astro.redirect('/login'); } --- **⚠️ Cookies vs localStorage** : - ``Astro.cookies`` : Uniquement si cookies utilisés (SSR) - ``localStorage`` : Vérification côté client (Svelte component) **Meilleure approche** : Middleware Astro .. code-block:: typescript // src/middleware.ts export function onRequest({ cookies, redirect }, next) { const token = cookies.get('koprogo_token'); const isPublicRoute = ['/login', '/'].includes(request.url.pathname); if (!token && !isPublicRoute) { return redirect('/login'); } return next(); } Pages par Rôle -------------- /admin/* (SUPERADMIN) ^^^^^^^^^^^^^^^^^^^^^ **admin/index.astro** : Dashboard admin .. code-block:: astro --- import AdminDashboard from '../../components/dashboards/AdminDashboard.svelte'; // TODO: Vérifier role === SUPERADMIN --- **admin/users.astro** : Gestion utilisateurs .. code-block:: astro --- import UserListAdmin from '../../components/UserListAdmin.svelte'; --- **admin/organizations.astro** : Gestion organisations (multi-tenant) **admin/subscriptions.astro** : Abonnements (cloud vs self-hosted) **admin/seed.astro** : Génération données de test /syndic (SYNDIC) ^^^^^^^^^^^^^^^^ **syndic/index.astro** : Dashboard syndic .. code-block:: astro --- import SyndicDashboard from '../../components/dashboards/SyndicDashboard.svelte'; --- /accountant (ACCOUNTANT) ^^^^^^^^^^^^^^^^^^^^^^^^ **accountant/index.astro** : Dashboard comptable .. code-block:: astro --- import AccountantDashboard from '../../components/dashboards/AccountantDashboard.svelte'; --- /owner/* (OWNER) ^^^^^^^^^^^^^^^^ **owner/index.astro** : Dashboard copropriétaire .. code-block:: astro --- import OwnerDashboard from '../../components/dashboards/OwnerDashboard.svelte'; --- **owner/units.astro** : Mes lots **owner/expenses.astro** : Mes charges **owner/documents.astro** : Mes documents **owner/contact.astro** : Contacter le syndic Pages Entités (CRUD) --------------------- buildings/index.astro ^^^^^^^^^^^^^^^^^^^^^ Liste et création immeubles. .. code-block:: astro --- import Layout from '../../layouts/Layout.astro'; import BuildingList from '../../components/BuildingList.svelte'; ---

Gestion des Immeubles

owners.astro ^^^^^^^^^^^^ Liste copropriétaires. .. code-block:: astro --- import OwnerList from '../components/OwnerList.svelte'; --- units.astro ^^^^^^^^^^^ Liste lots. expenses.astro ^^^^^^^^^^^^^^ Liste charges avec filtres et marquage "Payé". meetings.astro ^^^^^^^^^^^^^^ Liste assemblées générales avec upload PV. documents.astro ^^^^^^^^^^^^^^^ Liste documents partagés avec upload. Pages Utilitaires ----------------- reports.astro ^^^^^^^^^^^^^ Génération rapports (PCN, financiers). .. code-block:: astro --- import Layout from '../layouts/Layout.astro'; ---

Rapports et Exports

Précompte de Charge Notariale (PCN)

Rapports Financiers

settings.astro ^^^^^^^^^^^^^^ Paramètres utilisateur (langue, notifications, préférences). profile.astro ^^^^^^^^^^^^^ Profil utilisateur (nom, email, mot de passe). Routing Dynamique ----------------- Pour pages dynamiques (ex: ``/buildings/[id]``), créer : .. code-block:: text pages/ └── buildings/ └── [id].astro .. code-block:: astro --- // pages/buildings/[id].astro import Layout from '../../layouts/Layout.astro'; const { id } = Astro.params; // Fetch building data (SSG) const response = await fetch(`${API_URL}/buildings/${id}`); const building = await response.json(); ---

{building.name}

{building.address}

{building.total_units} lots

**Static Site Generation (SSG)** : Générer toutes les pages au build .. code-block:: typescript export async function getStaticPaths() { const buildings = await fetchAllBuildings(); return buildings.map(building => ({ params: { id: building.id }, props: { building } })); } Redirections ------------ **Redirect Simple** : .. code-block:: astro --- return Astro.redirect('/login'); --- **Redirect Conditionnel** : .. code-block:: astro --- const token = Astro.cookies.get('koprogo_token'); if (!token) { return Astro.redirect('/login'); } // Continuer si authentifié --- **Redirect après Action** : .. code-block:: astro --- if (Astro.request.method === 'POST') { // Traiter formulaire await api.post('/buildings', formData); return Astro.redirect('/buildings'); } --- SEO et Meta Tags ---------------- **Page avec SEO** : .. code-block:: astro --- import Layout from '../layouts/Layout.astro'; const title = "Gestion Immeubles - KoproGo"; const description = "Gérez vos copropriétés avec KoproGo"; ---
...
**Sitemap** : .. code-block:: xml https://koprogo.com/ 2025-01-01 1.0 https://koprogo.com/login 0.8 Gestion Erreurs --------------- **404.astro** : .. code-block:: astro --- import Layout from '../layouts/Layout.astro'; ---

404

Page non trouvée

Retour à l'accueil
**500.astro** (erreur serveur) : Créer ``src/pages/500.astro`` pour erreurs serveur. Tests Pages ----------- .. code-block:: typescript // tests/e2e/login.spec.ts import { test, expect } from '@playwright/test'; test('should login successfully', async ({ page }) => { await page.goto('/login'); await page.fill('input[type="email"]', 'test@example.com'); await page.fill('input[type="password"]', 'password123'); await page.click('button[type="submit"]'); await expect(page).toHaveURL('/dashboard'); }); test('should redirect to login if not authenticated', async ({ page }) => { await page.goto('/buildings'); await expect(page).toHaveURL('/login'); }); Build Output ------------ **Mode SSG (par défaut)** : .. code-block:: bash npm run build # Génère: dist/ ├── index.html ├── login.html ├── buildings/ │ └── index.html └── _astro/ ├── client.*.js └── *.css **Mode SSR (Server-Side Rendering)** : .. code-block:: javascript // astro.config.mjs export default defineConfig({ output: 'server', // SSR adapter: node() // Adapter Node.js }); Références ---------- - Layouts : ``frontend/src/layouts/`` - Components : ``frontend/src/components/`` - Middleware : ``frontend/src/middleware.ts`` (à créer) - Astro Routing : https://docs.astro.build/en/core-concepts/routing/