Skip to content

feat(scraper): bouton Actualiser les offres + API /scraping/trigger#2

Merged
Bastagas merged 1 commit into
mainfrom
feat/scrape-trigger-button
Apr 21, 2026
Merged

feat(scraper): bouton Actualiser les offres + API /scraping/trigger#2
Bastagas merged 1 commit into
mainfrom
feat/scrape-trigger-button

Conversation

@Bastagas

Copy link
Copy Markdown
Owner

Summary

  • Bouton "Actualiser les offres" en haut de /scraper.php qui lance un scrape manuel sans attendre le cron 03:00 UTC.
  • Nouvelle route POST /scraping/trigger (Flask) qui enfile un job APScheduler one-shot.
  • Nouvelle route GET /scraping/status pour polling UI.
  • Proxy PHP /api/trigger_scrape.php qui évite CORS et cache l'URL du container.

UX

  • Click → spinner "Envoi…" → "Scrape en cours..." avec dots animés
  • Poll toutes les 5s sur /scraping/status
  • À la fin du run : toast +N nouvelles offres puis reload auto pour montrer la nouvelle data partout sur le site

Fix bonus

  • docker-compose.yml : les lignes FRANCE_TRAVAIL_CLIENT_ID: ${…:-} dans environment: écrasaient silencieusement la valeur de .env.local (docker précédence environment > env_file). Supprimé. Les credentials viennent maintenant de env_file seulement.

Test plan

  • Backend : POST /scraping/trigger → 200 + job_id
  • Double-clic : 2e appel reçoit already_queued → 409
  • E2E : 1 clic → run complet en 21s → +48 offres en base
  • Button UI : spinner + polling + reload auto
  • Smoke test manuel dans le navigateur

🤖 Generated with Claude Code

Permet de relancer le scrape depuis la page /scraper.php en 1 clic,
sans attendre le cron 03:00 UTC.

Backend (api/)
- scheduler.trigger_scrape_now() : ajoute un job APScheduler one-shot
  (DateTrigger now+2s) avec id manual_<timestamp>. Anti-double-clic :
  refuse si un job manuel est déjà en file.
- Nouvelle route POST /scraping/trigger : 200 ok / 409 already_queued
  / 503 scheduler_disabled. Rate-limit global 120/min déjà en place.
- Nouvelle route GET /scraping/status : renvoie les 3 derniers runs
  (id, status, offers_found/new/updated, started_at) pour polling UI.
- Blueprint scraping enregistré dans create_app().

Frontend (frontend/)
- /api/trigger_scrape.php : proxy curl vers l'API Flask Docker-network
  (api:5001), évite CORS et URL absolue exposée au client.
- /scraper.php : bouton "Actualiser les offres" (cta-red) dans le header
  avec Alpine x-data="scrapeTrigger". États loading/running/done avec
  spinner + dots animés. Toast feedback succès/erreur.
- Polling automatique /scraping/status toutes les 5s pendant un run.
- Quand le run termine : toast "+N nouvelles offres" + reload auto
  pour refléter la nouvelle data partout.
- Cache-busting CSS : href="/assets/css/*.css?v={{ now|date('U') }}"
  pour forcer le navigateur à recharger après un rebuild.

Fix (docker-compose.yml)
- environment: ne définit plus FRANCE_TRAVAIL_CLIENT_ID/_SECRET avec
  ${VAR:-} car ça écrasait la valeur fournie par env_file .env.local
  (docker-compose précedence : environment > env_file). Les credentials
  viennent maintenant uniquement de .env.local, via env_file.

Test E2E réussi : POST /scraping/trigger → run terminé en 21s →
+48 offres nouvelles en base.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@Bastagas Bastagas merged commit 214e3eb into main Apr 21, 2026
3 checks passed
@Bastagas Bastagas deleted the feat/scrape-trigger-button branch April 21, 2026 11:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant