at main 37 lines 1.2 kB view raw
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}