sofapub 0.1.9

A minimally functional ActivityPub server
Documentation
use serde::{Deserialize, Serialize};

use crate::Configuration;

#[derive(Serialize, Deserialize, Clone, Debug)]
#[serde(rename_all = "camelCase")]
pub struct PublicKey {
    id: String,
    owner: String,
    public_key_pem: String,
}

#[derive(Serialize, Deserialize, Clone, Debug)]
#[serde(rename_all = "camelCase")]
pub struct Actor {
    #[serde(rename = "@context")]
    pub context: String,

    #[serde(rename = "type")]
    pub kind: String,

    pub name: String,
    pub summary: String,
    pub id: String,
    pub preferred_username: String,
    pub inbox: String,
    pub outbox: String,
    pub public_key: PublicKey,
    pub published: String,
}

impl From<Configuration> for Actor {
    fn from(configuration: Configuration) -> Self {
        Actor {
            context: "https://www.w3.org/ns/activitystreams".to_string(),
            kind: "Person".to_string(),
            name: configuration.display_name.clone(),
            summary: configuration.summary.clone(),
            id: format!("https://{}/profile", configuration.domain),
            preferred_username: configuration.username.clone(),
            inbox: format!("https://{}/inbox", configuration.domain,),
            outbox: format!("https://{}/outbox", configuration.domain,),
            public_key: PublicKey {
                id: format!("https://{}/profile#main-key", configuration.domain),
                owner: format!("https://{}/profile", configuration.domain),
                public_key_pem: configuration.public_key,
            },
            published: configuration.published,
        }
    }
}

impl Actor {
    pub fn profile(&self) -> String {
        format!(
            "<html><body><h1>{}</h1><h2>{}</h2></body></html>",
            self.name, self.id
        )
    }
}