Surfaces distinct visitors for the selected range as a headline figure, and
lets the current view be exported for use in filings without retyping.
Unique visitors are counted across the range as a whole rather than summed
per document, so one person pulling five filings counts once. Where visitor
IPs were never recorded the CSV leaves the cell blank instead of writing 0,
which would otherwise read as "nobody downloaded this".
Records every successful document download and surfaces the counts in the
admin area, so the docket owner can see which filings are being pulled and
how often.
- document_accesses table + DocumentAccess model
- DocumentController@download records each successful download with IP and
user agent
- documents:import-access-log backfills history from an archived nginx log
- Dashboard gains a 60-day downloads card and a most-requested list
- New Document Access page with a date-range filter and per-day trend
Client IPs were only captured from 2026-07-30, when the reverse proxy chain
started forwarding X-Forwarded-For correctly. Rows imported from the old
nginx log therefore have no IP, and the UI labels those periods as download
counts rather than unique visitors instead of showing a misleading number.
- Added fixSequences() method to V1DataMigrationSeeder
- Automatically resets sequences for docket_entries, documents, and subscriptions
- Prevents 'duplicate key value violates unique constraint' errors
- Fixes issue where PDF uploads were failing due to out-of-sync sequences
- PDF upload fix (nginx permissions)
- Unsubscribe confirmation page
- Date format consistency (American MM/DD/YYYY)
- Removed pagination from docket entries admin page
- All features deployed and tested
- Created Unsubscribe.vue with matching site styling
- Added showUnsubscribe method to SubscriptionController
- Updated routes: GET /unsubscribe/{token} shows confirmation page
- POST /api/unsubscribe/{token} processes unsubscribe
- Updated email template to use new unsubscribe route
- Prevents accidental unsubscribes with confirmation dialog
- chmod 755 on /var/lib/nginx to allow www-data to traverse
- Parent directory was 750 (drwxr-x---) owned by nginx:nginx
- www-data couldn't access tmp subdirectory despite owning it
- This fixes the Permission denied error on PDF uploads
- Added detailed logging at each step of upload process
- Logs file info, validation, storage, and database creation
- Catches and logs full exception details with stack trace
- Will help diagnose 500 error on PDF upload
- Removed automatic email sending on docket entry creation
- Added sendNotification() method to DocketEntryController
- Added route for manual notification trigger
- Added 'Send Notification' button to Show page
- Email now only sends when admin explicitly clicks button
- Still in testing mode (chris@deafgain.org only)
- Created NewDocketEntryNotification mailable class
- Added professional HTML email template
- Updated DocketEntryController to send notifications on entry creation
- TESTING MODE: Only sends to chris@deafgain.org
- Configured SMTP with Gmail (system@deafgain.org)
- Added logging for email delivery tracking
- Production code commented out for safety during testing