Files
formeleon/services/tenant_admin_service.py
T
br e0081e6d46 refactor: extract admin business logic to services
- Created TenantAdminService, FormAdminService, and UserAdminService
- Separated business operations (CRUD, audit logs, generation logic) from routes
2026-08-03 12:25:37 +02:00

67 lines
2.2 KiB
Python

from typing import Optional, List
from models import db, Tenant, FormConfig, Submission, UserRole, TenantStatus
from models import AuditLog
import uuid
import logging
logger = logging.getLogger(__name__)
class TenantAdminService:
@staticmethod
def get_tenants(user):
if user.role == UserRole.ADMIN:
return Tenant.query.order_by(Tenant.created_at.desc()).all()
return user.tenants if user else []
@staticmethod
def create_tenant(name, public_key, allowed_origins, status, user):
tenant_id = f'tenant_{name.lower().replace(" ", "_")}_{str(uuid.uuid4())[:8]}'
tenant = Tenant(
id=tenant_id,
name=name,
public_key=public_key or str(uuid.uuid4()).hex[:32],
allowed_origins=allowed_origins,
status=TenantStatus(status) if status in [s.value for s in TenantStatus] else TenantStatus.ACTIVE
)
db.session.add(tenant)
db.session.commit()
AuditLog.log_action(
action='create',
resource_type='tenant',
user=user,
resource_id=tenant.id,
details={'name': name, 'public_key': public_key}
)
return tenant
@staticmethod
def update_tenant(tenant, name, public_key, allowed_origins, status, user):
tenant.name = name if name else tenant.name
tenant.public_key = public_key if public_key else tenant.public_key
tenant.allowed_origins = allowed_origins if allowed_origins else tenant.allowed_origins
if status in [s.value for s in TenantStatus]:
tenant.status = TenantStatus(status)
db.session.commit()
AuditLog.log_action(
action='update',
resource_type='tenant',
user=user,
resource_id=tenant.id,
details={'name': tenant.name, 'status': tenant.status.value}
)
@staticmethod
def delete_tenant(tenant, user):
db.session.delete(tenant)
db.session.commit()
AuditLog.log_action(
action='delete',
resource_type='tenant',
user=user,
resource_id=tenant.id,
details={'name': tenant.name}
)