# 10.9 - Usando Funções como API no Supabase

Agora que você já sabe criar suas funções no banco, vamos ver como usá-las diretamente pela **API RESTful** que o Supabase gera para o seu banco de dados.

#### Como funciona?

O Supabase cria automaticamente uma API chamada **PostgREST** que expõe suas tabelas e também suas funções armazenadas (database functions) — desde que estejam configuradas para isso.

#### Passos para chamar uma função via API:

1. **Criar a função com parâmetros (se precisar)**
2. **Permitir a execução da função para a role `anon` ou `authenticated`** (você faz isso na interface de permissões do Supabase ou via SQL com `GRANT EXECUTE`)
3. **Chamar a função pela rota `/rpc/nome_da_funcao`** usando uma requisição POST com JSON contendo os parâmetros

#### Exemplo prático:

Suponha a função PL/pgSQL que calcula idade:

```sql
CREATE OR REPLACE FUNCTION calcular_idade(data_nasc DATE)
RETURNS integer
LANGUAGE plpgsql
AS $$
BEGIN
  RETURN date_part('year', age(now(), data_nasc));
END;
$$;
```

**Para chamar via API REST:**

* Endpoint: `POST https://<seu-projeto>.supabase.co/rest/v1/rpc/calcular_idade`
* Body JSON:

```json
jsonCopiarEditar{
  "data_nasc": "1990-05-23"
}
```

* Headers:

```http
httpCopiarEditarapikey: <sua_api_key>
Authorization: Bearer <token_jwt>
Content-Type: application/json
```

* Resposta:

```json
jsonCopiarEditar{
  "calcular_idade": 34
}
```

***

#### Importante:

* As funções expostas via `/rpc` devem retornar um tipo válido (ex: scalar, tabela, void).
* Você sempre faz a chamada via POST, enviando os parâmetros no corpo da requisição em JSON.
* Funções sem parâmetros podem ser chamadas enviando um objeto JSON vazio `{}`.
* Para garantir segurança, configure as permissões das funções para que apenas usuários autenticados possam executá-las, quando for o caso.

***

#### Por que usar funções via API?

* **Isolamento da lógica:** O cliente não precisa saber como o cálculo é feito, só chama a função.
* **Mais segurança:** Você controla o que o usuário pode executar sem dar acesso direto às tabelas.
* **Redução de dados trafegados:** O banco retorna só o resultado final da função, não dados brutos para processar no cliente.
