# backend-php

## Requisitos

- PHP (recomendado 8.2+) e extensões comuns (ex: `pdo_pgsql`)
- Composer
- PostgreSQL
- `psql` disponível no PATH

## Instalação

```bash
composer install
```

## Configuração do projeto

- Copie o arquivo de exemplo:

```bash
cp .env.example .env
```

- Preencha no `.env` (mínimo para banco):

```bash
DB_HOST=
DB_PORT=
DB_NAME=
DB_USER=
DB_PASSWORD=
```

## Criar usuário e banco no PostgreSQL (psql)

Você pode criar manualmente o usuário e o banco antes de rodar o `bin/setup`.

1. Entre no `psql` com um usuário admin do Postgres (ex: `postgres`):

```bash
psql -U postgres
```

2. Crie o usuário e o banco (ajuste nomes/senha conforme seu `.env`):

```sql
CREATE USER app_user WITH PASSWORD 'app_password';
CREATE DATABASE app_db OWNER app_user;
GRANT ALL PRIVILEGES ON DATABASE app_db TO app_user;
```

3. Saia:

```sql
\q
```

## (Opcional) Deletar um banco no PostgreSQL

Se você quiser remover completamente o banco (isso **apaga todos os dados**), use `DROP DATABASE`.

1. Entre no `psql` com um usuário admin (ex: `postgres`):

```bash
psql -U postgres
```

2. Se não houver conexões ativas no banco:

```sql
DROP DATABASE app_db;
```

3. Se o Postgres recusar por haver conexões ativas:

- Postgres 13+ (recomendado):

```sql
DROP DATABASE app_db WITH (FORCE);
```

- Alternativa (encerrar conexões e depois dropar):

```sql
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE datname = 'app_db'
  AND pid <> pg_backend_pid();

DROP DATABASE app_db;
```

Observação: se preferir, o `bin/setup` também consegue criar o banco quando ele não existe, desde que o usuário usado tenha permissão de `CREATE DATABASE` (por padrão ele usa `DB_USER` como “superuser”, a não ser que você defina `DB_SUPERUSER`, `DB_SUPERUSER_PASSWORD` e `DB_SUPERUSER_DB`).

## Rodar migrations e seed (`bin/setup`)

O script `bin/setup`:

- Verifica se o banco existe; se existir, **não recria** (não faz `DROP DATABASE`).
- Cria (se necessário) a tabela `migrations_run`.
- Aplica as migrations `.sql` em `migrations/`.
  - `migrations_v1.sql` é executada primeiro (se existir).
  - As demais são executadas em ordem alfabética do nome do arquivo.
- Executa seeds (company/role/status/chain/commodities/wallet e usuário padrão).

Execute:

```bash
chmod +x bin/setup
./bin/setup
```

## Subir a aplicação

Existem **dois entrypoints**:

- `public/index.php` (API)
- `public/index_webhook.php` (webhooks)

Você deve rodar **cada um em uma porta diferente**.

Exemplo (2 terminais):

Terminal 1 (API):

```bash
PORT=8000 php public/index.php
```

Terminal 2 (Webhooks):

```bash
PORT=8001 php public/index_webhook.php
```

Observação: o `FrameworkX` usa a variável de ambiente `PORT` para definir a porta do servidor.

## B3 (mTLS)

Para rodar endpoints/funcionalidades relacionadas à B3, é necessário ter estes arquivos na **raiz do projeto**:

- `319245319-320109623_PROD.cer`
- `319245319-320109623_PROD.key`
