Mídia
Visão geral
O fluxo de mídia do Etnos é híbrido:
- o arquivo físico vai para o
Firebase Storage; - os metadados ficam na tabela
midiano Postgres; - a API centraliza upload, assinatura de URL, listagem e remoção.
Diagrama da arquitetura
flowchart LR
A["Admin / Frontend"] --> B["API /midia"]
B --> C["Firebase Storage"]
B --> D["Prisma"]
D --> E["PostgreSQL"]
C --> B
E --> B

Como esse fluxo foi organizado
Essa arquitetura deixa cada parte no lugar certo:
- armazenar arquivos grandes fora do banco;
- paginar e filtrar assets por usuário e pasta;
- reutilizar a mesma biblioteca de imagens no admin;
- desacoplar o dominio da URL assinada em si.
Fluxo de upload
Upload simples
- o cliente envia
multipart/form-dataparaPOST /midia/upload; - a API recebe o arquivo e uma pasta opcional;
- a API salva o binario no bucket do Firebase;
- a API gera uma signed URL de leitura;
- a API persiste
url,folder,patheuserIdna tabelamidia; - o frontend passa a consumir esse item pela biblioteca de imagens.
Upload múltiplo
O endpoint POST /midia/upload/multiple repete o mesmo fluxo para vários
arquivos em paralelo.
Fluxo de consulta
Os assets são listados por usuário autenticado com suporte a:
limitpagefolder
O retorno inclui:
data: lista da página atual;nextCursor: página seguinte, quando existir.
Fluxo de remoção
Existem três formas principais de apagar um asset:
- por URL, usando
DELETE /midia/by-url; - por ID, usando
DELETE /midia/:id; - por body, usando
DELETE /midia.
Em todos os casos, a API tenta:
- localizar o registro do usuário;
- resolver o caminho real no bucket;
- apagar o arquivo físico;
- remover o metadado do Postgres.
Diagrama de sequencia
sequenceDiagram
participant UI as Admin
participant API as API /midia
participant FS as Firebase Storage
participant DB as PostgreSQL
UI->>API: POST /midia/upload
API->>FS: salva arquivo no bucket
FS-->>API: confirma upload
API->>FS: gera signed URL
FS-->>API: retorna URL
API->>DB: salva metadados
DB-->>API: confirma persistencia
API-->>UI: retorna URL e item salvo

Modelo de dados
Tabela principal: midia
Campos relevantes:
idurlfolderpathuserIdcreatedAtupdatedAt
Indices relevantes:
- indice por
userId - indice por
folder
Convenções importantes
Pasta lógica
O campo folder funciona como agrupador funcional dos assets. Exemplos:
games/anitagames/dandarauploads
Essa convenção é importante porque a interface administrativa usa a pasta para filtrar a biblioteca de imagens.
Caminho físico
O path identifica o arquivo real no bucket. Quando ele não existe, a API
reconstrói o caminho a partir da URL assinada.
Signed URL
As URLs de leitura são assinadas com validade muito longa, o que simplifica o consumo no frontend e no admin.
Integração com o admin
O fluxo de jogos depende diretamente da arquitetura de mídia:
- a capa do jogo da memória vem da biblioteca de imagens;
- as cartas do jogo da memória são selecionadas a partir dos assets de uma pasta por personagem;
- o componente
ImageLibrarydepende da listagem paginada da API.
Endpoints principais
POST /midia/uploadPOST /midia/upload/multipleGET /midiaGET /midia/foldersPOST /midiaDELETE /midia/by-urlDELETE /midia/:idDELETE /midia
Dependências externas
Firebase StoragePostgreSQLPrisma