mad-lawsuit/cline_docs/activeContext.md

12 KiB

Active Context - Current Work Status

Current Task: DOCKER BUILD ISSUES FULLY RESOLVED

MAD Lawsuit Website Docker Deployment Successfully Fixed:

  • Problem: Docker containers failing to build and run due to pnpm and Prisma issues
  • Root Cause: Prisma CLI in devDependencies but needed in production for client generation
  • Solution: Dependency restructuring + Docker build process optimization
  • Status: ALL CONTAINERS RUNNING AND HEALTHY

Docker Fix Implementation Details

Issues Resolved:

  1. pnpm TTY Error FIXED

    • Problem: pnpm prune --prod failing with TTY error in Docker build
    • Solution: Added ENV CI=true to Dockerfile before prune command
    • File: backend/Dockerfile
  2. Prisma Client Missing After Prune FIXED

    • Problem: prisma CLI in devDependencies, removed during production prune
    • Impact: Prisma client generation failing, backend crashing with MODULE_NOT_FOUND
    • Solution: Moved prisma from devDependencies to dependencies in package.json
    • Files: backend/package.json, backend/pnpm-lock.yaml
  3. Outdated Lockfile FIXED

    • Problem: pnpm-lock.yaml outdated after dependency changes
    • Impact: pnpm install --frozen-lockfile failing in Docker build
    • Solution: Regenerated lockfile locally and committed to repository

Final Docker Build Process

# Install all dependencies
RUN pnpm install --frozen-lockfile

# Generate Prisma client (first time)
RUN pnpm prisma generate

# Build application
RUN pnpm build

# Remove dev dependencies (but keep prisma CLI)
ENV CI=true
RUN pnpm prune --prod

# Regenerate Prisma client (after prune, using production deps)
RUN pnpm prisma generate

Current Container Status - ALL HEALTHY

  • mad-lawsuit-frontend-1: Running and healthy on port 806
  • mad-lawsuit-backend-1: Running and healthy with working database connections
  • mad-lawsuit-postgres-1: Running on port 5432
  • mad-lawsuit-redis-1: Running on port 6379

Backend Verification

> node dist/index.js
prisma:info Starting a postgresql pool with 3 connections.
prisma:query SELECT 1
prisma:query SELECT "public"."docket_entries"...
  • Prisma client working correctly
  • Database connections established
  • Queries executing successfully

Git Commits Made

  1. b291ee9b - Fix Docker build: Add CI=true env var for pnpm prune command
  2. d087ca9c - Fix Prisma client: Regenerate after pnpm prune to restore missing binaries
  3. 0035b7cc - Fix Prisma generate: Use npx instead of pnpm after prune removes CLI
  4. cf071cc4 - Fix Prisma prune: Use --config.ignore-scripts=false to preserve Prisma client
  5. b59ae90c - Fix Prisma dependencies: Move prisma CLI to production deps and regenerate after prune
  6. f962327a - Update pnpm-lock.yaml after moving prisma to production dependencies

Previous Task: GMAIL SMUGGLER FULLY OPERATIONAL

SMTP Relay Solution Successfully Implemented:

  • DigitalOcean Server (chrishaulmark.com): SMTP ports 25, 465, 587 BLOCKED by DigitalOcean
  • Dedicated Server (74.80.182.50): All SMTP ports WORKING
  • Gmail Smuggler Container: DEPLOYED and RUNNING on port 2525 (unblocked)

Solution: DNS override + port 2525 SMTP relay bypasses DigitalOcean SMTP blocking completely.

Gmail Smuggler Final Configuration

  • Container Name: gmail-smuggler
  • Location: 10.4.0.206:~/gmail-smuggler/ (internal VM)
  • Status: Running with Docker Compose auto-restart
  • Port: 2525 (external) → 587 (internal, forwarding to smtp.gmail.com:587)
  • Technology: Alpine Linux + socat TCP relay
  • OPNsense: Port forwarding 2525 → 10.4.0.206:2525

Implementation Details

  1. DNS Override: 74.80.182.50 smtp.gmail.com in /etc/hosts
  2. Backend Configuration: SMTP_PORT=2525 in backend/.env
  3. Port Forwarding: OPNsense forwards port 2525 to internal VM
  4. Connection Verified: DigitalOcean VPS → 74.80.182.50:2525 → Gmail

Email Flow

Court Docket Website → smtp.gmail.com:2525 → 74.80.182.50:2525 → 10.4.0.206:2525 → Gmail SMTP

Previous Task: COMPLETED

DeafGain LLC Footer Addition - Added "Designed by DeafGain LLC" footer to the court docket website.

Previous Task: COMPLETED

Email System URL Fix - Updated email notifications to use production domain and added unsubscribe instructions.

Previous Task: COMPLETED

PDF Upload Issue Resolution - Successfully identified and fixed all issues preventing PDF document uploads in the admin dashboard.

Recent Work Completed

Problem: Website was missing professional branding footer like other DeafGain websites.

Solution Implemented:

  1. Footer Design ADDED

    • Implementation: Added footer section at bottom of home page
    • Styling: Matches website theme with dark background and yellow accent text
    • Content: "Designed by DeafGain LLC" with link to http://deafgain.org
    • File: frontend/src/app/page.tsx
  2. Visual Consistency ACHIEVED

    • Reference: Based on Chris Haulmark website footer implementation
    • Colors: Gray text with yellow (#fbbf24) DeafGain LLC link
    • Hover Effect: Color changes to darker yellow (#f59e0b) on hover
    • Layout: Centered text in footer section
<footer style={{ 
  width: '100%',
  padding: '2rem 0',
  backgroundColor: 'rgba(57, 64, 83, 0.95)',
  borderTop: '1px solid #4E4A59',
  textAlign: 'center',
  display: 'block'
}}>
  <div style={{ textAlign: 'center', display: 'block', width: '100%' }}>
    <span style={{ color: '#9ca3af' }}>Designed by </span>
    <a href="http://deafgain.org" target="_blank" rel="noopener noreferrer" 
       style={{ color: '#fbbf24', textDecoration: 'none' }}>
      DeafGain LLC
    </a>
  </div>
</footer>

Email System URL Fix - COMPLETED

Problem: Email notifications were linking to localhost instead of production domain, and missing unsubscribe instructions.

Issues Fixed:

  1. Production URL Issue FIXED

    • Problem: Email links pointed to localhost:3000 instead of production domain
    • Impact: Subscribers couldn't access website from email notifications
    • Solution: Updated all email links to use https://mad-lawsuit.org/
    • File: backend/src/services/emailService.ts
  2. Email Text Improvement FIXED

    • Problem: Generic "court docket website" text in emails
    • Impact: Less professional email presentation
    • Solution: Changed to "You can view the complete docket and any associated documents by visiting the website:" with website as clickable link
    • File: backend/src/services/emailService.ts
  3. Missing Unsubscribe Instructions FIXED

    • Problem: No clear unsubscribe instructions for email recipients
    • Impact: Users couldn't easily unsubscribe from notifications
    • Solution: Added "To unsubscribe, please send an email to eliza.kragh@gmail.com" in footer
    • File: backend/src/services/emailService.ts

Email Changes Made:

<!-- Before -->
<p>You can view the complete docket and any associated documents by visiting the court docket website:</p>
<a href="${process.env['FRONTEND_URL'] || 'http://localhost:3000'}" class="button">View Court Docket</a>

<!-- After -->
<p>You can view the complete docket and any associated documents by visiting the <a href="https://mad-lawsuit.org/">website</a>:</p>
<a href="https://mad-lawsuit.org/" class="button">View Court Docket</a>
<p>To unsubscribe, please send an email to eliza.kragh@gmail.com</p>

PDF Upload Issue - FULLY RESOLVED

Problem: Users could not upload PDF documents through the admin dashboard, receiving various errors.

Root Causes Identified and Fixed:

  1. Network Connectivity Issue FIXED

    • Problem: Frontend container only on caddy_network, backend on app-network
    • Impact: Frontend couldn't reach backend for API calls
    • Solution: Added frontend to both networks in docker-compose.yml
    • Commit: 910bd525
  2. MIME Type Validation Issue FIXED

    • Problem: Backend fileFilter only accepted application/pdf MIME type
    • Impact: Valid PDFs rejected due to browser MIME detection variations
    • Solution: Enhanced fileFilter to accept multiple PDF MIME types + file extension fallback
    • File: backend/src/routes/documents.ts
    • Commit: 9ab09196
  3. Missing Form Data Issue FIXED

    • Problem: Frontend only sending file and docketEntryId, missing required title field
    • Impact: Backend validation failing with "title is required" error
    • Solution: Added all required fields to FormData in dashboard upload
    • File: frontend/src/app/admin/dashboard/page.tsx
    • Commit: 8027ef0a

Technical Details

Network Architecture Fixed:

frontend:
  networks:
    - app-network      # Added for backend communication
    - caddy_network    # Existing for reverse proxy

Enhanced PDF Detection:

const allowedMimeTypes = [
  'application/pdf',
  'application/x-pdf', 
  'application/acrobat',
  'applications/vnd.pdf',
  'text/pdf',
  'text/x-pdf'
];

Complete Form Data:

uploadFormData.append('file', selectedFile);
uploadFormData.append('docketEntryId', data.entry.id.toString());
uploadFormData.append('title', selectedFile.name.replace('.pdf', ''));
uploadFormData.append('summary', '');
uploadFormData.append('notes', '');

Current Status

What's Working

  • Docker containers all running and healthy
  • Backend with working Prisma database connections
  • Frontend accessible on port 806
  • Network connectivity between frontend and backend
  • PDF MIME type detection (multiple formats)
  • Form validation with all required fields
  • Error logging and debugging
  • Email system with production URLs (https://mad-lawsuit.org/)
  • Professional unsubscribe instructions (eliza.kragh@gmail.com)
  • DeafGain LLC footer branding with professional styling
  • All code committed and pushed to Git

Next Steps for User

  1. Website is fully operational - no further action needed
  2. All containers healthy and running on remote server
  3. Database connections working - Prisma queries executing successfully
  4. Email notifications functional with proper URLs
  5. Professional branding with DeafGain LLC footer

Files Modified (Docker Fix)

  • backend/Dockerfile - Added CI=true, optimized Prisma generation
  • backend/package.json - Moved prisma from devDependencies to dependencies
  • backend/pnpm-lock.yaml - Updated lockfile for new dependency structure

Files Modified (Previous Tasks)

  • docker-compose.yml - Network configuration
  • backend/src/routes/documents.ts - Enhanced PDF validation
  • frontend/src/app/admin/dashboard/page.tsx - Fixed form data
  • backend/src/services/emailService.ts - Updated URLs and unsubscribe info
  • frontend/src/app/page.tsx - Added DeafGain LLC footer

Deployment Notes

  • Docker deployment successful - all containers running on remote server
  • No further deployment needed - website fully operational
  • All fixes are committed to Git repository
  • Backend and frontend both successfully deployed with latest fixes

Investigation Process

  1. Docker Build Analysis: Identified pnpm TTY and Prisma dependency issues
  2. Dependency Management: Restructured package.json for proper production builds
  3. Build Process Optimization: Enhanced Dockerfile for reliable Prisma client generation
  4. Systematic Testing: Verified all containers healthy and database connections working

The MAD lawsuit website Docker deployment is now fully operational with all containers running successfully.