atproto blogging
1//! Well-known endpoints for site.standard compatibility.
2
3use crate::host_mode::CustomDomainContext;
4use axum::{Json, http::StatusCode};
5use jacquard::smol_str::{SmolStr, format_smolstr};
6use serde::Serialize;
7
8/// Well-known publication response per site.standard spec.
9#[derive(Debug, Clone, Serialize)]
10#[serde(rename_all = "camelCase")]
11pub struct WellKnownPublication {
12 pub publication_uri: SmolStr,
13 pub name: SmolStr,
14 pub url: SmolStr,
15}
16
17/// Handle /.well-known/site.standard.publication
18///
19/// Returns publication info for the current custom domain.
20/// This handler expects CustomDomainContext to be set by middleware.
21pub async fn well_known_publication(
22 ctx: Option<axum::Extension<CustomDomainContext>>,
23) -> Result<Json<WellKnownPublication>, StatusCode> {
24 let ctx = ctx.ok_or(StatusCode::NOT_FOUND)?;
25
26 let publication_uri = format_smolstr!(
27 "at://{}/site.standard.publication/{}",
28 ctx.owner,
29 ctx.publication_rkey
30 );
31
32 Ok(Json(WellKnownPublication {
33 publication_uri,
34 name: ctx.publication_name.clone(),
35 url: format_smolstr!("https://{}", ctx.domain),
36 }))
37}