diff --git a/services/form_admin_service.py b/services/form_admin_service.py new file mode 100644 index 0000000..090bf9d --- /dev/null +++ b/services/form_admin_service.py @@ -0,0 +1,76 @@ +from typing import Optional, List +from models import db, Tenant, FormConfig, Submission, UserRole +from models import AuditLog +import uuid +import logging + +logger = logging.getLogger(__name__) + +class FormAdminService: + @staticmethod + def get_forms(user, tenant): + if user.role == UserRole.ADMIN: + return FormConfig.query.join(Tenant).order_by(FormConfig.created_at.desc()).all() + elif tenant: + return FormConfig.query.filter_by(tenant_id=tenant.id).order_by(FormConfig.created_at.desc()).all() + return [] + + @staticmethod + def create_form(tenant, name, description, form_structure, settings, is_active, user): + form_id = f'form_{name.lower().replace(" ", "_")}_{str(uuid.uuid4())[:8]}' + form = FormConfig( + id=form_id, + tenant_id=tenant.id, + name=name, + description=description, + form_structure=form_structure, + settings=settings, + is_active=is_active + ) + db.session.add(form) + db.session.commit() + + AuditLog.log_action( + action='create', + resource_type='form', + user=user, + tenant=tenant, + resource_id=form.id, + details={'name': name, 'tenant_id': tenant.id} + ) + return form + + @staticmethod + def update_form(form, name, description, is_active, form_structure, settings, user, tenant): + form.name = name if name else form.name + form.description = description if description else form.description + form.is_active = is_active + if form_structure is not None: + form.form_structure = form_structure + if settings is not None: + form.settings = settings + + db.session.commit() + + AuditLog.log_action( + action='update', + resource_type='form', + user=user, + tenant=tenant, + resource_id=form.id, + details={'name': form.name, 'is_active': form.is_active} + ) + + @staticmethod + def delete_form(form, user, tenant): + db.session.delete(form) + db.session.commit() + + AuditLog.log_action( + action='delete', + resource_type='form', + user=user, + tenant=tenant, + resource_id=form.id, + details={'name': form.name} + ) diff --git a/services/tenant_admin_service.py b/services/tenant_admin_service.py new file mode 100644 index 0000000..045cf73 --- /dev/null +++ b/services/tenant_admin_service.py @@ -0,0 +1,66 @@ +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} + ) diff --git a/services/user_admin_service.py b/services/user_admin_service.py new file mode 100644 index 0000000..aa9f655 --- /dev/null +++ b/services/user_admin_service.py @@ -0,0 +1,41 @@ +from typing import Optional, List +from models import db, User, UserRole +from models import AuditLog +import logging + +logger = logging.getLogger(__name__) + +class UserAdminService: + @staticmethod + def get_users(): + return User.query.order_by(User.created_at.desc()).all() + + @staticmethod + def update_user(target_user, email, name, role, admin_user): + target_user.email = email if email else target_user.email + target_user.name = name if name else target_user.name + if role in [r.value for r in UserRole]: + target_user.role = UserRole(role) + + db.session.commit() + + AuditLog.log_action( + action='update', + resource_type='user', + user=admin_user, + resource_id=target_user.id, + details={'email': target_user.email, 'role': target_user.role.value} + ) + + @staticmethod + def delete_user(target_user, admin_user): + db.session.delete(target_user) + db.session.commit() + + AuditLog.log_action( + action='delete', + resource_type='user', + user=admin_user, + resource_id=target_user.id, + details={'email': target_user.email} + )