# Configuracao do Banco de Dados

O Capyshop requer PostgreSQL 17+ com a extensao [pgvector](https://github.com/pgvector/pgvector) instalada.

## Pre-requisitos

- Servidor PostgreSQL 17+ com pgvector instalado
- Acesso ao superusuario `postgres` (ou equivalente) para a configuracao inicial

## 1. Criar o Banco de Dados e o Usuario

Conecte-se ao seu servidor PostgreSQL como superusuario (ex: `postgres`) e execute:

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

## 2. Configurar Permissoes do Banco de Dados

Conecte-se ao banco de dados recem-criado e conceda as permissoes necessarias:

```sql
-- Conectar ao banco de dados
\c your_database

-- Conceder privilegios ao usuario
GRANT ALL PRIVILEGES ON DATABASE your_database TO your_user;
GRANT ALL ON SCHEMA public TO your_user;

-- Criar a extensao pgvector (requer superusuario)
CREATE EXTENSION IF NOT EXISTS vector;
```

A extensao `vector` deve ser criada por um superusuario. Uma vez criada, o usuario da aplicacao pode utiliza-la sem privilegios de superusuario.

## 3. Definir a URL de Conexao

Defina a variavel de ambiente `DATABASE_URL` com os dados da sua conexao:

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

## Exemplo com Docker Compose

Se estiver usando a imagem personalizada do PostgreSQL com pgvector, voce pode automatizar a configuracao com um script de inicializacao.

Crie o arquivo `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;
```

Monte-o no seu `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
```

Em seguida, crie o usuario da aplicacao manualmente ou por meio de outro script de inicializacao:

```sql
-- Em um segundo script de inicializacao (ex: 00-create-user.sql, executa antes do init-db.sql)
CREATE USER your_user WITH PASSWORD 'your_secure_password';
```

> **Nota:** Scripts em `/docker-entrypoint-initdb.d/` so sao executados quando o diretorio de dados do PostgreSQL esta vazio (primeira execucao). Se o banco de dados ja existir, execute os comandos SQL manualmente.

## Solucao de Problemas

| Erro                                             | Causa                                                      | Correcao                                                                               |
| ------------------------------------------------ | ---------------------------------------------------------- | -------------------------------------------------------------------------------------- |
| `permission denied for schema public`            | Usuario nao possui permissoes no schema                    | `GRANT ALL ON SCHEMA public TO your_user;`                                             |
| `permission denied to create extension "vector"` | A extensao deve ser criada por um superusuario             | Execute `CREATE EXTENSION IF NOT EXISTS vector;` como superusuario                     |
| `type "vector" does not exist`                   | Extensao pgvector nao instalada ou nao criada              | Instale o pgvector no PostgreSQL e execute `CREATE EXTENSION IF NOT EXISTS vector;`    |
| `P3009 - failed migrations`                      | Uma migracao anterior falhou e deixou estado inconsistente | Execute `DROP TABLE IF EXISTS _prisma_migrations CASCADE;` e reexecute as migracoes    |
| `Connection url is empty`                        | `DATABASE_URL` nao definida                                | Certifique-se de que a variavel de ambiente esta configurada no seu ambiente de deploy |
