s0wlz (Matthias Puchstein) 827eb63bab
Some checks failed
CI / test (push) Failing after 3m6s
CI / test (pull_request) Failing after 3m22s
fix: address review findings — error handling, migration safety, CI audit
Backend:
- migration 003: apply pixel→grid transform per-element (CASE WHEN > 50)
  instead of per-row, preventing double-conversion of mixed-scale rooms;
  skip empty arrays via json_array_length guard to avoid NULL assignment
- attendance.rs: log layout JSON parse errors instead of silently
  swallowing them with .ok()
- tutors.rs: check rows_affected() in set_tutor_active and return 404
  for non-existent IDs; remap FK constraint errors on delete to 409
  so concurrent inserts between conflict-check and DELETE don't surface
  as 500

Frontend:
- live/[slotId]: expose polling failures to the tutor via error banner
  instead of only console.error
- s/[code]: split checkin into two try/catch blocks so a successful
  POST followed by a failed reload doesn't report failure to the student;
  fix dead '409' string detection to match actual server error 'seat taken'
- rooms/[roomId]: remove duplicate onMount fetch; add .catch() to $effect
- tutors: expose loadTutors failures via error banner, not just console
- rooms: fix bare catch in createRoom (captures error, shows message);
  add try/catch to onMount rooms load

CI:
- sync cargo audit --ignore RUSTSEC-2023-0071 with Makefile; the advisory
  is in rsa which sqlx-mysql retains in the lock file even when the mysql
  feature is disabled — aws_lc_rs correctly removes it from the active tree
2026-05-05 01:28:40 +02:00
2026-05-04 17:15:53 +02:00
2026-05-04 17:15:53 +02:00
2026-05-04 17:26:24 +02:00

TutorTool

Attendance tracker for tutoring sessions. Tutors manage courses, rooms, and slots; students check in via a public QR code link. Live at tutor.puchstein.dev.

Quickstart

make dev
# Backend: http://localhost:3000
# Frontend: http://localhost:5173

Demo credentials: admin@tutortool.com / admin

Stack

  • Backend: Rust + Axum + SQLite (via SQLx), Secure httpOnly Cookie JWT auth
  • Frontend: SvelteKit 5 (Svelte runes), TypeScript, adapter-static (SPA)
  • Build: Vite + Cargo; 3-stage Docker build for production

Documentation

Doc Contents
CLAUDE.md Agent guidance: commands, architecture, conventions
GEMINI.md Same, with Gemini-specific context
docs/testing.md E2E test pipeline (Playwright + test daemon)
docs/specs/ Feature specs
docs/plans/ Implementation plans
docs/design_handoff/ UI design mocks

Deployment

Kubernetes via deploy/ Helm chart on ITSH Cloud (tenant-5, Hetzner). CI via Gitea Actions at .gitea/workflows/ci.yml.

Description
No description provided
Readme 254 MiB
Languages
Rust 46.5%
Svelte 41.9%
TypeScript 6.4%
CSS 2%
Makefile 1.2%
Other 2%