-
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
The core feature of the contract is book_workspace — a member selects a workspace, picks a time slot, pays the computed fee, and the contract records the booking. This issue also adds the three booking query functions.
Task
Building on Issue #3, add:
-
pub fn book_workspace(env, member, booking_id, workspace_id, start_time, end_time) -> Result<(), Error>- Call
member.require_auth(). - Return
Error::BookingAlreadyExistsifDataKey::Booking(booking_id.clone())already exists. - Validate time range:
start_time >= end_time || end_time <= now→Error::InvalidTimeRange. - Load workspace, return
Error::WorkspaceNotFoundif absent. - Return
Error::WorkspaceUnavailableif!workspace.is_available. - Call
Self::is_slot_available(...)→ returnError::BookingConflictif false. - Compute cost:
hourly_rate × ⌈(end_time - start_time) / 3600⌉usingdiv_ceil(3600). - Transfer payment from member to contract using
token::Client::new(&env, &payment_token).transfer(&member, env.current_contract_address(), &amount). - Build
Bookingstruct and save toDataKey::Booking(booking_id.clone())in persistent storage. - Append
booking_idtoDataKey::WorkspaceBookings(workspace_id.clone())in persistent storage. - Append
booking_idtoDataKey::MemberBookings(member.clone())in persistent storage. - Emit event: topic
(symbol_short!("booked"), booking_id), data(member, workspace_id, start_time, end_time, amount).
- Call
-
pub fn get_booking(env: Env, booking_id: String) -> Result<Booking, Error>- Read
DataKey::Booking(booking_id)from persistent storage, returnError::BookingNotFoundif absent.
- Read
-
pub fn get_member_bookings(env: Env, member: Address) -> Vec<String>- Read
DataKey::MemberBookings(member)from persistent storage, return emptyVecif absent.
- Read
-
pub fn get_workspace_bookings(env: Env, workspace_id: String) -> Vec<String>- Read
DataKey::WorkspaceBookings(workspace_id)from persistent storage, return 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. - A successful booking transfers tokens from the member to the contract.
- Cost rounds up to the nearest full hour (e.g., 90-minute booking = 2 hours of payment).
- Overlapping bookings are rejected with
Error(Contract, #6)(BookingConflict). - Booking an unavailable workspace returns
Error(Contract, #5)(WorkspaceUnavailable). -
get_member_bookingsandget_workspace_bookingsreturn the correct IDs after booking. - Duplicate
booking_idreturnsError(Contract, #8)(BookingAlreadyExists).
Technical notes
- Use
duration_secs.div_ceil(3600)— do not use(duration_secs + 3599) / 3600(triggersmanual_div_ceilclippy lint). - Token transfer:
fromtakes&Address,totakes an ownedAddress(env.current_contract_address()— no&).
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
Beta-CampaignCampaign: Beta-CampaignCampaign: Beta-Campaigngood first issueGood for newcomersGood for newcomerssoroban-contract