feat: system actor domain obj
This commit is contained in:
parent
58073520c0
commit
8773036ec1
2 changed files with 108 additions and 0 deletions
|
@ -21,6 +21,7 @@ pub mod follow_activity;
|
||||||
pub mod follow_repository;
|
pub mod follow_repository;
|
||||||
pub mod followers;
|
pub mod followers;
|
||||||
pub mod remote_actor;
|
pub mod remote_actor;
|
||||||
|
pub mod system_actor;
|
||||||
pub mod visibility;
|
pub mod visibility;
|
||||||
|
|
||||||
// aggregates
|
// aggregates
|
||||||
|
@ -42,6 +43,8 @@ pub enum SupportedActorType {
|
||||||
Patch,
|
Patch,
|
||||||
#[display(fmt = "team")]
|
#[display(fmt = "team")]
|
||||||
Team,
|
Team,
|
||||||
|
#[display(fmt = "system_actor")]
|
||||||
|
SystemActor,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Display, Clone, Hash, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)]
|
#[derive(Debug, Display, Clone, Hash, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)]
|
||||||
|
@ -59,6 +62,7 @@ impl FromStr for SupportedActorType {
|
||||||
"ticket" => Ok(SupportedActorType::Ticket),
|
"ticket" => Ok(SupportedActorType::Ticket),
|
||||||
"patch" => Ok(SupportedActorType::Patch),
|
"patch" => Ok(SupportedActorType::Patch),
|
||||||
"team" => Ok(SupportedActorType::Team),
|
"team" => Ok(SupportedActorType::Team),
|
||||||
|
"system_actor" => Ok(SupportedActorType::SystemActor),
|
||||||
_ => Err(SupportedActorError::UnsupportedActor),
|
_ => Err(SupportedActorError::UnsupportedActor),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -289,6 +293,7 @@ pub mod tests {
|
||||||
assert_eq!("ticket", SupportedActorType::Ticket.to_string());
|
assert_eq!("ticket", SupportedActorType::Ticket.to_string());
|
||||||
assert_eq!("patch", SupportedActorType::Patch.to_string());
|
assert_eq!("patch", SupportedActorType::Patch.to_string());
|
||||||
assert_eq!("team", SupportedActorType::Team.to_string());
|
assert_eq!("team", SupportedActorType::Team.to_string());
|
||||||
|
assert_eq!("system_actor", SupportedActorType::SystemActor.to_string());
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn mock_cachable(times: Option<usize>) -> Box<dyn Cachable> {
|
pub fn mock_cachable(times: Option<usize>) -> Box<dyn Cachable> {
|
||||||
|
|
103
src/federation/domain/system_actor.rs
Normal file
103
src/federation/domain/system_actor.rs
Normal file
|
@ -0,0 +1,103 @@
|
||||||
|
// SPDX-FileCopyrightText: 2024 Aravinth Manivannan <realaravinth@batsense.net>
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
|
use derive_builder::Builder;
|
||||||
|
use derive_getters::Getters;
|
||||||
|
use derive_more::Display;
|
||||||
|
use mockall::predicate::*;
|
||||||
|
use mockall::*;
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
#[allow(unused_imports)]
|
||||||
|
#[cfg(test)]
|
||||||
|
pub use tests::*;
|
||||||
|
use url::Url;
|
||||||
|
|
||||||
|
use super::{Keypair, SupportedActorType, WebFingerable};
|
||||||
|
|
||||||
|
pub const SYSTEM_ACTOR_PREFERRED_USERNAME: &str = "system_actor";
|
||||||
|
|
||||||
|
#[derive(
|
||||||
|
Debug, Builder, Clone, Getters, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord,
|
||||||
|
)]
|
||||||
|
pub struct SystemActor {
|
||||||
|
preferred_username: String,
|
||||||
|
actor_id: Url,
|
||||||
|
html_url: Url,
|
||||||
|
#[builder(default)]
|
||||||
|
keys: Keypair,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for SystemActor {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self {
|
||||||
|
preferred_username: SYSTEM_ACTOR_PREFERRED_USERNAME.into(),
|
||||||
|
html_url: Url::parse(&format!(
|
||||||
|
"https://example.com/{SYSTEM_ACTOR_PREFERRED_USERNAME}"
|
||||||
|
))
|
||||||
|
.unwrap(),
|
||||||
|
actor_id: Url::parse(&format!(
|
||||||
|
"https://forgeflux.example.com/system/{SYSTEM_ACTOR_PREFERRED_USERNAME}"
|
||||||
|
))
|
||||||
|
.unwrap(),
|
||||||
|
keys: Keypair::default(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl SystemActor {
|
||||||
|
pub fn generate_keys(&mut self) {
|
||||||
|
self.keys.generate()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl WebFingerable for SystemActor {
|
||||||
|
fn username(&self) -> String {
|
||||||
|
self.preferred_username().into()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn html_page(&self) -> &Url {
|
||||||
|
self.html_url()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn actor_type(&self) -> SupportedActorType {
|
||||||
|
SupportedActorType::SystemActor
|
||||||
|
}
|
||||||
|
|
||||||
|
fn profile_photo(&self) -> Option<&Url> {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[automock]
|
||||||
|
pub trait GenerateSystemActorRoutes: Send + Sync {
|
||||||
|
fn generate_actor_id(&self, username: &str) -> Result<Url, url::ParseError>;
|
||||||
|
fn generate_html_url(&self, username: &str) -> Result<Url, url::ParseError>;
|
||||||
|
}
|
||||||
|
pub type FederationGenerateSystemActorRoutes = std::sync::Arc<dyn GenerateSystemActorRoutes>;
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
pub mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
pub fn mock_generate_system_actor_routes(
|
||||||
|
times: Option<usize>,
|
||||||
|
) -> FederationGenerateSystemActorRoutes {
|
||||||
|
let mut m = MockGenerateSystemActorRoutes::new();
|
||||||
|
if let Some(times) = times {
|
||||||
|
m.expect_generate_actor_id()
|
||||||
|
.times(times)
|
||||||
|
.returning(|_| Ok(Url::parse("https://mock_obj_id.example.com").unwrap()));
|
||||||
|
m.expect_generate_html_url()
|
||||||
|
.times(times)
|
||||||
|
.returning(|_| Ok(Url::parse("https://mock_obj_id.example.com").unwrap()));
|
||||||
|
} else {
|
||||||
|
m.expect_generate_actor_id()
|
||||||
|
.returning(|_| Ok(Url::parse("https://mock_obj_id.example.com").unwrap()));
|
||||||
|
m.expect_generate_html_url()
|
||||||
|
.returning(|_| Ok(Url::parse("https://mock_obj_id.example.com").unwrap()));
|
||||||
|
}
|
||||||
|
|
||||||
|
std::sync::Arc::new(m)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue