# Publisher Module

**Last Verified:** December 25, 2025  
**Status:** ✅ Active  
**Backend Path:** `backend/igny8_core/modules/publisher/` + `backend/igny8_core/business/publishing/`  
**Frontend Path:** N/A (API-only module)

---

## Quick Reference

| What | File | Key Items |
|------|------|-----------|
| Views | `modules/publisher/views.py` | `PublishingRecordViewSet`, `DeploymentViewSet`, `PublishContentViewSet` |
| Models | `business/publishing/models.py` | `PublishingRecord`, `DeploymentRecord` |
| Services | `business/publishing/services/*.py` | Publishing orchestration |
| URLs | `modules/publisher/urls.py` | Publisher endpoints |

---

## Purpose

The Publisher module manages:
- Content publishing pipeline
- Publishing record tracking
- Deployment management
- Multi-destination publishing

---

## Data Models

### PublishingRecord

| Field | Type | Purpose |
|-------|------|---------|
| account | FK | Owner account |
| site | FK | Parent site |
| content | FK | Source content |
| destination | CharField | wordpress/ghost/webflow |
| external_id | CharField | ID on destination platform |
| external_url | URLField | Published URL |
| status | CharField | pending/published/failed/retracted |
| published_at | DateTime | Publication time |
| metadata | JSON | Additional data |
| created_at | DateTime | Record creation |

### DeploymentRecord

| Field | Type | Purpose |
|-------|------|---------|
| account | FK | Owner account |
| site | FK | Target site |
| deployment_type | CharField | full/incremental |
| status | CharField | pending/deploying/completed/failed |
| items_deployed | Integer | Number of items |
| started_at | DateTime | Start time |
| completed_at | DateTime | Completion time |
| error_log | TextField | Errors encountered |
| metadata | JSON | Deployment details |

---

## API Endpoints

| Method | Path | Handler | Purpose |
|--------|------|---------|---------|
| GET | `/api/v1/publisher/records/` | `PublishingRecordViewSet.list` | List publishing records |
| POST | `/api/v1/publisher/records/` | `PublishingRecordViewSet.create` | Create record |
| GET | `/api/v1/publisher/deployments/` | `DeploymentViewSet.list` | List deployments |
| POST | `/api/v1/publisher/publish/` | `PublishContentViewSet.publish` | Publish content |
| GET | `/api/v1/publisher/publish/status/` | `PublishContentViewSet.status` | Get publishing status |
| GET | `/api/v1/publisher/site-definition/` | `SiteDefinitionViewSet.list` | Public site definitions |

---

## Publishing Flow

### Single Content Publish

**Trigger:** User clicks "Publish" or API call  
**Flow:**
1. Validate content is in publishable state
2. Get site integration credentials
3. Transform content for destination:
   - Format HTML for platform
   - Process images
   - Map taxonomies
4. Push to destination API
5. Create `PublishingRecord` with external ID
6. Update Content status to `published`

### Batch Deployment

**Trigger:** Deployment action  
**Flow:**
1. Create `DeploymentRecord`
2. Gather all pending content
3. Process each item:
   - Publish to destination
   - Create publishing record
   - Update content status
4. Update deployment status
5. Log any errors

---

## Destination Adapters

### WordPress Adapter

- Uses WordPress REST API
- Supports posts, pages, custom post types
- Handles media upload
- Maps categories/tags

### Ghost Adapter (Planned)

- Ghost Admin API integration
- Post publishing
- Image handling

### Webflow Adapter (Planned)

- Webflow CMS API
- Collection item publishing
- Asset management

---

## Publishing States

| Status | Description |
|--------|-------------|
| pending | Ready to publish |
| published | Successfully published |
| failed | Publishing failed |
| retracted | Unpublished/removed |

---

## Site Definition Endpoint

**Purpose:** Public endpoint for headless CMS use cases

Returns site structure for external consumption:
- Site metadata
- Available taxonomies
- Content types
- URL structure

---

## Integration Points

| From | To | Trigger |
|------|----|---------| 
| Writer | Publisher | Publish action |
| Automation Stage 7 | Publisher | Auto-publish (future) |
| Publisher | Integrations | Destination APIs |
| Publisher | Content | Status updates |

---

## Common Issues

| Issue | Cause | Fix |
|-------|-------|-----|
| Publish failed | Invalid credentials | Check integration settings |
| Duplicate posts | Published twice | Check existing publishing record |
| Images missing | Upload failed | Check media library access |
| Wrong category | Mapping issue | Verify taxonomy sync |

---

## Planned Changes

| Feature | Status | Description |
|---------|--------|-------------|
| Ghost integration | 🔜 Planned | Ghost CMS publishing |
| Webflow integration | 🔜 Planned | Webflow publishing |
| Scheduled publishing | 🔜 Planned | Future-date publishing |
| Republish detection | 🔜 Planned | Detect and handle updates |
| Publishing queue | 🔜 Planned | Batch publishing with queue |
