# Configuracion de la Base de Datos

Capyshop requiere PostgreSQL 17+ con la extension [pgvector](https://github.com/pgvector/pgvector) instalada.

## Requisitos Previos

- Servidor PostgreSQL 17+ con pgvector instalado
- Acceso al superusuario `postgres` (o equivalente) para la configuracion inicial

## 1. Crear la Base de Datos y el Usuario

Conectate a tu servidor PostgreSQL como superusuario (ej. `postgres`) y ejecuta:

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

## 2. Configurar Permisos de la Base de Datos

Conectate a la base de datos recien creada y otorga los permisos necesarios:

```sql
-- Conectarse a la base de datos
\c your_database

-- Otorgar privilegios al usuario
GRANT ALL PRIVILEGES ON DATABASE your_database TO your_user;
GRANT ALL ON SCHEMA public TO your_user;

-- Crear la extension pgvector (requiere superusuario)
CREATE EXTENSION IF NOT EXISTS vector;
```

La extension `vector` debe ser creada por un superusuario. Una vez creada, el usuario de la aplicacion puede usarla sin privilegios de superusuario.

## 3. Establecer la URL de Conexion

Configura la variable de entorno `DATABASE_URL` con tus datos de conexion:

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

## Ejemplo con Docker Compose

Si usas la imagen personalizada de PostgreSQL con pgvector, puedes automatizar la configuracion con un script de inicializacion.

Crea `init-db.sql`:

```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;
```

Montalo en tu `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
```

Luego crea el usuario de la aplicacion manualmente o mediante otro script de inicializacion:

```sql
-- En un segundo script de inicializacion (ej. 00-create-user.sql, se ejecuta antes de init-db.sql)
CREATE USER your_user WITH PASSWORD 'your_secure_password';
```

> **Nota:** Los scripts en `/docker-entrypoint-initdb.d/` solo se ejecutan cuando el directorio de datos de PostgreSQL esta vacio (primer inicio). Si la base de datos ya existe, ejecuta los comandos SQL manualmente.

## Solucion de Problemas

| Error                                            | Causa                                                       | Solucion                                                                                     |
| ------------------------------------------------ | ----------------------------------------------------------- | -------------------------------------------------------------------------------------------- |
| `permission denied for schema public`            | El usuario no tiene permisos sobre el esquema               | `GRANT ALL ON SCHEMA public TO your_user;`                                                   |
| `permission denied to create extension "vector"` | La extension debe ser creada por un superusuario            | Ejecuta `CREATE EXTENSION IF NOT EXISTS vector;` como superusuario                           |
| `type "vector" does not exist`                   | La extension pgvector no esta instalada o no fue creada     | Instala pgvector en PostgreSQL y ejecuta `CREATE EXTENSION IF NOT EXISTS vector;`            |
| `P3009 - failed migrations`                      | Una migracion anterior fallo y dejo un estado inconsistente | `DROP TABLE IF EXISTS _prisma_migrations CASCADE;` y luego vuelve a ejecutar las migraciones |
| `Connection url is empty`                        | `DATABASE_URL` no esta configurada                          | Asegurate de que la variable de entorno este configurada en tu entorno de despliegue         |
