Skip to content

feat(web): add assignmentReport query (first token-decrypt path)#102

Merged
obcode merged 1 commit into
mainfrom
feat/web-assignment-report
Jul 18, 2026
Merged

feat(web): add assignmentReport query (first token-decrypt path)#102
obcode merged 1 commit into
mainfrom
feat/web-assignment-report

Conversation

@obcode

@obcode obcode commented Jul 18, 2026

Copy link
Copy Markdown
Owner

Zweite Milestone-B-Operation: ein Live-Report über die Repositories eines Assignments, live von GitLab geholt mit dem gespeicherten PAT der Nutzenden. Hier entsteht erstmals der Token-Decrypt-Pfad in glabs-web.

Was drin ist

  • app.gitlabClientFor — die einzige Entschlüsselungsstelle: GetUserSecretSealer.Opengitlab.NewClient(WithHost, WithToken, WithReporter(discard)). Der Klartext geht direkt an den Client, wird nie geloggt oder zurückgegeben; fail-closed mit klarer Meldung, wenn kein Token hinterlegt oder secrets.key fehlt. Der Discard-Reporter verhindert Progress-Ausgabe auf stdout des Servers.
  • app.AssignmentReport — löst das Assignment auf (nil bei fehlend/abstrakt, wie AssignmentURLs; die Resolve-Logik ist jetzt das geteilte resolveAssignmentConfig) und liefert report.Reports über das neue gitlab.Client.ReportData (data-returning, ohne Rendering).
  • graph: eigene Typen AssignmentReport/ProjectReport/CommitReport/ProjectMemberReport/ReleaseReport/… + assignmentReport(course, name)-Query, Resolver, Mapper. Der Mapper projiziert den internen Report (der ein rohes *gitlab.ProjectMember trägt) auf reine Anzeigefelder — keine GitLab-internen IDs, daher kein models:-Binding des API-Typs nötig.
  • Tests: app-Fehler-/Nil-Pfade (kein Token, kein Sealer, fehlend/abstrakt) + Report-Mapper. Der Live-GitLab-Pfad bleibt durch die gitlab-Contract-Tests abgedeckt.

GraphQL

assignmentReport(course: String!, name: String!): AssignmentReport

Null bei fehlendem/nicht auflösbarem Assignment; Fehler, wenn kein Token hinterlegt oder GitLab nicht erreichbar.

Verifikation (lokal grün)

go build ./..., go vet ./..., go vet -tags=integration ./..., go test ./..., golangci-lint run — alle sauber; gofmt clean.

Nächster Schritt: das GUI konsumiert assignmentReport (Report-Ansicht auf der Assignment-Seite), danach check.

🤖 Generated with Claude Code

Second Milestone-B operation: a live report over an assignment's repositories,
fetched from GitLab with the caller's stored PAT. This introduces the first
place in glabs-web where the sealed token is decrypted and used.

- app.gitlabClientFor: the single decrypt site — GetUserSecret → Sealer.Open →
  gitlab.NewClient(WithHost, WithToken, WithReporter(discard)). The plaintext is
  handed straight to the client, never logged or returned; fails closed with a
  clear message when no token is stored or secrets.key is unset.
- app.AssignmentReport resolves the assignment (nil for missing/abstract, like
  AssignmentURLs — the resolve logic is now the shared resolveAssignmentConfig)
  and returns report.Reports via the new gitlab.Client.ReportData.
- graph: own AssignmentReport/ProjectReport/... types + assignmentReport query,
  resolver and mapper. The mapper projects the internal report (which carries a
  raw *gitlab.ProjectMember) onto display-only fields — no GitLab-internal ids,
  so no gqlgen models binding for the API type is needed.
- tests: app error/nil paths (no token, no sealer, missing/abstract) and the
  report mapper. The live GitLab path stays covered by the gitlab contract tests.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@obcode
obcode merged commit f06fc9c into main Jul 18, 2026
8 checks passed
@obcode
obcode deleted the feat/web-assignment-report branch July 18, 2026 15:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant