Data flow

Author write → publish

ArticleEditor autosaves every 30s via PATCH /author/articles/{id}. Publish sets status=published, published_at, clears scheduled_for.

sequenceDiagram
    participant A as Author
    participant ED as ArticleEditor
    participant API as FastAPI
    participant DB as MySQL
    A->>ED: Edit blocks
    ED->>API: PATCH /author/articles/{id}
    API->>DB: Update article
    A->>ED: Publish now
    ED->>API: POST /author/articles/{id}/publish
    API->>DB: status=published
    API-->>ED: slug

Public read: GET /api/v1/articles/{slug} increments view count and applies paywall truncation server-side.