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.
3.4 KiB
3.4 KiB
| title | status | type | priority | created_at | updated_at |
|---|---|---|---|---|---|
| quotesdb/ui: admin API client functions | completed | feature | normal | 2026-03-10T23:32:05Z | 2026-03-10T23:32:05Z |
Admin API client functions (UI)
Add four async functions to the UI API client module that cover every admin and status endpoint introduced by the API tickets. These functions are consumed by the /admin page and the /submit page.
Files to modify
src/bin/ui/api.rs— add four new public async functions
New types
Add to src/bin/ui/api.rs (or to a shared types module imported by api.rs):
/// Response from GET /api/status.
#[derive(Deserialize, Clone, PartialEq)]
pub struct StatusResponse {
pub submissions_locked: bool,
}
/// Response from POST /api/admin/reset-auth-code.
#[derive(Deserialize)]
struct ResetAuthCodeResponse {
pub auth_code: String,
}
/// Response from POST /api/admin/lock or /api/admin/unlock.
#[derive(Deserialize)]
struct LockResponse {
pub submissions_locked: bool,
}
New functions
/// Fetch the current submission lock state from GET /api/status.
/// Returns Ok(StatusResponse) on success or ApiError on failure.
pub async fn get_status() -> Result<StatusResponse, ApiError> { ... }
/// Call POST /api/admin/reset-auth-code.
/// Sends X-Admin-Code: admin_code in the request header.
/// Body: { "new_code": new_code } (omit field if new_code is None).
/// Returns the new auth code string on success, or ApiError on failure.
pub async fn admin_reset_auth_code(
current: &str,
new_code: Option<&str>,
admin_code: &str,
) -> Result<String, ApiError> { ... }
/// Call POST /api/admin/lock.
/// Sends X-Admin-Code: admin_code in the request header.
/// Returns Ok(true) on success, or ApiError (including ApiError::Forbidden on 403).
pub async fn admin_lock(admin_code: &str) -> Result<bool, ApiError> { ... }
/// Call POST /api/admin/unlock.
/// Sends X-Admin-Code: admin_code in the request header.
/// Returns Ok(false) on success, or ApiError (including ApiError::Forbidden on 403).
pub async fn admin_unlock(admin_code: &str) -> Result<bool, ApiError> { ... }
Implementation notes:
- Use the same
gloo_net::http::Requestpattern already used inapi.rsfor other endpoints. - Add an
ApiError::Forbiddenvariant (or reuse an existing error variant) to communicate403responses back to the UI so pages can show "Wrong auth code." without a generic error. admin_reset_auth_code: serialize the body as{ "new_code": "..." }whennew_codeisSome, or as{}whenNone.admin_lockandadmin_unlocksend no request body (empty POST).
ApiError extension
If ApiError does not already have a Forbidden variant, add one:
pub enum ApiError {
// ... existing variants ...
/// The server returned 403 Forbidden (wrong admin code).
Forbidden,
}
Map HTTP 403 → ApiError::Forbidden in each new function before returning.
Tests
This module compiles only for wasm32-unknown-unknown so no cargo test unit tests are practical here. Instead, verify the build compiles cleanly:
cargo check --target wasm32-unknown-unknown --bin ui
Write a brief doc-comment on each function describing its endpoint, required header, and error conditions.
Validation
cargo fmt && cargo check --target wasm32-unknown-unknown --bin ui
Commit
feat(quotesdb): admin API client functions in UI