]> Untitled Git - lemmy.git/blob - server/src/routes/nodeinfo.rs
Remove federation option from master. (#745)
[lemmy.git] / server / src / routes / nodeinfo.rs
1 use super::*;
2
3 pub fn config(cfg: &mut web::ServiceConfig) {
4   cfg
5     .route("/nodeinfo/2.0.json", web::get().to(node_info))
6     .route("/.well-known/nodeinfo", web::get().to(node_info_well_known));
7 }
8
9 async fn node_info_well_known() -> HttpResponse<Body> {
10   let node_info = NodeInfoWellKnown {
11     links: NodeInfoWellKnownLinks {
12       rel: "http://nodeinfo.diaspora.software/ns/schema/2.0".to_string(),
13       href: format!("https://{}/nodeinfo/2.0.json", Settings::get().hostname),
14     },
15   };
16   HttpResponse::Ok().json(node_info)
17 }
18
19 async fn node_info(
20   db: web::Data<Pool<ConnectionManager<PgConnection>>>,
21 ) -> Result<HttpResponse, Error> {
22   let res = web::block(move || {
23     let conn = db.get()?;
24     let site_view = match SiteView::read(&conn) {
25       Ok(site_view) => site_view,
26       Err(_) => return Err(format_err!("not_found")),
27     };
28     let protocols = vec![];
29     Ok(NodeInfo {
30       version: "2.0".to_string(),
31       software: NodeInfoSoftware {
32         name: "lemmy".to_string(),
33         version: version::VERSION.to_string(),
34       },
35       protocols,
36       usage: NodeInfoUsage {
37         users: NodeInfoUsers {
38           total: site_view.number_of_users,
39         },
40         local_posts: site_view.number_of_posts,
41         local_comments: site_view.number_of_comments,
42         open_registrations: site_view.open_registration,
43       },
44     })
45   })
46   .await
47   .map(|json| HttpResponse::Ok().json(json))
48   .map_err(ErrorBadRequest)?;
49   Ok(res)
50 }
51
52 #[derive(Serialize)]
53 struct NodeInfoWellKnown {
54   links: NodeInfoWellKnownLinks,
55 }
56
57 #[derive(Serialize)]
58 struct NodeInfoWellKnownLinks {
59   rel: String,
60   href: String,
61 }
62
63 #[derive(Serialize)]
64 struct NodeInfo {
65   version: String,
66   software: NodeInfoSoftware,
67   protocols: Vec<String>,
68   usage: NodeInfoUsage,
69 }
70
71 #[derive(Serialize)]
72 struct NodeInfoSoftware {
73   name: String,
74   version: String,
75 }
76
77 #[derive(Serialize)]
78 #[serde(rename_all = "camelCase")]
79 struct NodeInfoUsage {
80   users: NodeInfoUsers,
81   local_posts: i64,
82   local_comments: i64,
83   open_registrations: bool,
84 }
85
86 #[derive(Serialize)]
87 struct NodeInfoUsers {
88   total: i64,
89 }