mirror of
https://github.com/bookorbit/bookorbit.git
synced 2026-11-03 00:11:37 -06:00
3a095efcbb
Editing Date Started or Date Finished sent a date-only patch that the attempt layer had nothing to attach it to. On an unread book no attempt was created, so the request returned 200 with null dates and the field cleared itself. On a book being read the date landed on the open attempt as an end date with no outcome, violating reading_attempts_closed_has_outcome_chk and surfacing as a 500. Treat a date-only patch as a lifecycle statement: a start date opens an attempt and projects reading, a finish date closes one as completed and projects read, and endedOn is never written without its outcome. Clearing a finish date keeps the completion, because an outcome with no completion date is legal and is already what re-read seeding writes. Setting a finish date on an abandoned book now completes it. Reject a status that contradicts its dates with a stable error code the client can translate, and derive statusChanged from the resulting status so a date-driven transition still reaches achievements and the Kobo projection. Keep unread and want_to_read free of dates they cannot own. The attempt keeps its own, so a book marked unread no longer projects a start and finish date once a historical attempt is logged, and marking a finished book unread no longer strands its finish date on the projection. Stop the Hardcover import sending dates a status cannot carry. A want-to-read row that still holds a start date would otherwise fail its row and skip the status import entirely. Closes #1073