# Database Instellen

Capyshop vereist PostgreSQL 17+ met de [pgvector](https://github.com/pgvector/pgvector)-extensie geïnstalleerd.

## Vereisten

- PostgreSQL 17+ server met pgvector geïnstalleerd
- Toegang tot de `postgres`-supergebruiker (of equivalent) voor de initiële configuratie

## 1. Database en Gebruiker Aanmaken

Maak verbinding met je PostgreSQL-server als supergebruiker (bijv. `postgres`) en voer uit:

```sql
CREATE DATABASE your_database;
CREATE USER your_user WITH PASSWORD 'your_secure_password';
```

## 2. Databaserechten Configureren

Maak verbinding met de zojuist aangemaakte database en ken de vereiste rechten toe:

```sql
-- Verbind met de database
\c your_database

-- Ken rechten toe aan de gebruiker
GRANT ALL PRIVILEGES ON DATABASE your_database TO your_user;
GRANT ALL ON SCHEMA public TO your_user;

-- Maak de pgvector-extensie aan (vereist supergebruiker)
CREATE EXTENSION IF NOT EXISTS vector;
```

De `vector`-extensie moet aangemaakt worden door een supergebruiker. Eenmaal aangemaakt kan de applicatiegebruiker deze gebruiken zonder supergebruikersrechten.

## 3. Verbindings-URL Instellen

Stel de `DATABASE_URL`-omgevingsvariabele in met je verbindingsgegevens:

```
DATABASE_URL=postgresql://your_user:your_secure_password@localhost:5432/your_database
```

## Docker Compose Voorbeeld

Als je de aangepaste PostgreSQL-image met pgvector gebruikt, kun je de configuratie automatiseren met een init-script.

Maak `init-db.sql` aan:

```sql
GRANT ALL PRIVILEGES ON DATABASE your_database TO your_user;
GRANT ALL ON SCHEMA public TO your_user;
CREATE EXTENSION IF NOT EXISTS vector;
```

Koppel het in je `docker-compose.yml`:

```yaml
postgres:
  image: your-pgvector-image:latest
  environment:
    - POSTGRES_USER=postgres
    - POSTGRES_PASSWORD=postgres_password
    - POSTGRES_DB=your_database
  volumes:
    - ./init-db.sql:/docker-entrypoint-initdb.d/init-db.sql
    - postgres_data:/var/lib/postgresql/data
```

Maak vervolgens de applicatiegebruiker handmatig aan of via een ander init-script:

```sql
-- In een tweede init-script (bijv. 00-create-user.sql, wordt uitgevoerd vóór init-db.sql)
CREATE USER your_user WITH PASSWORD 'your_secure_password';
```

> **Opmerking:** Scripts in `/docker-entrypoint-initdb.d/` worden alleen uitgevoerd wanneer de PostgreSQL-datamap leeg is (eerste keer opstarten). Als de database al bestaat, voer de SQL-commando's handmatig uit.

## Probleemoplossing

| Fout                                             | Oorzaak                                                              | Oplossing                                                                               |
| ------------------------------------------------ | -------------------------------------------------------------------- | --------------------------------------------------------------------------------------- |
| `permission denied for schema public`            | Gebruiker mist schemarechten                                         | `GRANT ALL ON SCHEMA public TO your_user;`                                              |
| `permission denied to create extension "vector"` | Extensie moet aangemaakt worden door supergebruiker                  | Voer `CREATE EXTENSION IF NOT EXISTS vector;` uit als supergebruiker                    |
| `type "vector" does not exist`                   | pgvector-extensie niet geïnstalleerd of aangemaakt                   | Installeer pgvector in PostgreSQL en voer `CREATE EXTENSION IF NOT EXISTS vector;` uit  |
| `P3009 - failed migrations`                      | Een eerdere migratie is mislukt en heeft een vervuilde staat gelaten | `DROP TABLE IF EXISTS _prisma_migrations CASCADE;` en voer daarna migraties opnieuw uit |
| `Connection url is empty`                        | `DATABASE_URL` niet ingesteld                                        | Zorg ervoor dat de omgevingsvariabele is ingesteld in je deployment-omgeving            |
