4.1 KiB
4.1 KiB
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
npm install
⚙️ Configuration
Copy .env.example to .env and configure:
cp .env.example .env
Required environment variables:
DATABASE_URL— PostgreSQL connection stringREDIS_URL— Redis connection stringAPI_KEY— Authentication key for API endpointsTWILIO_ACCOUNT_SID— Twilio Account SIDTWILIO_AUTH_TOKEN— Twilio Auth Token
🗄️ Database Setup
Generate migration files:
npm run db:generate
Run migrations:
npm run db:migrate
Open Drizzle Studio (database GUI):
npm run db:studio
🚀 Running the Server
Development (with hot reload):
npm run dev
Production:
npm run build
npm start
📡 API Endpoints
Submissions
POST /api/submissions— Create new A2P registrationGET /api/submissions— List submissions (with filters)GET /api/submissions/:id— Get submission detailsPOST /api/submissions/:id/retry— Retry failed submissionPOST /api/submissions/:id/cancel— Cancel pending submissionGET /api/submissions/:id/audit-log— Get audit trailPOST /api/submissions/bulk— Bulk import submissions
Stats
GET /api/stats— Dashboard statistics
Webhooks (Public)
POST /webhooks/twilio/brand— Twilio brand status webhookPOST /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:
Authorization: Bearer YOUR_API_KEY
📊 Database Schema Details
submissions table
Tracks the complete lifecycle of each A2P registration:
- Status tracking — 14 different states from
pendingtocompleted - SID chain — All Twilio resource SIDs stored in JSONB
- Input data — Full
RegistrationInputpreserved - 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 structureSubmissionRecord— Full submission with historySubmissionStatus— 14 lifecycle statesSidChain— All Twilio resource SIDs
🔄 Next Steps
The following components need to be implemented:
-
Landing Page Generator (
src/landing-page/generator.ts)- Generate compliant landing pages from input data
- Upload to S3 or static hosting
-
Submission Engine (
src/engine/submission-engine.ts)- Twilio API client wrapper
- Multi-step submission orchestration
- Auto-remediation logic
-
BullMQ Workers (
src/workers/)- Polling worker for status updates
- Submission processing worker
- Retry/remediation worker
-
Notification Service (
src/notifications/)- Webhook delivery
- Email notifications
- Status update broadcasting
📄 License
MIT