feat: Phase 3 complete — push alerts, feedback scoring, S3 fallback, SPA routing, mobile CSS
- ImpactScoreService: implement getFeedbackBonus() (ST_Distance query on UserFeedback within 20km/6h) - ImpactScoreService: trigger PushNotificationService when score >= 70 - PushNotificationService: send VAPID WebPush to spot subscribers, clean expired subs - PushController: GET vapid-public-key, POST/DELETE subscribe with rate limiting - SentinelHubClient: add optional $collection param, add Sentinel-3 OLCI FAI evalscript (MCI) - IngestionService: add $collection param + HighCloudCoverageException for fallback logic - IngestionService: add ingestWithFallback() — tries S2, falls back to S3 on high cloud - IngestSentinelCommand: --source=auto (default) triggers ingestWithFallback - FeedbackController: rate limiting via apiFeedbackLimiter - Migration: push_subscription table - rate_limiter.yaml: api_read(120/min), api_feedback(10/min), api_push(5/min) - sw.js: service worker handling push events + notificationclick - usePushSubscription hook: subscribe/unsubscribe lifecycle with VAPID - SpotPanel: PushButton component integrated - SpotPanel.css + TimelineSlider.css: mobile responsive (bottom-sheet on small screens) - Caddyfile: SPA served at / with try_files fallback, sw.js served from root scope - vite.config.js: build outDir → backend/public (not /spa) - deploy/post-receive.sh: full deploy script (composer, npm build, migrations, cache, docker up) - docs/roadmap.md: all Phase 3 + transversal items marked done Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -6,20 +6,26 @@
|
||||
:80 {
|
||||
root * /app/public
|
||||
|
||||
# Assets Symfony
|
||||
# Assets Symfony (webpack encore)
|
||||
handle /bundles/* {
|
||||
file_server
|
||||
}
|
||||
|
||||
# SPA React (fichiers statiques buildés dans public/spa/)
|
||||
handle /spa/* {
|
||||
# Service worker (must be served from root scope)
|
||||
handle /sw.js {
|
||||
file_server
|
||||
}
|
||||
|
||||
# Tout le reste → Symfony (front controller index.php)
|
||||
handle {
|
||||
# API → Symfony front controller
|
||||
handle /api/* {
|
||||
php_server
|
||||
}
|
||||
|
||||
# SPA React : try static files first, fallback to index.html
|
||||
handle {
|
||||
try_files {path} /index.html
|
||||
file_server
|
||||
}
|
||||
|
||||
encode gzip
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user