# Influence Build Guide

Influence is BNKops campaign tool for connecting Alberta residents with their elected representatives across all levels of government.

!!! info "Complete Configuration"
    For detailed configuration, usage instructions, and troubleshooting, see the main [Influence README](https://gitea.bnkops.com/admin/changemaker.lite/src/branch/main/influence/README.MD).

!!! tip "Email Testing"
    The application includes MailHog integration for safe email testing during development. All test emails are caught locally and never sent to actual representatives.

## Prerequisites

- Docker and Docker Compose installed
- NocoDB instance with API access
- SMTP email configuration (or use MailHog for testing)
- Domain name (optional but recommended for production)

## Quick Build Process

### 1. Get NocoDB API Token

1. Login to your NocoDB instance
2. Click user icon → **Account Settings** → **API Tokens**
3. Create new token with read/write permissions
4. Copy the token for the next step

### 2. Configure Environment

Navigate to the influence directory and create your environment file:

```bash
cd influence
cp example.env .env
```

Edit the `.env` file with your configuration:

```env
# Server Configuration
NODE_ENV=production
PORT=3333

# NocoDB Configuration
NOCODB_API_URL=https://your-nocodb-instance.com
NOCODB_API_TOKEN=your_nocodb_api_token_here
NOCODB_PROJECT_ID=your_project_id_here

# Email Configuration (Production SMTP)
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_SECURE=false
SMTP_USER=your_email@gmail.com
SMTP_PASS=your_app_password
SMTP_FROM_NAME=BNKops Influence Campaign
SMTP_FROM_EMAIL=your_email@gmail.com

# Rate Limiting
RATE_LIMIT_WINDOW_MS=900000
RATE_LIMIT_MAX_REQUESTS=100
```

#### Development Mode Configuration

For development and testing, use MailHog to catch emails:

```env
# Development Mode
NODE_ENV=development
EMAIL_TEST_MODE=true

# MailHog SMTP (for development)
SMTP_HOST=mailhog
SMTP_PORT=1025
SMTP_SECURE=false
SMTP_USER=test
SMTP_PASS=test
SMTP_FROM_EMAIL=dev@albertainfluence.local
SMTP_FROM_NAME="BNKops Influence Campaign (DEV)"

# Email Testing
TEST_EMAIL_RECIPIENT=developer@example.com
```

### 3. Auto-Create Database Structure

Run the build script to create required NocoDB tables:

```bash
chmod +x scripts/build-nocodb.sh
./scripts/build-nocodb.sh
```

This creates six tables:
- **Campaigns** - Campaign configurations with email templates and settings
- **Campaign Emails** - Tracking of all emails sent through campaigns
- **Representatives** - Cached representative data by postal code
- **Email Logs** - System-wide email delivery logs
- **Postal Codes** - Canadian postal code geolocation data
- **Users** - Admin authentication and access control

### 4. Build and Deploy

Build the Docker image and start the application:

```bash
# Build the Docker image
docker compose build

# Start the application (includes MailHog in development)
docker compose up -d
```

## Verify Installation

1. Check container status:
   ```bash
   docker compose ps
   ```

2. View logs:
   ```bash
   docker compose logs -f app
   ```

3. Access the application:
   - **Main App**: http://localhost:3333
   - **Admin Panel**: http://localhost:3333/admin.html
   - **Email Testing** (dev): http://localhost:3333/email-test.html
   - **MailHog UI** (dev): http://localhost:8025

## Initial Setup

### 1. Create Admin User

Access the admin panel at `/admin.html` and create your first administrator account.

### 2. Create Your First Campaign

1. Login to the admin panel
2. Click **"Create Campaign"**
3. Configure basic settings:
   - Campaign title and description
   - Email subject and body template
   - Upload cover photo (optional)
4. Set campaign options:
   - ✅ Allow SMTP Email - Enable server-side sending
   - ✅ Allow Mailto Link - Enable browser-based mailto
   - ✅ Collect User Info - Request name and email
   - ✅ Show Email Count - Display engagement metrics
   - ✅ Allow Email Editing - Let users customize message
5. Select target government levels (Federal, Provincial, Municipal, School Board)
6. Set status to **Active** to make campaign public
7. Click **"Create Campaign"**

### 3. Test Representative Lookup

1. Visit the homepage
2. Enter an Alberta postal code (e.g., T5N4B8)
3. View representatives at all government levels
4. Test email sending functionality

## Development Workflow

### Email Testing Interface

Access the email testing interface at `/email-test.html` (requires admin login):

**Features:**
- 📧 **Quick Test** - Send test email with one click
- 👁️ **Email Preview** - Preview email formatting before sending
- ✏️ **Custom Composition** - Test with custom subject and message
- 📊 **Email Logs** - View all sent emails with filtering
- 🔧 **SMTP Diagnostics** - Test connection and troubleshoot

### MailHog Web Interface

Access MailHog at http://localhost:8025 to:
- View all caught emails during development
- Inspect email content, headers, and formatting
- Search and filter test emails
- Verify emails never leave your local environment

### Switching to Production

When ready to deploy to production:

1. Update `.env` with production SMTP settings:
   ```env
   EMAIL_TEST_MODE=false
   NODE_ENV=production
   SMTP_HOST=smtp.your-provider.com
   SMTP_USER=your-real-email@domain.com
   SMTP_PASS=your-real-password
   ```

2. Restart the application:
   ```bash
   docker compose restart
   ```

## Key Features

### Representative Lookup
- Search by Alberta postal code (T prefix)
- Display federal MPs, provincial MLAs, municipal representatives
- Smart caching with NocoDB for fast performance
- Graceful fallback to Represent API when cache unavailable

### Campaign System
- Create unlimited advocacy campaigns
- Upload cover photos for campaign pages
- Customizable email templates
- Optional user information collection
- Toggle email count display for engagement metrics
- Multi-level government targeting

### Email Integration
- SMTP email sending with delivery confirmation
- Mailto link support for browser-based email
- Comprehensive email logging
- Rate limiting for API protection
- Test mode for safe development

## API Endpoints

### Public Endpoints
- `GET /` - Homepage with representative lookup
- `GET /campaign/:slug` - Individual campaign page
- `GET /api/public/campaigns` - List active campaigns
- `GET /api/representatives/by-postal/:postalCode` - Find representatives
- `POST /api/emails/send` - Send campaign email

### Admin Endpoints (Authentication Required)
- `GET /admin.html` - Campaign management dashboard
- `GET /email-test.html` - Email testing interface
- `POST /api/emails/preview` - Preview email without sending
- `POST /api/emails/test` - Send test email
- `GET /api/test-smtp` - Test SMTP connection

## Maintenance Commands

### Update Application
```bash
docker compose down
git pull origin main
docker compose build
docker compose up -d
```

### Development Mode
```bash
cd app
npm install
npm run dev
```

### View Logs
```bash
# Follow application logs
docker compose logs -f app

# View MailHog logs (development)
docker compose logs -f mailhog
```

### Database Backup
```bash
# Backup is handled through NocoDB
# Access NocoDB admin panel to export tables
```

### Health Check
```bash
curl http://localhost:3333/api/health
```

## Troubleshooting

### NocoDB Connection Issues
- Verify `NOCODB_API_URL` and `NOCODB_API_TOKEN` in `.env`
- Run `./scripts/build-nocodb.sh` to ensure tables exist
- Application works without NocoDB (API fallback mode)

### Email Not Sending
- In development: Check MailHog UI at http://localhost:8025
- Verify SMTP credentials in `.env`
- Use `/email-test.html` interface for diagnostics
- Check email logs via admin panel
- Review `docker compose logs -f app` for errors

### No Representatives Found
- Ensure postal code starts with 'T' (Alberta only)
- Try different postal code format (remove spaces)
- Check Represent API status: `curl http://localhost:3333/api/test-represent`
- Review application logs for API errors

### Campaign Not Appearing
- Verify campaign status is set to "Active"
- Check campaign configuration in admin panel
- Clear browser cache and reload homepage
- Review console for JavaScript errors

## Production Deployment

### Environment Configuration
```env
NODE_ENV=production
EMAIL_TEST_MODE=false
PORT=3333

# Use production SMTP settings
SMTP_HOST=smtp.your-provider.com
SMTP_PORT=587
SMTP_SECURE=false
SMTP_USER=your-production-email@domain.com
SMTP_PASS=your-production-password
```

### Docker Production
```bash
# Build and start in production mode
docker compose -f docker-compose.yml up -d --build

# View logs
docker compose logs -f app

# Monitor health
watch curl http://localhost:3333/api/health
```

### Monitoring
- Health check endpoint: `/api/health`
- Email logs via admin panel
- NocoDB integration status in logs
- Rate limiting metrics in application logs

## Security Considerations

- 🔒 Always use strong passwords for admin accounts
- 🔒 Enable HTTPS in production (use reverse proxy)
- 🔒 Rotate SMTP credentials regularly
- 🔒 Monitor email logs for suspicious activity
- 🔒 Set appropriate rate limits based on expected traffic
- 🔒 Keep NocoDB API tokens secure and rotate periodically
- 🔒 Use `EMAIL_TEST_MODE=false` only in production

## Support

For detailed configuration, troubleshooting, and usage instructions, see:
- [Main Influence README](https://gitea.bnkops.com/admin/changemaker.lite/src/branch/main/influence/README.MD)
- [Campaign Settings Guide](https://gitea.bnkops.com/admin/changemaker.lite/src/branch/main/influence/CAMPAIGN_SETTINGS_GUIDE.md)
- [Files Explainer](https://gitea.bnkops.com/admin/changemaker.lite/src/branch/main/influence/files-explainer.md)
