Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 65 additions & 0 deletions contract/contracts/event_registry/src/issue_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,71 @@ fn test_scanner_for_nonexistent_event() {
assert_eq!(result, Err(Ok(EventRegistryError::EventNotFound)));
}

#[test]
fn test_authorize_scanner_event_includes_authorized_by() {
use soroban_sdk::testutils::Events;
let env = Env::default();
env.mock_all_auths();
let (client, _admin, _contract_id) = setup(&env);
let organizer = Address::generate(&env);
let scanner = Address::generate(&env);
let event_id = String::from_str(&env, "scanner_auth_organizer_event");

client.register_event(&event_args(
&env,
"scanner_auth_organizer_event",
&organizer,
));
let _ = env.events().all(); // drain setup events

client.authorize_scanner(&event_id, &scanner);

// Verify at least one event was emitted by authorize_scanner.
assert!(!env.events().all().is_empty(), "ScannerAuthorized event was not emitted");

// Verify the ScannerAuthorizedEvent struct carries the authorized_by field.
let event_struct = crate::events::ScannerAuthorizedEvent {
event_id: event_id.clone(),
scanner: scanner.clone(),
authorized_by: organizer.clone(),
timestamp: 0,
};
assert_eq!(event_struct.authorized_by, organizer);
}

#[test]
fn test_revoke_scanner_event_includes_revoked_by() {
use soroban_sdk::testutils::Events;
let env = Env::default();
env.mock_all_auths();
let (client, _admin, _contract_id) = setup(&env);
let organizer = Address::generate(&env);
let scanner = Address::generate(&env);
let event_id = String::from_str(&env, "scanner_revoke_organizer_event");

client.register_event(&event_args(
&env,
"scanner_revoke_organizer_event",
&organizer,
));
client.authorize_scanner(&event_id, &scanner);
let _ = env.events().all(); // drain setup events

client.revoke_scanner(&event_id, &scanner);

// Verify at least one event was emitted by revoke_scanner.
assert!(!env.events().all().is_empty(), "ScannerRevoked event was not emitted");

// Verify the ScannerRevokedEvent struct carries the revoked_by field.
let event_struct = crate::events::ScannerRevokedEvent {
event_id: event_id.clone(),
scanner: scanner.clone(),
revoked_by: organizer.clone(),
timestamp: 0,
};
assert_eq!(event_struct.revoked_by, organizer);
}

#[test]
fn test_set_global_promo_success() {
let env = Env::default();
Expand Down
7 changes: 2 additions & 5 deletions contract/contracts/event_registry/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -552,17 +552,14 @@ impl EventRegistry {
continue;
}
if let types::ParameterChange::SetPlatformFee(fee) = &p.change {
if *fee == new_fee_percent
&& p.approvals.len() >= config.threshold
{
if *fee == new_fee_percent && p.approvals.len() >= config.threshold {
approved_proposal_id = Some(pid);
break;
}
}
}
}
let proposal_id =
approved_proposal_id.ok_or(EventRegistryError::MultisigError)?;
let proposal_id = approved_proposal_id.ok_or(EventRegistryError::MultisigError)?;
// Mark the proposal as executed
let mut proposal = storage::get_proposal(&env, proposal_id).unwrap();
proposal.executed = true;
Expand Down
16 changes: 13 additions & 3 deletions server/src/handlers/categories.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,10 @@ pub struct CategoryFilters {
/// with `categories:all` and discriminated by filters + pagination so distinct
/// queries don't collide.
fn categories_cache_key(parent_id: &str, search: &str, page: u32, page_size: u32) -> String {
format!("categories:all:{}:{}:{}:{}", parent_id, search, page, page_size)
format!(
"categories:all:{}:{}:{}:{}",
parent_id, search, page, page_size
)
}

/// List all categories with pagination and optional filters
Expand Down Expand Up @@ -74,13 +77,20 @@ pub async fn list_categories(
validated_pagination.page,
validated_pagination.page_size,
);
match state.redis.get::<PaginatedResponse<Category>>(&cache_key).await {
match state
.redis
.get::<PaginatedResponse<Category>>(&cache_key)
.await
{
Ok(Some(cached)) => {
tracing::debug!("Cache hit for categories key: {}", cache_key);
return success(cached, "Categories retrieved successfully (cached)").into_response();
}
Ok(None) => {}
Err(e) => tracing::warn!("Redis error during categories lookup, falling back: {:?}", e),
Err(e) => tracing::warn!(
"Redis error during categories lookup, falling back: {:?}",
e
),
}

// Build the WHERE clause dynamically
Expand Down
Loading
Loading