2.9 KiB
Sinka
SaaS de inteligência logística. Cada operação simula frete, compara transportadoras e acompanha custo — com os dados de uma empresa isolados dos das outras.
Demo: armandosoares.tech · código: git.armandosoares.tech/armando/sinka
O que faz
- Cotação de frete (peso cubado, distância, ad valorem) a partir de CEP (ViaCEP) e coordenadas (Nominatim)
- Ranking de transportadoras da própria empresa
- Clientes, equipe e papéis (Administrador, Manager, Operador)
- Dashboard de custo
- Chat interno (admin da plataforma ↔ empresa)
- Arquivos de operação (CSV/XLSX) por empresa
Dois produtos no mesmo sistema: o admin da Sinka (/admin) cria e suspende empresas; cada empresa entra pelo slug na URL (/demo, /outra-empresa).
Isolamento
Um database MySQL por empresa (sinka_t_<slug>). O catálogo fica em sinka_platform.
O JWT carrega o tenant. As queries de operação usam o PrismaClient daquele banco — um WHERE errado não cruza empresa. Backup, restore e exclusão também são por tenant.
Stack
| Camada | Tecnologia |
|---|---|
| API | NestJS, Prisma, JWT em cookie httpOnly |
| Web | Next.js (App Router) |
| Dados | MySQL 8, Redis |
| Infra | Docker Compose |
Next.js → NestJS /api → sinka_platform
↓ ↓
Redis sinka_t_<slug> …
Estrutura
api/ REST, auth, regras, Prisma
web/ landing, login, painéis
docs/ arquitetura, decisões, testes
Como rodar
cp .env.example .env
docker compose up -d
cd api && npm install && npm run prisma:setup && npm run start:dev
cd web && npm install && npm run dev
MySQL e Redis sobem no Docker; API e web no Node da máquina.
Tudo em containers:
cp .env.example .env
docker compose --profile full up -d --build
Contas
| Área | URL | Senha | |
|---|---|---|---|
| Plataforma | /admin/login |
tina.r@example.net | SinkaPlatform!1 |
| Empresa (admin) | /demo/login |
xena.w@example.org | SinkaAdmin!1 |
| Empresa (manager) | /demo/login |
james.b@example.com | SinkaManager!1 |
| Empresa (operador) | /demo/login |
ursula.b@example.com | SinkaOperador!1 |
Testes
npm test
npm run test:cov
Jest na API: frete, papéis, tenancy, chat, dashboard. A cobertura mede regra de negócio. Detalhes em docs/TESTING.md.
Documentação
Entrega
Push em main sobe a demo na hora. Neste desafio isso basta; em produção o caminho é merge request → pipeline (testes e build) → merge → deploy. Detalhes em docs/CI.md.