# StickerHub — Backend PHP + MySQL (cPanel)

Backend para o app de stickers: API REST que permite publicar pacotes
online, sistema social (likes, denúncias) e moderação por admin antes
de qualquer pacote enviado por utilizador aparecer no app.

## 1. Estrutura

```
backend/
├── database.sql              ← importar no phpMyAdmin
├── config/
│   ├── database.php           ← credenciais MySQL (EDITAR)
│   └── app.php                 ← URL base e limites (EDITAR)
├── includes/                   ← código PHP partilhado (não tocar)
├── api/                        ← endpoints da API (ver secção 4)
├── admin/                      ← painel de moderação web
├── storage/
│   ├── packs/                  ← pacotes APROVADOS (públicos)
│   └── pending/packs/           ← pacotes em análise (privado-ish)
└── tools/
    ├── import_seed_packs_web.php
    └── seed_assets/             ← stickers originais do app, para importar
```

## 2. Instalação no cPanel (passo a passo)

### 2.1. Criar a base de dados
1. cPanel → **MySQL® Databases**
2. Cria uma base de dados, ex. `stickers`. O nome final será algo como
   `teuutilizador_stickers`.
3. Cria um utilizador MySQL com password forte.
4. Em "Add User to Database", dá-lhe **All Privileges**.
5. Anota: nome da BD, utilizador, password, host (`localhost`).

### 2.2. Importar o schema
1. cPanel → **phpMyAdmin** → seleciona a tua base de dados.
2. Aba **Importar** → escolhe o ficheiro `database.sql` → Executar.
3. Isto cria as tabelas e um utilizador admin inicial:
   - email: `admin@example.com`
   - password: `admin123`
   - **Troca esta password imediatamente** (ver secção 5).

### 2.3. Enviar os ficheiros
1. Sobe a pasta `backend/` inteira para dentro de `public_html/`
   (ou para uma subpasta, ex. `public_html/stickers-backend/`), via
   **Gestor de Ficheiros** do cPanel ou FTP.
2. Confirma que `storage/packs`, `storage/pending/packs` têm permissão de
   escrita (normalmente `755` já funciona; se der erro de permissão ao
   gravar, tenta `775`).

### 2.4. Configurar credenciais
Edita `config/database.php`:
```php
return [
    'host'     => 'localhost',
    'dbname'   => 'teuutilizador_stickers',
    'username' => 'teuutilizador_stickeruser',
    'password' => 'a_password_que_definiste',
    'charset'  => 'utf8mb4',
];
```

Edita `config/app.php` e ajusta `base_url` para o caminho público real, ex:
```php
'base_url' => 'https://meusite.com/stickers-backend',
```
(sem barra final).

### 2.5. Importar os pacotes originais do app (opcional, recomendado)
A pasta `tools/seed_assets/` já contém os stickers que vinham com o app
de exemplo (Cuppy, etc). Para os colocar no banco como pacotes oficiais:

1. Edita `tools/import_seed_packs_web.php` e troca `SETUP_KEY` por uma
   chave secreta só tua.
2. Acede no navegador a:
   `https://meusite.com/stickers-backend/tools/import_seed_packs_web.php?key=A_TUA_CHAVE`
3. Confirma a mensagem "Concluído".
4. **Apaga o ficheiro `import_seed_packs_web.php`** do servidor depois
   de usar (por segurança).

Se tiveres acesso SSH, podes usar `tools/import_seed_packs.php` via
linha de comando em vez disso.

### 2.6. Testar a API
Acede a:
```
https://meusite.com/stickers-backend/api/packs_list.php
```
Deves ver um JSON com `"success": true` e a lista de pacotes (se já
tiveres importado o seed).

### 2.7. Aceder ao painel de admin
```
https://meusite.com/stickers-backend/admin/
```
Entra com o email/password do admin (trocados na secção 5).

## 3. Como o fluxo de moderação funciona

1. O utilizador envia um pacote pelo app → `POST api/packs_upload.php`.
2. O backend valida tudo automaticamente (tamanhos, dimensões, contagem
   de stickers, emojis) usando as mesmas regras do WhatsApp.
3. Se passar a validação, o pacote é guardado em `storage/pending/packs/`
   com status `pending` no banco — **ainda não aparece no app**.
4. O admin entra no painel (`admin/`) e vê a fila de moderação com
   pré-visualização de todos os stickers.
5. Ao **Aprovar**: os ficheiros são movidos para `storage/packs/` e o
   status muda para `approved` → passa a aparecer em `packs_list.php`.
6. Ao **Rejeitar**: o status muda para `rejected` com o motivo, e o
   utilizador pode ver isso em `api/my_packs.php`.

## 4. Endpoints da API

| Endpoint | Método | Auth | Descrição |
|---|---|---|---|
| `api/auth_register.php` | POST | — | Cria conta anónima por `device_id`, devolve `api_token` |
| `api/auth_login.php` | POST | — | Login com email/password |
| `api/packs_list.php` | GET | — | Lista pacotes aprovados (com stickers) |
| `api/packs_upload.php` | POST | token | Envia novo pacote (entra em moderação) |
| `api/my_packs.php` | GET | token | Pacotes enviados pelo próprio utilizador + status |
| `api/pack_like.php` | POST | token | Toggle de like num pacote |
| `api/pack_report.php` | POST | token | Denuncia um pacote |
| `api/pack_download.php` | POST | — | Incrementa contador de downloads |
| `api/admin_packs_pending.php` | GET | token admin | Lista fila de moderação (JSON) |
| `api/admin_packs_approve.php` | POST | token admin | Aprova um pacote |
| `api/admin_packs_reject.php` | POST | token admin | Rejeita um pacote |

Todas as respostas são JSON com `"success": true/false`.

Autenticação por token: header `Authorization: Bearer <api_token>`.

## 5. Trocar a password do admin

A forma mais simples é entrar no painel admin com a senha padrão
(`admin123`), e depois correr este SQL no phpMyAdmin (gera um hash com
o script `tools/generate_password_hash.php` — ver abaixo — e cola no
lugar de `NOVO_HASH_AQUI`):

```sql
UPDATE users SET password_hash = 'NOVO_HASH_AQUI' WHERE email = 'admin@example.com';
```

Ou simplesmente acede a `tools/generate_password_hash.php?password=ASuaNovaSenha`
(apaga este ficheiro depois de usar) para gerar o hash automaticamente.

## 6. Segurança — checklist antes de ir para produção

- [ ] Trocar a password do admin (secção 5)
- [ ] Trocar o `api_token` do admin seed na tabela `users`
- [ ] Apagar `tools/import_seed_packs_web.php` depois de usar
- [ ] Apagar `tools/generate_password_hash.php` depois de usar
- [ ] Confirmar que `config/.htaccess` e `includes/.htaccess` bloqueiam acesso direto
- [ ] Considerar HTTPS obrigatório (a maioria dos cPanel já tem Let's Encrypt gratuito)
- [ ] Ajustar `max_upload_mb` em `config/app.php` conforme o limite do teu hosting (`upload_max_filesize` e `post_max_size` no PHP, configuráveis em "MultiPHP INI Editor" no cPanel)
