pdf-quiz-generator/backend/app/routers
Daniel cdf4ab80b4
Some checks failed
Tests / backend (push) Failing after 7s
Tests / frontend (push) Successful in 34s
Tests / e2e (push) Has been cancelled
fix: the figures route handed out the answer side to anybody signed in
GET /questions/detail/{id}/figures had no check at all, sitting next to
a detail route that has one. Any signed-in account could ask for any
question's figures by id and be handed its explanation images: the
paths, and the library record that now rides on them — whose titles run
to "Neonatal Herpes Simplex · Q874". No attempt required, and the answer
in the title. Found by walking today's surfaces as a real learner
account rather than reading the guards.

Same rule as the route beside it: the stem is readable in the bank, the
answer side belongs to whoever writes the question.

Also, refining an article no longer breaks the links into it. The refine
path replaces the whole section list and the model was never shown the
existing ids, so it invented fresh ones — silently breaking every
`[[95#id]]` pointing at a section, from another article, a question's
key point or a study plan's reading. The id travels in the heading now
and the prompt says to return it unchanged for any section kept. The
model is also told to leave existing `[[123|links]]` exactly as written
and never to invent one, because a guessed number points at nothing.

And the section strip is centred. Widening its box to 1600px let the
links spread but `flex: 1` on the strip — right for every other strip on
the site — filled the whole box with the links against its left edge:
measured at 1500px, they began 70px left of the page content while the
strip ran 180px past its right. Content-sized and centred now, still
scrolling when the links genuinely outrun the window. Diagnosis from the
ped-ai session; verified at 1500 and 1920 with no arrows at either.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TqXevQJhxFrM7jJg82cgZN
2026-09-13 15:29:29 +02:00
..
__init__.py Initial commit: PDF Quiz Generator app 2026-03-30 20:04:53 +00:00
access.py fix: a role is not set here while the provider holds it 2026-09-13 14:04:16 +02:00
admin.py feat: no account creation here — the provider makes accounts 2026-09-13 14:37:10 +02:00
ai_mode.py fix: moderator flag in /auth/me, and AI Mode answers that go wrong 2026-09-12 23:05:55 +02:00
articles.py feat: the bank belongs to a role, not to a person 2026-09-13 13:26:25 +02:00
attempts.py refactor: remove the LMS 2026-09-12 23:27:51 +02:00
auth.py feat: no account creation here — the provider makes accounts 2026-09-13 14:37:10 +02:00
categories.py feat: the bank belongs to a role, not to a person 2026-09-13 13:26:25 +02:00
collections.py feat: articles are collectible, and Summary is a toggle 2026-09-12 14:52:20 +02:00
contact.py fix: the contact form's messages were readable by anyone 2026-09-12 22:37:28 +02:00
documents.py feat: the bank belongs to a role, not to a person 2026-09-13 13:26:25 +02:00
drafts.py feat: extracted questions are staged, and only acceptance takes an id 2026-09-11 22:57:08 +02:00
exams.py feat: exams are a group you can build, with the board's own blueprint 2026-09-11 20:27:48 +02:00
favorites.py Add switchable embedding model, Polly toggle, job cancellation, and UI fixes 2026-04-03 20:44:11 +02:00
feedback.py feat: question folders, per-section notes, and two feedback paths 2026-09-12 18:37:43 +02:00
flashcards.py fix: a schema promising an owner where the column now says NULL 2026-09-13 14:17:55 +02:00
folders.py feat: question folders, per-section notes, and two feedback paths 2026-09-12 18:37:43 +02:00
media.py feat: the bank belongs to a role, not to a person 2026-09-13 13:26:25 +02:00
mynote.py Add persistent MyNote for quizzes 2026-05-12 17:51:23 +02:00
nextcloud.py Security hardening, async TeachChat, rate limit UX, unthrottle 2026-04-04 01:09:42 +02:00
public.py feat: the objective is not optional, and the site can count itself 2026-09-12 06:40:48 +02:00
question_categories.py feat: the bank belongs to a role, not to a person 2026-09-13 13:26:25 +02:00
questions.py fix: the figures route handed out the answer side to anybody signed in 2026-09-13 15:29:29 +02:00
quizzes.py feat: jobs move to the workbench, with their logs and a way to clear them 2026-09-13 03:41:22 +02:00
search.py feat: rerank what a learner is shown, with Cohere through the proxy 2026-09-12 18:23:06 +02:00
share.py refactor: remove the LMS 2026-09-12 23:27:51 +02:00
study_plans.py feat: study plans built to the board's content outline 2026-09-11 21:40:17 +02:00
study_tools.py feat: a versioned API, refresh tokens, and an end-to-end stack that found four bugs 2026-09-13 01:23:38 +02:00
tags.py fix: put the disciplines and diseases back, and order Performance as shown 2026-09-12 05:39:22 +02:00
teach.py fix: WebP figures, the openai SDK removed, and a voice a site can add to 2026-09-12 17:13:05 +02:00
tts.py fix: a speech model is added with its voices, and Orpheus is sent where it works 2026-09-13 05:04:37 +02:00
uploads.py feat: a versioned API, refresh tokens, and an end-to-end stack that found four bugs 2026-09-13 01:23:38 +02:00