summaryrefslogtreecommitdiffstats
path: root/server/src/apub.rs
blob: 3c7202b2756dd3c404436e21529ae428e7e2517e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
extern crate activitypub;
use self::activitypub::{actor::Person, context};
use crate::db::user::User_;

impl User_ {
  pub fn person(&self) -> Person {
    use crate::{to_datetime_utc, Settings};
    let base_url = &format!("{}/user/{}", Settings::get().api_endpoint(), self.name);
    let mut person = Person::default();
    person.object_props.set_context_object(context()).ok();
    person.object_props.set_id_string(base_url.to_string()).ok();
    person
      .object_props
      .set_name_string(self.name.to_owned())
      .ok();
    person
      .object_props
      .set_published_utctime(to_datetime_utc(self.published))
      .ok();
    if let Some(i) = self.updated {
      person
        .object_props
        .set_updated_utctime(to_datetime_utc(i))
        .ok();
    }
    // person.object_props.summary = self.summary;

    person
      .ap_actor_props
      .set_inbox_string(format!("{}/inbox", &base_url))
      .ok();
    person
      .ap_actor_props
      .set_outbox_string(format!("{}/outbox", &base_url))
      .ok();
    person
      .ap_actor_props
      .set_following_string(format!("{}/following", &base_url))
      .ok();
    person
      .ap_actor_props
      .set_liked_string(format!("{}/liked", &base_url))
      .ok();
    if let Some(i) = &self.preferred_username {
      person
        .ap_actor_props
        .set_preferred_username_string(i.to_string())
        .ok();
    }

    person
  }
}

#[cfg(test)]
mod tests {
  use super::User_;
  use crate::db::{ListingType, SortType};
  use crate::naive_now;

  #[test]
  fn test_person() {
    let expected_user = User_ {
      id: 52,
      name: "thom".into(),
      fedi_name: "rrf".into(),
      preferred_username: None,
      password_encrypted: "here".into(),
      email: None,
      icon: None,
      published: naive_now(),
      admin: false,
      banned: false,
      updated: None,
      show_nsfw: false,
      theme: "darkly".into(),
      default_sort_type: SortType::Hot as i16,
      default_listing_type: ListingType::Subscribed as i16,
    };

    let person = expected_user.person();
    assert_eq!(
      "rrr/api/v1/user/thom",
      person.object_props.id_string().unwrap()
    );
    let json = serde_json::to_string_pretty(&person).unwrap();
    println!("{}", json);
  }
}