From 0cc6fa3a9d9676b5cc385681b3098ea9c917987b Mon Sep 17 00:00:00 2001 From: Julien Martin Date: Mon, 13 Apr 2026 17:40:58 +0200 Subject: [PATCH] =?UTF-8?q?docs:=20ticket=20#120=20ferm=C3=A9=20=E2=80=94?= =?UTF-8?q?=20liste=20tickets=20+=20script=20cl=C3=B4ture=20Gitea?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 23_LISTE-TICKETS : #120 marqué fermé. - backend/scripts/close-gitea-issue-120.js : commentaire de livraison + PATCH state closed (réutilisable / traçabilité). Made-with: Cursor --- backend/scripts/close-gitea-issue-120.js | 104 +++++++++++++++++++++++ docs/23_LISTE-TICKETS.md | 2 +- 2 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 backend/scripts/close-gitea-issue-120.js diff --git a/backend/scripts/close-gitea-issue-120.js b/backend/scripts/close-gitea-issue-120.js new file mode 100644 index 0000000..fbdc75a --- /dev/null +++ b/backend/scripts/close-gitea-issue-120.js @@ -0,0 +1,104 @@ +/** + * Commentaire de clôture + fermeture issue Gitea #120. + * Usage: node backend/scripts/close-gitea-issue-120.js + * Token : .gitea-token (racine), GITEA_TOKEN, ou docs/BRIEFING-FRONTEND.md + */ +const https = require('https'); +const fs = require('fs'); +const path = require('path'); + +const repoRoot = path.join(__dirname, '../..'); +const ISSUE = 120; +const REPO = 'jmartin/petitspas'; + +const body = `## Fermeture ticket #120 — livré sur \`develop\` + +Branche **\`feature/120-inscription-am-photo\`** mergée dans **\`develop\`** (livraison : inscription AM alignée parents + panneau validation gestionnaire). + +### Inscription AM (alignement parents) +- Photo, consentement, lieux de naissance : parcours et API alignés sur le modèle parents (DTO, entité user, migration SQL, écrans inscription AM, \`registration_photo_slot\`, scripts de test Node). + +### Panneau gestionnaire — onglet « À valider » +- Bouton **Ouvrir** : visible au **survol** (même principe que les cartes admin), **icône centrée** sur la ligne et **taille doublée** (\`iconSize\` 34). + +### Wizard validation dossier AM +- Titres : **Identité et coordonnées** · **Dossier professionnel** (au-dessus des champs à droite, pas de la photo) · **Présentation**. +- **Photo** à gauche (ratio identité 35×45) ; **grille droite** \`[2,2,2,2]\` : NIR | date de naissance, ville | pays de naissance, n° agrément | date d'agrément, capacité | places. +- **\`AppUser\`** : \`date_naissance\`, \`lieu_naissance_ville\`, \`lieu_naissance_pays\` ; affichage dates **\`dd/MM/yyyy\`** (\`formatIsoDateFr\`). +- **\`ValidationDetailSection\`** : titre **optionnel** (wizard AM). + +### Wizard validation famille +- Étape 4 : titre **« Présentation »** (plus « Présentation / Motivation »). + +### Nettoyage +- Suppression des **\`debugPrint\`** liés aux médias / images / chargement dossier (\`api_config\`, \`auth_network_image\`, \`dossier_unifie\`, \`user_service\`, carte enfant validation). + +--- +*Issue fermée après merge sur \`develop\` et recette.*`; + +let token = process.env.GITEA_TOKEN; +if (!token) { + try { + const tokenFile = path.join(repoRoot, '.gitea-token'); + if (fs.existsSync(tokenFile)) token = fs.readFileSync(tokenFile, 'utf8').trim(); + } catch (_) {} +} +if (!token) { + try { + const briefing = fs.readFileSync(path.join(repoRoot, 'docs/BRIEFING-FRONTEND.md'), 'utf8'); + const m = briefing.match(/Token:\s*(giteabu_[a-f0-9]+)/); + if (m) token = m[1].trim(); + } catch (_) {} +} +if (!token) { + console.error('Token non trouvé : .gitea-token ou GITEA_TOKEN'); + process.exit(1); +} + +function request(method, apiPath, payloadObj) { + const payload = payloadObj ? JSON.stringify(payloadObj) : null; + return new Promise((resolve, reject) => { + const opts = { + hostname: 'git.ptits-pas.fr', + path: `/api/v1/repos/${REPO}${apiPath}`, + method, + headers: { + Authorization: 'token ' + token, + 'Content-Type': 'application/json', + ...(payload ? { 'Content-Length': Buffer.byteLength(payload) } : {}), + }, + }; + const req = https.request(opts, (res) => { + let d = ''; + res.on('data', (c) => (d += c)); + res.on('end', () => { + if (res.statusCode !== 200 && res.statusCode !== 201) { + reject(new Error(`HTTP ${res.statusCode}: ${d}`)); + return; + } + try { + resolve(d ? JSON.parse(d) : {}); + } catch (_) { + resolve({}); + } + }); + }); + req.on('error', reject); + if (payload) req.write(payload); + req.end(); + }); +} + +(async () => { + try { + console.log(`POST commentaire issue #${ISSUE}...`); + await request('POST', `/issues/${ISSUE}/comments`, { body }); + console.log('Commentaire publié.'); + console.log(`PATCH fermeture issue #${ISSUE}...`); + await request('PATCH', `/issues/${ISSUE}`, { state: 'closed' }); + console.log(`Issue #${ISSUE} fermée.`); + } catch (e) { + console.error(e.message || e); + process.exit(1); + } +})(); diff --git a/docs/23_LISTE-TICKETS.md b/docs/23_LISTE-TICKETS.md index 6e4b516..0d79a14 100644 --- a/docs/23_LISTE-TICKETS.md +++ b/docs/23_LISTE-TICKETS.md @@ -101,7 +101,7 @@ | 116 | Rattachement parent – frontend | Ouvert | | 117 | Évolution du cahier des charges | Ouvert | | 119 | Endpoint unifié GET /dossiers/:numeroDossier (AM ou famille) | ✅ Fermé | -| 120 | [Full-stack] Inscription AM — photo, API et UX alignés sur les parents (suite #91) | Ouvert | +| 120 | [Full-stack] Inscription AM — photo, API et UX alignés sur les parents (suite #91) | ✅ Fermé | *Gitea #1 et #2 = anciens tickets de test (fermés). Liste complète : https://git.ptits-pas.fr/jmartin/petitspas/issues*