Files
echo-du-huit/extension/nextcloud.js
Pierre Martin 058229dce3 feat: write the mairie status back to Nextcloud over CalDAV
REPORT by UID gives href + ETag + calendar-data, then PUT with If-Match: the
resource URL is never guessed and a concurrent edit yields 412 instead of an
overwrite. URL_COLLECTION is derived from URL_CALENDRIER.
2026-08-13 16:50:16 +02:00

38 lines
1.5 KiB
JavaScript

// Transport CalDAV isolé : récupère le flux iCalendar brut du calendrier
// Nextcloud de l'Atelier du Huit en réutilisant la session du navigateur
// (cookies). Aucun mot de passe stocké. Le module reste pur de toute
// présentation : il renvoie un *type* d'erreur, pas un message.
export const URL_CALENDRIER =
"https://atelier-huit.frama.space/remote.php/dav/calendars/Pierre/latelier-du-huit-sbastien_shared_by_admin/?export";
// La collection CalDAV (sans `?export`) est la cible des requêtes REPORT/PUT.
// DÉRIVÉE plutôt que recopiée : une seule URL de calendrier dans le repo, donc
// aucune dérive possible entre lecture et écriture.
export const URL_COLLECTION = URL_CALENDRIER.replace(/\?export$/, "");
// fetchImpl est injecté (obligatoire) pour la testabilité.
// Résultat discriminé : { ok:true, flux } | { ok:false, erreur }.
export async function recupererFluxCalendrier(fetchImpl) {
let reponse;
try {
reponse = await fetchImpl(URL_CALENDRIER, { credentials: "include" });
} catch {
return { ok: false, erreur: "reseau" };
}
if (reponse.status === 401 || reponse.status === 403) {
return { ok: false, erreur: "non-connecte" };
}
if (!reponse.ok) {
return { ok: false, erreur: "serveur" };
}
const flux = await reponse.text();
// Piège central : une redirection vers la page de login renvoie un 200 HTML.
if (!flux.trimStart().startsWith("BEGIN:VCALENDAR")) {
return { ok: false, erreur: "non-connecte" };
}
return { ok: true, flux };
}