# 10.8 - Automatizando Tarefas com Funções

Fala, engenheiro(a) de automação! Já vimos o poder do Supabase para Auth, Storage e Realtime. Agora é hora de conhecer uma ferramenta incrível que vive *dentro* do nosso banco PostgreSQL: as **Database Functions** (Funções de Banco de Dados).

Imagine elas como pequenos **robôs programáveis** morando no seu banco. Você ensina uma tarefa para esse robô (uma função) e pode mandar ele executar essa tarefa sempre que quiser, direto pelo SQL ou pela API do Supabase!

### Qual é a missão desses robôs?

Por que usar funções?

* **Reutilizar código SQL:** Se você tem um pedaço de código SQL que usa sempre (tipo calcular a pontuação total do usuário), ao invés de repetir tudo, você cria uma função e chama ela quando precisar.
* **Lógica complexa:** Para processos com vários passos, condições (IF/ELSE) ou loops (FOR/WHILE) no banco. Só SELECT, INSERT e UPDATE não dão conta de tudo.
* **Segurança:** Dá pra liberar para um usuário só executar a função, sem dar acesso direto às tabelas por trás.
* **Performance:** Processar direto no banco, onde os dados estão, costuma ser mais rápido que trazer tudo para o app e depois voltar.
* **Triggers (Gatilhos):** Funções são a base para gatilhos que disparam ações automáticas em resposta a eventos (tipo, criar um perfil padrão quando um usuário novo é inserido). Isso é avançado, mas entender funções é o primeiro passo.

### A linguagem dos robôs: SQL e PL/pgSQL

No PostgreSQL (o coração do Supabase), as funções podem ser escritas em:

1. **SQL:** Funções que rodam comandos SQL, ótimas para encapsular queries complexas.
2. **PL/pgSQL:** Linguagem procedural nativa do PostgreSQL, que adiciona programação ao SQL, permitindo:
   * Declarar variáveis;
   * Usar estruturas de controle (IF/ELSE, CASE);
   * Loops (FOR, WHILE);
   * Tratamento de erros;

É a escolha para funções mais elaboradas.

### Como criar funções no Supabase?

Você pode fazer isso de dois jeitos:

1. Pelo **SQL Editor** usando o comando `CREATE FUNCTION`.
2. Na seção **Database -> Functions**, que tem um editor visual (que gera o `CREATE FUNCTION` por baixo dos panos).

***

**Exemplo básico de função PL/pgSQL:**

```sql
CREATE OR REPLACE FUNCTION nome_da_funcao(param1 tipo1, param2 tipo2)
RETURNS tipo_de_retorno
LANGUAGE plpgsql
AS $$
DECLARE
  variavel_local tipo;
BEGIN
  -- lógica da função
  RETURN resultado;
END;
$$;
```

***

#### Exemplos práticos

**1. Função SQL simples — contar agentes ativos:**

```sql
CREATE OR REPLACE FUNCTION contar_agentes_ativos()
RETURNS integer
LANGUAGE sql
AS $$
  SELECT COUNT(*) FROM agentes WHERE ativo = true;
$$;
```

Use assim:\
`SELECT contar_agentes_ativos();`\
Retorna o número de agentes ativos.

***

**2. Função PL/pgSQL — calcular idade pela data de nascimento:**

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

Use assim:\
`SELECT nome, calcular_idade(data_nascimento) AS idade FROM usuarios;`

***

**3. Função PL/pgSQL — dar bônus de habilidade (sem retorno):**

```sql
CREATE OR REPLACE FUNCTION dar_bonus_habilidade(id_agente uuid, bonus integer)
RETURNS void
LANGUAGE plpgsql
AS $$
BEGIN
  UPDATE agentes
  SET nivel_habilidade = nivel_habilidade + bonus
  WHERE id = id_agente;
END;
$$;
```

Use assim:\
`SELECT dar_bonus_habilidade('uuid-002', 2);`\
Atualiza o nível de habilidade do agente com o bônus.

***

### Segurança e permissões

Quem cria a função é seu "dono". Outros usuários só podem executá-la se receberem permissão (`GRANT EXECUTE`). O Supabase cuida de várias permissões automaticamente, especialmente para chamadas via API (veremos isso no próximo capítulo).

***

As funções no banco são ferramentas poderosas para automatizar, otimizar e organizar sua lógica diretamente onde os dados moram — seu banco PostgreSQL no Supabase.
