# ParCerto — site, app e API

Plataforma de **companhia social** para atividades (balada, bar, praia, shows, jantares, museus, turismo…). É exclusivamente social: proibida para menores de 18 anos e sem qualquer serviço de natureza sexual.

Este pacote junta tudo:

```
parcerto/
  web/                 site + app (React). O mesmo código gera o app Android/iOS.
  api/                 back-end (Node.js + Fastify + PostgreSQL)
  docker-compose.yml   coloca tudo no ar numa VPS, com HTTPS automático
  .env.example         configurações de produção
```

O front-end e a API já estão ligados:
- login, cadastro e recuperação de senha;
- busca e perfis;
- reservas, pagamento, chat e notificações;
- verificação de identidade, denúncias e bloqueios;
- painel do parceiro e painel administrativo.

Todos os textos estão em 4 idiomas (🇧🇷 🇪🇸 🇺🇸 🇨🇳), inclusive as mensagens de erro da API.

---

## 1. Rodar no computador

Requer **Node.js 20+**. Não precisa instalar banco de dados: em desenvolvimento a API usa um PostgreSQL embutido.

```bash
npm run setup     # instala tudo e cria os dados de demonstração (só na primeira vez)
npm run dev       # sobe API + site juntos
```

Abra **http://localhost:5173**.

### Contas de demonstração

A senha de todas é `parcerto123`.

| Conta | Para testar |
|---|---|
| `cliente@parcerto.local` | Cliente verificada (Ana). Já teve um encontro com o Rafael, então **Casa e Sítio** estão liberados com ele. |
| `marina@parcerto.local` | Parceira. Também valem `rafael@`, `bia@`, `leo@`, `clara@`, `helena@` e `julia@` (todos com `@parcerto.local`). |
| `admin@parcerto.local` | Painel administrativo |

**Dica para testar o fluxo completo:** use dois navegadores (ou uma janela anônima).
1. Como cliente, peça uma reserva com a Marina.
2. Como Marina, aceite em **Painel do parceiro**.
3. Como cliente, pague com Pix e toque em "Já fiz o pagamento". No modo de testes, o pagamento é confirmado sem cobrança real.
4. Converse pelo chat, faça check-in, finalize o encontro e avalie.

Em desenvolvimento:
- sem o Gmail configurado, os e-mails (código de confirmação e de recuperação de senha) aparecem no terminal da API;
- a verificação de identidade é aprovada na hora.

Para enviar de verdade também no computador, crie o arquivo `api/.env` com `GMAIL_USER` e `GMAIL_APP_PASSWORD` (veja a seção 3).

Testes automáticos da API: `npm test`.

---

## 2. Colocar no ar (recomendado: VPS + Docker)

Tudo fica num domínio só:
- o site em `https://seudominio.com.br`;
- a API em `https://seudominio.com.br/api`;
- as fotos em `https://seudominio.com.br/uploads`.

O certificado HTTPS é emitido sozinho.

> Hospedagem compartilhada (planos de site da Hostinger, cPanel) **não roda Node.js**. Para a API, use uma VPS: Hostinger VPS, DigitalOcean, Contabo, AWS Lightsail etc. Uma VPS de 2 GB de RAM é suficiente para começar.

1. No painel do seu domínio, aponte `seudominio.com.br` e `www` para o IP da VPS (registro **A**).
2. Na VPS, instale o Docker: `curl -fsSL https://get.docker.com | sh`.
3. Envie a pasta `parcerto` para a VPS e entre nela.
4. Crie o arquivo de configuração:
   ```bash
   cp .env.example .env
   nano .env
   ```
   Preencha `DOMAIN`, `COOKIE_SECRET` e `DB_PASSWORD`. Gere cada segredo com `openssl rand -base64 48`.
5. Suba tudo:
   ```bash
   docker compose up -d --build
   ```
6. Crie o seu usuário administrador:
   ```bash
   docker compose exec api node dist/db/createAdmin.js voce@seudominio.com.br "Seu Nome" "uma-senha-bem-forte"
   ```
7. Acesse `https://seudominio.com.br`. Para conferir a API, abra `/api/health`.

Para colocar dados de demonstração no servidor (só para testes, nunca com usuários reais), rode `docker compose exec api node dist/db/seed.js`.

**Atualizar depois de mudanças:** `docker compose up -d --build`.

**Backup diário do banco** (agende no `crontab -e`):
```bash
0 3 * * * cd /caminho/parcerto && docker compose exec -T db pg_dump -U parcerto parcerto | gzip > backup-$(date +\%F).sql.gz
```

### Alternativa: site na hospedagem atual + API na VPS

Para manter o site onde ele já está, use um subdomínio para a API, por exemplo `api.seudominio.com.br`:
1. Gere o site com o endereço da API:
   ```bash
   cd web && VITE_API_URL=https://api.seudominio.com.br npm run build
   ```
   Envie o conteúdo de `web/dist/`, incluindo o `.htaccess`.
2. Na VPS, suba só o banco e a API. No `.env`, defina:
   - `APP_URL=https://seudominio.com.br`
   - `PUBLIC_URL=https://api.seudominio.com.br`
   - `COOKIE_DOMAIN=.seudominio.com.br`

   Use um proxy com HTTPS na frente da API, como o próprio Caddy.

---

## 3. E-mails pelo Gmail

O ParCerto envia 3 tipos de e-mail, com a marca e no idioma de cada pessoa:
- o **código de confirmação** no cadastro (sem confirmar o e-mail, não dá para reservar);
- o **código para criar uma nova senha**;
- o aviso de que o **suporte recebeu a mensagem**.

### Criar a senha de app do Gmail

O Gmail não aceita a senha normal da conta em aplicativos. É preciso criar uma **senha de app** de 16 letras:

1. Entre na conta Google que vai enviar os e-mails. O ideal é uma conta só do ParCerto, como `parcerto.app@gmail.com`.
2. Ative a **verificação em duas etapas**: [myaccount.google.com/security](https://myaccount.google.com/security) → "Verificação em duas etapas". É obrigatória para a senha de app.
3. Abra [myaccount.google.com/apppasswords](https://myaccount.google.com/apppasswords), dê um nome (por exemplo "ParCerto") e toque em **Criar**.
4. Copie as 16 letras que aparecem. Os espaços não importam.
5. No `.env` do servidor, preencha:
   ```
   GMAIL_USER=parcerto.app@gmail.com
   GMAIL_APP_PASSWORD=abcd efgh ijkl mnop
   EMAIL_FROM=ParCerto <parcerto.app@gmail.com>
   ```
6. Reinicie a API com `docker compose up -d` e envie um e-mail de teste:
   ```bash
   docker compose exec api node dist/testEmail.js seuemail@exemplo.com
   ```
   No computador, use `cd api && npm run email:test -- seuemail@exemplo.com`.

**Se der erro:**
- `535` (usuário ou senha não aceitos): a senha de app está errada ou foi apagada. Crie outra.
- `534`: a verificação em duas etapas não está ativa.
- O e-mail caiu no spam: peça para as primeiras pessoas marcarem como "Não é spam".

**Limite do Gmail:**
- **conta gratuita:** cerca de **500 e-mails por dia**. Isso dá para o lançamento: cada cadastro gasta 1 e-mail.
- **Google Workspace** (e-mail com seu domínio, como `contato@parcerto.com.br`): até **2.000 por dia**, e o remetente fica mais profissional.

Quando o volume crescer, troque o Gmail por um serviço de envio (Resend, Brevo, Amazon SES) usando `SMTP_URL`, sem mudar código.

---

## 4. App Android e iOS

O app é o mesmo site empacotado com Capacitor. Gere-o apontando para o endereço da API:

```bash
cd web
VITE_API_URL=https://seudominio.com.br npm run android   # abre o Android Studio
VITE_API_URL=https://seudominio.com.br npm run ios       # abre o Xcode (precisa de Mac)
```

No app, o login usa um token guardado no aparelho em vez do cookie do site. Detalhes em `web/README.md`.

---

## 5. Antes de abrir para o público

1. **Pagamentos.** Crie a conta no Mercado Pago e teste primeiro com as credenciais de teste.
   - No `.env`: `PAYMENT_PROVIDER=mercadopago`, `MERCADOPAGO_ACCESS_TOKEN` e `MERCADOPAGO_WEBHOOK_SECRET`.
   - Cadastre o webhook: `https://seudominio.com.br/api/webhooks/payments`.
2. **E-mail.** Configure o Gmail (seção 3) e rode o e-mail de teste. Sem isso, ninguém consegue confirmar o cadastro.
3. **Verificação de identidade.** Em produção, os documentos ficam "em análise" e são aprovados à mão no painel admin. Para automatizar, contrate Unico, idwall ou CAF (veja `api/README.md`).
4. **SMS/WhatsApp** para avisar o contato de confiança no check-in e no SOS: `api/src/providers/messaging.ts`.
5. **Revisão jurídica** dos Termos, da Privacidade e das Diretrizes, nos 4 idiomas, e definição do encarregado de dados (DPO), exigido pela LGPD.

---

## 6. Regras de segurança garantidas pela API

- Só maiores de 18 anos. E-mail confirmado e verificação de identidade obrigatórios para reservar. Parceiros só aparecem na busca depois de verificados.
- **Casa e Sítio** só liberam depois de um encontro **concluído em local público** com a mesma pessoa, com contato de confiança cadastrado e endereço compartilhado.
- O chat bloqueia telefone, e-mail e links antes do encontro. Pedido ou oferta de serviço sexual não é entregue e vira denúncia urgente.
- O pagamento fica retido e só é liberado ao parceiro depois do encontro. As regras de cancelamento são:
  - com mais de 24 h de antecedência, o cliente recebe tudo de volta;
  - com menos de 24 h, recebe 50%;
  - se o parceiro cancela, o cliente sempre recebe tudo.
- Check-in e SOS avisam o contato de confiança. O SOS também alerta a equipe.
- A localização do parceiro é sempre aproximada (~1 km).
- LGPD: baixar meus dados e excluir conta, na tela Perfil.
