Pixie log the backlog api
  • Rust 78.5%
  • HTML 9.9%
  • Hurl 8.3%
  • Shell 1.5%
  • PLpgSQL 0.8%
  • Other 0.9%
Find a file
Jonatas Oliveira adb7ba9dd6
All checks were successful
ci/woodpecker/push/pipeline/2 Pipeline was successful
ci/woodpecker/push/pipeline/1 Pipeline was successful
fix(api): rotas logadas que davam 500 (settings, correcoes, upload de imagem) e storage local
Quatro defeitos da mesma familia -- rota que so quebra para quem esta logado, e que o spider
anonimo nao via porque o 401 responde antes do handler:

1. /api/user/settings* (5 rotas) e /api/suggestions* (3) pediam `Extension<Uuid>`, que o
   middleware nunca inseriu: 500 "Missing request extension" para todo usuario logado, desde o
   commit do Friend Code (71aec01). Friend Code da Nintendo, historico de sincronizacao e
   sugestoes de correcao nunca funcionaram. Agora usam `Extension<User>` (`user.id`).

2. O `ReviewUploadService` nunca era construido nem injetado em main.rs: o upload de imagem de
   review e de diario (/api/games/{id}/review-images, /log-images) dava 500 para todos, embora
   FEAT-F.2 estivesse marcada como pronta. Novo `from_storage`, ligado ao mesmo storage que
   main ja escolhe (Bunny ou disco).

3. `LocalStorage::upload` gravava `reviews/AAAA/MM/<id>.webp` sem criar as subpastas ("No such
   file or directory") e sem `flush()` (tokio::fs::File escreve em segundo plano; um teste que
   lia logo apos o upload falhou intermitentemente: 0 falhas em 40 rodadas depois do flush).
   Tambem passa a recusar nome que escape do diretorio base (`..`, caminho absoluto).

4. main.rs trata `BUNNY_STORAGE_API_KEY` vazia como nao configurada. O `.env` local tem a chave
   real, e os testes que sobem o binario iriam gravar no CDN de verdade; runner de Hurl e
   spider agora a esvaziam e apontam UPLOADS_PATH para uma pasta temporaria (e as chaves de
   RAWG/Steam/Moby ficam inertes no spider).

Camadas
  unidade    +18: `router_tests` de user_settings (anonimo 401 em todas as rotas, comeca vazio,
             salvar/ler/remover, codigo invalido 400, isolamento, e historico/can-sync com
             DADOS reais: ordem, campos, so sincronizacao bem-sucedida de hoje bloqueia) e de
             correction_suggestions (criar/listar so as proprias, autor gravado, campo invalido,
             so admin revisa e o revisor gravado e o admin); review_upload (from_storage com
             storage em memoria, delete, tamanho/tipo invalidos recusados antes do storage);
             LocalStorage (subpastas, delete, nomes que escapam, safe_join). Passam pelo ROUTER
             real com sessao real -- um teste de handler com Extension montada a mao nao pegaria.
  integracao +2 Hurl logados: user_settings.hurl (settings, Friend Code, sugestoes, revisao por
             admin) e log_images.hurl (upload multipart real, 400 sem log, 400 para nao-imagem);
             36 arquivos passam.
  spider     passada LOGADA no api_spider: registra um usuario comum e chama toda rota com a
             sessao, falhando se alguma responder "Missing request extension". Foi ela que achou
             os 3 uploads (item 2) depois de eu ter corrigido os 8 handlers do item 1.
  mutacao    o hook reprovou a 1a tentativa: get_sync_history e can_sync_today devolvendo
             `[]`/`true` passavam porque os testes so olhavam o estado inicial; agora ha dados
             reais. Os mutantes de user_settings.rs morrem todos. O teste de nomes que escapam
             do diretorio gravava em /tmp compartilhado quando um mutante de safe_join o
             deixava passar; agora usa um diretorio pai privado. Removido o bloco
             `if !base_path.exists()` do LocalStorage, redundante apos create_dir_all(pai) e
             fonte de mutante equivalente.
2026-10-08 17:34:59 +02:00
.cargo fix(security): segredo de API de nivel user virava admin; e mais 4 defeitos achados pelos Hurl 2026-09-30 19:19:49 +02:00
.githooks fix(api): rotas logadas que davam 500 (settings, correcoes, upload de imagem) e storage local 2026-10-08 17:34:59 +02:00
.sqlx fix(sqlx): declara nullability em colunas vindas de LEFT JOIN 2026-08-20 15:09:09 +02:00
.woodpecker ci: tira Hurl e mutacao do CI por completo, ficam so no pre-commit 2026-09-29 11:56:05 +02:00
migrations fix(security): sessao opaca no lugar do UUID do usuario (qualquer um se passava por qualquer usuario) 2026-10-08 12:03:21 +02:00
scripts build: improve config docker 2026-03-13 14:11:48 +01:00
src fix(api): rotas logadas que davam 500 (settings, correcoes, upload de imagem) e storage local 2026-10-08 17:34:59 +02:00
static fix(static): adiciona o default_cover.png que nunca existiu 2026-08-20 15:09:33 +02:00
templates feat: add platform sync verification API endpoints 2026-04-13 10:28:55 +02:00
test-results feat: screenshots in library, steam wishlist sync, improved search 2026-03-20 08:57:05 +01:00
tests fix(api): rotas logadas que davam 500 (settings, correcoes, upload de imagem) e storage local 2026-10-08 17:34:59 +02:00
.audit.toml feat: add games management 2026-01-05 14:06:00 +01:00
.buildpacks build: add config for build in dokku 2026-02-11 16:32:29 +01:00
.env.example feat: add platform sync verification API endpoints 2026-04-13 10:28:55 +02:00
.gitignore fix(ci): versiona o Cargo.lock e trava as resolucoes com --locked 2026-09-04 08:08:32 +02:00
.pre-commit-config.yaml feat: add library e improve profile 2026-02-25 10:32:43 +01:00
app.json feat: FEAT-H Game Detail Page with analytics endpoints 2026-04-08 15:49:19 +02:00
Cargo.lock feat(api): token pessoal para o usuario ler a propria biblioteca em outros sistemas 2026-10-08 07:16:32 +02:00
Cargo.toml feat(api): token pessoal para o usuario ler a propria biblioteca em outros sistemas 2026-10-08 07:16:32 +02:00
debug_render.sh feat: add library e improve profile 2026-02-25 10:32:43 +01:00
docker-compose.yml fix: fix empty field to keyrunes 2026-02-27 13:26:32 +01:00
Dockerfile build: improve config docker 2026-03-13 14:11:48 +01:00
fix_migration.sql fix(profile): correct game ID in profile page links 2026-04-09 13:50:20 +02:00
init_db.sh feat: add games management 2026-01-05 14:06:00 +01:00
LICENSE feat: add user management 2026-01-05 08:14:50 +01:00
parse_lcov.py feat: add games management 2026-01-05 14:06:00 +01:00
Procfile build: add config for build in dokku 2026-02-11 16:32:29 +01:00
README.md feat: add goal and list. mail smtp configure 2026-01-07 10:02:29 +01:00
rust-toolchain build: add config for build in dokku 2026-02-11 16:32:29 +01:00

Pixie API

A Rust-based API for Pixielog, featuring Keyrunes authentication, email confirmation, and Femtocat-styled views.

Prerequisites

  • Rust (latest stable)
  • Docker and Docker Compose
  • Postgres client (optional, for debugging)

Configuration

The application requires the following environment variables. A .env file can be used locally.

Variable Description Example
DATABASE_URL Postgres connection string postgres://postgres:password@localhost:5432/pixielog
SMTP_URL SMTP server URL smtp://localhost:1025
KEYRUNES_URL Keyrunes service URL http://localhost:3000 (internal) or http://keyrunes:3000 (docker)
APP_URL Public URL of this app http://localhost:8000

Running the Application

1. Start Infrastructure

Start Postgres, Mailhog, and Keyrunes using Docker Compose:

docker-compose up -d

2. Initialize Keyrunes (First Run Only)

Setup superuser and organization in Keyrunes:

docker compose exec keyrunes sh /setup.sh

3. Run Database Migrations

Initialize the pixielog database schema:

sqlx migrate run

3. Run Locally (Development)

Start the API server:

cargo run

The server will be available at http://localhost:8000.

4. Run via Docker

To run the entire stack including the API in Docker (if a Dockerfile is provided, otherwise mostly used for deps):

docker-compose up -d

(Note: Ensure your config or env vars point to the keyrunes container name if running inside docker network)

Development

View Docs

Swagger UI is available at: http://localhost:8000/swagger-ui/

Running Tests

Run unit and integration tests:

# Unit tests
cargo test

# Hurl Integration tests (requires running server)
hurl --test tests/auth.hurl