3a32e93ab1
Implements the JSON API for Le Donut Infolab per INSTRUCTIONS.md.
Schema (migrations/001-002):
- 8 tables: categories, members, projects, project_members, roadmap_steps,
discussions, resources, activity_log
- 6 categories seeded with colors / dimensions (social, ecologique, transversal)
- FK contraintes + soft delete sur projects, CHECK sur progress_percent
Bare PHP framework (src/):
- Front controller public/index.php + router :params + auth flag par route
- PSR-4 autoload sans Composer (bootstrap.php)
- Database PDO singleton + helpers fetchOne/All/insert/update/delete
- Validator fluent -> 422 {error: validation_failed, fields: {...}}
- Bearer token admin (hash_equals) sur POST/PATCH/DELETE
- Slugger avec unicité (suffixe -2, -3...) via intl Transliterator
- ActivityLogger best-effort sur activity_log
- Erreurs uniformes : 400/401/404/405/409/422/500 + CORS configurable
10 contrôleurs (Health, Categories, Members, Projects, ProjectMembers,
Roadmap, Discussions, Resources, Activity, Stats). Transitions de statut
loggées (created_project, completed_step, joined, etc.).
Cible prod :
- Dockerfile (php:8.3-apache + pdo_mysql + intl + opcache)
- docker-compose.yml sur réseau donut-net, bind 127.0.0.1:8003
- caddy.conf pour infolab.ledonut-marseille.org
- migrations/apply.sh idempotent (table schema_migrations)
- DEPLOY.md avec commandes SSH exactes
Tests :
- tests/smoke.sh exerce 10 endpoints clés, body envoyé via stdin
(--data-binary @-) pour gérer l UTF-8 sous Git Bash Windows.
Vérifié localement sous Laragon Apache + MySQL 8.4 : 10/10 OK + cas
négatifs (401, 404, 405, 409, 422) conformes au contrat.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
33 lines
982 B
Docker
33 lines
982 B
Docker
FROM php:8.3-apache
|
|
|
|
# Extensions PHP nécessaires
|
|
RUN apt-get update \
|
|
&& apt-get install -y --no-install-recommends \
|
|
libicu-dev \
|
|
&& docker-php-ext-install -j$(nproc) pdo_mysql intl opcache \
|
|
&& apt-get clean \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
# Active mod_rewrite (pour le routing index.php) + headers (CORS)
|
|
RUN a2enmod rewrite headers
|
|
|
|
# Pointe Apache vers /public
|
|
ENV APACHE_DOCUMENT_ROOT=/var/www/html/public
|
|
RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' \
|
|
/etc/apache2/sites-available/*.conf \
|
|
/etc/apache2/apache2.conf \
|
|
/etc/apache2/conf-available/*.conf
|
|
|
|
# Config PHP minimale en prod
|
|
RUN { \
|
|
echo 'opcache.enable=1'; \
|
|
echo 'opcache.memory_consumption=128'; \
|
|
echo 'opcache.validate_timestamps=0'; \
|
|
echo 'display_errors=Off'; \
|
|
echo 'log_errors=On'; \
|
|
echo 'error_log=/dev/stderr'; \
|
|
echo 'expose_php=Off'; \
|
|
} > /usr/local/etc/php/conf.d/donut.ini
|
|
|
|
EXPOSE 80
|