You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
74 lines
1.9 KiB
Markdown
74 lines
1.9 KiB
Markdown
---
|
|
# 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
|
|
```
|