Skip to content

Commit c1cf02c

Browse files
Merge pull request #52 from KevinMB0220/feat/unban-expert
Feat/unban expert
2 parents 228c477 + 4a3ba57 commit c1cf02c

4 files changed

Lines changed: 73 additions & 0 deletions

File tree

contracts/identity-registry-contract/src/contract.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,32 @@ pub fn ban_expert(env: &Env, expert: &Address) -> Result<(), RegistryError> {
117117
Ok(())
118118
}
119119

120+
/// Unban an expert by reverting their status to Verified (Admin only)
121+
pub fn unban_expert(env: &Env, expert: &Address) -> Result<(), RegistryError> {
122+
let admin = storage::get_admin(env).ok_or(RegistryError::NotInitialized)?;
123+
admin.require_auth();
124+
125+
let current_status = storage::get_expert_status(env, expert);
126+
127+
if current_status != ExpertStatus::Banned {
128+
return Err(RegistryError::NotBanned);
129+
}
130+
131+
// Preserve existing data_uri when unbanning
132+
let existing = storage::get_expert_record(env, expert);
133+
storage::set_expert_record(env, expert, ExpertStatus::Verified, existing.data_uri);
134+
135+
events::emit_status_change(
136+
env,
137+
expert.clone(),
138+
current_status,
139+
ExpertStatus::Verified,
140+
admin,
141+
);
142+
143+
Ok(())
144+
}
145+
120146
/// Get the total number of verified experts ever indexed
121147
pub fn get_total_experts(env: &Env) -> u64 {
122148
storage::get_total_experts(env)

contracts/identity-registry-contract/src/error.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,5 @@ pub enum RegistryError {
1818
ExpertVecMax = 7,
1919
NotVerified = 8,
2020
UriTooLong = 9,
21+
NotBanned = 10,
2122
}

contracts/identity-registry-contract/src/lib.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,11 @@ impl IdentityRegistryContract {
4343
contract::ban_expert(&env, &expert)
4444
}
4545

46+
/// Unban an expert and restore their verification status (Admin only)
47+
pub fn unban_expert(env: Env, expert: Address) -> Result<(), RegistryError> {
48+
contract::unban_expert(&env, &expert)
49+
}
50+
4651
/// Get the total number of verified experts ever added to the directory
4752
pub fn get_total_experts(env: Env) -> u64 {
4853
contract::get_total_experts(&env)

contracts/identity-registry-contract/src/test.rs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -746,3 +746,44 @@ fn test_expert_pagination() {
746746
}
747747
}
748748

749+
#[test]
750+
fn test_unban_expert() {
751+
let env = Env::default();
752+
let contract_id = env.register(IdentityRegistryContract, ());
753+
let client = IdentityRegistryContractClient::new(&env, &contract_id);
754+
755+
let admin = Address::generate(&env);
756+
let expert = Address::generate(&env);
757+
758+
client.init(&admin);
759+
760+
env.mock_all_auths();
761+
let data_uri = String::from_str(&env, "ipfs://unban");
762+
client.add_expert(&expert, &data_uri);
763+
764+
// Initial status: Verified
765+
assert_eq!(client.get_status(&expert), ExpertStatus::Verified);
766+
let initial_total = client.get_total_experts();
767+
768+
// Ban the expert
769+
client.ban_expert(&expert);
770+
assert_eq!(client.get_status(&expert), ExpertStatus::Banned);
771+
772+
// Unban the expert
773+
client.unban_expert(&expert);
774+
assert_eq!(client.get_status(&expert), ExpertStatus::Verified);
775+
776+
// Data URI should be preserved
777+
env.as_contract(&contract_id, || {
778+
let rec = storage::get_expert_record(&env, &expert);
779+
assert_eq!(rec.data_uri, data_uri);
780+
});
781+
782+
// Total experts should NOT have increased
783+
assert_eq!(client.get_total_experts(), initial_total);
784+
785+
// Test: Try to unban a non-banned expert (should fail with NotBanned)
786+
let result = client.try_unban_expert(&expert);
787+
assert_eq!(result, Err(Ok(RegistryError::NotBanned)));
788+
}
789+

0 commit comments

Comments
 (0)