# A2P AutoPilot - Database Schema + API Server

Production-grade PostgreSQL database schema and REST API for managing Twilio A2P brand and campaign registrations.

## 🏗️ Architecture

### Database Schema (Drizzle ORM)
- **submissions** — Main table tracking each A2P registration lifecycle
- **remediation_log** — History of automated fixes applied to failed submissions
- **audit_log** — Complete audit trail of every Twilio API call

### API Server (Express + TypeScript)
- REST API for submission management
- Webhook endpoints for Twilio status updates
- Real-time dashboard statistics
- Bulk import capabilities

## 📦 Installation

```bash
npm install
```

## ⚙️ Configuration

Copy `.env.example` to `.env` and configure:

```bash
cp .env.example .env
```

Required environment variables:
- `DATABASE_URL` — PostgreSQL connection string
- `REDIS_URL` — Redis connection string
- `API_KEY` — Authentication key for API endpoints
- `TWILIO_ACCOUNT_SID` — Twilio Account SID
- `TWILIO_AUTH_TOKEN` — Twilio Auth Token

## 🗄️ Database Setup

### Generate migration files:
```bash
npm run db:generate
```

### Run migrations:
```bash
npm run db:migrate
```

### Open Drizzle Studio (database GUI):
```bash
npm run db:studio
```

## 🚀 Running the Server

### Development (with hot reload):
```bash
npm run dev
```

### Production:
```bash
npm run build
npm start
```

## 📡 API Endpoints

### Submissions
- `POST /api/submissions` — Create new A2P registration
- `GET /api/submissions` — List submissions (with filters)
- `GET /api/submissions/:id` — Get submission details
- `POST /api/submissions/:id/retry` — Retry failed submission
- `POST /api/submissions/:id/cancel` — Cancel pending submission
- `GET /api/submissions/:id/audit-log` — Get audit trail
- `POST /api/submissions/bulk` — Bulk import submissions

### Stats
- `GET /api/stats` — Dashboard statistics

### Webhooks (Public)
- `POST /webhooks/twilio/brand` — Twilio brand status webhook
- `POST /webhooks/twilio/campaign` — Twilio campaign status webhook

### Health
- `GET /health` — Health check endpoint

## 🔐 Authentication

All API endpoints (except webhooks and health) require an API key:

```bash
Authorization: Bearer YOUR_API_KEY
```

## 📊 Database Schema Details

### submissions table
Tracks the complete lifecycle of each A2P registration:
- **Status tracking** — 14 different states from `pending` to `completed`
- **SID chain** — All Twilio resource SIDs stored in JSONB
- **Input data** — Full `RegistrationInput` preserved
- **Timestamps** — Detailed tracking of each stage
- **Retry logic** — Attempt count and max attempts
- **Notifications** — Webhook/email configuration

### remediation_log table
Automated fix history:
- What failed
- What fix was applied
- Before/after field changes
- Resubmission timestamp

### audit_log table
Complete audit trail:
- Every Twilio API call
- Full request/response data
- Performance metrics (duration_ms)
- Success/error status

## 🛠️ Tech Stack

- **Database**: PostgreSQL + Drizzle ORM
- **API**: Express.js + TypeScript
- **Queue**: BullMQ + Redis
- **Validation**: Zod
- **Logging**: Pino
- **IDs**: nanoid (collision-resistant, URL-safe)

## 📝 Type Safety

All code uses shared types from `src/types.ts`:
- `RegistrationInput` — User input structure
- `SubmissionRecord` — Full submission with history
- `SubmissionStatus` — 14 lifecycle states
- `SidChain` — All Twilio resource SIDs

## 🔄 Next Steps

The following components need to be implemented:

1. **Landing Page Generator** (`src/landing-page/generator.ts`)
   - Generate compliant landing pages from input data
   - Upload to S3 or static hosting
   
2. **Submission Engine** (`src/engine/submission-engine.ts`)
   - Twilio API client wrapper
   - Multi-step submission orchestration
   - Auto-remediation logic

3. **BullMQ Workers** (`src/workers/`)
   - Polling worker for status updates
   - Submission processing worker
   - Retry/remediation worker

4. **Notification Service** (`src/notifications/`)
   - Webhook delivery
   - Email notifications
   - Status update broadcasting

## 📄 License

MIT
