✨ feat: Adicionando o serviço mockaroo para testar a chamada de serviços externos e uma simulação de um banco de dados externo.
parent
4219ab39a3
commit
7da23293a4
@ -1,2 +1,14 @@
|
|||||||
GOOGLE_PROJECT_ID=seu-projeto-id
|
GOOGLE_PROJECT_ID=seu-projeto-id
|
||||||
GOOGLE_LOCATION=us-central1
|
GOOGLE_LOCATION=us-central1
|
||||||
|
|
||||||
|
|
||||||
|
# Database
|
||||||
|
DB_HOST=Seu_host
|
||||||
|
DB_PORT=3306
|
||||||
|
DB_USER=Seu_usuario
|
||||||
|
DB_PASSWORD=Sua_senha
|
||||||
|
DB_NAME=Seu_banco_de_dados
|
||||||
|
|
||||||
|
# Mockaroo
|
||||||
|
MOCKAROO_API_KEY=coloque_sua_api_key_aqui
|
||||||
|
MOCKAROO_BASE_URL=https://my.api.mockaroo.com
|
||||||
@ -0,0 +1,92 @@
|
|||||||
|
from typing import Optional, List, Dict, Any
|
||||||
|
import re
|
||||||
|
import uuid
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
from app.services.mockaroo_client import MockarooClient
|
||||||
|
from app.core.settings import settings
|
||||||
|
|
||||||
|
|
||||||
|
def normalize_cpf(value: str) -> str:
|
||||||
|
return re.sub(r"\D", "", value or "")
|
||||||
|
|
||||||
|
|
||||||
|
async def consultar_estoque(preco_max: float, categoria: Optional[str] = None) -> List[Dict[str, Any]]:
|
||||||
|
client = MockarooClient()
|
||||||
|
registros = await client.fetch_schema_data("consultar_estoque", count=200)
|
||||||
|
return [
|
||||||
|
r for r in registros
|
||||||
|
if float(r.get("preco", 0)) <= preco_max and (categoria is None or r.get("categoria") == categoria)
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
async def validar_cliente_venda(cpf: str, valor_veiculo: float) -> Dict[str, Any]:
|
||||||
|
client = MockarooClient()
|
||||||
|
registros = await client.fetch_schema_data("clientes_credito", count=500)
|
||||||
|
cpf_norm = normalize_cpf(cpf)
|
||||||
|
cliente = next((r for r in registros if normalize_cpf(r.get("cpf", "")) == cpf_norm), None)
|
||||||
|
if not cliente:
|
||||||
|
return {
|
||||||
|
"aprovado": False,
|
||||||
|
"motivo": "Cliente não encontrado",
|
||||||
|
"cpf": cpf_norm,
|
||||||
|
"valor_veiculo": valor_veiculo,
|
||||||
|
}
|
||||||
|
limite = float(cliente.get("limite_credito", 0))
|
||||||
|
restricao = bool(cliente.get("possui_restricao", False))
|
||||||
|
aprovado = (not restricao) and (valor_veiculo <= limite)
|
||||||
|
return {
|
||||||
|
"aprovado": aprovado,
|
||||||
|
"cpf": cpf_norm,
|
||||||
|
"nome": cliente.get("nome"),
|
||||||
|
"score": cliente.get("score"),
|
||||||
|
"limite_credito": limite,
|
||||||
|
"possui_restricao": restricao,
|
||||||
|
"valor_veiculo": valor_veiculo,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async def avaliar_veiculo_troca(modelo: str, ano: int, km: int) -> Dict[str, Any]:
|
||||||
|
ano_atual = datetime.now().year
|
||||||
|
idade = max(0, ano_atual - ano)
|
||||||
|
base = 80000.0
|
||||||
|
valor = base * (0.85 ** idade) - (km * 0.03)
|
||||||
|
valor = max(5000.0, valor)
|
||||||
|
return {
|
||||||
|
"modelo": modelo,
|
||||||
|
"ano": ano,
|
||||||
|
"km": km,
|
||||||
|
"valor_estimado_troca": round(valor, 2),
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async def agendar_revisao(placa: str, data_hora: str) -> Dict[str, Any]:
|
||||||
|
if settings.use_mockaroo_writes:
|
||||||
|
client = MockarooClient()
|
||||||
|
try:
|
||||||
|
return await client.post_json(
|
||||||
|
"agendamentos_revisao",
|
||||||
|
{"placa": placa, "data_hora": data_hora, "status": "Agendado"},
|
||||||
|
)
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
agendamento_id = str(uuid.uuid4())
|
||||||
|
return {"id": agendamento_id, "placa": placa, "data_hora": data_hora, "status": "Agendado"}
|
||||||
|
|
||||||
|
|
||||||
|
async def cancelar_pedido(numero_pedido: str, motivo: str) -> Dict[str, Any]:
|
||||||
|
client = MockarooClient()
|
||||||
|
registros = await client.fetch_schema_data("pedidos", count=500)
|
||||||
|
pedido = next((r for r in registros if str(r.get("numero_pedido")) == str(numero_pedido)), None)
|
||||||
|
if not pedido:
|
||||||
|
return {
|
||||||
|
"status": "NaoEncontrado",
|
||||||
|
"numero_pedido": numero_pedido,
|
||||||
|
"motivo": motivo,
|
||||||
|
}
|
||||||
|
if settings.use_mockaroo_writes:
|
||||||
|
try:
|
||||||
|
await client.delete_json("pedidos", {"numero_pedido": numero_pedido, "motivo": motivo})
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
return {"status": "Cancelado", "numero_pedido": numero_pedido, "motivo": motivo, "pedido": pedido}
|
||||||
@ -0,0 +1,60 @@
|
|||||||
|
from typing import Any, Dict, List, Optional
|
||||||
|
|
||||||
|
import httpx
|
||||||
|
|
||||||
|
from app.core.settings import settings
|
||||||
|
|
||||||
|
class MockarooClient:
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
api_key: Optional[str] = None,
|
||||||
|
base_url: Optional[str] = None,
|
||||||
|
):
|
||||||
|
self.api_key = api_key or settings.mockaroo_api_key
|
||||||
|
self.base_url = (base_url or settings.mockaroo_base_url).rstrip("/")
|
||||||
|
|
||||||
|
async def fetch_schema_data(
|
||||||
|
self,
|
||||||
|
schema_name: str,
|
||||||
|
count: int = 100,
|
||||||
|
extra_params: Optional[Dict[str, Any]] = None,
|
||||||
|
) -> List[Dict[str, Any]]:
|
||||||
|
url = f"{self.base_url}/{schema_name}"
|
||||||
|
params: Dict[str, Any] = {
|
||||||
|
"key": self.api_key,
|
||||||
|
"count": count,
|
||||||
|
}
|
||||||
|
if extra_params:
|
||||||
|
params.update(extra_params)
|
||||||
|
|
||||||
|
async with httpx.AsyncClient() as client:
|
||||||
|
response = await client.get(url, params=params)
|
||||||
|
response.raise_for_status()
|
||||||
|
data = response.json()
|
||||||
|
if isinstance(data, list):
|
||||||
|
return data
|
||||||
|
return [data]
|
||||||
|
|
||||||
|
async def post_json(self, route: str, payload: Dict[str, Any]) -> Dict[str, Any]:
|
||||||
|
url = f"{self.base_url}/{route}"
|
||||||
|
params = {"key": self.api_key}
|
||||||
|
async with httpx.AsyncClient() as client:
|
||||||
|
response = await client.post(url, params=params, json=payload)
|
||||||
|
response.raise_for_status()
|
||||||
|
return response.json()
|
||||||
|
|
||||||
|
async def put_json(self, route: str, payload: Dict[str, Any]) -> Dict[str, Any]:
|
||||||
|
url = f"{self.base_url}/{route}"
|
||||||
|
params = {"key": self.api_key}
|
||||||
|
async with httpx.AsyncClient() as client:
|
||||||
|
response = await client.put(url, params=params, json=payload)
|
||||||
|
response.raise_for_status()
|
||||||
|
return response.json()
|
||||||
|
|
||||||
|
async def delete_json(self, route: str, payload: Optional[Dict[str, Any]] = None) -> Dict[str, Any]:
|
||||||
|
url = f"{self.base_url}/{route}"
|
||||||
|
params = {"key": self.api_key}
|
||||||
|
async with httpx.AsyncClient() as client:
|
||||||
|
response = await client.delete(url, params=params, json=payload or {})
|
||||||
|
response.raise_for_status()
|
||||||
|
return response.json()
|
||||||
Loading…
Reference in New Issue