use crate::permission::Permission;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Collaborator {
pub id: u64,
pub repo_key: String,
pub user: String,
pub permission: Permission,
pub added_by: String,
pub created_at: u64,
pub updated_at: u64,
}
impl Collaborator {
pub fn new(
id: u64,
repo_key: String,
user: String,
permission: Permission,
added_by: String,
) -> Self {
let now = Self::now();
Self {
id,
repo_key,
user,
permission,
added_by,
created_at: now,
updated_at: now,
}
}
pub fn has_permission(&self, required: Permission) -> bool {
self.permission.has(required)
}
pub fn set_permission(&mut self, permission: Permission) {
self.permission = permission;
self.updated_at = Self::now();
}
fn now() -> u64 {
std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap_or_default()
.as_secs()
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CollaboratorRequest {
pub user: String,
pub permission: Permission,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CollaboratorResponse {
pub user: String,
pub permission: Permission,
pub created_at: u64,
}
impl From<&Collaborator> for CollaboratorResponse {
fn from(c: &Collaborator) -> Self {
Self {
user: c.user.clone(),
permission: c.permission,
created_at: c.created_at,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_collaborator_creation() {
let collab = Collaborator::new(
1,
"acme/api".into(),
"user123".into(),
Permission::Write,
"owner".into(),
);
assert_eq!(collab.id, 1);
assert_eq!(collab.repo_key, "acme/api");
assert_eq!(collab.user, "user123");
assert_eq!(collab.permission, Permission::Write);
assert!(collab.has_permission(Permission::Read));
assert!(collab.has_permission(Permission::Write));
assert!(!collab.has_permission(Permission::Admin));
}
#[test]
fn test_collaborator_permission_update() {
let mut collab = Collaborator::new(
1,
"acme/api".into(),
"user123".into(),
Permission::Read,
"owner".into(),
);
assert!(!collab.has_permission(Permission::Write));
collab.set_permission(Permission::Admin);
assert!(collab.has_permission(Permission::Admin));
assert!(collab.updated_at >= collab.created_at);
}
}