95 lines
2.8 KiB
Markdown
95 lines
2.8 KiB
Markdown
# 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.
|
|
|
|
## 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 (`/cliente-1`, `/cliente-2`).
|
|
|
|
## 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
|
|
|
|
```bash
|
|
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:
|
|
|
|
```bash
|
|
cp .env.example .env
|
|
docker compose --profile full up -d --build
|
|
```
|
|
|
|
- App: http://localhost:3000
|
|
- API: http://localhost:3001/api/health
|
|
|
|
## Contas
|
|
|
|
| Área | URL | E-mail | Senha |
|
|
| --- | --- | --- | --- |
|
|
| Plataforma | `/admin/login` | tina.r@example.net | SinkaPlatform!1 |
|
|
| Cliente 1 (admin) | `/cliente-1/login` | xena.w@example.org | SinkaAdmin!1 |
|
|
| Cliente 1 (manager) | `/cliente-1/login` | james.b@example.com | SinkaManager!1 |
|
|
| Cliente 1 (operador) | `/cliente-1/login` | ursula.b@example.com | SinkaOperador!1 |
|
|
| Cliente 2 (admin) | `/cliente-2/login` | ivan.p@example.net | Cliente2Admin!1 |
|
|
|
|
## Testes
|
|
|
|
```bash
|
|
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](docs/TESTING.md).
|
|
|
|
## Documentação
|
|
|
|
- [Arquitetura](docs/ARCHITECTURE.md)
|
|
- [Decisões](docs/DECISIONS.md)
|
|
- [Testes](docs/TESTING.md)
|
|
- [Entrega e CI](docs/CI.md)
|
|
|
|
## 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](docs/CI.md).
|