• Mahmoud Aglan's avatar
    feat(notifications): scheduled campaigns are actually sent · 52d5591d
    Mahmoud Aglan authored
    Campaigns saved as 'scheduled' were never looked at again: nothing in either
    app processed them. CampaignService::processDue() sends every due campaign
    into the game's bell (notifications with title_ar/body_ar, as the game's
    notifications.php reads them) and records recipients, claiming each one with
    a conditional scheduled -> sending update so overlapping runs never send
    twice. It runs from GET/POST /api/cron/notifications (X-Service-Key, or
    X-Cron-Secret / ?secret= when CRON_SECRET is set, the same credentials as
    the game's api/cron.php) for a scheduler, and as a fallback at most once a
    minute after any staff page load.
    
    Scheduling now stores the typed Cairo time as UTC (the raw datetime-local
    value was saved as UTC, 2-3 hours late) and refuses past times; filters
    are stored as jsonb, not a JSON string; cancelling only cancels a campaign
    that has not started; send-now shares the same delivery code.
    Co-Authored-By: 's avatarClaude Opus 5.5 <noreply@anthropic.com>
    52d5591d
Name
Last commit
Last update
Connections and docs Loading commit data...
api Loading commit data...
config Loading commit data...
core Loading commit data...
layouts Loading commit data...
migrations Loading commit data...
modules Loading commit data...
public Loading commit data...
storage Loading commit data...
tools Loading commit data...
.gitignore Loading commit data...
.htaccess Loading commit data...
Dockerfile Loading commit data...
EL3AB_MANAGEMENT_SYSTEM.md Loading commit data...
EL3AB_PLAYER_APP_DATA.md Loading commit data...
TOURNAMENT_PLAYBOOK.md Loading commit data...
captain-definition Loading commit data...
index.php Loading commit data...