Skip to content

Commit f6681a7

Browse files
committed
Added WorkspaceAvailability and UnavailabilityReason to re-exports
1 parent ba82a5f commit f6681a7

4 files changed

Lines changed: 43 additions & 17 deletions

File tree

contracts/Cargo.lock

Lines changed: 14 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

contracts/workspace_booking/src/lib.rs

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ mod types;
1111
mod test;
1212

1313
pub use errors::Error;
14-
pub use types::{Booking, BookingStatus, Workspace, WorkspaceType};
14+
pub use types::{
15+
Booking, BookingStatus, UnavailabilityReason, Workspace, WorkspaceAvailability, WorkspaceType,
16+
};
1517

1618
use soroban_sdk::{
1719
contract, contractimpl, contracttype, symbol_short, token, Address, Env, String, Vec,
@@ -130,14 +132,14 @@ impl WorkspaceBookingContract {
130132
name: String,
131133
workspace_type: WorkspaceType,
132134
capacity: u32,
133-
hourly_rate: i128,
135+
hourly_rate: u128,
134136
) -> Result<(), Error> {
135137
Self::require_admin(&env, &caller)?;
136138

137139
if capacity == 0 {
138140
return Err(Error::InvalidCapacity);
139141
}
140-
if hourly_rate <= 0 {
142+
if hourly_rate == 0 {
141143
return Err(Error::InvalidRate);
142144
}
143145
if env
@@ -154,7 +156,7 @@ impl WorkspaceBookingContract {
154156
workspace_type: workspace_type.clone(),
155157
capacity,
156158
hourly_rate,
157-
is_available: true,
159+
availability: WorkspaceAvailability::Available,
158160
created_at: env.ledger().timestamp(),
159161
};
160162

@@ -193,7 +195,11 @@ impl WorkspaceBookingContract {
193195
.get(&DataKey::Workspace(workspace_id.clone()))
194196
.ok_or(Error::WorkspaceNotFound)?;
195197

196-
workspace.is_available = is_available;
198+
workspace.availability = if is_available {
199+
WorkspaceAvailability::Available
200+
} else {
201+
WorkspaceAvailability::Unavailable(UnavailabilityReason::AdminHold)
202+
};
197203
env.storage()
198204
.persistent()
199205
.set(&DataKey::Workspace(workspace_id.clone()), &workspace);
@@ -208,11 +214,11 @@ impl WorkspaceBookingContract {
208214
env: Env,
209215
caller: Address,
210216
workspace_id: String,
211-
hourly_rate: i128,
217+
hourly_rate: u128,
212218
) -> Result<(), Error> {
213219
Self::require_admin(&env, &caller)?;
214220

215-
if hourly_rate <= 0 {
221+
if hourly_rate == 0 {
216222
return Err(Error::InvalidRate);
217223
}
218224

@@ -274,7 +280,7 @@ impl WorkspaceBookingContract {
274280
.get(&DataKey::Workspace(workspace_id.clone()))
275281
.ok_or(Error::WorkspaceNotFound)?;
276282

277-
if !workspace.is_available {
283+
if workspace.availability != WorkspaceAvailability::Available {
278284
return Err(Error::WorkspaceUnavailable);
279285
}
280286

@@ -285,14 +291,14 @@ impl WorkspaceBookingContract {
285291
// Cost = hourly_rate × ⌈duration_seconds / 3600⌉
286292
let duration_secs = end_time - start_time;
287293
let duration_hours = duration_secs.div_ceil(3600);
288-
let amount: i128 = workspace.hourly_rate * duration_hours as i128;
294+
let amount: u128 = workspace.hourly_rate * duration_hours as u128;
289295

290296
// Collect payment from member → contract
291297
let payment_token = Self::get_payment_token(&env)?;
292298
token::Client::new(&env, &payment_token).transfer(
293299
&member,
294300
env.current_contract_address(),
295-
&amount,
301+
&(amount as i128),
296302
);
297303

298304
let booking = Booking {
@@ -304,6 +310,8 @@ impl WorkspaceBookingContract {
304310
status: BookingStatus::Active,
305311
amount_paid: amount,
306312
created_at: now,
313+
cancelled_at: None,
314+
completed_at: None,
307315
};
308316

309317
env.storage()
@@ -365,10 +373,11 @@ impl WorkspaceBookingContract {
365373
token::Client::new(&env, &payment_token).transfer(
366374
&env.current_contract_address(),
367375
&booking.member,
368-
&booking.amount_paid,
376+
&(booking.amount_paid as i128),
369377
);
370378

371379
booking.status = BookingStatus::Cancelled;
380+
booking.cancelled_at = Some(env.ledger().timestamp());
372381
env.storage()
373382
.persistent()
374383
.set(&DataKey::Booking(booking_id.clone()), &booking);
@@ -397,6 +406,7 @@ impl WorkspaceBookingContract {
397406
}
398407

399408
booking.status = BookingStatus::Completed;
409+
booking.completed_at = Some(env.ledger().timestamp());
400410
env.storage()
401411
.persistent()
402412
.set(&DataKey::Booking(booking_id.clone()), &booking);
@@ -468,7 +478,7 @@ impl WorkspaceBookingContract {
468478
None => return false,
469479
};
470480

471-
if !workspace.is_available {
481+
if workspace.availability != WorkspaceAvailability::Available {
472482
return false;
473483
}
474484

contracts/workspace_booking/src/test.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,8 @@ fn test_register_workspace_success() {
9090
assert_eq!(ws.name, String::from_str(&env, "Hot Desk A"));
9191
assert_eq!(ws.workspace_type, WorkspaceType::HotDesk);
9292
assert_eq!(ws.capacity, 1u32);
93-
assert_eq!(ws.hourly_rate, 500i128);
94-
assert!(ws.is_available);
93+
assert_eq!(ws.hourly_rate, 500u128);
94+
assert_eq!(ws.availability, WorkspaceAvailability::Available);
9595

9696
let all = client.get_all_workspaces();
9797
assert_eq!(all.len(), 1u32);
@@ -192,7 +192,7 @@ fn test_book_workspace_success() {
192192
assert_eq!(booking.workspace_id, String::from_str(&env, "ws-001"));
193193
assert_eq!(booking.member, member);
194194
assert_eq!(booking.status, BookingStatus::Active);
195-
assert_eq!(booking.amount_paid, 2_000i128); // 2 hrs × 1000
195+
assert_eq!(booking.amount_paid, 2_000u128); // 2 hrs × 1000
196196

197197
// Member balance should have decreased
198198
let balance = TokenClient::new(&env, &token_address).balance(&member);
@@ -582,7 +582,7 @@ fn test_hourly_rate_update_applies_to_future_bookings() {
582582
client.set_workspace_rate(&admin, &String::from_str(&env, "ws-001"), &2_000i128);
583583

584584
let ws = client.get_workspace(&String::from_str(&env, "ws-001"));
585-
assert_eq!(ws.hourly_rate, 2_000i128);
585+
assert_eq!(ws.hourly_rate, 2_000u128);
586586

587587
let now = env.ledger().timestamp();
588588
let start = now + 60;
@@ -597,5 +597,5 @@ fn test_hourly_rate_update_applies_to_future_bookings() {
597597
);
598598

599599
let booking = client.get_booking(&String::from_str(&env, "bk-001"));
600-
assert_eq!(booking.amount_paid, 2_000i128); // new rate applied
600+
assert_eq!(booking.amount_paid, 2_000u128); // new rate applied
601601
}

contracts/workspace_booking/src/types.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
use soroban_sdk::{contracttype, Address, String};
22

33
/// Maximum allowed length for workspace identifiers.
4+
#[allow(dead_code)]
45
pub const MAX_ID_LEN: u32 = 64;
56

67
/// Maximum allowed length for workspace names.
8+
#[allow(dead_code)]
79
pub const MAX_NAME_LEN: u32 = 128;
810

911
/// Category of workspace being registered.

0 commit comments

Comments
 (0)