Aller au contenu

Embed public AIT

L'espace AIT expose deux pages publiques qu'une commune intègre en iframe sur son propre site, pour ses habitants, sans l'app bat-id : une carte interactive en lecture seule et la liste des mises à l'enquête. Découplées de toute session AIT.

Lecture seule, aucune donnée privée

Routes publiques : pas d'authentification, pas de session AIT, pas de Policy. Aucune zone d'alerte, aucun identifiant bat-id, aucune donnée privée. Aucune écriture possible.

Endpoints

Méthode Route Contenu
GET /ait/embed/{municipality} Carte interactive (formes géométriques de la commune)
GET /ait/embed-alerts/{municipality} Liste des mises à l'enquête (annonces BO)
GET /ait/embed-screen/{municipality} Écran d'information plein écran, boucle automatique

{municipality} = identifiant de la commune (route-model binding). Langue optionnelle sur la carte :

GET /ait/embed/{municipality}?lang=fr   (ou lang=de ; défaut = locale applicative, repli fr)

Carte interactive — /ait/embed/{municipality}

Diffuse les planches géométriques publiées par la commune. Une planche reste invisible tant qu'un admin AIT ne l'a pas explicitement passée en statut published ; les brouillons (draft) ne sont jamais diffusés.

  • Payload par forme : titre, information, couleur, publics cibles, pictogrammes, bornes de validité (valid_from, valid_until).
  • Tranche temporelle (past / present / future) calculée côté serveur ; filtre par période appliqué côté client.
  • Filtres client sur les publics cibles et pictogrammes réellement présents.
  • Géométries servies en GeoJSON (FeatureCollection).

Formes publiées et valides uniquement

Le serveur n'expose que les planches en statut published destinées à la diffusion publique (where('status', 'published')). Les brouillons restent réservés au back-office AIT. Aucune zone d'alerte ni donnée nominative dans le payload.

Fidélité de rendu

Les formes s'affichent dans l'iframe à l'identique de l'éditeur AIT (source de vérité : AitMap.vue) :

  • couleur et épaisseur de trait (_line_weight) respectées ;
  • tirets proportionnels (computeDash(_dash_array, _line_weight)) ;
  • étiquettes texte avec leur taille (_text_size) et leur fond (_text_bg, padding et centrage).

Le codage temporel public (passé estompé, futur en tirets) s'applique par-dessus ce rendu fidèle.

Liste des alertes — /ait/embed-alerts/{municipality}

Annonces du Bulletin officiel de la commune (jusqu'à 300, les plus récentes d'abord), sans carte. Par entrée : date, ancienneté en jours, parcelles concernées, rubrique, titre, source, lien vers le PDF. Mention bat-id sobre incitant à la géolocalisation. Active par défaut pour toutes les communes.

Écran d'information — /ait/embed-screen/{municipality}

Vue plein écran conçue pour des écrans diffusés en continu (commerces, cafés, office du tourisme, vitrines communales). Sans filtre ni interaction : la page enchaîne automatiquement les sujets « en ce moment » (planches valides le jour même) puis « à venir » (nouveautés des 5 prochains jours), avec une transition de carte (zoom arrière → recadrage → zoom avant) entre chaque. Grand format, lisible à distance.

Même source publique que la carte interactive (planches published uniquement, aucune donnée nominative). Affichage recommandé en 16:9 (le code d'intégration proposé est responsive en ratio 16:9).

Intégration iframe

En-têtes configurés pour ces deux routes uniquement :

  • Content-Security-Policy: frame-ancestors * — autorise l'intégration par tout site communal tiers.
  • X-Frame-Options retiré — neutralisé au cas où un reverse-proxy ajouterait un DENY/SAMEORIGIN. Sur navigateurs modernes, frame-ancestors prévaut ; les deux sont couverts.

Périmètre des en-têtes

Limités aux deux routes d'embed. Aucun middleware global de headers n'est touché.

Exemple responsive

<div style="position:relative; width:100%; padding-top:62.5%;">
  <iframe
    src="https://demo.bat-id.ch/ait/embed/{ID_COMMUNE}?lang=fr"
    title="Carte des mises à l'enquête"
    loading="lazy"
    style="position:absolute; inset:0; width:100%; height:100%; border:0;"
    referrerpolicy="no-referrer">
  </iframe>
</div>

Pour la liste des alertes, remplacer le chemin par /ait/embed-alerts/{ID_COMMUNE}.

Bonnes pratiques

loading="lazy" + conteneur à ratio fixe pour éviter le décalage de mise en page. Le domaine dépend de l'environnement (démo / production) — vérifier l'URL exacte côté espace AIT.