--- # quotesdb-r72e title: 'quotesdb/api: enforce submission lock on PUT /api/quotes' status: completed type: feature priority: normal created_at: 2026-03-10T23:32:09Z updated_at: 2026-03-10T23:32:16Z blocked_by: - quotesdb-04cw --- ## Enforce submission lock on PUT /api/quotes Modify the quote-creation handler to check the submissions lock before accepting a new quote. If locked, return `423 Locked` with a JSON error body. Note: This ticket depends on ticket 35685a (GET /api/status) because that ticket adds `get_submissions_locked` to the `QuoteRepository` trait. Complete 35685a first. --- ## Files to modify - `src/bin/api/handlers/mod.rs` — modify the `create_quote` handler (the handler for `PUT /api/quotes`) to add a lock pre-flight check No new DB methods, routes, or types are needed. --- ## Change to create_quote handler At the top of the handler body, before any other logic, add: ```rust // Pre-flight: reject new submissions when locked. match repo.get_submissions_locked().await { Ok(true) => { return ( StatusCode::LOCKED, Json(json!({ "error": "submissions are closed" })), ).into_response(); } Ok(false) => {} Err(_) => return StatusCode::INTERNAL_SERVER_ERROR.into_response(), } ``` HTTP 423 is `StatusCode::LOCKED` in axum/hyper. --- ## Tests - `PUT /api/quotes` while `submissions_locked = false` → `201` (existing behaviour unchanged) - `PUT /api/quotes` while `submissions_locked = true` → `423` with body `{ "error": "submissions are closed" }` - After unlocking (`submissions_locked = false`), `PUT /api/quotes` succeeds again → `201` Use the in-memory/mock repo already used by other handler tests; expose a method to toggle the lock state on the test double. --- ## Validation ```sh cargo fmt && cargo check && cargo clippy && cargo test ``` --- ## Commit ``` feat(quotesdb): enforce submission lock on PUT /api/quotes ```