72 lines
3.4 KiB
Markdown
72 lines
3.4 KiB
Markdown
# Site Endpoints
|
||
|
||
## Purpose
|
||
Document site management endpoints under the auth module, including creation, listing, sector selection, and activation.
|
||
|
||
## Code Locations (exact paths)
|
||
- Routing: `backend/igny8_core/auth/urls.py`
|
||
- Views: `backend/igny8_core/auth/views.py` (`SiteViewSet`)
|
||
- Serializers: `backend/igny8_core/auth/serializers.py` (`SiteSerializer`, `SectorSerializer`)
|
||
|
||
## High-Level Responsibilities
|
||
- CRUD for sites scoped to an account, with role-based access.
|
||
- Allow public read by slug for active sites (renderer support).
|
||
- Manage sector selection and activation per site.
|
||
|
||
## Detailed Behavior
|
||
- Base path: `/api/v1/auth/sites/`
|
||
- Permissions:
|
||
- `list` with slug filter: `AllowAny` (public read by slug, active sites only).
|
||
- `create`: authenticated users (viewer+); sets site account from request/user.
|
||
- Other actions: `IsEditorOrAbove` with tenant access.
|
||
- Queryset logic:
|
||
- Unauthenticated with `slug` query param: returns active site by slug.
|
||
- Authenticated admin/developer: all sites.
|
||
- Authenticated owner/admin: sites for user’s account.
|
||
- Other users: sites where they have `SiteUserAccess`.
|
||
- Actions:
|
||
- `GET /sites/` list (with filters above).
|
||
- `POST /sites/` create site; account set from request/user.
|
||
- `GET /sites/{id}/sectors/` list active sectors for the site.
|
||
- `POST /sites/{id}/set_active/` marks site active (no deactivation of others).
|
||
- `POST /sites/{id}/select_sectors/` sets industry and sectors:
|
||
- Requires `industry_slug`; optional `sector_slugs` list.
|
||
- Validates industry exists/active; enforces plan sector limit (`get_max_sectors_limit`).
|
||
- Deactivates sectors not in provided list; ensures sectors belong to industry; creates missing site sectors as needed; returns site + sectors.
|
||
- Create/update:
|
||
- `perform_create` sets account; no single-active constraint.
|
||
- `perform_update` retains account; no single-active constraint.
|
||
|
||
## Data Structures / Models Involved (no code)
|
||
- `Site`, `Sector`, `Industry`, `IndustrySector`, `Plan` (for sector limits), `SiteUserAccess`, `Account`.
|
||
|
||
## Execution Flow
|
||
- Requests → DRF auth (JWT/session) → permissions → queryset scoping → serializer validation → model ops → unified response. Public slug reads bypass account filtering.
|
||
|
||
## Cross-Module Interactions
|
||
- Sites link to planner/writer records via site/sector; integration uses `Site.wp_api_key`; plan sector limits referenced here.
|
||
|
||
## State Transitions
|
||
- Site activation via `set_active`; sector activation/deactivation via `select_sectors`; industry assignment updated on selection.
|
||
|
||
## Error Handling
|
||
- 400 for missing industry slug or exceeding sector limits; 404 for missing site/industry; 500 if site lacks account when selecting sectors.
|
||
|
||
## Tenancy Rules
|
||
- Account-scoped except public slug read; role-based overrides for admins/developers; SiteUserAccess governs non-admin access.
|
||
|
||
## Billing Rules
|
||
- Sector limit enforced from plan (`max_industries` via `get_max_sectors_limit`).
|
||
|
||
## Background Tasks / Schedulers
|
||
- None in site endpoints.
|
||
|
||
## Key Design Considerations
|
||
- Public slug access supports site renderer without auth.
|
||
- Sector selection enforces industry/plan constraints and deactivates unselected sectors.
|
||
|
||
## How Developers Should Work With This Module
|
||
- Use `select_sectors` to set industry/sector with plan-aware limits.
|
||
- When extending site data, keep public slug path safe and scoped to active sites; maintain role-based access controls.
|
||
|