Embed public AIT¶
L'espace AIT expose des pages publiques qu'une commune intègre en iframe sur son propre site, pour ses habitants, sans l'app Bat-ID. Découplées de toute session AIT, en lecture seule.
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. Le contenu public est bâti en liste blanche — on énumère ce qu'on expose, on ne retire pas ce qu'on veut cacher : une colonne ajoutée demain au modèle ne sera pas publiée par accident.
Deux générations d'adresses¶
Depuis la 2.3.3, une commune n'intègre plus des vues figées portant tout son territoire : elle ouvre autant de diffusions qu'elle a d'usages, chacune avec les planches qu'elle montre, sa présentation et son échéance.
| Méthode | Route | Contenu | Statut |
|---|---|---|---|
GET | /ait/geo/p/{token} | Une diffusion de géoinformation — carte, liste ou écran, selon le mode du lien | ✅ Voie normale |
GET | /ait/geo/p/{token}/data | Le contenu de cette diffusion en JSON | ✅ |
GET | /ait/embed-alerts/{municipality} | Liste des mises à l'enquête (annonces BO) | ✅ Maintenue — elle ne sort pas des planches |
GET | /ait/embed/{municipality} | Carte interactive de toutes les planches publiées | ⚠️ Héritée |
GET | /ait/embed-screen/{municipality} | Écran d'information plein écran | ⚠️ Héritée |
Les adresses héritées restent en service — ne pas les retirer
Des communes les ont déjà collées sur leur site. Les supprimer y laisserait un cadre vide, sans que personne ne fasse le rapprochement avec une décision technique prise ailleurs. Elles continuent de fonctionner à l'identique ; elles ne sont simplement plus proposées à l'écran.
Les diffusions — /ait/geo/p/{token}¶
Une diffusion se crée depuis l'espace AIT, au choix dans le module Géoinformation ou dans la page « Diffusion publique » — c'est le même panneau, monté aux deux endroits.
Chacune porte :
- un périmètre — toutes les planches publiées, ou une sélection ;
- une présentation —
map(carte navigable avec la liste sur le côté),list(les planches et leurs informations, sans navigation),screen(défilement automatique, pour un panneau de hall ou de guichet) ; - une échéance facultative — passée cette date, l'adresse cesse de répondre ;
- une révocation immédiate, indépendante des autres diffusions.
Le statut décide, et lui seul
Seules les planches publiées et valides le jour même sortent. Un brouillon, une planche en attente ou périmée reste invisible même si le lien la désigne nommément : une diffusion ne peut pas servir à contourner le circuit de publication. Une planche datée — chantier, manifestation, déviation — disparaît donc d'elle-même le jour venu, sans que personne ait à y revenir.
Le nom de la diffusion n'est jamais public
C'est un libellé interne, qui sert à savoir où l'on a collé quoi (« Page urbanisme », « Écran du hall »). Le montrer révélerait l'organisation de la commune sans rien apprendre d'utile au visiteur.
Un jeton inconnu, révoqué ou expiré donne la même 404. Distinguer les trois apprendrait à qui essaie des jetons au hasard lesquels ont existé — et donc quelles communes diffusent quoi.
Endpoints hérités¶
| Méthode | Route | Contenu |
|---|---|---|
GET | /ait/embed/{municipality} | Carte interactive (formes géométriques de la commune) |
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 :
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é : GeoCanvas.vue, le canevas de dessin partagé) :
- 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 routes publiques uniquement (/ait/geo/p/{token} et les trois adresses héritées) :
Content-Security-Policy: frame-ancestors *— autorise l'intégration par tout site communal tiers.X-Frame-Optionsretiré — neutralisé au cas où un reverse-proxy ajouterait unDENY/SAMEORIGIN. Sur navigateurs modernes,frame-ancestorsprévaut ; les deux sont couverts.
Périmètre des en-têtes
Limités aux routes d'embed. Aucun middleware global de headers n'est touché.
Côté serveur : ne jamais poser de CSP frame-ancestors globale
Ces routes en posent une côté application. Deux CSP se cumulent au plus restrictif : une directive globale ajoutée dans nginx ou Plesk casserait silencieusement toutes les intégrations communales.
Exemple responsive — une diffusion¶
<div style="position:relative; width:100%; padding-top:62.5%;">
<iframe
src="https://demo.bat-id.ch/ait/geo/p/{JETON}"
title="Plan de zones — Commune de …"
loading="lazy"
style="position:absolute; inset:0; width:100%; height:100%; border:0;"
referrerpolicy="no-referrer">
</iframe>
</div>
Le code d'intégration exact est fourni prêt à copier dans l'espace AIT, pour chaque diffusion : il porte déjà le bon ratio selon la présentation choisie (16:9 pour un écran d'information, plus haut pour une carte insérée dans une page).
Pour la liste des annonces officielles, le chemin reste /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.