-use actix_web::{body::Body, error::ErrorBadRequest, *};
+use actix_web::{error::ErrorBadRequest, web, Error, HttpResponse, Result};
use anyhow::anyhow;
-use lemmy_api_common::blocking;
-use lemmy_db_views::site_view::SiteView;
-use lemmy_utils::{settings::structs::Settings, version, LemmyError};
-use lemmy_websocket::LemmyContext;
+use lemmy_api_common::context::LemmyContext;
+use lemmy_db_schema::RegistrationMode;
+use lemmy_db_views::structs::SiteView;
+use lemmy_utils::{error::LemmyError, version};
use serde::{Deserialize, Serialize};
use url::Url;
.route("/.well-known/nodeinfo", web::get().to(node_info_well_known));
}
-async fn node_info_well_known() -> Result<HttpResponse<Body>, LemmyError> {
+async fn node_info_well_known(
+ context: web::Data<LemmyContext>,
+) -> Result<HttpResponse, LemmyError> {
let node_info = NodeInfoWellKnown {
- links: NodeInfoWellKnownLinks {
+ links: vec![NodeInfoWellKnownLinks {
rel: Url::parse("http://nodeinfo.diaspora.software/ns/schema/2.0")?,
href: Url::parse(&format!(
"{}/nodeinfo/2.0.json",
- Settings::get().get_protocol_and_hostname()
+ &context.settings().get_protocol_and_hostname(),
))?,
- },
+ }],
};
Ok(HttpResponse::Ok().json(node_info))
}
async fn node_info(context: web::Data<LemmyContext>) -> Result<HttpResponse, Error> {
- let site_view = blocking(context.pool(), SiteView::read)
- .await?
+ let site_view = SiteView::read_local(&mut context.pool())
+ .await
.map_err(|_| ErrorBadRequest(LemmyError::from(anyhow!("not_found"))))?;
- let protocols = if Settings::get().federation.enabled {
- vec!["activitypub".to_string()]
+ let protocols = if site_view.local_site.federation_enabled {
+ Some(vec!["activitypub".to_string()])
} else {
- vec![]
+ None
};
-
+ let open_registrations = Some(site_view.local_site.registration_mode == RegistrationMode::Open);
let json = NodeInfo {
- version: "2.0".to_string(),
- software: NodeInfoSoftware {
- name: "lemmy".to_string(),
- version: version::VERSION.to_string(),
- },
+ version: Some("2.0".to_string()),
+ software: Some(NodeInfoSoftware {
+ name: Some("lemmy".to_string()),
+ version: Some(version::VERSION.to_string()),
+ }),
protocols,
- usage: NodeInfoUsage {
- users: NodeInfoUsers {
- total: site_view.counts.users,
- active_halfyear: site_view.counts.users_active_half_year,
- active_month: site_view.counts.users_active_month,
- },
- local_posts: site_view.counts.posts,
- local_comments: site_view.counts.comments,
- },
- open_registrations: site_view.site.open_registration,
+ usage: Some(NodeInfoUsage {
+ users: Some(NodeInfoUsers {
+ total: Some(site_view.counts.users),
+ active_halfyear: Some(site_view.counts.users_active_half_year),
+ active_month: Some(site_view.counts.users_active_month),
+ }),
+ local_posts: Some(site_view.counts.posts),
+ local_comments: Some(site_view.counts.comments),
+ }),
+ open_registrations,
};
Ok(HttpResponse::Ok().json(json))
#[derive(Serialize, Deserialize, Debug)]
struct NodeInfoWellKnown {
- pub links: NodeInfoWellKnownLinks,
+ pub links: Vec<NodeInfoWellKnownLinks>,
}
#[derive(Serialize, Deserialize, Debug)]
pub href: Url,
}
-#[derive(Serialize, Deserialize, Debug)]
-#[serde(rename_all = "camelCase")]
-struct NodeInfo {
- pub version: String,
- pub software: NodeInfoSoftware,
- pub protocols: Vec<String>,
- pub usage: NodeInfoUsage,
- pub open_registrations: bool,
+#[derive(Serialize, Deserialize, Debug, Default)]
+#[serde(rename_all = "camelCase", default)]
+pub struct NodeInfo {
+ pub version: Option<String>,
+ pub software: Option<NodeInfoSoftware>,
+ pub protocols: Option<Vec<String>>,
+ pub usage: Option<NodeInfoUsage>,
+ pub open_registrations: Option<bool>,
}
-#[derive(Serialize, Deserialize, Debug)]
-struct NodeInfoSoftware {
- pub name: String,
- pub version: String,
+#[derive(Serialize, Deserialize, Debug, Default)]
+#[serde(default)]
+pub struct NodeInfoSoftware {
+ pub name: Option<String>,
+ pub version: Option<String>,
}
-#[derive(Serialize, Deserialize, Debug)]
-#[serde(rename_all = "camelCase")]
-struct NodeInfoUsage {
- pub users: NodeInfoUsers,
- pub local_posts: i64,
- pub local_comments: i64,
+#[derive(Serialize, Deserialize, Debug, Default)]
+#[serde(rename_all = "camelCase", default)]
+pub struct NodeInfoUsage {
+ pub users: Option<NodeInfoUsers>,
+ pub local_posts: Option<i64>,
+ pub local_comments: Option<i64>,
}
-#[derive(Serialize, Deserialize, Debug)]
-#[serde(rename_all = "camelCase")]
-struct NodeInfoUsers {
- pub total: i64,
- pub active_halfyear: i64,
- pub active_month: i64,
+#[derive(Serialize, Deserialize, Debug, Default)]
+#[serde(rename_all = "camelCase", default)]
+pub struct NodeInfoUsers {
+ pub total: Option<i64>,
+ pub active_halfyear: Option<i64>,
+ pub active_month: Option<i64>,
}