saveinmed/saveinmed-bff/scripts/seed_usuario_empresa_perfis.py
Tiago Yamamoto b39caf0fd0 first commit
2025-12-17 13:58:26 -03:00

160 lines
4.9 KiB
Python
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""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())