# PdfEditor — Backend (Go)

API REST du projet PdfEditor. Implémente le contrat décrit dans `../docs/API.md`.

## Stack
- Go 1.23, routeur [chi](https://github.com/go-chi/chi)
- PostgreSQL via [pgx](https://github.com/jackc/pgx) (pgxpool)
- JWT [golang-jwt](https://github.com/golang-jwt/jwt), bcrypt pour les mots de passe
- Migrations embarquées appliquées au démarrage via [goose](https://github.com/pressly/goose)
- Stockage des PDF sur disque (un fichier par document, nom = UUID)

## Variables d'environnement

| Variable          | Obligatoire | Défaut             | Description                                   |
|-------------------|-------------|--------------------|-----------------------------------------------|
| `DATABASE_URL`    | oui         | —                  | DSN PostgreSQL (`postgres://...`)             |
| `JWT_SECRET`      | oui         | —                  | Secret de signature des JWT                   |
| `JWT_ACCESS_TTL`  | non         | `15m`              | Durée de vie des access tokens                |
| `JWT_REFRESH_TTL` | non         | `168h`             | Durée de vie des refresh tokens               |
| `STORAGE_PATH`    | non         | `/data/documents`  | Dossier d'écriture des PDF                    |
| `PORT`            | non         | `8080`             | Port d'écoute HTTP                            |
| `CORS_ORIGIN`     | non         | `*`                | Origine autorisée pour le CORS                |

## Lancer en natif

Prérequis : Go 1.23+ et une base PostgreSQL accessible.

```sh
# Récupérer / verrouiller les dépendances
go mod tidy

# Variables d'environnement (exemple dev)
export DATABASE_URL="postgres://pdfeditor:changeme@localhost:5432/pdfeditor?sslmode=disable"
export JWT_SECRET="dev-secret-not-for-prod"
export STORAGE_PATH="./data/documents"
export PORT="8081"
export CORS_ORIGIN="http://localhost:4200"

# Démarrer (les migrations s'appliquent automatiquement)
go run ./cmd/server
```

## Vérifications

```sh
go build ./...
go vet ./...
```

## Docker

Le `Dockerfile` produit une image distroless avec un binaire statique.
L'orchestration se fait via les fichiers `docker-compose.yml` (prod) et
`docker-compose.local.yml` (dev) à la racine du dépôt.

```sh
# Depuis la racine du dépôt
docker compose -f docker-compose.local.yml up --build
```

## Arborescence

```
backend/
├── cmd/server/main.go        # point d'entrée
├── internal/
│   ├── auth/                 # JWT, bcrypt, refresh tokens
│   ├── config/               # chargement de la config
│   ├── db/                   # pool pgx + migrations
│   ├── handlers/             # routeur + handlers HTTP
│   └── storage/              # stockage des PDF sur disque
├── migrations/               # SQL embarqué (goose)
├── Dockerfile
├── go.mod / go.sum
└── README.md
```
