9.3 KiB
9.3 KiB
External Integrations
Analysis Date: 2026-05-28
APIs & External Services
Firebase Cloud Messaging (FCM):
- Service: Firebase Cloud Messaging — push notification delivery to mobile devices via topic-based messaging
- Implementation:
src/app/Services/FcmService.php - Auth: Service Account JSON file (path configured via
FIREBASE_CREDENTIALSenv var); usesGoogle\Auth\Credentials\ServiceAccountCredentialsto fetch OAuth2 access tokens - Scopes:
https://www.googleapis.com/auth/firebase.messaging - Endpoint:
https://fcm.googleapis.com/v1/projects/{projectId}/messages:send - Env vars:
FIREBASE_PROJECT_ID,FIREBASE_CREDENTIALS - Topic mapping:
FCM_TOPIC_RAINFALL_WARNINGenv var (set insrc/app/Http/Controllers/Api/AlertController.php)
Google Auth Library:
- Package:
google/auth ^1.49(src/composer.json) - Purpose: Generates OAuth2 bearer tokens for Firebase API calls using service account credentials
- Implementation:
src/app/Services/FcmService.php— createsServiceAccountCredentialsinstance and callsfetchAuthToken()
Amazon SES (Simple Email Service):
- Configured in
src/config/services.php—seskey withAWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY,AWS_DEFAULT_REGION - Mail transport:
sesdriver insrc/config/mail.php - Also used as a transport in
roundrobinfailover group
Postmark:
- Configured in
src/config/services.php—postmarkkey withPOSTMARK_API_KEYenv var - Mail transport:
postmarkdriver insrc/config/mail.php - Optional
message_stream_idconfig commented out - Used in
roundrobinfailover group with SES
Resend:
- Configured in
src/config/services.php—resendkey withRESEND_API_KEYenv var - Mail transport:
resenddriver insrc/config/mail.php
Slack:
- Notifications: configured in
src/config/services.php—slack.notificationswithSLACK_BOT_USER_OAUTH_TOKENandSLACK_BOT_USER_DEFAULT_CHANNELenv vars - Logging: Slack webhook channel available in
src/config/logging.php—LOG_SLACK_WEBHOOK_URLenv var for critical-level log alerts
Papertrail:
- Logging channel configured in
src/config/logging.php—SyslogUdpHandlerviaPAPERTRAIL_URLandPAPERTRAIL_PORTenv vars with TLS
Data Storage
Databases:
- PostgreSQL 18.1
- Container:
sides-db(imagepostgres:18.1) - Connection:
pgsqldriver; env varsDB_HOST,DB_PORT(5432),DB_DATABASE,DB_USERNAME,DB_PASSWORD - Persistence:
./docker/postgres/data:/var/lib/postgres/data - Exposed port: 5432
- Schema:
public - Client library:
pdo_pgsqlandpgsqlPHP extensions installed in Docker image
- Container:
Redis:
- Configured in
src/config/database.phpunder therediskey - Client:
phpredis(configured viaREDIS_CLIENTenv var) - Separate connections for
default(DB 0) andcache(DB 1) - Retry/backoff: decorrelated jitter strategy, max 3 retries, 100ms base, 1000ms cap
- Used as optional driver for: cache (
CACHE_STORE=redis), queue (QUEUE_CONNECTION=redis), session (SESSION_DRIVER=redis)
File Storage:
- Local disk (
local):storage/app/private/— default filesystem - Public disk (
public):storage/app/public/— symlinked topublic/storage - S3 disk (
s3) configured for AWS S3: env varsAWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY,AWS_DEFAULT_REGION,AWS_BUCKET,AWS_URL,AWS_ENDPOINT - Default disk: selected via
FILESYSTEM_DISKenv var (falls back tolocal)
Authentication & Identity
Auth Provider:
- Laravel's built-in session-based authentication (
src/config/auth.php)- Guard:
webdriver usingsession - Provider:
usersusingeloquentdriver onApp\Models\User
- Guard:
- Password resets via
password_reset_tokenstable; 60-minute expiry; 60-second throttle - Custom
access_levelfield onuserstable (integer, default2), withis_blockedandlogin_attemptsfields for account lockout - API authentication: custom tokenless login in
src/app/Http/Controllers/Api/AuthController.php— validates username/password via raw SQL andHash::check(), returns user data withaccess_level
Email Verification:
- Built-in Laravel email verification flow (
MustVerifyEmailtrait available but not used inApp\Models\User) - Routes use
signedmiddleware with throttling (6:1)
Monitoring & Observability
Error Tracking:
- Not detected — no Sentry, Bugsnag, or similar APM integration
Logs:
- Laravel logging via Monolog (
src/config/logging.php) - Default channel:
stack→single(writes tostorage/logs/laravel.log) - Available channels:
single,daily(14-day retention),slack,papertrail,stderr,syslog,errorlog pailCLI log viewer available in dev (laravel/pail ^1.2.2)
Dozzle:
- Log viewer container (
amir20/dozzle:latest) indocker-compose.yml - Port: 777
- Container actions and shell access enabled
CI/CD & Deployment
Hosting:
- Not explicitly declared — Docker-based deployment assumed
- Artisan serve on port 8000 (dev); Nginx on port 8080/8443 (production via Docker)
composer setupscript performs full bootstrap:composer install,.envcreation,key:generate, migrations, npm install + build
CI Pipeline:
- Not detected — no GitHub Actions, GitLab CI, or similar config files found
Environment Configuration
Required env vars (from code analysis):
| Variable | Used In | Purpose |
|---|---|---|
APP_KEY |
config/app.php |
Laravel encryption key (AES-256-CBC) |
APP_ENV |
config/app.php |
Environment (local/production) |
APP_DEBUG |
config/app.php |
Debug mode toggle |
APP_URL |
config/app.php, config/filesystems.php |
Application base URL |
APP_NAME |
config/app.php, config/session.php, config/cache.php |
Application name |
DB_CONNECTION |
config/database.php, config/queue.php |
Database connection (default: sqlite) |
DB_HOST, DB_PORT, DB_DATABASE, DB_USERNAME, DB_PASSWORD |
config/database.php |
PostgreSQL connection |
SESSION_DRIVER |
config/session.php |
Session backend (default: database) |
SESSION_DRIVER |
config/session.php |
Session backend (default: database) |
QUEUE_CONNECTION |
config/queue.php |
Queue driver (default: database) |
CACHE_STORE |
config/cache.php |
Cache backend (default: database) |
FILESYSTEM_DISK |
config/filesystems.php |
Storage disk (default: local) |
MAIL_MAILER |
config/mail.php |
Mail driver (default: log) |
FIREBASE_PROJECT_ID |
FcmService.php |
Firebase project identifier |
FIREBASE_CREDENTIALS |
FcmService.php |
Path to Firebase service account JSON |
FCM_TOPIC_RAINFALL_WARNING |
AlertController.php |
FCM topic for alerts |
POSTGRES_DB, POSTGRES_USER, POSTGRES_PASSWORD |
docker-compose.yml |
PostgreSQL container credentials |
PGADMIN_EMAIL, PGADMIN_PASSWORD |
docker-compose.yml |
pgAdmin login credentials |
Secrets location:
- Environment variables via
.envfile (not committed per.env.examplepattern) - Docker Compose
environmentblocks reference${VAR}from.envfile (no hardcoded secrets)
Frontend CDN Dependencies
Loaded via CDN (not bundled by Vite):
- Bootstrap 5.3.3 (CSS + JS bundle) —
cdn.jsdelivr.net - Leaflet 1.9.4 (CSS + JS) —
unpkg.com - Chart.js 4.4.0 + chartjs-plugin-zoom 2.1.1 —
cdn.jsdelivr.net - jsPDF 2.5.1 + jspdf-autotable 3.5.28 —
cdnjs.cloudflare.com - jQuery 3.6.0 —
cdn.jsdelivr.net - Boxicons 2.1.4 —
unpkg.com - Flatpickr —
cdn.jsdelivr.net
Webhooks & Callbacks
Incoming:
- Not detected — no webhook endpoint routes found
Outgoing:
- Firebase FCM HTTP POST to
fcm.googleapis.comfor push notifications (FcmService.php) - Slack webhook for log alerts (configured via
LOG_SLACK_WEBHOOK_URL)
Queue & Job Processing
Queue Driver:
- Default:
database(using PostgreSQLjobstable) - Alternate drivers configured:
sync,beanstalkd,sqs,redis,deferred,background,failover - Failover chain:
database→deferred - Job batching table:
job_batches - Failed jobs table:
failed_jobs(driver:database-uuids)
Queue Worker:
- Dev command:
php artisan queue:listen --tries=1(part ofcomposer devscript, runs viaconcurrently)
Session Management
Session Driver:
- Default:
database(using PostgreSQLsessionstable) - Alternate drivers available:
file,cookie,memcached,redis,dynamodb,array - Lifetime: 120 minutes (configurable via
SESSION_LIFETIME) - Cookie:
{app_name}-session, HTTP-only, SameSite=Lax
Localization
Supported Locales:
- English (
en):src/lang/en/—messages.php,toast.php,auth.php,validation.php,pagination.php,passwords.php - Bahasa Malaysia (
bm):src/lang/bm/— same file set as English - Locale switching:
src/app/Http/Controllers/LocaleController.phpviaGET /locale/{locale}route - Stored in session via
Session::put('locale', $lang)
Management & Utility Containers
Docker auxiliary services (in docker-compose.yml):
- pgAdmin4 (
dpage/pgadmin4) - Port 5050, for PostgreSQL management - Adminer - Port 6060, lightweight DB management
- Dozzle (
amir20/dozzle:latest) - Port 777, real-time Docker log viewer - Filebrowser (
gtstef/filebrowser:stable) - Port 8900, web file manager with access to/root/sides
Integration audit: 2026-05-28