# Domain Models ## Purpose Describe the key backend models, their responsibilities, constraints, and tenancy rules, grounded in current implementations. ## Code Locations (exact paths) - Tenancy bases and identity: `backend/igny8_core/auth/models.py` - Planner models: `backend/igny8_core/business/planning/models.py` - Writer/content models: `backend/igny8_core/business/content/models.py` - Automation models: `backend/igny8_core/business/automation/models.py` - Billing models: `backend/igny8_core/business/billing/models.py` - Integration models: `backend/igny8_core/business/integration/models.py` - Publishing models: `backend/igny8_core/business/publishing/models.py` - Optimization models: `backend/igny8_core/business/optimization/models.py` ## High-Level Responsibilities - Provide tenant-scoped storage for planner (keywords/clusters/ideas), writer (tasks/content/taxonomies/images/attributes), automation runs/config, billing (credits, invoices, payments), integration metadata, publishing records, and optimization tasks. - Enforce account/site/sector alignment via base classes and save-time validation. - Track external platform links (WordPress/Shopify/custom), credit usage, and publishing/optimization state. ## Detailed Behavior ### Tenancy Bases (auth/models.py) - `AccountBaseModel`: adds `account`, timestamps, and indexes; all tenant models inherit. - `SiteSectorBaseModel`: extends with `site` and `sector`; save enforces site → account alignment and sector belonging to the same site; raises validation errors if mismatched. ### Planner (business/planning/models.py) - `Clusters`: tenant/site/sector-scoped keyword group; tracks counts, volume, mapped pages, status (`new/mapped`), disable flag; unique per site/sector by name; soft-deletable. - `Keywords`: tenant/site/sector-scoped keyword tied to a global `SeedKeyword`; optional overrides for volume/difficulty/attributes; optional cluster link (same sector enforced); validation ensures seed keyword industry/sector matches site/sector; status (`new/mapped`), disable flag; soft-deletable. - `ContentIdeas`: ideas tied to clusters and optional keywords; tracks status (`new/queued/completed`), content type/structure, estimated word count; soft-deletable. ### Writer / Content (business/content/models.py) - `Tasks`: queue items for content generation; tied to cluster (required) and optional idea/taxonomy; content type/structure, keywords text, target word count, status (`queued/completed`); soft-deletable. - `Content`: generated or imported content; stores HTML, word count, SEO fields, cluster link, content type/structure, taxonomy M2M, external IDs/URLs/metadata, sync status, source (`igny8/wordpress`), and status (`draft/review/published`); soft-deletable. - `ContentTaxonomy`: simplified taxonomy (category/tag) with external taxonomy/ID, sync status, description, count, metadata; unique per site by slug/type and by external ID/taxonomy. - `Images`: images linked to content or task; auto-populates account/site/sector from the linked object; tracks type, URL/path, prompt, status, position; soft-deletable. - `ContentClusterMap`: maps content/tasks to clusters with role (`hub/supporting/attribute`) and source (`blueprint/manual/import`); auto-populates tenant context from linked content/task; unique per content+cluster+role. - `ContentAttribute` (alias `ContentAttributeMap`): tenant/site/sector-scoped attributes for content/task/cluster; typed (`product_spec/service_modifier/semantic_facet`), with optional external IDs, sources, and metadata; auto-populates tenant context from linked content/task. ### Automation (business/automation/models.py) - `AutomationConfig`: per-site config with enable flag, frequency (`daily/weekly/monthly`), scheduled time, batch sizes per stage, within/between-stage delays, and next/last run timestamps. - `AutomationRun`: tracks each run with trigger (`manual/scheduled`), status (`running/paused/cancelled/completed/failed`), current stage, pause/cancel timestamps, start/end, total credits used, per-stage JSON results, and optional error message. ### Billing (business/billing/models.py) - `CreditTransaction`: ledger of credit changes (purchase/subscription/refund/deduction/adjustment) with balance-after and metadata. - `CreditUsageLog`: detailed AI usage log with operation type (clustering/idea/content/image/reparse/legacy names), credits used, optional cost/model/tokens, related object references, and metadata. - `CreditCostConfig`: admin-configurable credit costs per operation with unit (per request/words/items/images), display metadata, active flag, audit fields, and previous cost tracking. - `Invoice`: tenant invoice with amounts, status (`draft/pending/paid/void/uncollectible`), dates, subscription link, line items JSON, payment metadata, Stripe IDs, notes; helper properties mirror legacy fields. - `Payment`: payment records per invoice with status lifecycle (pending/processing/succeeded/completed/failed/refunded/cancelled), method (Stripe/PayPal/bank/local wallet/manual), provider references, manual notes/approval fields, failure reason, timestamps, metadata. - `CreditPackage`: one-time credit bundles with price, discount, Stripe/PayPal IDs, active/featured flags, description/features, sort order. - `PaymentMethodConfig`: per-country payment-method availability and display/instruction fields; includes bank/local wallet metadata; unique per country+method. - `AccountPaymentMethod`: account-level payment metadata (non-sensitive) with type, display name, default/enabled/verified flags, country code, instructions, metadata; unique per account+display name. ### Integration (business/integration/models.py) - `SiteIntegration`: tenant/site-specific integration config with platform (`wordpress/shopify/custom`), platform type (`cms/ecommerce/custom_api`), config JSON, credentials JSON, active/sync flags, sync status, last sync/error, timestamps; unique per site+platform. - `SyncEvent`: event log per integration/site with event/action types, success flag, optional content/external IDs, details JSON, error, duration, and timestamps; indexed for debugging feeds. ### Publishing (business/publishing/models.py) - `PublishingRecord`: tracks content publishing to destinations (wordpress/sites/shopify) with destination IDs/URLs, status (`pending/publishing/published/failed`), timestamps, errors, metadata; site/sector scoped via base. - `DeploymentRecord`: tracks site deployments (sites renderer) with version/deployed_version, status (`pending/deploying/deployed/failed/rolled_back`), deployment URL, error, metadata, timestamps; site/sector scoped. ### Optimization (business/optimization/models.py) - `OptimizationTask`: content optimization runs with before/after scores and HTML, status (`pending/running/completed/failed`), credits used, metadata; auto-sets account from content; tenant scoped. ## Execution Flow - Tenant context is inherited from base models; many save methods propagate account/site/sector from related entities (e.g., Images, ContentClusterMap, ContentAttribute). - Planner → Writer linkage: Keywords and Clusters feed ContentIdeas; Tasks reference clusters/ideas; Content references clusters and taxonomies; Images/Attributes link to Tasks/Content. - Automation runs reference planner/writer models and record per-stage outputs; configs control batching/delays. - Billing logs and cost configs govern credit debits triggered by services (see services doc). - Integration/publishing models bind site integrations and publishing deployments to site-scoped content. - Optimization tasks attach to content and capture before/after artifacts. ## Cross-Module Interactions - Planner and writer share clusters/ideas/tasks/content relationships. - Billing models are invoked by services during AI/automation/image/content operations. - Integration events reference content IDs and external IDs for sync traces. - Publishing records reference writer content; deployment records reference sites. - Optimization tasks reference writer content and can influence publishing readiness downstream. ## State Transitions (if applicable) - Soft-delete is available on planner keywords/clusters/ideas and writer tasks/content/images via `SoftDeletableModel`. - Status fields track lifecycle: planner (`new/mapped/queued/completed`), writer tasks (`queued/completed`), content (`draft/review/published`), automation (`running/paused/cancelled/completed/failed`), publishing/deployment statuses, payment/invoice statuses, optimization statuses. ## Error Handling - Save-time validation in `SiteSectorBaseModel` and `Keywords` ensures tenant/site/sector alignment and industry/sector matching. - Unique constraints prevent duplicate clusters/keywords per site/sector and overlapping taxonomies/external IDs. - Automation runs store error messages and partial stage results; publishing/deployment records store error text. ## Tenancy Rules - All models shown are tenant scoped via `AccountBaseModel` or `SiteSectorBaseModel`; save hooks propagate context from related objects where needed. - Privileged roles can bypass filtering at the viewset layer, but persisted records retain account/site/sector ownership. ## Billing Rules (if applicable) - Credits reside on `Account`; transactions/usage logs record debits/credits; cost configs define per-operation pricing. - Invoices/payments/credit packages configure monetary flows; payment methods can be toggled per country or per account. ## Background Tasks / Schedulers (if applicable) - Automation configs drive scheduled runs; automation runs record stage outputs and timing. - Publishing/optimization tasks may be executed async via services/Celery (see services doc). ## Key Design Considerations - Tenant isolation is encoded at the model layer via base classes and validation, ensuring downstream services inherit scoping. - Cross-module links (clusters ↔ tasks ↔ content ↔ publishing/optimization) keep content lifecycle traceable. - Billing and integration models include metadata fields to avoid schema churn while capturing provider-specific details. ## How Developers Should Work With This Module - Inherit new tenant models from `AccountBaseModel` or `SiteSectorBaseModel` to enforce scoping automatically. - Validate cross-entity alignment (site/sector/industry) when relating planner and writer records. - Use existing status fields/choices when extending lifecycles; preserve unique constraints when adding fields. - When integrating new providers, extend or add models parallel to `SiteIntegration`/`SyncEvent` and keep platform-specific data in JSON fields.