feat: per-student owned flag on readings

- new table jz_bm_reading_ownership and its migration
  20261026120000_create_jz_bm_reading_ownership
- PUT and DELETE /_bm/api/v1/readings/{id}/owned, idempotent
- owned_at on every reading in /readings and /courses/{id}
- read semantics, progress routes and counts unchanged
This commit is contained in:
2026-10-26 11:11:22 +01:00
parent 85cae45cb9
commit cf84f1d0e8
12 changed files with 142 additions and 14 deletions

View File

@@ -168,7 +168,7 @@ func newDeadlinesJSON(rows []models.Deadline) []deadlineJSON {
return out
}
// readingJSON is one reading with the caller's read state.
// readingJSON is one reading with the caller's read and owned state.
type readingJSON struct {
ID uint `json:"id"`
CourseID uint `json:"course_id"`
@@ -180,6 +180,7 @@ type readingJSON struct {
IsRequired bool `json:"is_required"`
SortOrder int `json:"sort_order"`
ReadAt *string `json:"read_at"`
OwnedAt *string `json:"owned_at"`
}
// tagJSON is one material tag.