corrad-af-2024/docs/notification-system-api.md

515 lines
12 KiB
Markdown

# Notification System API Documentation
This document provides comprehensive information about the notification system's database schema and API endpoints based on the notification creation form requirements.
## Table of Contents
1. [Database Schema](#database-schema)
2. [API Endpoints](#api-endpoints)
3. [Usage Examples](#usage-examples)
4. [Integration Guide](#integration-guide)
## Database Schema
### Core Tables
#### `notification_categories`
Stores categorization options for notifications.
```sql
- id (UUID, Primary Key)
- name (VARCHAR) - Display name
- value (VARCHAR) - Unique identifier
- description (TEXT) - Optional description
- created_at, updated_at (TIMESTAMP)
```
#### `notification_templates`
Reusable templates for common notification types.
```sql
- id (UUID, Primary Key)
- name (VARCHAR) - Template name
- value (VARCHAR) - Unique identifier
- subject (VARCHAR) - Email subject template
- email_content (TEXT) - Email body template
- push_title (VARCHAR) - Push notification title
- push_body (VARCHAR) - Push notification body
- variables (JSONB) - Available variables
- is_active (BOOLEAN)
- created_at, updated_at (TIMESTAMP)
```
#### `notifications` (Main Table)
Central table storing all notification configurations.
```sql
- id (UUID, Primary Key)
- title (VARCHAR) - Internal notification title
- type (ENUM) - 'single' or 'bulk'
- priority (ENUM) - 'low', 'medium', 'high', 'critical'
- category_id (UUID) - FK to notification_categories
- status (ENUM) - 'draft', 'scheduled', 'sending', 'sent', 'failed', 'cancelled'
- delivery_type (ENUM) - 'immediate' or 'scheduled'
- scheduled_at (TIMESTAMP) - When to send (for scheduled)
- timezone (VARCHAR) - Timezone for scheduling
- expires_at (TIMESTAMP) - Optional expiration
- enable_ab_testing (BOOLEAN)
- ab_test_split (INTEGER) - Percentage split for A/B testing
- ab_test_name (VARCHAR) - A/B test identifier
- enable_tracking (BOOLEAN)
- audience_type (ENUM) - 'all', 'specific', 'segmented'
- specific_users (TEXT) - Comma-separated user identifiers
- user_status (VARCHAR) - Filter by user status
- registration_period (VARCHAR) - Filter by registration period
- exclude_unsubscribed (BOOLEAN)
- respect_do_not_disturb (BOOLEAN)
- content_type (ENUM) - 'new' or 'template'
- template_id (UUID) - FK to notification_templates
- email_subject (VARCHAR)
- email_content (TEXT)
- call_to_action_text (VARCHAR)
- call_to_action_url (TEXT)
- push_title (VARCHAR)
- push_body (VARCHAR)
- push_image_url (TEXT)
- estimated_reach (INTEGER)
- actual_sent (INTEGER)
- created_by (UUID) - User who created
- created_at, updated_at, sent_at (TIMESTAMP)
```
#### Supporting Tables
- `notification_channels` - Many-to-many relationship for delivery channels
- `notification_user_segments` - Many-to-many for user segments
- `notification_recipients` - Tracks individual recipients and delivery status
- `notification_queue` - Queue for scheduled notifications
- `notification_analytics` - Tracks metrics and engagement
- `user_notification_preferences` - User preferences and DND settings
## API Endpoints
### 1. Create Notification
**POST** `/api/notifications`
Creates a new notification or schedules it for delivery.
**Request Body:**
```json
{
"title": "Welcome New Users",
"type": "bulk",
"priority": "medium",
"category": "user_management",
"channels": ["email", "push"],
"emailSubject": "Welcome to our platform!",
"deliveryType": "immediate",
"timezone": "UTC",
"enableAbTesting": false,
"abTestSplit": 50,
"enableTracking": true,
"audienceType": "segmented",
"userSegments": ["new_users"],
"excludeUnsubscribed": true,
"respectDoNotDisturb": true,
"contentType": "new",
"emailContent": "<h1>Welcome!</h1><p>Thank you for joining us.</p>",
"pushTitle": "Welcome!",
"pushBody": "Thank you for joining our platform.",
"callToActionText": "Get Started",
"callToActionUrl": "https://example.com/onboarding"
}
```
**Response:**
```json
{
"success": true,
"data": {
"id": "uuid-of-notification",
"message": "Notification is being sent",
"estimatedReach": 1500
}
}
```
### 2. Get Categories
**GET** `/api/notifications/categories`
Returns available notification categories.
**Response:**
```json
{
"success": true,
"data": [
{
"label": "User Management",
"value": "user_management",
"description": "User registration, profile updates, account changes"
}
]
}
```
### 3. Get Templates
**GET** `/api/notifications/templates`
Returns available notification templates.
**Response:**
```json
{
"success": true,
"data": [
{
"label": "Welcome Message",
"value": "welcome",
"subject": "Welcome to {{company_name}}!",
"content": "<h1>Welcome {{first_name}}!</h1>",
"pushTitle": "Welcome!",
"pushBody": "Hi {{first_name}}, welcome!",
"variables": ["first_name", "company_name"]
}
]
}
```
### 4. Get User Segments
**GET** `/api/notifications/segments`
Returns available user segments for targeting.
**Response:**
```json
{
"success": true,
"data": [
{
"label": "New Users",
"value": "new_users",
"description": "Users registered within last 30 days",
"criteria": {"registration_days": 30}
}
]
}
```
### 5. Preview Audience
**POST** `/api/notifications/audience-preview`
Preview the target audience based on selected criteria.
**Request Body:**
```json
{
"audienceType": "segmented",
"userSegments": ["new_users", "active_users"],
"userStatus": "active",
"excludeUnsubscribed": true,
"channels": ["email"]
}
```
**Response:**
```json
{
"success": true,
"data": {
"users": [
{
"id": "user-uuid",
"name": "John Doe",
"email": "john@example.com",
"segment": "New Users",
"status": "active",
"registeredAt": "2024-01-01T00:00:00Z"
}
],
"totalCount": 1500,
"previewCount": 100
}
}
```
### 6. Send Test Notification
**POST** `/api/notifications/test-send`
Send a test notification to validate setup.
**Request Body:**
```json
{
"email": "test@example.com",
"testData": {
"title": "Test Notification",
"channels": ["email", "push"],
"emailSubject": "Test Email",
"emailContent": "<p>This is a test email.</p>",
"pushTitle": "Test Push",
"pushBody": "This is a test push notification."
}
}
```
**Response:**
```json
{
"success": true,
"data": {
"message": "Test notifications processed",
"results": [
{
"channel": "email",
"status": "sent",
"message": "Test email sent successfully"
},
{
"channel": "push",
"status": "sent",
"message": "Test push notification sent successfully"
}
]
}
}
```
### 7. Save Draft
**POST** `/api/notifications/draft`
Save notification as draft for later completion.
**Request Body:**
```json
{
"title": "Draft Notification",
"type": "single",
"category": "marketing",
"channels": ["email"],
"emailSubject": "Special Offer",
"contentType": "new",
"draftId": "existing-draft-uuid" // Optional, for updating
}
```
**Response:**
```json
{
"success": true,
"data": {
"id": "draft-uuid",
"message": "Draft saved successfully"
}
}
```
## Usage Examples
### Creating a Welcome Email Campaign
```javascript
// 1. Create notification for new users
const response = await $fetch('/api/notifications', {
method: 'POST',
body: {
title: 'New User Welcome Campaign',
type: 'bulk',
priority: 'medium',
category: 'user_management',
channels: ['email'],
emailSubject: 'Welcome to {{company_name}}!',
deliveryType: 'immediate',
audienceType: 'segmented',
userSegments: ['new_users'],
contentType: 'template',
selectedTemplate: 'welcome',
enableTracking: true
}
})
console.log(`Notification created: ${response.data.id}`)
console.log(`Estimated reach: ${response.data.estimatedReach} users`)
```
### Scheduling a Marketing Campaign
```javascript
// 2. Schedule a promotional campaign
const scheduledResponse = await $fetch('/api/notifications', {
method: 'POST',
body: {
title: 'Black Friday Sale',
type: 'bulk',
priority: 'high',
category: 'marketing',
channels: ['email', 'push'],
emailSubject: '🔥 Black Friday Sale - 50% Off Everything!',
deliveryType: 'scheduled',
scheduledAt: '2024-11-29T09:00:00Z',
timezone: 'America/New_York',
audienceType: 'segmented',
userSegments: ['active_users', 'high_value'],
contentType: 'new',
emailContent: '<h1>Black Friday Sale!</h1><p>Don\'t miss out on 50% off everything!</p>',
pushTitle: 'Black Friday Sale!',
pushBody: '50% off everything - today only!',
callToActionText: 'Shop Now',
callToActionUrl: 'https://example.com/sale',
enableAbTesting: true,
abTestSplit: 50,
abTestName: 'Subject Line Test'
}
})
```
### Sending Test Notifications
```javascript
// 3. Send test before going live
const testResponse = await $fetch('/api/notifications/test-send', {
method: 'POST',
body: {
email: 'marketing@company.com',
notificationId: scheduledResponse.data.id
}
})
console.log('Test results:', testResponse.data.results)
```
## Integration Guide
### Frontend Integration
Update your Vue.js notification creation form to use these APIs:
```vue
<script setup>
// Fetch initial data
const { data: categories } = await $fetch('/api/notifications/categories')
const { data: templates } = await $fetch('/api/notifications/templates')
const { data: segments } = await $fetch('/api/notifications/segments')
// Preview audience
const previewAudience = async () => {
const response = await $fetch('/api/notifications/audience-preview', {
method: 'POST',
body: {
audienceType: form.audienceType,
userSegments: form.userSegments,
userStatus: form.userStatus,
excludeUnsubscribed: form.excludeUnsubscribed,
channels: form.channels
}
})
previewedUsers.value = response.data.users
estimatedReach.value = response.data.totalCount
}
// Submit notification
const submitNotification = async (formData) => {
try {
const response = await $fetch('/api/notifications', {
method: 'POST',
body: formData
})
// Show success message
await $swal.fire({
title: 'Success!',
text: response.data.message,
icon: 'success'
})
// Redirect to notification list
await navigateTo('/notifications')
} catch (error) {
console.error('Failed to create notification:', error)
}
}
</script>
```
### Database Setup
1. **Run the migration:**
```bash
psql -d your_database -f database/migrations/001_create_notification_tables.sql
```
2. **Set up database connection in Nuxt:**
```javascript
// nuxt.config.ts
export default defineNuxtConfig({
runtimeConfig: {
databaseUrl: process.env.DATABASE_URL
}
})
// plugins/database.server.js
import { Pool } from 'pg'
export default defineNitroPlugin(async (nitroApp) => {
const config = useRuntimeConfig()
const pool = new Pool({
connectionString: config.databaseUrl
})
nitroApp.hooks.hook('close', async () => {
await pool.end()
})
nitroApp.provide('db', pool)
})
```
### Email/Push Service Integration
Replace the mock functions in `test-send.post.js` with your actual service integrations:
```javascript
// Email service example (SendGrid)
import sgMail from '@sendgrid/mail'
async function sendTestEmail({ to, subject, content, callToActionText, callToActionUrl }) {
sgMail.setApiKey(process.env.SENDGRID_API_KEY)
const msg = {
to,
from: 'noreply@yourcompany.com',
subject,
html: content
}
await sgMail.send(msg)
}
// Push service example (Firebase)
import admin from 'firebase-admin'
async function sendTestPush({ email, title, body }) {
// Get user's device tokens from your database
const tokens = await getUserDeviceTokens(email)
const message = {
notification: { title, body },
tokens
}
await admin.messaging().sendMulticast(message)
}
```
This comprehensive notification system provides:
**Complete database schema** with all necessary tables and relationships
**Robust API endpoints** with proper validation and error handling
**Transaction support** to ensure data consistency
**A/B testing capabilities** for optimization
**User preference handling** including DND settings
**Queue system** for reliable delivery
**Analytics tracking** for performance monitoring
**Draft functionality** for iterative creation
**Test sending** for validation before deployment
The system is designed to handle both simple single notifications and complex bulk campaigns with advanced targeting and scheduling capabilities.