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.
vibed/quotesdb/.beans/quotesdb-d09v--quotesdbui-a...

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::Request pattern already used in api.rs for other endpoints.
  • Add an ApiError::Forbidden variant (or reuse an existing error variant) to communicate 403 responses 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": "..." } when new_code is Some, or as {} when None.
  • admin_lock and admin_unlock send 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