"""Seed para coleção usuario-empresa-perfis com relacionamentos básicos.""" from __future__ import annotations import asyncio import sys from pathlib import Path from typing import Any, Dict from appwrite.exception import AppwriteException # Garantir que o diretório src esteja no sys.path quando o script for executado diretamente ROOT_DIR = Path(__file__).resolve().parents[1] if str(ROOT_DIR) not in sys.path: sys.path.append(str(ROOT_DIR)) from src.core.appwrite_client import get_appwrite_clients # noqa: E402 from src.core.auth import get_password_hash # noqa: E402 from src.core.config import get_settings # noqa: E402 async def _run_io(fn, *args, **kwargs): return await asyncio.to_thread(fn, *args, **kwargs) async def _upsert_document(databases, database_id: str, collection_id: str, document_id: str, data: Dict[str, Any]) -> str: try: await _run_io(databases.get_document, database_id, collection_id, document_id) except AppwriteException as exc: if exc.code != 404: raise await _run_io(databases.create_document, database_id, collection_id, document_id, data) else: await _run_io(databases.update_document, database_id, collection_id, document_id, data) return document_id async def _ensure_unique_index(databases, database_id: str, collection_id: str) -> None: try: await _run_io( databases.create_index, database_id, collection_id, key="unique_usuario_empresa_perfis", type="unique", attributes=["usuarios", "empresas-dados", "usuario-perfis"], ) print("✔️ Índice único criado: unique_usuario_empresa_perfis") except AppwriteException as exc: if exc.code == 409: print("ℹ️ Índice único já existia: unique_usuario_empresa_perfis") return raise async def _assert_unique(databases, database_id: str, collection_id: str, data: Dict[str, Any]) -> None: try: await _run_io(databases.create_document, database_id, collection_id, "unique()", data) except AppwriteException as exc: if exc.code == 409: print("✔️ Índice único impediu duplicidade conforme esperado.") return raise else: # pragma: no cover - proteção em caso de comportamento inesperado raise RuntimeError("Índice único não impediu duplicidade para usuario-empresa-perfis.") async def seed() -> None: settings = get_settings() _, databases = get_appwrite_clients() await _ensure_unique_index( databases, settings.appwrite_database_id, settings.appwrite_collection_usuario_empresa_perfis_id, ) usuario_id = await _upsert_document( databases, settings.appwrite_database_id, settings.appwrite_collection_usuarios_id, "seed-usuario-a", { "identificador": "seed.user@saveinmed.com", "senha": get_password_hash("Seed123!"), "ativo": True, "superadmin": False, }, ) empresa_id = await _upsert_document( databases, settings.appwrite_database_id, settings.appwrite_collection_empresas_id, "seed-empresa-x", { "cnpj": "00000000000191", "razao-social": "Empresa Semente LTDA", "nome-fantasia": "Empresa Seed", }, ) perfil_admin_id = await _upsert_document( databases, settings.appwrite_database_id, settings.appwrite_collection_usuarios_perfil_id, "seed-perfil-admin", {"codigo": "admin", "nome": "Administrador"}, ) perfil_colaborador_id = await _upsert_document( databases, settings.appwrite_database_id, settings.appwrite_collection_usuarios_perfil_id, "seed-perfil-colaborador", {"codigo": "colaborador", "nome": "Colaborador"}, ) vinculo_admin = { "usuarios": usuario_id, "empresas-dados": empresa_id, "usuario-perfis": perfil_admin_id, } vinculo_colaborador = { "usuarios": usuario_id, "empresas-dados": empresa_id, "usuario-perfis": perfil_colaborador_id, } await _upsert_document( databases, settings.appwrite_database_id, settings.appwrite_collection_usuario_empresa_perfis_id, "seed-vinculo-admin", vinculo_admin, ) await _upsert_document( databases, settings.appwrite_database_id, settings.appwrite_collection_usuario_empresa_perfis_id, "seed-vinculo-colaborador", vinculo_colaborador, ) await _assert_unique( databases, settings.appwrite_database_id, settings.appwrite_collection_usuario_empresa_perfis_id, vinculo_admin, ) print( "Seed concluído. Usuário seed-usuario-a vinculado à empresa seed-empresa-x " "com perfis admin e colaborador." ) if __name__ == "__main__": asyncio.run(seed())