diff --git a/README.md b/README.md index 02f0c70..a334ef4 100644 --- a/README.md +++ b/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_`). 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_ … +``` ## 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_`). - -## 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)