summaryrefslogtreecommitdiffstats
path: root/server/src/routes/nodeinfo.rs
blob: 2b7135fba462b787b20e1b664bc683fc1c3b55d9 (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
use crate::db::establish_connection;
use crate::db::site_view::SiteView;
use crate::version;
use crate::Settings;
use actix_web::body::Body;
use actix_web::web;
use actix_web::HttpResponse;
use serde_json::json;

pub fn config(cfg: &mut web::ServiceConfig) {
  cfg
    .route("/nodeinfo/2.0.json", web::get().to(node_info))
    .route("/.well-known/nodeinfo", web::get().to(node_info_well_known));
}

async fn node_info_well_known() -> HttpResponse<Body> {
  let json = json!({
    "links": {
      "rel": "http://nodeinfo.diaspora.software/ns/schema/2.0",
      "href": format!("https://{}/nodeinfo/2.0.json", Settings::get().hostname),
    }
  });

  HttpResponse::Ok()
    .content_type("application/json")
    .body(json.to_string())
}

async fn node_info() -> HttpResponse<Body> {
  let conn = establish_connection();
  let site_view = match SiteView::read(&conn) {
    Ok(site_view) => site_view,
    Err(_e) => return HttpResponse::InternalServerError().finish(),
  };
  let protocols = if Settings::get().federation_enabled {
    vec!["activitypub"]
  } else {
    vec![]
  };
  let json = json!({
    "version": "2.0",
    "software": {
      "name": "lemmy",
      "version": version::VERSION,
    },
    "protocols": protocols,
    "usage": {
      "users": {
        "total": site_view.number_of_users
      },
      "localPosts": site_view.number_of_posts,
      "localComments": site_view.number_of_comments,
      "openRegistrations": site_view.open_registration,
      }
  });
  HttpResponse::Ok()
    .content_type("application/json")
    .body(json.to_string())
}