# Active Context - Current Work Status ## Current Task: v2.0 PHASE 3 DATA MIGRATION - 100% COMPLETE ✅ **MAD Lawsuit Website v2.0 - Data Migration from v1.0 Production**: - **v1.0 Status**: Fully operational at https://mad-lawsuit.org (Next.js + Express + React) - **v2.0 Goal**: Rebuild with Laravel + Inertia + Vue + TypeScript - **Current Phase**: Phase 3 - Data Migration (100% complete) - **Status**: ALL DATA MIGRATED SUCCESSFULLY - Ready for Phase 4 ✅ ### Phase 3 Complete - Data Migration ✅ **All Steps Completed:** 1. **PostgreSQL Data Export** ✅ - Exported via `pg_dump` from production server (10.4.0.205) - File: `/tmp/v1-data.sql` (local machine) - Contains: 63 docket entries, 63 documents, 28 subscriptions 2. **PDF Files Transfer** ✅ - Copied via SCP from production: `/docker/websites/mad-lawsuit/uploads/*.pdf` - Destination: `storage/app/public/documents/` - Total: 69 PDF files (158MB transferred successfully) 3. **Parser Development** ✅ - Created `parse_sql_to_seeder.py` (v1) - captured 32/63 entries - Identified limitation: only parsed single-line INSERT statements - Created `parse_sql_to_seeder_v2.py` - handles multi-line INSERTs - Successfully parsed ALL 63 entries from SQL dump 4. **Seeder Automation** ✅ - Created `update_seeder.py` (v1) - for initial 32 entries - Created `update_seeder_v2.py` - for complete 63 entries - Automatically updates V1DataMigrationSeeder.php - Fixes file paths: `/app/uploads/` → `documents/` 5. **Data Import Execution** ✅ - Cleared database: `php artisan migrate:fresh --seed --seeder=AdminSeeder` - Ran seeder: `php artisan db:seed --class=V1DataMigrationSeeder` - Result: 63 entries, 63 documents, 28 subscriptions imported 6. **Data Integrity Verification** ✅ - Database counts: 63/63/28 ✅ - Sample entries verified (IDs 1-76) - All dates and titles accurate - Relationships intact (entries → documents) - File paths corrected for v2.0 **Files Created:** - `parse_sql_to_seeder_v2.py` - Multi-line INSERT parser - `update_seeder_v2.py` - Seeder automation script - `seeder_data_full.txt` - Complete parsed data (63 entries) - `DATA_COMPARISON_REPORT.md` - Detailed migration analysis - `check_v1_data.js` - v1.0 data verification script ### v2.0 Phase 2 COMPLETED ✅ **Admin Dashboard - Fully Functional**: **Controllers Implemented**: - ✅ **AuthController** - Login/logout with session management - ✅ **DashboardController** - Statistics and recent entries - ✅ **DocketEntryController** - Full CRUD (7 resource methods) - ✅ **DocumentController** - PDF upload/delete with UUID naming - ✅ **SubscriberController** - List and deactivate subscribers **Vue Pages Created**: - ✅ **Admin/Login.vue** - Professional authentication page - ✅ **Admin/Dashboard.vue** - Statistics cards, quick actions, recent entries - ✅ **Admin/DocketEntries/Index.vue** - Paginated table (20 per page) - ✅ **Admin/DocketEntries/Create.vue** - Form for new entries - ✅ **Admin/DocketEntries/Edit.vue** - Update existing entries - ✅ **Admin/DocketEntries/Show.vue** - View details + upload documents - ✅ **Admin/Subscribers/Index.vue** - Manage email subscribers (50 per page) **Features Implemented**: - ✅ Session-based authentication (separate from Breeze) - ✅ Full CRUD operations for docket entries - ✅ PDF document upload with validation (10MB max, PDF only) - ✅ UUID-based file naming for security - ✅ File storage in `storage/app/public/documents` - ✅ Storage symlink configured (`php artisan storage:link`) - ✅ Pagination for entries and subscribers - ✅ Soft delete for subscribers (deactivate) - ✅ Cascade delete for entries (removes documents) - ✅ Professional UI with Tailwind CSS - ✅ Form validation with error display - ✅ Success/error flash messages - ✅ Responsive design **Admin Access**: - URL: http://127.0.0.1:8000/admin/login - Username: admin - Password: password ### v2.0 Technology Stack **Backend**: - **Framework**: Laravel 12.43.1 (latest stable) - **PHP**: 8.3.28 - **Database**: SQLite (development), PostgreSQL (production) - **ORM**: Eloquent (replacing Prisma) - **Auth**: Laravel Sanctum + Session - **API**: Inertia.js server-side **Frontend**: - **Framework**: Vue 3 + TypeScript - **Routing**: Inertia.js (SSR-like experience) - **Styling**: Tailwind CSS 3.x - **Build Tool**: Vite 7.x - **Components**: Vue SFC (Single File Components) **Development Environment**: - **PHP**: Installed via Homebrew (8.3.28) - **Composer**: 2.9.2 - **Node**: Latest stable - **NPM**: With legacy-peer-deps for Vite compatibility - **Servers**: Laravel (8000), Vite (5173) ### v2.0 Progress Checklist **Phase 1 - Public Website** ✅ COMPLETE: - [x] Install PHP 8.3 and Composer locally - [x] Create Laravel 12 project - [x] Install Laravel Breeze with Vue + Inertia + TypeScript - [x] Resolve NPM dependency conflicts (Vite 7 compatibility) - [x] Install all NPM packages successfully - [x] Create database migrations (docket_entries, documents, subscriptions, admin_users) - [x] Create Eloquent models with relationships - [x] Run migrations successfully (SQLite) - [x] Create HomeController with Inertia - [x] Build Vue home page component matching v1.0 design - [x] Test locally with development servers (php artisan serve + npm run dev) - [x] Verify website rendering correctly - [x] Implement email subscription API - [x] Add document download functionality **Phase 2 - Admin Dashboard** ✅ COMPLETE: - [x] Build admin authentication (session-based) - [x] Create AdminUser model and migration - [x] Implement AuthController (login/logout) - [x] Create AdminAuth middleware - [x] Build Admin/Login.vue page - [x] Implement DashboardController with statistics - [x] Create Admin/Dashboard.vue page - [x] Implement DocketEntryController (all 7 CRUD methods) - [x] Create all DocketEntry Vue pages (Index, Create, Edit, Show) - [x] Implement DocumentController (store, destroy) - [x] Implement SubscriberController (index, destroy) - [x] Create Admin/Subscribers/Index.vue page - [x] Set up file storage for PDFs - [x] Configure storage symlink **Phase 3 - Data Migration** ✅ COMPLETE (100%): - [x] Export v1.0 production data (PostgreSQL dump) - [x] Copy PDF files from production (69 files, 158MB) - [x] Create V1DataMigrationSeeder (tested with sample data) - [x] Create Python parser script (parse_sql_to_seeder.py) - [x] Identify parser limitation (only captured 32/63 entries) - [x] Create improved parser v2 (parse_sql_to_seeder_v2.py) with multi-line support - [x] Generate complete PHP arrays (63 entries, 63 docs, 28 subs) - [x] Update seeder with all production data - [x] Run seeder to import ALL data - [x] Verify 100% data integrity in database (63/63/28) **Phase 4 - Production Deployment** ⏳ PENDING: - [ ] Configure PostgreSQL connection (for production) - [ ] Implement email notifications - [ ] Deploy to v2.mad-lawsuit.org for testing - [ ] Final testing and verification - [ ] Switch DNS to v2.0 ### v2.0 Design Specifications **Complete v1.0 documentation captured**: - ✅ Visual design (colors, typography, layout) - ✅ Component specifications (forms, cards, buttons) - ✅ Functional requirements (interactions, animations) - ✅ Data structures (63 entries, 63 PDFs, 28 subscribers) - ✅ Admin dashboard specs (complete CRUD operations) - ✅ Production data verified from live database **Reference Document**: `cline_docs/v1_design_specifications.md` (400+ lines) ### Next Immediate Steps **Phase 3 Complete! Ready for Phase 4:** 1. **Configure PostgreSQL** - Set up production database connection 2. **Implement Email Notifications** - SMTP configuration for subscriber alerts 3. **Deploy to v2.mad-lawsuit.org** - Test subdomain deployment 4. **Final Testing** - Comprehensive verification of all features 5. **Switch DNS** - Point mad-lawsuit.org to v2.0 ### Data Migration Details **v1.0 Production Data**: - **Docket Entries**: 63 entries with dates, titles, summaries - **Documents**: 63 PDF files (UUID filenames) - **Subscriptions**: 28 email subscribers - **Total Size**: 158MB of PDF files **Schema Mapping** (v1.0 → v2.0): - `docket_entries.id` → `docket_entries.id` - `docket_entries.date` → `docket_entries.date` - `docket_entries.title` → `docket_entries.title` - `docket_entries.summary` → `docket_entries.summary` - `docket_entries.notes` → `docket_entries.notes` - `docket_entries.createdAt` → `docket_entries.created_at` - `docket_entries.updatedAt` → `docket_entries.updated_at` - `documents.docketEntryId` → `documents.docket_entry_id` - `documents.storedFilename` → `documents.stored_filename` - `documents.originalFilename` → `documents.original_filename` - `documents.fileSize` → `documents.file_size` - `documents.mimeType` → `documents.mime_type` - `documents.displayOrder` → `documents.display_order` - `subscriptions.isActive` → `subscriptions.is_active` - `subscriptions.unsubscribeToken` → `subscriptions.unsubscribe_token` - `subscriptions.createdAt` → `subscriptions.created_at` ## Previous Task: v1.0 PRODUCTION SERVER MIGRATION COMPLETED ✅ **MAD Lawsuit Website Successfully Migrated to New Infrastructure**: - **Old Server**: chrishaulmark.com (DigitalOcean VPS - being decommissioned) - **New Server**: 10.4.0.205 (Dedicated server behind NAT) - **Status**: FULLY OPERATIONAL WITH ALL DATA MIGRATED ✅ - **v1.0 Tagged**: Git tag `v1.0` created and pushed to Gitea ### Migration Implementation Details **Infrastructure Changes**: 1. **Package Upgrades** ✅ COMPLETED - **Frontend**: React 18→19, Next.js 15→16, Tailwind 3→4 - **Backend**: Prisma 5→7, Express 4→5 - **All Dependencies**: Updated to latest stable versions - **Docker Images**: Rebuilt with new package versions 2. **Caddy Reverse Proxy Fix** ✅ COMPLETED - **Problem**: Docker DNS resolving container hostnames to wrong network IPs - **Impact**: Caddy timing out trying to reach containers - **Solution**: Updated Caddyfile to use direct IP addresses on caddy_network - **Frontend IP**: 172.18.0.6:806 (instead of hostname) - **Backend IP**: 172.18.0.5:901 (instead of hostname) - **File**: `/home/chaulmark/docker/caddy/config/Caddyfile` on server 3. **Data Migration** ✅ COMPLETED - **Database**: PostgreSQL data (47MB) migrated from old server - **PDF Files**: 158MB of court documents (69 files) migrated - **Redis Cache**: Cache data migrated - **Method**: Created tar archive, transferred via rsync, extracted on new server - **Location**: `/docker/websites/mad-lawsuit/` on 10.4.0.205 4. **SSL Certificates** ✅ COMPLETED - **Provider**: Let's Encrypt via Caddy - **Domains**: mad-lawsuit.org, files.mad-lawsuit.org - **Status**: Active and auto-renewing ### Final Production Architecture ``` ┌─────────────────────────────────────────────────────────┐ │ Caddy Reverse Proxy (10.4.0.205) │ │ │ │ mad-lawsuit.org → 172.18.0.6:806 (Frontend) │ │ files.mad-lawsuit.org → 172.18.0.5:901 (Backend) │ └─────────────────────────────────────────────────────────┘ │ ├─────────────────────────────┐ │ │ ┌──────▼──────┐ ┌──────▼──────┐ │ Frontend │ │ Backend │ │ Port 806 │──────────────│ Port 901 │ │ Next.js 16 │ API Calls │ Express 5 │ │ React 19 │ │ Prisma 7 │ └─────────────┘ └─────────────┘ │ ┌──────▼──────┐ │ PostgreSQL │ │ + Redis │ └─────────────┘ ``` ### Deployment Server Information **IMPORTANT**: All deployments now go to **10.4.0.205** (NOT chrishaulmark.com) **Server Details**: - **Hostname**: public-websites (internal: 10.4.0.205) - **External Access**: Via NAT through dedicated server - **SSH Access**: `ssh chaulmark@10.4.0.205` - **Project Location**: `~/websites/mad-lawsuit.org/` - **Docker Volumes**: `/docker/websites/mad-lawsuit/` **Deployment Commands**: ```bash # SSH to production server ssh chaulmark@10.4.0.205 # Navigate to project cd ~/websites/mad-lawsuit.org # Pull latest code git pull # Rebuild and restart containers docker compose down docker compose build docker compose up -d # Check container status docker compose ps docker compose logs -f ``` ### Verification ✅ - **Website**: https://mad-lawsuit.org (HTTP/2 200 ✓) - **Backend API**: https://files.mad-lawsuit.org (HTTP/2 200 ✓) - **Database**: 63 docket entries with all historical data ✓ - **PDF Files**: 69 court documents accessible ✓ - **All Containers**: Running and healthy ✓ ## Current Status ### What's Working ✅ - **v2.0 Phase 1**: Public website fully functional - **v2.0 Phase 2**: Admin dashboard complete with all CRUD operations - **v2.0 Phase 3**: 100% data migration complete (63/63/28) - **Development Servers**: Laravel (8000) and Vite (5173) running - **Admin Authentication**: Login working with session management - **File Storage**: PDFs uploading and downloading correctly - **Database**: SQLite with complete production data, ready for PostgreSQL migration - **All 63 Entries**: Imported and verified in database - **All 63 Documents**: Linked correctly with proper file paths - **All 28 Subscriptions**: Active and ready for notifications ### Next Steps for User **Phase 4 - Production Deployment (On Hold)**: 1. **Configure PostgreSQL** - Set up production database connection 2. **Implement Email Notifications** - SMTP configuration 3. **Deploy to v2.mad-lawsuit.org** - Test subdomain 4. **Final Testing** - Comprehensive verification 5. **DNS Switchover** - Point mad-lawsuit.org to v2.0 ### Files Modified (Phase 2 & 3) **Controllers**: - `app/Http/Controllers/Admin/AuthController.php` - `app/Http/Controllers/Admin/DashboardController.php` - `app/Http/Controllers/Admin/DocketEntryController.php` - `app/Http/Controllers/Admin/DocumentController.php` - `app/Http/Controllers/Admin/SubscriberController.php` **Vue Pages**: - `resources/js/Pages/Admin/Login.vue` - `resources/js/Pages/Admin/Dashboard.vue` - `resources/js/Pages/Admin/DocketEntries/Index.vue` - `resources/js/Pages/Admin/DocketEntries/Create.vue` - `resources/js/Pages/Admin/DocketEntries/Edit.vue` - `resources/js/Pages/Admin/DocketEntries/Show.vue` - `resources/js/Pages/Admin/Subscribers/Index.vue` **Middleware & Routes**: - `app/Http/Middleware/AdminAuth.php` - `routes/web.php` **Database**: - `database/seeders/AdminSeeder.php` - `database/migrations/2025_12_17_223224_create_admin_users_table.php` ### Deployment Notes - **Phase 2 Complete**: All admin features working locally - **Phase 3 In Progress**: Data migration 50% complete - **Ready for Seeder**: SQL dump and PDFs ready for import - All code committed to Git repository ## Investigation Process 1. **Phase 1**: Built public website matching v1.0 design 2. **Phase 2**: Implemented complete admin dashboard with CRUD 3. **Phase 3**: Exported production data and transferred PDF files 4. **Next**: Create seeder to import v1.0 data into v2.0 The MAD lawsuit website v2.0 rebuild is progressing well with Phase 2 complete and Phase 3 50% done.