-
Notifications
You must be signed in to change notification settings - Fork 134
Closed
Labels
Beta-CampaignCampaign: Beta-CampaignCampaign: Beta-Campaigngood first issueGood for newcomersGood for newcomerssoroban-contract
Description
Background
Admins need to register workspaces and manage their availability and pricing. This issue implements the three workspace-management write functions and the two workspace query functions.
Task
Building on Issue #2, add the following public functions:
-
pub fn register_workspace(env, caller, id, name, workspace_type, capacity, hourly_rate) -> Result<(), Error>- Call
Self::require_admin(&env, &caller)?. - Return
Error::InvalidCapacityifcapacity == 0. - Return
Error::InvalidRateifhourly_rate <= 0. - Return
Error::WorkspaceAlreadyExistsifDataKey::Workspace(id.clone())exists in persistent storage. - Build a
Workspacestruct withis_available: trueandcreated_at: env.ledger().timestamp(). - Save to
DataKey::Workspace(id.clone())in persistent storage. - Append
idto theWorkspaceListin instance storage. - Emit event: topic
(symbol_short!("ws_reg"), id), data(name, workspace_type, capacity, hourly_rate).
- Call
-
pub fn set_workspace_availability(env, caller, workspace_id, is_available) -> Result<(), Error>- Require admin. Load workspace, return
Error::WorkspaceNotFoundif missing. - Toggle
workspace.is_available, save back. - Emit event: topic
(symbol_short!("ws_avail"), workspace_id), data(is_available,).
- Require admin. Load workspace, return
-
pub fn set_workspace_rate(env, caller, workspace_id, hourly_rate) -> Result<(), Error>- Require admin. Return
Error::InvalidRateifhourly_rate <= 0. - Load workspace, return
Error::WorkspaceNotFoundif missing. - Update
workspace.hourly_rate, save back. - Emit event: topic
(symbol_short!("ws_rate"), workspace_id), data(hourly_rate,).
- Require admin. Return
-
pub fn get_workspace(env: Env, workspace_id: String) -> Result<Workspace, Error>- Read
DataKey::Workspace(workspace_id)from persistent storage, returnError::WorkspaceNotFoundif absent.
- Read
-
pub fn get_all_workspaces(env: Env) -> Vec<String>- Read
DataKey::WorkspaceListfrom instance storage, return an emptyVecif absent.
- Read
Files to modify
contracts/workspace_booking/src/lib.rs
Acceptance criteria
-
cargo check -p workspace_bookingandcargo clippy -p workspace_booking -- -D warningspass. - Non-admin callers are rejected with
Error(Contract, #2)(Unauthorized). - Registering a duplicate workspace ID returns
Error(Contract, #7)(WorkspaceAlreadyExists). -
capacity == 0returnsError(Contract, #9)(InvalidCapacity). -
hourly_rate <= 0returnsError(Contract, #10)(InvalidRate). -
get_workspacereturns the correct struct after registration. -
get_all_workspacesreturns IDs in registration order. - Rate change via
set_workspace_rateis reflected in the stored workspace.
Technical notes
WorkspaceListlives in instance storage (contract-wide index); workspace records live in persistent storage.- Rate changes apply only to future bookings — existing bookings already recorded
amount_paid.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
Beta-CampaignCampaign: Beta-CampaignCampaign: Beta-Campaigngood first issueGood for newcomersGood for newcomerssoroban-contract