160 lines
4.9 KiB
Python
160 lines
4.9 KiB
Python
"""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())
|