Skip to content

Commit 2bca657

Browse files
Merge pull request #60 from arandomogg/expert-category-tagging
feat: expert category tagging
2 parents 2dad268 + ba46f93 commit 2bca657

5 files changed

Lines changed: 114 additions & 58 deletions

File tree

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

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ pub fn batch_add_experts(env: Env, experts: Vec<Address>) -> Result<(), Registry
3131
}
3232
// Default empty URI for batch adds
3333
let empty_uri = String::from_str(&env, "");
34-
storage::set_expert_record(&env, &expert, ExpertStatus::Verified, empty_uri);
34+
storage::set_expert_record(&env, &expert, ExpertStatus::Verified, empty_uri, 0);
3535
storage::add_expert_to_index(&env, &expert);
3636
events::emit_status_change(&env, expert, status, ExpertStatus::Verified, admin.clone());
3737
}
@@ -54,7 +54,7 @@ pub fn batch_ban_experts(env: Env, experts: Vec<Address>) -> Result<(), Registry
5454
return Err(RegistryError::AlreadyBanned);
5555
}
5656
let existing = storage::get_expert_record(&env, &expert);
57-
storage::set_expert_record(&env, &expert, ExpertStatus::Banned, existing.data_uri);
57+
storage::set_expert_record(&env, &expert, ExpertStatus::Banned, existing.data_uri, existing.category_id);
5858
events::emit_status_change(&env, expert, status, ExpertStatus::Banned, admin.clone());
5959
}
6060

@@ -82,6 +82,7 @@ pub fn verify_expert(
8282
caller: &Address,
8383
expert: &Address,
8484
data_uri: String,
85+
category_id: u32,
8586
) -> Result<(), RegistryError> {
8687
let admin = storage::get_admin(env).ok_or(RegistryError::NotInitialized)?;
8788

@@ -104,7 +105,7 @@ pub fn verify_expert(
104105
return Err(RegistryError::UriTooLong);
105106
}
106107

107-
storage::set_expert_record(env, expert, ExpertStatus::Verified, data_uri);
108+
storage::set_expert_record(env, expert, ExpertStatus::Verified, data_uri, category_id);
108109
storage::add_expert_to_index(env, expert);
109110

110111
events::emit_status_change(
@@ -136,9 +137,9 @@ pub fn ban_expert(env: &Env, caller: &Address, expert: &Address) -> Result<(), R
136137
return Err(RegistryError::AlreadyBanned);
137138
}
138139

139-
// Preserve existing data_uri when banning
140+
// Preserve existing data_uri and category_id when banning
140141
let existing = storage::get_expert_record(env, expert);
141-
storage::set_expert_record(env, expert, ExpertStatus::Banned, existing.data_uri);
142+
storage::set_expert_record(env, expert, ExpertStatus::Banned, existing.data_uri, existing.category_id);
142143

143144
events::emit_status_change(
144145
env,
@@ -162,9 +163,9 @@ pub fn unban_expert(env: &Env, expert: &Address) -> Result<(), RegistryError> {
162163
return Err(RegistryError::NotBanned);
163164
}
164165

165-
// Preserve existing data_uri when unbanning
166+
// Preserve existing data_uri and category_id when unbanning
166167
let existing = storage::get_expert_record(env, expert);
167-
storage::set_expert_record(env, expert, ExpertStatus::Verified, existing.data_uri);
168+
storage::set_expert_record(env, expert, ExpertStatus::Verified, existing.data_uri, existing.category_id);
168169

169170
events::emit_status_change(
170171
env,
@@ -199,7 +200,7 @@ pub fn is_verified(env: &Env, expert: &Address) -> bool {
199200
}
200201

201202
/// Allow a verified expert to update their own profile URI
202-
pub fn update_profile(env: &Env, expert: &Address, new_uri: String) -> Result<(), RegistryError> {
203+
pub fn update_profile(env: &Env, expert: &Address, new_uri: String, category_id: u32) -> Result<(), RegistryError> {
203204
expert.require_auth();
204205

205206
// Validate URI length
@@ -213,7 +214,7 @@ pub fn update_profile(env: &Env, expert: &Address, new_uri: String) -> Result<()
213214
}
214215

215216
// Update record preserving status
216-
storage::set_expert_record(env, expert, status, new_uri.clone());
217+
storage::set_expert_record(env, expert, status, new_uri.clone(), category_id);
217218
events::emit_profile_updated(env, expert.clone(), new_uri);
218219
Ok(())
219220
}
@@ -222,7 +223,7 @@ pub fn update_profile(env: &Env, expert: &Address, new_uri: String) -> Result<()
222223
/// Allows admins to update multiple expert metadata URIs in a single transaction
223224
pub fn batch_update_profiles(
224225
env: &Env,
225-
updates: Vec<(Address, String, u32)>,
226+
updates: Vec<(Address, String, u32, u32)>,
226227
) -> Result<(), RegistryError> {
227228
// Limit batch size to prevent DoS
228229
if updates.len() > 20 {
@@ -233,7 +234,7 @@ pub fn batch_update_profiles(
233234
admin.require_auth();
234235

235236
for update in updates {
236-
let (expert, new_uri, status_u32) = update;
237+
let (expert, new_uri, status_u32, category_id) = update;
237238

238239
// Validate URI length
239240
if new_uri.len() > 64 {
@@ -249,7 +250,7 @@ pub fn batch_update_profiles(
249250
};
250251

251252
// Update the expert record
252-
storage::set_expert_record(env, &expert, status, new_uri);
253+
storage::set_expert_record(env, &expert, status, new_uri, category_id);
253254
}
254255

255256
Ok(())

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,9 @@ impl IdentityRegistryContract {
4949
caller: Address,
5050
expert: Address,
5151
data_uri: String,
52+
category_id: u32,
5253
) -> Result<(), RegistryError> {
53-
contract::verify_expert(&env, &caller, &expert, data_uri)
54+
contract::verify_expert(&env, &caller, &expert, data_uri, category_id)
5455
}
5556

5657
/// Ban an expert and revoke their verification status (Admin or Moderator)
@@ -85,15 +86,15 @@ impl IdentityRegistryContract {
8586
}
8687

8788
/// Allow a verified expert to update their own profile URI
88-
pub fn update_profile(env: Env, expert: Address, new_uri: String) -> Result<(), RegistryError> {
89-
contract::update_profile(&env, &expert, new_uri)
89+
pub fn update_profile(env: Env, expert: Address, new_uri: String, category_id: u32) -> Result<(), RegistryError> {
90+
contract::update_profile(&env, &expert, new_uri, category_id)
9091
}
9192

9293
/// Batch update expert profiles (Admin only)
9394
/// Allows admins to update multiple expert metadata URIs in a single transaction
9495
pub fn batch_update_profiles(
9596
env: Env,
96-
updates: Vec<(Address, String, u32)>,
97+
updates: Vec<(Address, String, u32, u32)>,
9798
) -> Result<(), RegistryError> {
9899
contract::batch_update_profiles(&env, updates)
99100
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,13 +68,14 @@ pub fn remove_moderator(env: &Env, address: &Address) {
6868
// ... [Expert Helpers] ...
6969

7070
/// Set the expert record with status, data_uri and timestamp
71-
pub fn set_expert_record(env: &Env, expert: &Address, status: ExpertStatus, data_uri: String) {
71+
pub fn set_expert_record(env: &Env, expert: &Address, status: ExpertStatus, data_uri: String, category_id: u32) {
7272
let key = DataKey::Expert(expert.clone());
7373

7474
let record = ExpertRecord {
7575
status,
7676
updated_at: env.ledger().timestamp(),
7777
data_uri,
78+
category_id,
7879
};
7980

8081
// 1. Save the data
@@ -107,6 +108,7 @@ pub fn get_expert_record(env: &Env, expert: &Address) -> ExpertRecord {
107108
status: ExpertStatus::Unverified,
108109
updated_at: 0,
109110
data_uri: String::from_str(env, ""),
111+
category_id: 0,
110112
})
111113
}
112114

0 commit comments

Comments
 (0)