db/herodb/src/models/circle/circle.rs
2025-04-04 10:59:51 +02:00

70 lines
1.9 KiB
Rust

use serde::{Deserialize, Serialize};
use crate::core::{SledModel, Storable};
use std::collections::HashMap;
/// Role represents the role of a member in a circle
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum Role {
Admin,
Stakeholder,
Member,
Contributor,
Guest,
}
/// Member represents a member of a circle
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Member {
pub pubkeys: Vec<String>, // public keys of the member
pub emails: Vec<String>, // list of emails
pub name: String, // name of the member
pub description: String, // optional description
pub role: Role, // role of the member in the circle
}
/// Circle represents a collection of members (users or other circles)
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Circle {
pub id: u32, // unique id
pub name: String, // name of the circle
pub description: String, // optional description
pub members: Vec<Member>, // members of the circle
}
impl Circle {
/// Create a new circle
pub fn new(id: u32, name: String, description: String) -> Self {
Self {
id,
name,
description,
members: Vec::new(),
}
}
/// Add a member to the circle
pub fn add_member(&mut self, member: Member) {
self.members.push(member);
}
/// Returns a map of index keys for this circle
pub fn index_keys(&self) -> HashMap<String, String> {
let mut keys = HashMap::new();
keys.insert("name".to_string(), self.name.clone());
keys
}
}
// Implement Storable trait (provides default dump/load)
impl Storable for Circle {}
// Implement SledModel trait
impl SledModel for Circle {
fn get_id(&self) -> String {
self.id.to_string()
}
fn db_prefix() -> &'static str {
"circle"
}
}