readme
This commit is contained in:
parent
00c0f4e415
commit
b15be7a9a0
97
README.md
97
README.md
@ -1,71 +1,78 @@
|
||||
# Sinka
|
||||
|
||||
Plataforma SaaS multi-tenant de inteligência logística (desafio técnico).
|
||||
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.
|
||||
|
||||
**Stack:** NestJS · Next.js · TypeScript · MySQL · Redis · Docker
|
||||
**Demo:** [armandosoares.tech](https://armandosoares.tech) · código: [git.armandosoares.tech/armando/sinka](https://git.armandosoares.tech/armando/sinka)
|
||||
|
||||
Não há PHP neste repositório.
|
||||
## 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/ NestJS (porta 3001)
|
||||
web/ Next.js (porta 3000)
|
||||
docs/ Arquitetura e decisões
|
||||
api/ REST, auth, regras, Prisma
|
||||
web/ landing, login, painéis
|
||||
docs/ arquitetura, decisões, testes
|
||||
```
|
||||
|
||||
Leia `RULES.md`, `docs/DECISIONS.md` e `docs/TESTING.md` antes de alterar código.
|
||||
|
||||
Isolamento: **um database MySQL por empresa** (`sinka_platform` + `sinka_t_<slug>`).
|
||||
|
||||
## Subir local
|
||||
|
||||
Só MySQL + Redis no Docker; API e web no Node da máquina:
|
||||
## Como rodar
|
||||
|
||||
```bash
|
||||
docker compose up -d
|
||||
cp .env.example .env
|
||||
docker compose up -d
|
||||
cd api && npm install && npm run prisma:setup && npm run start:dev
|
||||
cd web && npm run dev
|
||||
cd web && npm install && npm run dev
|
||||
```
|
||||
|
||||
### Tudo no Docker (demo / VPS)
|
||||
MySQL e Redis sobem no Docker; API e web no Node da máquina.
|
||||
|
||||
Sobe MySQL, Redis, API e Next.js. Na VPS só precisa de Docker. Porta pública: **3000**.
|
||||
Tudo em containers:
|
||||
|
||||
```bash
|
||||
cp .env.example .env
|
||||
docker compose --profile full up -d --build
|
||||
```
|
||||
|
||||
- App: http://localhost:3000 (ou `http://IP-DA-VPS:3000`)
|
||||
- API (só na máquina): http://127.0.0.1:3001/api/health
|
||||
|
||||
Se a VPS já usa 3306, no `.env`: `SINKA_MYSQL_PORT=3307`. Com HTTPS na frente, `COOKIE_SECURE=true` e `WEB_ORIGIN=https://seu-dominio`.
|
||||
|
||||
Para apagar o projeto da VPS (containers, volumes, imagens locais, uploads):
|
||||
|
||||
```bash
|
||||
docker compose --profile full down -v --rmi local --remove-orphans
|
||||
rm -rf /opt/sinka
|
||||
```
|
||||
|
||||
- App: http://localhost:3000
|
||||
- API: http://localhost:3001/api/health
|
||||
- Web: http://localhost:3000
|
||||
- Login empresa demo: http://localhost:3000/demo/login
|
||||
- Sistema demo: http://localhost:3000/demo
|
||||
- Admin do produto: http://localhost:3000/admin/login
|
||||
|
||||
### Contas de demonstração
|
||||
## Contas
|
||||
|
||||
| Área | Caminho | E-mail | Senha |
|
||||
| Área | URL | E-mail | Senha |
|
||||
| --- | --- | --- | --- |
|
||||
| Produto | `/admin` | tina.r@example.net | SinkaPlatform!1 |
|
||||
| Demo | `/demo` | xena.w@example.org | SinkaAdmin!1 |
|
||||
| Demo | `/demo` | james.b@example.com | SinkaManager!1 |
|
||||
| Demo | `/demo` | ursula.b@example.com | SinkaOperador!1 |
|
||||
|
||||
Papéis na empresa: Administrador, Manager, Operador.
|
||||
| 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
|
||||
|
||||
@ -74,8 +81,10 @@ npm test
|
||||
npm run test:cov
|
||||
```
|
||||
|
||||
Unidade Jest na API (frete, papéis, tenancy, chat, dashboard). A cobertura olha a regra de negócio, não o fio Nest/Prisma. Detalhes em `docs/TESTING.md`.
|
||||
Jest na API: frete, papéis, tenancy, chat, dashboard. A cobertura mede regra de negócio. Detalhes em [docs/TESTING.md](docs/TESTING.md).
|
||||
|
||||
## Etapa atual
|
||||
## Documentação
|
||||
|
||||
Auth (JWT + refresh), área restrita, papéis, multi-tenant (banco por empresa), clientes, transportadoras e simulação de frete (ViaCEP + Nominatim).
|
||||
- [Arquitetura](docs/ARCHITECTURE.md)
|
||||
- [Decisões](docs/DECISIONS.md)
|
||||
- [Testes](docs/TESTING.md)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user