1501 lines
56 KiB
Markdown
1501 lines
56 KiB
Markdown
# Role-Based Access Control (RBAC) Analysis Report
|
|
## Bakery-IA Microservices Platform
|
|
|
|
**Generated:** 2025-10-12
|
|
**Status:** Analysis Complete - Implementation Recommendations
|
|
|
|
---
|
|
|
|
## Executive Summary
|
|
|
|
This document provides a comprehensive analysis of the Role-Based Access Control (RBAC) requirements for the Bakery-IA platform, which consists of 15 microservices with 250+ API endpoints. The analysis identifies user roles, tenant roles, subscription tiers, and provides detailed access control recommendations for each service.
|
|
|
|
### Key Findings
|
|
|
|
- **4 User Roles** with hierarchical permissions: Viewer → Member → Admin → Owner
|
|
- **3 Subscription Tiers** with feature gating: Starter → Professional → Enterprise
|
|
- **250+ API Endpoints** requiring access control
|
|
- **Mixed Implementation Status**: Some endpoints have decorators, many need implementation
|
|
- **Tenant Isolation**: All services enforce tenant-level data isolation
|
|
|
|
---
|
|
|
|
## 1. Role System Architecture
|
|
|
|
### 1.1 User Role Hierarchy
|
|
|
|
The platform implements a hierarchical role system defined in [`shared/auth/access_control.py`](shared/auth/access_control.py):
|
|
|
|
```python
|
|
class UserRole(Enum):
|
|
VIEWER = "viewer" # Read-only access
|
|
MEMBER = "member" # Read + basic write operations
|
|
ADMIN = "admin" # Full operational access
|
|
OWNER = "owner" # Full control including tenant settings
|
|
```
|
|
|
|
**Role Hierarchy (Higher = More Permissions):**
|
|
1. **Viewer** (Level 1) - Read-only access to tenant data
|
|
2. **Member** (Level 2) - Can create and edit operational data
|
|
3. **Admin** (Level 3) - Can manage users, delete data, configure settings
|
|
4. **Owner** (Level 4) - Full control, billing, tenant deletion
|
|
|
|
### 1.2 Subscription Tier System
|
|
|
|
Subscription tiers control feature access defined in [`shared/auth/access_control.py`](shared/auth/access_control.py):
|
|
|
|
```python
|
|
class SubscriptionTier(Enum):
|
|
STARTER = "starter" # Basic features
|
|
PROFESSIONAL = "professional" # Advanced analytics & ML
|
|
ENTERPRISE = "enterprise" # Full feature set + priority support
|
|
```
|
|
|
|
**Tier Features:**
|
|
|
|
| Feature | Starter | Professional | Enterprise |
|
|
|---------|---------|--------------|------------|
|
|
| Basic Inventory | ✓ | ✓ | ✓ |
|
|
| Basic Sales | ✓ | ✓ | ✓ |
|
|
| Basic Recipes | ✓ | ✓ | ✓ |
|
|
| ML Forecasting | ✓ | ✓ | ✓ |
|
|
| Advanced Analytics | ✗ | ✓ | ✓ |
|
|
| Custom Reports | ✗ | ✓ | ✓ |
|
|
| Production Optimization | ✓ | ✓ | ✓ |
|
|
| Multi-location | 1 | 2 | Unlimited |
|
|
| API Access | ✗ | ✗ | ✓ |
|
|
| Priority Support | ✗ | ✗ | ✓ |
|
|
| Max Users | 5 | 20 | Unlimited |
|
|
| Max Products | 50 | 500 | Unlimited |
|
|
|
|
### 1.3 Tenant Member Roles
|
|
|
|
Defined in [`services/tenant/app/models/tenants.py`](services/tenant/app/models/tenants.py):
|
|
|
|
```python
|
|
class TenantMember(Base):
|
|
role = Column(String(50), default="member") # owner, admin, member, viewer
|
|
```
|
|
|
|
**Permission Matrix by Action:**
|
|
|
|
| Action Type | Viewer | Member | Admin | Owner |
|
|
|-------------|--------|--------|-------|-------|
|
|
| Read data | ✓ | ✓ | ✓ | ✓ |
|
|
| Create records | ✗ | ✓ | ✓ | ✓ |
|
|
| Update records | ✗ | ✓ | ✓ | ✓ |
|
|
| Delete records | ✗ | ✗ | ✓ | ✓ |
|
|
| Manage users | ✗ | ✗ | ✓ | ✓ |
|
|
| Configure settings | ✗ | ✗ | ✓ | ✓ |
|
|
| Billing/subscription | ✗ | ✗ | ✗ | ✓ |
|
|
| Delete tenant | ✗ | ✗ | ✗ | ✓ |
|
|
|
|
---
|
|
|
|
## 2. Access Control Implementation
|
|
|
|
### 2.1 Available Decorators
|
|
|
|
The platform provides these decorators in [`shared/auth/access_control.py`](shared/auth/access_control.py):
|
|
|
|
```python
|
|
# Subscription tier enforcement
|
|
@require_subscription_tier(['professional', 'enterprise'])
|
|
@enterprise_tier_required # Convenience decorator
|
|
@analytics_tier_required # For analytics endpoints
|
|
|
|
# Role-based enforcement
|
|
@require_user_role(['admin', 'owner'])
|
|
@admin_role_required # Convenience decorator
|
|
@owner_role_required # Convenience decorator
|
|
|
|
# Combined enforcement
|
|
@require_tier_and_role(['professional', 'enterprise'], ['admin', 'owner'])
|
|
```
|
|
|
|
### 2.2 FastAPI Dependencies
|
|
|
|
Available in [`shared/auth/tenant_access.py`](shared/auth/tenant_access.py):
|
|
|
|
```python
|
|
# Basic authentication
|
|
current_user: Dict = Depends(get_current_user_dep)
|
|
|
|
# Tenant access verification
|
|
tenant_id: str = Depends(verify_tenant_access_dep)
|
|
|
|
# Resource permission check
|
|
tenant_id: str = Depends(verify_tenant_permission_dep(resource, action))
|
|
```
|
|
|
|
### 2.3 Current Implementation Status
|
|
|
|
**Implemented:**
|
|
- ✓ JWT authentication across all services
|
|
- ✓ Tenant isolation via path parameters
|
|
- ✓ Basic admin role checks in auth service
|
|
- ✓ Subscription tier checking framework
|
|
|
|
**Needs Implementation:**
|
|
- ✗ Role decorators on most service endpoints
|
|
- ✗ Subscription tier enforcement on premium features
|
|
- ✗ Fine-grained resource permissions
|
|
- ✗ Audit logging for sensitive operations
|
|
|
|
---
|
|
|
|
## 3. RBAC Matrix by Service
|
|
|
|
### 3.1 AUTH SERVICE
|
|
|
|
**Base Path:** `/api/v1`
|
|
**Total Endpoints:** 17
|
|
|
|
| Endpoint | Method | Min Role | Min Tier | Access Control |
|
|
|----------|--------|----------|----------|----------------|
|
|
| `/register` | POST | Public | Any | No auth required |
|
|
| `/login` | POST | Public | Any | No auth required |
|
|
| `/refresh` | POST | Authenticated | Any | Valid refresh token |
|
|
| `/verify` | POST | Authenticated | Any | Valid access token |
|
|
| `/logout` | POST | Authenticated | Any | Valid access token |
|
|
| `/change-password` | POST | Authenticated | Any | Own account only |
|
|
| `/profile` | GET | Authenticated | Any | Own account only |
|
|
| `/profile` | PUT | Authenticated | Any | Own account only |
|
|
| `/verify-email` | POST | Public | Any | Email verification token |
|
|
| `/reset-password` | POST | Public | Any | Reset token required |
|
|
| `/me` | GET | Authenticated | Any | Own account only |
|
|
| `/me` | PUT | Authenticated | Any | Own account only |
|
|
| `/delete/{user_id}` | DELETE | **Admin** | Any | **🔴 CRITICAL** Admin only |
|
|
| `/delete/{user_id}/deletion-preview` | GET | **Admin** | Any | Admin only |
|
|
| `/me/onboarding/*` | * | Authenticated | Any | Own account only |
|
|
| `/{user_id}/onboarding/progress` | GET | **Admin** | Any | Admin/service only |
|
|
| `/health` | GET | Public | Any | No auth required |
|
|
|
|
**🔴 Critical Operations:**
|
|
- User deletion requires admin role + audit logging
|
|
- Password changes should enforce strong password policy
|
|
- Email verification prevents account takeover
|
|
|
|
**Recommendations:**
|
|
- ✅ IMPLEMENTED: Admin role check on deletion
|
|
- 🔧 ADD: Rate limiting on login/register (3-5 attempts)
|
|
- 🔧 ADD: Audit log for user deletion
|
|
- 🔧 ADD: MFA for admin accounts
|
|
- 🔧 ADD: Password strength validation
|
|
- 🔧 ADD: Session management (concurrent login limits)
|
|
|
|
---
|
|
|
|
### 3.2 TENANT SERVICE
|
|
|
|
**Base Path:** `/api/v1`
|
|
**Total Endpoints:** 35+
|
|
|
|
#### Tenant Management
|
|
|
|
| Endpoint | Method | Min Role | Min Tier | Access Control |
|
|
|----------|--------|----------|----------|----------------|
|
|
| `/{tenant_id}` | GET | **Viewer** | Any | Tenant member |
|
|
| `/{tenant_id}` | PUT | **Admin** | Any | Admin+ only |
|
|
| `/register` | POST | Authenticated | Any | Creates new tenant, user becomes owner |
|
|
| `/{tenant_id}/deactivate` | POST | **Owner** | Any | **🔴 CRITICAL** Owner only |
|
|
| `/{tenant_id}/activate` | POST | **Owner** | Any | Owner only |
|
|
| `/subdomain/{subdomain}` | GET | Public | Any | Public discovery |
|
|
| `/search` | GET | Public | Any | Public discovery |
|
|
| `/nearby` | GET | Public | Any | Geolocation-based discovery |
|
|
| `/users/{user_id}` | GET | Authenticated | Any | Own tenants only |
|
|
| `/user/{user_id}/owned` | GET | Authenticated | Any | Own tenants only |
|
|
| `/statistics` | GET | **Platform Admin** | Any | **🔴 CRITICAL** Platform-wide stats |
|
|
|
|
#### Team Management
|
|
|
|
| Endpoint | Method | Min Role | Min Tier | Access Control |
|
|
|----------|--------|----------|----------|----------------|
|
|
| `/{tenant_id}/members` | GET | **Viewer** | Any | Tenant member |
|
|
| `/{tenant_id}/members` | POST | **Admin** | Any | Admin+ can invite users |
|
|
| `/{tenant_id}/members/{user_id}/role` | PUT | **Admin** | Any | Admin+ can change roles (except owner) |
|
|
| `/{tenant_id}/members/{user_id}` | DELETE | **Admin** | Any | **🔴** Admin+ can remove members |
|
|
| `/{tenant_id}/my-access` | GET | Authenticated | Any | Own access info |
|
|
| `/{tenant_id}/access/{user_id}` | GET | Service | Any | Internal service verification |
|
|
|
|
#### Subscription Management
|
|
|
|
| Endpoint | Method | Min Role | Min Tier | Access Control |
|
|
|----------|--------|----------|----------|----------------|
|
|
| `/subscriptions/{tenant_id}/limits` | GET | **Viewer** | Any | Tenant member |
|
|
| `/subscriptions/{tenant_id}/usage` | GET | **Viewer** | Any | Tenant member |
|
|
| `/subscriptions/{tenant_id}/can-add-*` | GET | **Admin** | Any | Pre-check for admins |
|
|
| `/subscriptions/{tenant_id}/features/{feature}` | GET | **Viewer** | Any | Feature availability check |
|
|
| `/subscriptions/{tenant_id}/validate-upgrade/{plan}` | GET | **Owner** | Any | Owner can view upgrade options |
|
|
| `/subscriptions/{tenant_id}/upgrade` | POST | **Owner** | Any | **🔴 CRITICAL** Owner only |
|
|
| `/subscriptions/{tenant_id}/cancel` | POST | **Owner** | Any | **🔴 CRITICAL** Owner only |
|
|
| `/subscriptions/{tenant_id}/invoices` | GET | **Owner** | Any | Billing info for owner |
|
|
| `/subscriptions/register-with-subscription` | POST | Authenticated | Any | New tenant with payment |
|
|
| `/plans` | GET | Public | Any | Public plan information |
|
|
|
|
#### Webhooks & Internal
|
|
|
|
| Endpoint | Method | Min Role | Min Tier | Access Control |
|
|
|----------|--------|----------|----------|----------------|
|
|
| `/webhooks/stripe` | POST | Service | Any | Stripe signature verification |
|
|
| `/webhooks/generic` | POST | Service | Any | Webhook secret verification |
|
|
| `/clone` | POST | Service | Any | **Internal only** - Demo cloning |
|
|
| `/{tenant_id}/model-status` | PUT | Service | Any | **Internal only** - ML service |
|
|
|
|
**🔴 Critical Operations:**
|
|
- Tenant deactivation/deletion
|
|
- Subscription changes and cancellation
|
|
- Role modifications (prevent owner role changes)
|
|
- Member removal
|
|
|
|
**Recommendations:**
|
|
- ✅ IMPLEMENTED: Role checks for member management
|
|
- 🔧 ADD: Prevent removing the last owner
|
|
- 🔧 ADD: Prevent owner from changing their own role
|
|
- 🔧 ADD: Subscription change confirmation (email/2FA)
|
|
- 🔧 ADD: Grace period before tenant deletion
|
|
- 🔧 ADD: Audit log for all tenant modifications
|
|
- 🔧 ADD: Rate limiting on team invitations
|
|
|
|
---
|
|
|
|
### 3.3 SALES SERVICE
|
|
|
|
**Base Path:** `/api/v1`
|
|
**Total Endpoints:** 10+
|
|
|
|
| Endpoint | Method | Min Role | Min Tier | Access Control |
|
|
|----------|--------|----------|----------|----------------|
|
|
| `/{tenant_id}/sales` | GET | **Viewer** | Any | Read sales data |
|
|
| `/{tenant_id}/sales` | POST | **Member** | Any | Create sales record |
|
|
| `/{tenant_id}/sales/{id}` | GET | **Viewer** | Any | Read single record |
|
|
| `/{tenant_id}/sales/{id}` | PUT | **Member** | Any | Update sales record |
|
|
| `/{tenant_id}/sales/{id}` | DELETE | **Admin** | Any | **🔴** Delete sales record |
|
|
| `/{tenant_id}/sales/import` | POST | **Admin** | Any | Bulk import |
|
|
| `/{tenant_id}/sales/export` | GET | **Member** | Any | Export data |
|
|
| `/{tenant_id}/products` | GET | **Viewer** | Any | Product catalog |
|
|
| `/{tenant_id}/products` | POST | **Admin** | Any | Add product |
|
|
| `/{tenant_id}/products/{id}` | PUT | **Admin** | Any | Update product |
|
|
| `/{tenant_id}/products/{id}` | DELETE | **Admin** | Any | **🔴** Delete product |
|
|
| `/{tenant_id}/analytics/*` | GET | **Viewer** | **Professional** | **💰** Advanced analytics |
|
|
| `/clone` | POST | Service | Any | **Internal only** |
|
|
|
|
**🔴 Critical Operations:**
|
|
- Sales record deletion (affects financial reports)
|
|
- Product deletion (affects historical data)
|
|
- Bulk imports (data integrity)
|
|
|
|
**💰 Premium Features:**
|
|
- Advanced analytics dashboards
|
|
- Custom reporting
|
|
- Sales forecasting integration
|
|
- Export to external systems
|
|
|
|
**Recommendations:**
|
|
- 🔧 ADD: Soft delete for sales records (audit trail)
|
|
- 🔧 ADD: Subscription tier check on analytics endpoints
|
|
- 🔧 ADD: Prevent deletion of products with sales history
|
|
- 🔧 ADD: Import validation and preview
|
|
- 🔧 ADD: Rate limiting on bulk operations
|
|
|
|
---
|
|
|
|
### 3.4 INVENTORY SERVICE
|
|
|
|
**Base Path:** `/api/v1`
|
|
**Total Endpoints:** 30+
|
|
|
|
#### Ingredients Management
|
|
|
|
| Endpoint | Method | Min Role | Min Tier | Access Control |
|
|
|----------|--------|----------|----------|----------------|
|
|
| `/{tenant_id}/ingredients` | GET | **Viewer** | Any | List ingredients |
|
|
| `/{tenant_id}/ingredients` | POST | **Member** | Any | Add ingredient |
|
|
| `/{tenant_id}/ingredients/{id}` | GET | **Viewer** | Any | View ingredient |
|
|
| `/{tenant_id}/ingredients/{id}` | PUT | **Member** | Any | Update ingredient |
|
|
| `/{tenant_id}/ingredients/{id}` | DELETE | **Admin** | Any | **🔴** Delete ingredient |
|
|
|
|
#### Stock Management
|
|
|
|
| Endpoint | Method | Min Role | Min Tier | Access Control |
|
|
|----------|--------|----------|----------|----------------|
|
|
| `/{tenant_id}/stock` | GET | **Viewer** | Any | View stock levels |
|
|
| `/{tenant_id}/stock` | POST | **Member** | Any | Add stock entry |
|
|
| `/{tenant_id}/stock/{id}` | PUT | **Member** | Any | Update stock entry |
|
|
| `/{tenant_id}/stock/{id}` | DELETE | **Admin** | Any | **🔴** Delete stock entry |
|
|
| `/{tenant_id}/stock/adjustments` | POST | **Admin** | Any | **🔴** Manual stock adjustment |
|
|
| `/{tenant_id}/stock/low-stock-alerts` | GET | **Viewer** | Any | View alerts |
|
|
|
|
#### Food Safety & Compliance
|
|
|
|
| Endpoint | Method | Min Role | Min Tier | Access Control |
|
|
|----------|--------|----------|----------|----------------|
|
|
| `/{tenant_id}/compliance` | GET | **Viewer** | Any | View compliance records |
|
|
| `/{tenant_id}/compliance` | POST | **Member** | Any | Record compliance check |
|
|
| `/{tenant_id}/compliance/{id}` | PUT | **Member** | Any | Update compliance record |
|
|
| `/{tenant_id}/compliance/{id}` | DELETE | **Admin** | Any | **🔴** Delete compliance record |
|
|
| `/{tenant_id}/temperature-logs` | GET | **Viewer** | Any | View temperature logs |
|
|
| `/{tenant_id}/temperature-logs` | POST | **Member** | Any | Record temperature |
|
|
| `/{tenant_id}/safety-alerts` | GET | **Viewer** | Any | View safety alerts |
|
|
| `/{tenant_id}/safety-alerts/{id}/acknowledge` | POST | **Member** | Any | Acknowledge alert |
|
|
|
|
#### Analytics & Dashboard
|
|
|
|
| Endpoint | Method | Min Role | Min Tier | Access Control |
|
|
|----------|--------|----------|----------|----------------|
|
|
| `/{tenant_id}/dashboard` | GET | **Viewer** | Any | Basic dashboard |
|
|
| `/{tenant_id}/analytics/*` | GET | **Viewer** | **Professional** | **💰** Advanced analytics |
|
|
| `/{tenant_id}/reports/waste-analysis` | GET | **Viewer** | **Professional** | **💰** Waste analysis |
|
|
| `/{tenant_id}/reports/cost-analysis` | GET | **Admin** | **Professional** | **💰** Cost analysis (sensitive) |
|
|
|
|
**🔴 Critical Operations:**
|
|
- Ingredient deletion (affects recipes)
|
|
- Manual stock adjustments (inventory manipulation)
|
|
- Compliance record deletion (regulatory violation)
|
|
- Food safety alert dismissal
|
|
|
|
**💰 Premium Features:**
|
|
- Advanced inventory analytics
|
|
- Waste analysis and optimization
|
|
- Cost tracking and analysis
|
|
- Automated reorder recommendations
|
|
- FIFO optimization
|
|
|
|
**Recommendations:**
|
|
- 🔧 ADD: Prevent deletion of ingredients used in recipes
|
|
- 🔧 ADD: Audit log for all stock adjustments
|
|
- 🔧 ADD: Compliance record retention (cannot delete, only archive)
|
|
- 🔧 ADD: Food safety alerts require investigation notes
|
|
- 🔧 ADD: Subscription tier checks on analytics
|
|
- 🔧 ADD: Role check: only Admin+ can see cost data
|
|
|
|
---
|
|
|
|
### 3.5 PRODUCTION SERVICE
|
|
|
|
**Base Path:** `/api/v1`
|
|
**Total Endpoints:** 40+
|
|
|
|
#### Production Batches
|
|
|
|
| Endpoint | Method | Min Role | Min Tier | Access Control |
|
|
|----------|--------|----------|----------|----------------|
|
|
| `/{tenant_id}/batches` | GET | **Viewer** | Any | View batches |
|
|
| `/{tenant_id}/batches` | POST | **Member** | Any | Create batch |
|
|
| `/{tenant_id}/batches/{id}` | GET | **Viewer** | Any | View batch details |
|
|
| `/{tenant_id}/batches/{id}` | PUT | **Member** | Any | Update batch |
|
|
| `/{tenant_id}/batches/{id}` | DELETE | **Admin** | Any | **🔴** Delete batch |
|
|
| `/{tenant_id}/batches/{id}/status` | PUT | **Member** | Any | Update batch status |
|
|
| `/{tenant_id}/batches/active` | GET | **Viewer** | Any | View active batches |
|
|
|
|
#### Production Schedules
|
|
|
|
| Endpoint | Method | Min Role | Min Tier | Access Control |
|
|
|----------|--------|----------|----------|----------------|
|
|
| `/{tenant_id}/schedules` | GET | **Viewer** | Any | View schedules |
|
|
| `/{tenant_id}/schedules` | POST | **Admin** | Any | Create schedule |
|
|
| `/{tenant_id}/schedules/{id}` | PUT | **Admin** | Any | Update schedule |
|
|
| `/{tenant_id}/schedules/{id}` | DELETE | **Admin** | Any | **🔴** Delete schedule |
|
|
| `/{tenant_id}/schedule-batch` | POST | **Member** | Any | Schedule production |
|
|
| `/{tenant_id}/start-batch` | POST | **Member** | Any | Start batch |
|
|
| `/{tenant_id}/complete-batch` | POST | **Member** | Any | Complete batch |
|
|
|
|
#### Production Operations
|
|
|
|
| Endpoint | Method | Min Role | Min Tier | Access Control |
|
|
|----------|--------|----------|----------|----------------|
|
|
| `/{tenant_id}/capacity/check` | GET | **Viewer** | Any | Capacity planning (basic) |
|
|
| `/{tenant_id}/capacity/optimize` | POST | **Admin** | Any | Basic optimization |
|
|
| `/{tenant_id}/bottlenecks` | GET | **Viewer** | Any | Basic bottleneck identification |
|
|
| `/{tenant_id}/resource-utilization` | GET | **Viewer** | Any | Basic resource metrics |
|
|
| `/{tenant_id}/adjust-schedule` | POST | **Admin** | Any | Adjust schedule |
|
|
| `/{tenant_id}/efficiency-metrics` | GET | **Viewer** | Any | Basic efficiency metrics |
|
|
|
|
#### Quality Control
|
|
|
|
| Endpoint | Method | Min Role | Min Tier | Access Control |
|
|
|----------|--------|----------|----------|----------------|
|
|
| `/{tenant_id}/quality-templates` | GET | **Viewer** | Any | View templates |
|
|
| `/{tenant_id}/quality-templates` | POST | **Admin** | Any | Create template |
|
|
| `/{tenant_id}/quality-templates/{id}` | PUT | **Admin** | Any | Update template |
|
|
| `/{tenant_id}/quality-templates/{id}` | DELETE | **Admin** | Any | Delete template |
|
|
| `/{tenant_id}/quality-check` | POST | **Member** | Any | Record quality check |
|
|
| `/{tenant_id}/batches/{id}/quality-checks` | POST | **Member** | Any | Batch quality check |
|
|
|
|
#### Analytics
|
|
|
|
| Endpoint | Method | Min Role | Min Tier | Access Control |
|
|
|----------|--------|----------|----------|----------------|
|
|
| `/{tenant_id}/production-volume` | GET | **Viewer** | Any | Basic production volume metrics |
|
|
| `/{tenant_id}/efficiency-trends` | GET | **Viewer** | **Professional** | **💰** Historical efficiency trends |
|
|
| `/{tenant_id}/quality-metrics` | GET | **Viewer** | Any | Basic quality metrics |
|
|
| `/{tenant_id}/equipment-performance` | GET | **Admin** | **Professional** | **💰** Detailed equipment metrics |
|
|
| `/{tenant_id}/capacity-analysis` | GET | **Admin** | **Professional** | **💰** Advanced capacity analysis |
|
|
| `/{tenant_id}/waste-analysis` | GET | **Viewer** | **Professional** | **💰** Detailed waste analysis |
|
|
|
|
**🔴 Critical Operations:**
|
|
- Batch deletion (affects inventory and tracking)
|
|
- Schedule changes (affects production timeline)
|
|
- Quality check modifications (compliance)
|
|
- Manual schedule adjustments (operational impact)
|
|
|
|
**💰 Premium Features:**
|
|
- **Starter Tier:**
|
|
- Basic capacity checking
|
|
- Simple bottleneck identification
|
|
- Basic resource utilization
|
|
- Simple optimization suggestions
|
|
- Current day metrics only
|
|
- **Professional Tier:**
|
|
- Historical efficiency trends
|
|
- Detailed equipment performance tracking
|
|
- Advanced capacity analysis
|
|
- Waste analysis and optimization
|
|
- Predictive alerts (30-day history)
|
|
- Advanced optimization algorithms
|
|
- **Enterprise Tier:**
|
|
- Predictive maintenance
|
|
- Multi-location production optimization
|
|
- Custom optimization parameters
|
|
- Real-time production monitoring
|
|
- Unlimited historical data
|
|
- AI-powered scheduling
|
|
|
|
**Recommendations:**
|
|
- ✅ AVAILABLE TO ALL TIERS: Basic production optimization
|
|
- 🔧 ADD: Optimization depth limits per tier (basic suggestions Starter, advanced Professional)
|
|
- 🔧 ADD: Historical data limits (7 days Starter, 90 days Professional, unlimited Enterprise)
|
|
- 🔧 ADD: Prevent deletion of completed batches (audit trail)
|
|
- 🔧 ADD: Schedule change approval for large adjustments
|
|
- 🔧 ADD: Quality check cannot be deleted, only corrected
|
|
- 🔧 ADD: Advanced analytics only for Professional+
|
|
- 🔧 ADD: Audit log for all production schedule changes
|
|
|
|
---
|
|
|
|
### 3.6 FORECASTING SERVICE
|
|
|
|
**Base Path:** `/api/v1`
|
|
**Total Endpoints:** 12+
|
|
|
|
| Endpoint | Method | Min Role | Min Tier | Access Control |
|
|
|----------|--------|----------|----------|----------------|
|
|
| `/{tenant_id}/forecasts` | GET | **Viewer** | Any | View forecasts (basic) |
|
|
| `/{tenant_id}/forecasts` | POST | **Admin** | Any | Generate forecast (basic) |
|
|
| `/{tenant_id}/forecasts/{id}` | GET | **Viewer** | Any | View single forecast |
|
|
| `/{tenant_id}/forecasts/generate` | POST | **Admin** | Any | Trigger ML forecast |
|
|
| `/{tenant_id}/forecasts/bulk-generate` | POST | **Admin** | Any | Bulk forecast generation |
|
|
| `/{tenant_id}/scenarios` | GET | **Viewer** | **Enterprise** | **💰** View scenarios |
|
|
| `/{tenant_id}/scenarios` | POST | **Admin** | **Enterprise** | **💰** Create scenario |
|
|
| `/{tenant_id}/scenarios/{id}/analyze` | POST | **Admin** | **Enterprise** | **💰** What-if analysis |
|
|
| `/{tenant_id}/scenarios/compare` | POST | **Admin** | **Enterprise** | **💰** Compare scenarios |
|
|
| `/{tenant_id}/analytics/accuracy` | GET | **Viewer** | **Professional** | **💰** Model accuracy metrics |
|
|
| `/{tenant_id}/analytics/performance` | GET | **Admin** | **Professional** | **💰** Model performance |
|
|
| `/alert-metrics` | GET | Service | Any | **Internal only** |
|
|
|
|
**🔴 Critical Operations:**
|
|
- Forecast generation (consumes ML resources)
|
|
- Bulk operations (resource intensive)
|
|
- Scenario creation (computational cost)
|
|
|
|
**💰 Premium Features:**
|
|
- **Starter Tier:**
|
|
- Basic ML forecasting (limited to 7-day forecasts)
|
|
- View basic forecast data
|
|
- Simple demand predictions
|
|
- **Professional Tier:**
|
|
- Extended forecasting (30+ days)
|
|
- Historical forecast data
|
|
- Accuracy metrics and analytics
|
|
- Advanced model performance tracking
|
|
- **Enterprise Tier:**
|
|
- Advanced scenario modeling
|
|
- What-if analysis
|
|
- Scenario comparison
|
|
- Custom ML parameters
|
|
- Multi-location forecasting
|
|
|
|
**Recommendations:**
|
|
- ✅ AVAILABLE TO ALL TIERS: Basic forecasting functionality
|
|
- 🔧 ADD: Forecast horizon limits per tier (7 days Starter, 30+ Professional)
|
|
- 🔧 ADD: Rate limiting on forecast generation based on tier (ML cost)
|
|
- 🔧 ADD: Quota limits per subscription tier (Starter: 10/day, Professional: 100/day, Enterprise: unlimited)
|
|
- 🔧 ADD: Scenario modeling only for Enterprise
|
|
- 🔧 ADD: Advanced analytics only for Professional+
|
|
- 🔧 ADD: Audit log for manual forecast overrides
|
|
|
|
---
|
|
|
|
### 3.7 TRAINING SERVICE
|
|
|
|
**Base Path:** `/api/v1`
|
|
**Total Endpoints:** 15+ (including WebSocket)
|
|
|
|
#### Training Jobs
|
|
|
|
| Endpoint | Method | Min Role | Min Tier | Access Control |
|
|
|----------|--------|----------|----------|----------------|
|
|
| `/{tenant_id}/training-jobs` | GET | **Admin** | Any | View training jobs |
|
|
| `/{tenant_id}/training-jobs` | POST | **Admin** | Any | Start training (basic) |
|
|
| `/{tenant_id}/training-jobs/{id}` | GET | **Admin** | Any | View job status |
|
|
| `/{tenant_id}/training-jobs/{id}/cancel` | POST | **Admin** | Any | Cancel training |
|
|
| `/{tenant_id}/training-jobs/retrain` | POST | **Admin** | Any | **🔴** Retrain model |
|
|
|
|
#### Model Management
|
|
|
|
| Endpoint | Method | Min Role | Min Tier | Access Control |
|
|
|----------|--------|----------|----------|----------------|
|
|
| `/{tenant_id}/models` | GET | **Admin** | Any | View models |
|
|
| `/{tenant_id}/models/{id}` | GET | **Admin** | Any | View model details |
|
|
| `/{tenant_id}/models/{id}/deploy` | POST | **Admin** | Any | **🔴** Deploy model |
|
|
| `/{tenant_id}/models/{id}/artifacts` | GET | **Admin** | **Enterprise** | **💰** Download artifacts (Enterprise only)
|
|
|
|
#### Monitoring
|
|
|
|
| Endpoint | Method | Min Role | Min Tier | Access Control |
|
|
|----------|--------|----------|----------|----------------|
|
|
| `/monitoring/circuit-breakers` | GET | **Platform Admin** | Any | **🔴** Platform monitoring |
|
|
| `/monitoring/circuit-breakers/{name}/reset` | POST | **Platform Admin** | Any | **🔴** Reset breaker |
|
|
| `/monitoring/training-jobs` | GET | **Platform Admin** | Any | Platform metrics |
|
|
| `/monitoring/models` | GET | **Platform Admin** | Any | Platform metrics |
|
|
| `/monitoring/performance` | GET | **Platform Admin** | Any | Platform metrics |
|
|
|
|
#### WebSocket
|
|
|
|
| Endpoint | Protocol | Min Role | Min Tier | Access Control |
|
|
|----------|----------|----------|----------|----------------|
|
|
| `/ws/{tenant_id}/training` | WebSocket | **Admin** | Any | Real-time training updates |
|
|
|
|
**🔴 Critical Operations:**
|
|
- Model training (expensive ML operations)
|
|
- Model deployment (affects production forecasts)
|
|
- Circuit breaker reset (platform stability)
|
|
- Model retraining (overwrites existing models)
|
|
|
|
**💰 Premium Features:**
|
|
- **Starter Tier:**
|
|
- Basic model training (limited dataset size)
|
|
- Simple Prophet models
|
|
- Training job monitoring
|
|
- WebSocket updates
|
|
- Maximum 1 training job per day
|
|
- **Professional Tier:**
|
|
- Advanced model training (larger datasets)
|
|
- Model versioning
|
|
- Multiple concurrent training jobs
|
|
- Historical model comparison
|
|
- Maximum 5 training jobs per day
|
|
- **Enterprise Tier:**
|
|
- Custom model parameters
|
|
- Model artifact download
|
|
- Priority training queue
|
|
- Multiple model versions
|
|
- Unlimited training jobs
|
|
- Custom ML architectures
|
|
|
|
**Recommendations:**
|
|
- ✅ AVAILABLE TO ALL TIERS: Basic model training
|
|
- 🔧 ADD: Training quota per subscription tier (1/day Starter, 5/day Professional, unlimited Enterprise)
|
|
- 🔧 ADD: Dataset size limits per tier (1000 rows Starter, 10k Professional, unlimited Enterprise)
|
|
- 🔧 ADD: Queue priority based on subscription
|
|
- 🔧 ADD: Model deployment approval workflow for production
|
|
- 🔧 ADD: Artifact download only for Enterprise
|
|
- 🔧 ADD: Custom model parameters only for Enterprise
|
|
- 🔧 ADD: Rate limiting on training job creation based on tier
|
|
|
|
---
|
|
|
|
### 3.8 SUPPLIERS SERVICE
|
|
|
|
**Base Path:** `/api/v1`
|
|
**Total Endpoints:** 20+
|
|
|
|
#### Supplier Management
|
|
|
|
| Endpoint | Method | Min Role | Min Tier | Access Control |
|
|
|----------|--------|----------|----------|----------------|
|
|
| `/{tenant_id}/suppliers` | GET | **Viewer** | Any | View suppliers |
|
|
| `/{tenant_id}/suppliers` | POST | **Admin** | Any | Add supplier |
|
|
| `/{tenant_id}/suppliers/{id}` | GET | **Viewer** | Any | View supplier |
|
|
| `/{tenant_id}/suppliers/{id}` | PUT | **Admin** | Any | Update supplier |
|
|
| `/{tenant_id}/suppliers/{id}` | DELETE | **Admin** | Any | **🔴** Delete supplier |
|
|
| `/{tenant_id}/suppliers/{id}/rate` | POST | **Member** | Any | Rate supplier |
|
|
|
|
#### Purchase Orders
|
|
|
|
| Endpoint | Method | Min Role | Min Tier | Access Control |
|
|
|----------|--------|----------|----------|----------------|
|
|
| `/{tenant_id}/purchase-orders` | GET | **Viewer** | Any | View POs |
|
|
| `/{tenant_id}/purchase-orders` | POST | **Member** | Any | Create PO |
|
|
| `/{tenant_id}/purchase-orders/{id}` | GET | **Viewer** | Any | View PO |
|
|
| `/{tenant_id}/purchase-orders/{id}` | PUT | **Member** | Any | Update PO |
|
|
| `/{tenant_id}/purchase-orders/{id}/approve` | POST | **Admin** | Any | **🔴** Approve PO |
|
|
| `/{tenant_id}/purchase-orders/{id}/reject` | POST | **Admin** | Any | Reject PO |
|
|
| `/{tenant_id}/purchase-orders/{id}` | DELETE | **Admin** | Any | **🔴** Delete PO |
|
|
|
|
#### Deliveries
|
|
|
|
| Endpoint | Method | Min Role | Min Tier | Access Control |
|
|
|----------|--------|----------|----------|----------------|
|
|
| `/{tenant_id}/deliveries` | GET | **Viewer** | Any | View deliveries |
|
|
| `/{tenant_id}/deliveries` | POST | **Member** | Any | Record delivery |
|
|
| `/{tenant_id}/deliveries/{id}` | GET | **Viewer** | Any | View delivery |
|
|
| `/{tenant_id}/deliveries/{id}/receive` | POST | **Member** | Any | Receive delivery |
|
|
| `/{tenant_id}/deliveries/{id}/items` | POST | **Member** | Any | Add delivery items |
|
|
|
|
#### Analytics
|
|
|
|
| Endpoint | Method | Min Role | Min Tier | Access Control |
|
|
|----------|--------|----------|----------|----------------|
|
|
| `/{tenant_id}/analytics/performance` | GET | **Viewer** | **Professional** | **💰** Supplier performance |
|
|
| `/{tenant_id}/analytics/cost-analysis` | GET | **Admin** | **Professional** | **💰** Cost analysis |
|
|
| `/{tenant_id}/analytics/scorecards` | GET | **Admin** | **Professional** | **💰** Supplier scorecards |
|
|
| `/{tenant_id}/analytics/benchmarking` | GET | **Admin** | **Enterprise** | **💰** Benchmarking |
|
|
| `/{tenant_id}/analytics/risk-assessment` | GET | **Admin** | **Enterprise** | **💰** Risk assessment |
|
|
|
|
**🔴 Critical Operations:**
|
|
- Supplier deletion (affects historical data)
|
|
- Purchase order approval (financial commitment)
|
|
- PO deletion (affects inventory and accounting)
|
|
- Delivery confirmation (affects inventory levels)
|
|
|
|
**💰 Premium Features:**
|
|
- **Professional Tier:**
|
|
- Supplier performance analytics
|
|
- Cost analysis
|
|
- Quality scorecards
|
|
- **Enterprise Tier:**
|
|
- Multi-supplier benchmarking
|
|
- Risk assessment
|
|
- Automated reorder optimization
|
|
|
|
**Recommendations:**
|
|
- 🔧 ADD: PO approval workflow with threshold amounts
|
|
- 🔧 ADD: Prevent supplier deletion if has active POs
|
|
- 🔧 ADD: Delivery confirmation requires photo/signature
|
|
- 🔧 ADD: Cost analysis only for Admin+ (sensitive data)
|
|
- 🔧 ADD: Subscription tier checks on analytics
|
|
- 🔧 ADD: Audit log for PO approvals and modifications
|
|
|
|
---
|
|
|
|
### 3.9 RECIPES SERVICE
|
|
|
|
**Base Path:** `/api/v1`
|
|
**Total Endpoints:** 15+
|
|
|
|
#### Recipe Management
|
|
|
|
| Endpoint | Method | Min Role | Min Tier | Access Control |
|
|
|----------|--------|----------|----------|----------------|
|
|
| `/{tenant_id}/recipes` | GET | **Viewer** | Any | View recipes |
|
|
| `/{tenant_id}/recipes` | POST | **Member** | Any | Create recipe |
|
|
| `/{tenant_id}/recipes/{id}` | GET | **Viewer** | Any | View recipe |
|
|
| `/{tenant_id}/recipes/{id}` | PUT | **Member** | Any | Update recipe |
|
|
| `/{tenant_id}/recipes/{id}` | DELETE | **Admin** | Any | **🔴** Delete recipe |
|
|
|
|
#### Recipe Operations
|
|
|
|
| Endpoint | Method | Min Role | Min Tier | Access Control |
|
|
|----------|--------|----------|----------|----------------|
|
|
| `/{tenant_id}/recipes/validate` | POST | **Member** | Any | Validate recipe |
|
|
| `/{tenant_id}/recipes/duplicate` | POST | **Member** | Any | Duplicate recipe |
|
|
| `/{tenant_id}/recipes/{id}/cost` | GET | **Admin** | Any | **💰** Calculate cost (sensitive) |
|
|
| `/{tenant_id}/recipes/{id}/availability` | GET | **Viewer** | Any | Check ingredient availability |
|
|
| `/{tenant_id}/recipes/{id}/scaling` | GET | **Viewer** | **Professional** | **💰** Scaling options |
|
|
|
|
#### Quality Configuration
|
|
|
|
| Endpoint | Method | Min Role | Min Tier | Access Control |
|
|
|----------|--------|----------|----------|----------------|
|
|
| `/{tenant_id}/recipes/{id}/quality-config` | GET | **Viewer** | Any | View quality config |
|
|
| `/{tenant_id}/recipes/{id}/quality-config` | POST | **Admin** | Any | Create quality config |
|
|
| `/{tenant_id}/recipes/{id}/quality-config` | PUT | **Admin** | Any | Update quality config |
|
|
| `/{tenant_id}/recipes/{id}/quality-config` | DELETE | **Admin** | Any | Delete quality config |
|
|
|
|
**🔴 Critical Operations:**
|
|
- Recipe deletion (affects production)
|
|
- Quality config changes (affects batch quality)
|
|
- Cost calculation access (sensitive financial data)
|
|
|
|
**💰 Premium Features:**
|
|
- **Professional Tier:**
|
|
- Advanced recipe scaling
|
|
- Cost optimization recommendations
|
|
- Ingredient substitution suggestions
|
|
- **Enterprise Tier:**
|
|
- Multi-location recipe management
|
|
- Recipe version control
|
|
- Batch costing analysis
|
|
|
|
**Recommendations:**
|
|
- 🔧 ADD: Prevent deletion of recipes in active production
|
|
- 🔧 ADD: Recipe costing only for Admin+ (sensitive)
|
|
- 🔧 ADD: Recipe versioning for audit trail
|
|
- 🔧 ADD: Quality config changes require validation
|
|
- 🔧 ADD: Subscription tier check on scaling features
|
|
|
|
---
|
|
|
|
### 3.10 ORDERS SERVICE
|
|
|
|
**Base Path:** `/api/v1`
|
|
**Total Endpoints:** 12+
|
|
|
|
#### Order Management
|
|
|
|
| Endpoint | Method | Min Role | Min Tier | Access Control |
|
|
|----------|--------|----------|----------|----------------|
|
|
| `/{tenant_id}/orders` | GET | **Viewer** | Any | View orders |
|
|
| `/{tenant_id}/orders` | POST | **Member** | Any | Create order |
|
|
| `/{tenant_id}/orders/{id}` | GET | **Viewer** | Any | View order |
|
|
| `/{tenant_id}/orders/{id}` | PUT | **Member** | Any | Update order |
|
|
| `/{tenant_id}/orders/{id}/status` | PUT | **Member** | Any | Update order status |
|
|
| `/{tenant_id}/orders/{id}/cancel` | POST | **Admin** | Any | **🔴** Cancel order |
|
|
| `/{tenant_id}/orders/{id}` | DELETE | **Admin** | Any | **🔴** Delete order |
|
|
|
|
#### Customer Management
|
|
|
|
| Endpoint | Method | Min Role | Min Tier | Access Control |
|
|
|----------|--------|----------|----------|----------------|
|
|
| `/{tenant_id}/customers` | GET | **Viewer** | Any | View customers |
|
|
| `/{tenant_id}/customers` | POST | **Member** | Any | Add customer |
|
|
| `/{tenant_id}/customers/{id}` | GET | **Viewer** | Any | View customer |
|
|
| `/{tenant_id}/customers/{id}` | PUT | **Member** | Any | Update customer |
|
|
| `/{tenant_id}/customers/{id}` | DELETE | **Admin** | Any | **🔴** Delete customer |
|
|
|
|
#### Procurement Operations
|
|
|
|
| Endpoint | Method | Min Role | Min Tier | Access Control |
|
|
|----------|--------|----------|----------|----------------|
|
|
| `/{tenant_id}/procurement/requirements` | GET | **Admin** | **Professional** | **💰** Procurement planning |
|
|
| `/{tenant_id}/procurement/schedule` | POST | **Admin** | **Professional** | **💰** Schedule procurement |
|
|
| `/test/procurement-scheduler` | POST | **Platform Admin** | Any | **🔴** Manual scheduler test |
|
|
|
|
**🔴 Critical Operations:**
|
|
- Order cancellation (affects production and customer)
|
|
- Order deletion (affects reporting and history)
|
|
- Customer deletion (GDPR compliance required)
|
|
- Procurement scheduling (affects inventory)
|
|
|
|
**💰 Premium Features:**
|
|
- **Professional Tier:**
|
|
- Automated procurement planning
|
|
- Demand-based scheduling
|
|
- Procurement optimization
|
|
- **Enterprise Tier:**
|
|
- Multi-location order routing
|
|
- Advanced customer segmentation
|
|
- Priority order handling
|
|
|
|
**Recommendations:**
|
|
- 🔧 ADD: Order cancellation requires reason/notes
|
|
- 🔧 ADD: Customer deletion with GDPR-compliant data export
|
|
- 🔧 ADD: Soft delete for orders (audit trail)
|
|
- 🔧 ADD: Procurement scheduling only for Professional+
|
|
- 🔧 ADD: Order approval workflow for large orders
|
|
|
|
---
|
|
|
|
### 3.11 POS SERVICE
|
|
|
|
**Base Path:** `/api/v1`
|
|
**Total Endpoints:** 20+
|
|
|
|
#### Configuration
|
|
|
|
| Endpoint | Method | Min Role | Min Tier | Access Control |
|
|
|----------|--------|----------|----------|----------------|
|
|
| `/{tenant_id}/pos/configurations` | GET | **Admin** | Any | View POS configs |
|
|
| `/{tenant_id}/pos/configurations` | POST | **Admin** | Any | Add POS config |
|
|
| `/{tenant_id}/pos/configurations/{id}` | GET | **Admin** | Any | View config |
|
|
| `/{tenant_id}/pos/configurations/{id}` | PUT | **Admin** | Any | Update config |
|
|
| `/{tenant_id}/pos/configurations/{id}` | DELETE | **Admin** | Any | **🔴** Delete config |
|
|
| `/{tenant_id}/pos/configurations/active` | GET | **Admin** | Any | View active configs |
|
|
|
|
#### Transactions
|
|
|
|
| Endpoint | Method | Min Role | Min Tier | Access Control |
|
|
|----------|--------|----------|----------|----------------|
|
|
| `/{tenant_id}/pos/transactions` | GET | **Viewer** | Any | View transactions |
|
|
| `/{tenant_id}/pos/transactions/{id}` | GET | **Viewer** | Any | View transaction |
|
|
|
|
#### Operations
|
|
|
|
| Endpoint | Method | Min Role | Min Tier | Access Control |
|
|
|----------|--------|----------|----------|----------------|
|
|
| `/{tenant_id}/pos/webhook` | POST | Service | Any | **Internal** Webhook handler |
|
|
| `/{tenant_id}/pos/sync-status` | GET | **Admin** | Any | View sync status |
|
|
| `/{tenant_id}/pos/products` | GET | **Viewer** | Any | View POS products |
|
|
| `/{tenant_id}/pos/sync/full` | POST | **Admin** | Any | **🔴** Full sync |
|
|
| `/{tenant_id}/pos/sync/incremental` | POST | **Admin** | Any | Incremental sync |
|
|
| `/{tenant_id}/pos/test-connection` | POST | **Admin** | Any | Test connection |
|
|
| `/{tenant_id}/pos/mapping/status` | GET | **Admin** | Any | View mapping status |
|
|
|
|
#### Analytics
|
|
|
|
| Endpoint | Method | Min Role | Min Tier | Access Control |
|
|
|----------|--------|----------|----------|----------------|
|
|
| `/{tenant_id}/pos/sales-summary` | GET | **Viewer** | Any | Sales summary |
|
|
| `/{tenant_id}/pos/sync-health` | GET | **Admin** | Any | Sync health metrics |
|
|
|
|
**🔴 Critical Operations:**
|
|
- POS configuration changes (affects sales recording)
|
|
- Full sync trigger (resource intensive)
|
|
- Configuration deletion (breaks integration)
|
|
|
|
**💰 Premium Features:**
|
|
- **Professional Tier:**
|
|
- Multi-POS support
|
|
- Advanced sync options
|
|
- Transaction analytics
|
|
- **Enterprise Tier:**
|
|
- Custom webhooks
|
|
- Real-time sync
|
|
- Multi-location POS management
|
|
|
|
**Recommendations:**
|
|
- 🔧 ADD: POS config changes require testing first
|
|
- 🔧 ADD: Full sync rate limiting (expensive operation)
|
|
- 🔧 ADD: Webhook signature verification
|
|
- 🔧 ADD: Transaction data retention policies
|
|
- 🔧 ADD: Configuration backup before deletion
|
|
|
|
---
|
|
|
|
### 3.12 NOTIFICATION SERVICE
|
|
|
|
**Base Path:** `/api/v1`
|
|
**Total Endpoints:** 10+
|
|
|
|
#### Notification Management
|
|
|
|
| Endpoint | Method | Min Role | Min Tier | Access Control |
|
|
|----------|--------|----------|----------|----------------|
|
|
| `/{tenant_id}/notifications` | GET | **Viewer** | Any | Own notifications |
|
|
| `/{tenant_id}/notifications/{id}` | GET | **Viewer** | Any | View notification |
|
|
| `/{tenant_id}/notifications/{id}/read` | PATCH | **Viewer** | Any | Mark as read |
|
|
| `/{tenant_id}/notifications/{id}/unread` | PATCH | **Viewer** | Any | Mark as unread |
|
|
| `/{tenant_id}/notifications/preferences` | GET | **Viewer** | Any | Get preferences |
|
|
| `/{tenant_id}/notifications/preferences` | PUT | **Viewer** | Any | Update preferences |
|
|
|
|
#### Operations
|
|
|
|
| Endpoint | Method | Min Role | Min Tier | Access Control |
|
|
|----------|--------|----------|----------|----------------|
|
|
| `/{tenant_id}/notifications/send` | POST | Service | Any | **Internal** Send notification |
|
|
| `/{tenant_id}/notifications/broadcast` | POST | **Admin** | Any | **🔴** Broadcast to team |
|
|
|
|
#### Analytics
|
|
|
|
| Endpoint | Method | Min Role | Min Tier | Access Control |
|
|
|----------|--------|----------|----------|----------------|
|
|
| `/{tenant_id}/notifications/analytics` | GET | **Admin** | **Professional** | **💰** Notification metrics |
|
|
| `/sse-metrics` | GET | **Platform Admin** | Any | **🔴** Platform SSE metrics |
|
|
|
|
**🔴 Critical Operations:**
|
|
- Broadcast notifications (all team members)
|
|
- Notification preferences (affects alert delivery)
|
|
- SSE metrics (platform monitoring)
|
|
|
|
**💰 Premium Features:**
|
|
- **Professional Tier:**
|
|
- WhatsApp notifications
|
|
- Custom notification channels
|
|
- Notification analytics
|
|
- **Enterprise Tier:**
|
|
- SMS notifications
|
|
- Webhook notifications
|
|
- Priority delivery
|
|
|
|
**Recommendations:**
|
|
- 🔧 ADD: Users can only access their own notifications
|
|
- 🔧 ADD: Broadcast requires Admin role
|
|
- 🔧 ADD: Rate limiting on broadcast (abuse prevention)
|
|
- 🔧 ADD: Notification analytics only for Professional+
|
|
- 🔧 ADD: Preference validation (at least one channel enabled)
|
|
|
|
---
|
|
|
|
### 3.13 ALERT PROCESSOR SERVICE
|
|
|
|
**Total Endpoints:** 0 (Background Worker)
|
|
|
|
**Access Control:** This service does not expose HTTP endpoints. It's a background worker that:
|
|
- Consumes from RabbitMQ queues
|
|
- Processes alerts and recommendations
|
|
- Routes to notification service based on severity
|
|
- Stores alerts in database
|
|
|
|
**Security Considerations:**
|
|
- 🔧 Service-to-service authentication required
|
|
- 🔧 RabbitMQ queue access control
|
|
- 🔧 Alert classification validation
|
|
- 🔧 Rate limiting on alert generation
|
|
|
|
**Alert Routing Rules:**
|
|
- **Urgent:** All channels (WhatsApp, Email, Push, Dashboard)
|
|
- **High:** WhatsApp + Email (daytime), Email only (night)
|
|
- **Medium:** Email (business hours only)
|
|
- **Low:** Dashboard only
|
|
- **Recommendations:** Email (business hours) for medium/high severity
|
|
|
|
---
|
|
|
|
### 3.14 DEMO SESSION SERVICE
|
|
|
|
**Base Path:** `/api/v1`
|
|
**Total Endpoints:** 8+
|
|
|
|
#### Demo Session Management
|
|
|
|
| Endpoint | Method | Min Role | Min Tier | Access Control |
|
|
|----------|--------|----------|----------|----------------|
|
|
| `/demo/sessions` | POST | Public | Any | Create demo session |
|
|
| `/demo/sessions/{id}` | GET | Public | Any | View demo session |
|
|
| `/demo/sessions/{id}/extend` | POST | Public | Any | Extend demo session |
|
|
| `/demo/sessions/{id}/cleanup` | POST | Service | Any | **Internal** Cleanup session |
|
|
|
|
#### Demo Account Management
|
|
|
|
| Endpoint | Method | Min Role | Min Tier | Access Control |
|
|
|----------|--------|----------|----------|----------------|
|
|
| `/demo/accounts` | POST | Public | Any | Create demo account |
|
|
| `/demo/accounts/{id}` | GET | Public | Any | View demo account |
|
|
| `/demo/accounts/{id}/reset` | POST | Public | Any | Reset demo data |
|
|
|
|
**🔴 Critical Operations:**
|
|
- Demo session cleanup (data deletion)
|
|
- Demo data seeding (resource intensive)
|
|
|
|
**Security Considerations:**
|
|
- 🔧 Rate limiting on demo creation (abuse prevention)
|
|
- 🔧 Automatic cleanup after expiration
|
|
- 🔧 Demo data isolation from production
|
|
- 🔧 Limited feature access in demo mode
|
|
- 🔧 No sensitive operations allowed in demo
|
|
|
|
**Recommendations:**
|
|
- ✅ IMPLEMENTED: Demo session expiration
|
|
- 🔧 ADD: CAPTCHA on demo creation
|
|
- 🔧 ADD: IP-based rate limiting (max 5 demos per IP per day)
|
|
- 🔧 ADD: Demo sessions cannot access paid features
|
|
- 🔧 ADD: Clear "DEMO MODE" indicators in UI
|
|
|
|
---
|
|
|
|
### 3.15 EXTERNAL SERVICE
|
|
|
|
**Base Path:** `/api/v1`
|
|
**Total Endpoints:** 10+
|
|
|
|
#### Weather Data
|
|
|
|
| Endpoint | Method | Min Role | Min Tier | Access Control |
|
|
|----------|--------|----------|----------|----------------|
|
|
| `/{tenant_id}/weather` | GET | **Viewer** | **Professional** | **💰** Weather data |
|
|
| `/{tenant_id}/weather/forecast` | GET | **Viewer** | **Professional** | **💰** Weather forecast |
|
|
| `/{tenant_id}/weather/historical` | GET | **Viewer** | **Enterprise** | **💰** Historical weather |
|
|
|
|
#### Traffic Data
|
|
|
|
| Endpoint | Method | Min Role | Min Tier | Access Control |
|
|
|----------|--------|----------|----------|----------------|
|
|
| `/{tenant_id}/traffic` | GET | **Viewer** | **Professional** | **💰** Traffic data |
|
|
| `/{tenant_id}/traffic/realtime` | GET | **Viewer** | **Professional** | **💰** Real-time traffic |
|
|
| `/{tenant_id}/traffic/predictions` | GET | **Viewer** | **Enterprise** | **💰** Traffic predictions |
|
|
|
|
#### City Operations
|
|
|
|
| Endpoint | Method | Min Role | Min Tier | Access Control |
|
|
|----------|--------|----------|----------|----------------|
|
|
| `/city/{city}/weather` | GET | **Viewer** | **Professional** | **💰** City weather |
|
|
| `/city/{city}/traffic` | GET | **Viewer** | **Professional** | **💰** City traffic |
|
|
| `/city/{city}/events` | GET | **Viewer** | **Enterprise** | **💰** City events |
|
|
|
|
**🔴 Critical Operations:**
|
|
- External API rate limit management
|
|
- Data collection scheduling
|
|
- API key management
|
|
|
|
**💰 Premium Features:**
|
|
- **Professional Tier:**
|
|
- Basic weather data
|
|
- Real-time traffic data
|
|
- Current day forecasts
|
|
- **Enterprise Tier:**
|
|
- Historical weather data
|
|
- Traffic predictions
|
|
- City events calendar
|
|
- Custom data collection schedules
|
|
|
|
**Recommendations:**
|
|
- ✅ REQUIRES: Subscription tier = Professional minimum
|
|
- 🔧 ADD: API quota limits per subscription tier
|
|
- 🔧 ADD: Rate limiting based on subscription
|
|
- 🔧 ADD: Historical data only for Enterprise
|
|
- 🔧 ADD: Cache external API responses
|
|
|
|
---
|
|
|
|
## 4. Implementation Recommendations
|
|
|
|
### 4.1 Priority Matrix
|
|
|
|
**CRITICAL (Implement Immediately):**
|
|
|
|
1. **Owner-Only Operations**
|
|
- Tenant deletion/deactivation
|
|
- Subscription changes and cancellation
|
|
- Billing information access
|
|
|
|
2. **Admin Operations**
|
|
- User deletion across all services
|
|
- Financial data access (costs, pricing)
|
|
- POS configuration changes
|
|
- Production schedule modifications
|
|
- Supplier/customer deletion
|
|
|
|
3. **Service-to-Service Auth**
|
|
- Internal API authentication
|
|
- Webhook signature verification
|
|
- RabbitMQ queue access control
|
|
|
|
**HIGH PRIORITY (Implement Soon):**
|
|
|
|
1. **Subscription Tier Enforcement**
|
|
- Forecast horizon limits (7 days Starter, 30+ Professional, unlimited Enterprise)
|
|
- Training job quotas (1/day Starter, 5/day Professional, unlimited Enterprise)
|
|
- Dataset size limits for ML (1k rows Starter, 10k Professional, unlimited Enterprise)
|
|
- Advanced analytics (Professional+)
|
|
- Scenario modeling (Enterprise only)
|
|
- Historical data limits (7 days Starter, 90 days Professional, unlimited Enterprise)
|
|
- Multi-location support (1 Starter, 2 Professional, unlimited Enterprise)
|
|
|
|
2. **Audit Logging**
|
|
- All deletion operations
|
|
- Subscription changes
|
|
- Role modifications
|
|
- Financial operations
|
|
|
|
3. **Rate Limiting & Quotas**
|
|
- ML training jobs (per tier: 1/day, 5/day, unlimited)
|
|
- Forecast generation (per tier: 10/day, 100/day, unlimited)
|
|
- Bulk imports
|
|
- POS sync operations
|
|
- Dataset size limits for training
|
|
|
|
**MEDIUM PRIORITY (Next Sprint):**
|
|
|
|
1. **Fine-Grained Permissions**
|
|
- Resource-level access control
|
|
- Custom role permissions
|
|
- Department-based access
|
|
|
|
2. **Approval Workflows**
|
|
- Large purchase orders
|
|
- Production schedule changes
|
|
- Model deployment
|
|
|
|
3. **Data Retention**
|
|
- Soft delete for critical records
|
|
- Audit trail preservation
|
|
- GDPR compliance
|
|
|
|
### 4.2 Implementation Steps
|
|
|
|
#### Step 1: Add Missing Role Decorators
|
|
|
|
```python
|
|
# Example for sales endpoint
|
|
@router.delete("/{tenant_id}/sales/{sale_id}")
|
|
@require_user_role(['admin', 'owner']) # ADD THIS
|
|
async def delete_sale(
|
|
tenant_id: str,
|
|
sale_id: str,
|
|
current_user: Dict = Depends(get_current_user_dep)
|
|
):
|
|
# Existing logic...
|
|
```
|
|
|
|
#### Step 2: Add Subscription Tier Checks
|
|
|
|
```python
|
|
# Example for forecasting endpoint with quota checking
|
|
@router.post("/{tenant_id}/forecasts/generate")
|
|
@require_user_role(['admin', 'owner'])
|
|
async def generate_forecast(
|
|
tenant_id: str,
|
|
horizon_days: int, # Forecast horizon
|
|
current_user: Dict = Depends(get_current_user_dep)
|
|
):
|
|
# Check tier-based limits
|
|
tier = current_user.get('subscription_tier', 'starter')
|
|
max_horizon = {
|
|
'starter': 7,
|
|
'professional': 90,
|
|
'enterprise': 365
|
|
}
|
|
|
|
if horizon_days > max_horizon.get(tier, 7):
|
|
raise HTTPException(
|
|
status_code=402,
|
|
detail=f"Forecast horizon limited to {max_horizon[tier]} days for {tier} tier"
|
|
)
|
|
|
|
# Check daily quota
|
|
daily_quota = {'starter': 10, 'professional': 100, 'enterprise': None}
|
|
if not await check_quota(tenant_id, 'forecasts', daily_quota[tier]):
|
|
raise HTTPException(
|
|
status_code=429,
|
|
detail=f"Daily forecast quota exceeded for {tier} tier"
|
|
)
|
|
|
|
# Existing logic...
|
|
```
|
|
|
|
#### Step 3: Add Audit Logging
|
|
|
|
```python
|
|
# Example audit log utility
|
|
from shared.audit import log_audit_event
|
|
|
|
@router.delete("/{tenant_id}/customers/{customer_id}")
|
|
@require_user_role(['admin', 'owner'])
|
|
async def delete_customer(
|
|
tenant_id: str,
|
|
customer_id: str,
|
|
current_user: Dict = Depends(get_current_user_dep)
|
|
):
|
|
# Existing logic...
|
|
|
|
# ADD AUDIT LOG
|
|
await log_audit_event(
|
|
tenant_id=tenant_id,
|
|
user_id=current_user["user_id"],
|
|
action="customer.delete",
|
|
resource_type="customer",
|
|
resource_id=customer_id,
|
|
severity="high"
|
|
)
|
|
```
|
|
|
|
#### Step 4: Implement Rate Limiting
|
|
|
|
```python
|
|
# Example rate limiting for ML operations with tier-based quotas
|
|
from shared.rate_limit import check_quota
|
|
from shared.ml_limits import check_dataset_size_limit
|
|
|
|
@router.post("/{tenant_id}/training-jobs")
|
|
@require_user_role(['admin', 'owner'])
|
|
async def create_training_job(
|
|
tenant_id: str,
|
|
dataset_rows: int,
|
|
current_user: Dict = Depends(get_current_user_dep)
|
|
):
|
|
tier = current_user.get('subscription_tier', 'starter')
|
|
|
|
# Check daily quota
|
|
daily_limits = {'starter': 1, 'professional': 5, 'enterprise': None}
|
|
if not await check_quota(tenant_id, 'training_jobs', daily_limits[tier], period=86400):
|
|
raise HTTPException(
|
|
status_code=429,
|
|
detail=f"Daily training job limit reached for {tier} tier ({daily_limits[tier]}/day)"
|
|
)
|
|
|
|
# Check dataset size limit
|
|
dataset_limits = {'starter': 1000, 'professional': 10000, 'enterprise': None}
|
|
if dataset_limits[tier] and dataset_rows > dataset_limits[tier]:
|
|
raise HTTPException(
|
|
status_code=402,
|
|
detail=f"Dataset size limited to {dataset_limits[tier]} rows for {tier} tier"
|
|
)
|
|
|
|
# Existing logic...
|
|
```
|
|
|
|
### 4.3 Security Checklist
|
|
|
|
**Authentication & Authorization:**
|
|
- [ ] JWT validation on all authenticated endpoints
|
|
- [ ] Tenant isolation verification
|
|
- [ ] Role-based access control on sensitive operations
|
|
- [ ] Subscription tier enforcement on premium features
|
|
- [ ] Service-to-service authentication
|
|
|
|
**Data Protection:**
|
|
- [ ] Soft delete for audit-critical records
|
|
- [ ] Audit logging for all destructive operations
|
|
- [ ] GDPR-compliant data deletion
|
|
- [ ] Financial data access restricted to Admin+
|
|
- [ ] PII access logging
|
|
|
|
**Rate Limiting & Abuse Prevention:**
|
|
- [ ] ML/Training job rate limits
|
|
- [ ] Bulk operation throttling
|
|
- [ ] Demo session creation limits
|
|
- [ ] Login attempt limiting
|
|
- [ ] API quota enforcement per subscription tier
|
|
|
|
**Compliance:**
|
|
- [ ] GDPR data export functionality
|
|
- [ ] Food safety record retention (cannot delete)
|
|
- [ ] Financial record audit trail
|
|
- [ ] User consent tracking
|
|
- [ ] Data breach notification system
|
|
|
|
### 4.4 Testing Strategy
|
|
|
|
**Unit Tests:**
|
|
```python
|
|
# Test role enforcement
|
|
def test_delete_requires_admin_role():
|
|
response = client.delete(
|
|
"/api/v1/tenant123/sales/sale456",
|
|
headers={"Authorization": f"Bearer {member_token}"}
|
|
)
|
|
assert response.status_code == 403
|
|
assert "insufficient_permissions" in response.json()["detail"]["error"]
|
|
|
|
# Test subscription tier enforcement with horizon limits
|
|
def test_forecasting_horizon_limit_starter():
|
|
response = client.post(
|
|
"/api/v1/tenant123/forecasts/generate",
|
|
json={"horizon_days": 30}, # Exceeds 7-day limit for Starter
|
|
headers={"Authorization": f"Bearer {starter_user_token}"}
|
|
)
|
|
assert response.status_code == 402 # Payment Required
|
|
assert "limited to 7 days" in response.json()["detail"]
|
|
|
|
# Test training job quota
|
|
def test_training_job_daily_quota_starter():
|
|
# First training job succeeds
|
|
response1 = client.post(
|
|
"/api/v1/tenant123/training-jobs",
|
|
json={"dataset_rows": 500},
|
|
headers={"Authorization": f"Bearer {starter_admin_token}"}
|
|
)
|
|
assert response1.status_code == 200
|
|
|
|
# Second training job on same day fails (1/day limit for Starter)
|
|
response2 = client.post(
|
|
"/api/v1/tenant123/training-jobs",
|
|
json={"dataset_rows": 500},
|
|
headers={"Authorization": f"Bearer {starter_admin_token}"}
|
|
)
|
|
assert response2.status_code == 429 # Too Many Requests
|
|
assert "Daily training job limit reached" in response2.json()["detail"]
|
|
|
|
# Test dataset size limit
|
|
def test_training_dataset_size_limit():
|
|
response = client.post(
|
|
"/api/v1/tenant123/training-jobs",
|
|
json={"dataset_rows": 5000}, # Exceeds 1000-row limit for Starter
|
|
headers={"Authorization": f"Bearer {starter_admin_token}"}
|
|
)
|
|
assert response.status_code == 402 # Payment Required
|
|
assert "Dataset size limited to 1000 rows" in response.json()["detail"]
|
|
```
|
|
|
|
**Integration Tests:**
|
|
```python
|
|
# Test tenant isolation
|
|
def test_user_cannot_access_other_tenant():
|
|
# User belongs to tenant123
|
|
response = client.get(
|
|
"/api/v1/tenant456/sales", # Trying to access tenant456
|
|
headers={"Authorization": f"Bearer {user_token}"}
|
|
)
|
|
assert response.status_code == 403
|
|
```
|
|
|
|
**Security Tests:**
|
|
```python
|
|
# Test rate limiting
|
|
def test_training_job_rate_limit():
|
|
for i in range(6):
|
|
response = client.post(
|
|
"/api/v1/tenant123/training-jobs",
|
|
headers={"Authorization": f"Bearer {admin_token}"}
|
|
)
|
|
assert response.status_code == 429 # Too Many Requests
|
|
```
|
|
|
|
---
|
|
|
|
## 5. Access Control Matrix Summary
|
|
|
|
### By Role
|
|
|
|
| Role | Read | Create | Update | Delete | Admin Functions | Billing |
|
|
|------|------|--------|--------|--------|----------------|---------|
|
|
| **Viewer** | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ |
|
|
| **Member** | ✓ | ✓ | ✓ | ✗ | ✗ | ✗ |
|
|
| **Admin** | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ |
|
|
| **Owner** | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
|
|
|
|
### By Subscription Tier
|
|
|
|
| Feature Category | Starter | Professional | Enterprise |
|
|
|------------------|---------|--------------|------------|
|
|
| Basic Operations | ✓ | ✓ | ✓ |
|
|
| ML Forecasting (Basic) | ✓ (7-day) | ✓ (30+ day) | ✓ (Unlimited) |
|
|
| Production Optimization (Basic) | ✓ | ✓ (Advanced) | ✓ (AI-powered) |
|
|
| Model Training (Basic) | ✓ (1/day) | ✓ (5/day) | ✓ (Unlimited) |
|
|
| Advanced Analytics | ✗ | ✓ | ✓ |
|
|
| Scenario Modeling | ✗ | ✗ | ✓ |
|
|
| Multi-location | 1 | 2 | Unlimited |
|
|
| API Access | ✗ | ✗ | ✓ |
|
|
| Custom ML Parameters | ✗ | ✗ | ✓ |
|
|
|
|
### Critical Operations (Owner/Admin Only)
|
|
|
|
**Owner Only:**
|
|
- Tenant deletion/deactivation
|
|
- Subscription upgrade/downgrade/cancel
|
|
- Billing information access
|
|
- Final owner cannot be removed
|
|
|
|
**Admin+ (Admin or Owner):**
|
|
- User management (invite, remove, role changes)
|
|
- Delete operations (sales, inventory, recipes, etc.)
|
|
- Financial data access (costs, margins, pricing)
|
|
- System configuration (POS, integrations)
|
|
- Production schedule modifications
|
|
- Purchase order approvals
|
|
|
|
**Member:**
|
|
- Create and update operational data
|
|
- View most reports and dashboards
|
|
- Basic CRUD operations
|
|
|
|
**Viewer:**
|
|
- Read-only access to operational data
|
|
- View dashboards and reports (non-financial)
|
|
- No write permissions
|
|
|
|
---
|
|
|
|
## 6. Next Steps
|
|
|
|
### Phase 1: Critical Security (Week 1-2)
|
|
1. Add role decorators to all deletion endpoints
|
|
2. Implement owner-only checks for billing/subscription
|
|
3. Add service-to-service authentication
|
|
4. Implement audit logging for critical operations
|
|
|
|
### Phase 2: Premium Feature Gating (Week 3-4)
|
|
1. Implement forecast horizon limits per tier (7/30/unlimited days)
|
|
2. Implement training job quotas per tier (1/5/unlimited per day)
|
|
3. Implement dataset size limits for ML training (1k/10k/unlimited rows)
|
|
4. Add tier checks to advanced analytics (Professional+)
|
|
5. Add tier checks to scenario modeling (Enterprise only)
|
|
6. Implement historical data limits (7/90/unlimited days)
|
|
7. Implement multi-location limits (1/2/unlimited)
|
|
8. Implement usage quota tracking and enforcement
|
|
|
|
### Phase 3: Rate Limiting & Abuse Prevention (Week 5-6)
|
|
1. ML training job rate limits
|
|
2. Bulk operation throttling
|
|
3. Demo session creation limits
|
|
4. Login attempt limiting
|
|
|
|
### Phase 4: Compliance & Audit (Week 7-8)
|
|
1. GDPR data export functionality
|
|
2. Audit trail for all destructive operations
|
|
3. Data retention policies
|
|
4. Compliance reporting
|
|
|
|
---
|
|
|
|
## 7. Appendix
|
|
|
|
### A. Role Hierarchy Code Reference
|
|
|
|
File: [`shared/auth/access_control.py`](shared/auth/access_control.py:27-51)
|
|
|
|
```python
|
|
class UserRole(Enum):
|
|
VIEWER = "viewer"
|
|
MEMBER = "member"
|
|
ADMIN = "admin"
|
|
OWNER = "owner"
|
|
|
|
ROLE_HIERARCHY = {
|
|
UserRole.VIEWER: 1,
|
|
UserRole.MEMBER: 2,
|
|
UserRole.ADMIN: 3,
|
|
UserRole.OWNER: 4,
|
|
}
|
|
```
|
|
|
|
### B. Subscription Tier Code Reference
|
|
|
|
File: [`shared/auth/access_control.py`](shared/auth/access_control.py:17-43)
|
|
|
|
```python
|
|
class SubscriptionTier(Enum):
|
|
STARTER = "starter"
|
|
PROFESSIONAL = "professional"
|
|
ENTERPRISE = "enterprise"
|
|
|
|
TIER_HIERARCHY = {
|
|
SubscriptionTier.STARTER: 1,
|
|
SubscriptionTier.PROFESSIONAL: 2,
|
|
SubscriptionTier.ENTERPRISE: 3,
|
|
}
|
|
```
|
|
|
|
### C. Tenant Member Model Reference
|
|
|
|
File: [`services/tenant/app/models/tenants.py`](services/tenant/app/models/tenants.py:72-98)
|
|
|
|
```python
|
|
class TenantMember(Base):
|
|
tenant_id = Column(UUID(as_uuid=True), ForeignKey("tenants.id"))
|
|
user_id = Column(UUID(as_uuid=True), nullable=False)
|
|
role = Column(String(50), default="member") # owner, admin, member, viewer
|
|
is_active = Column(Boolean, default=True)
|
|
```
|
|
|
|
### D. Decorator Usage Examples
|
|
|
|
**Role-Based:**
|
|
```python
|
|
@router.delete("/{tenant_id}/resource/{id}")
|
|
@require_user_role(['admin', 'owner'])
|
|
async def delete_resource(...):
|
|
pass
|
|
```
|
|
|
|
**Tier-Based:**
|
|
```python
|
|
@router.get("/{tenant_id}/analytics/advanced")
|
|
@require_subscription_tier(['professional', 'enterprise'])
|
|
async def get_advanced_analytics(...):
|
|
pass
|
|
```
|
|
|
|
**Combined:**
|
|
```python
|
|
@router.post("/{tenant_id}/ml/custom-model")
|
|
@require_tier_and_role(['enterprise'], ['admin', 'owner'])
|
|
async def train_custom_model(...):
|
|
pass
|
|
```
|
|
|
|
---
|
|
|
|
## Document Control
|
|
|
|
**Version:** 1.0
|
|
**Status:** Final
|
|
**Last Updated:** 2025-10-12
|
|
**Next Review:** After Phase 1 implementation
|
|
**Owner:** Security & Platform Team
|
|
|
|
---
|
|
|
|
**End of Report**
|