6.2 KiB
6.2 KiB
Backend Architecture
Purpose
Explain how the backend is structured, wired, and executed across Django/DRF, middleware, routing, async processing, and logging.
Code Locations (exact paths)
- Settings and app wiring:
backend/igny8_core/settings.py - URL routing:
backend/igny8_core/urls.py - Middleware:
backend/igny8_core/middleware/request_id.py,backend/igny8_core/auth/middleware.py,backend/igny8_core/middleware/resource_tracker.py - Auth stack:
backend/igny8_core/api/authentication.py,backend/igny8_core/auth/utils.py - Base viewsets and unified responses:
backend/igny8_core/api/base.py - Domain models:
backend/igny8_core/auth/models.pyplusbackend/igny8_core/business/*/models.py - Async/Celery config:
backend/igny8_core/settings.py - Logging:
backend/igny8_core/settings.py(publish/webhook logs), automation logging (backend/igny8_core/business/automation/services/automation_logger.py)
High-Level Responsibilities
- Django/DRF API surface under
/api/v1/*for planner, writer, system, billing, automation, linker, optimizer, publisher, and integration modules. - Middleware establishes request IDs, tenant context, and optional resource tracking before views run.
- DRF configuration standardizes pagination, filtering, authentication, throttling, and exception handling.
- Celery + Redis provide async execution for AI, automation, publishing, and other long-running tasks.
- Logging and CORS/security settings are centralized in settings.
Detailed Behavior
- Apps registered in
INSTALLED_APPSinclude auth, AI framework, planner, writer, system, billing, automation, optimization, publishing, integration, linker, optimizer, publisher. Custom admin config is loaded first. - Middleware order: security → WhiteNoise → CORS → session/common/CSRF → Django auth →
RequestIDMiddleware→AccountContextMiddleware(tenant + plan enforcement) →ResourceTrackingMiddleware(opt-in for admin/developer with header) → messages → clickjacking. - Routing (
urls.py): admin plus CSV helpers for industries/seed keywords, then/api/v1/routers for auth, account, planner, writer, system, billing (user/admin), automation, linker, optimizer, publisher, integration. OpenAPI served at/api/docsand/api/redoc. - DRF defaults: unified exception handler (unless env disables), custom pagination, filtering/search/ordering, auth stack (API key → JWT → CSRF-exempt session → basic), scoped throttling per operation class, drf-spectacular schema generation with tag ordering.
- CORS: IGNY8 domains and local dev ports allowed; credentials enabled; request/resource tracking headers exposed.
- Celery: Redis broker/result; JSON serialization; task/soft time limits; single-prefetch; sentinel/SSL toggles via env.
- Logging: console plus rotating files for publish/sync, WordPress API, webhooks; request IDs from middleware surface in responses; automation has dedicated file-based logger per run.
Data Structures / Models Involved (no code)
- Tenancy/identity:
Account,Plan,Subscription,Site,Sector,User,SiteUserAccess,PasswordResetToken(in auth models). - Domain models across planner, writer, billing, automation, publishing, integration, optimization (see domain models doc).
- Middleware uses request-scoped
request.account,request.site, andrequest.request_id.
Execution Flow
- Request enters middleware stack; IDs and tenant context are set; plan is verified.
- DRF auth classes authenticate user/api-key/JWT/session.
- Base viewsets filter by tenant/site/sector and handle unified responses.
- Serializers validate; database writes enforce tenant alignment via model bases.
- Optional Celery tasks are enqueued for long-running work; responses remain synchronous JSON with pagination/throttle headers when applicable.
- Logging writes to configured handlers; request/resource IDs are added to responses.
Cross-Module Interactions
- Tenant context from middleware is consumed by all module viewsets.
- AI and automation invoke Celery tasks and AI functions; billing services deduct credits used by automation/AI flows.
- Integration/publishing modules rely on API key auth to set
request.sitefor WordPress and other platforms.
State Transitions (if applicable)
- Account/plan validity is checked per request; system accounts are protected from deletion.
- Soft-delete is available on many models via
SoftDeletableModel. - Request lifecycle includes request ID creation, optional resource tracking, and unified response formatting.
Error Handling
- Custom DRF exception handler wraps errors with
success=false. AccountContextMiddlewareblocks requests lacking account or active plan (403/402 JSON).- Base viewsets wrap validation/404/500 errors into unified payloads.
Tenancy Rules
- Request-level
account(andsite/sectorwhere applicable) is injected by middleware/auth; base viewsets enforce filtering. - Admin/developer/system-account users bypass tenant filtering; system accounts are guarded from deletion.
Billing Rules (if applicable)
- Billing env keys configured in settings; plan enforcement occurs in middleware; credit debits handled by billing services during operations.
Background Tasks / Schedulers (if applicable)
- Celery worker/beat use Redis URLs from settings; task limits and JSON serialization enforced.
- Automation, AI, publishing, and optimization tasks run async; automation logger writes per-run files.
Key Design Considerations
- Middleware-first tenant enforcement ensures isolation.
- Unified API standards (responses, throttles, schema) keep clients consistent.
- Celery offloads expensive AI/automation/publishing work with bounded execution.
- Logging and request IDs aid observability; resource tracking is opt-in for admins.
How Developers Should Work With This Module
- Register new apps in
INSTALLED_APPSand route them under/api/v1/*. - Use existing middleware order; add new middleware only if it does not break account/request ID handling.
- Inherit from base viewsets for scoping and response consistency.
- Use Celery for long-running tasks; respect Redis/task time-limit settings.
- Keep env vars (DB, JWT, Redis, Stripe/PayPal) set per
settings.py; avoid hardcoded secrets.