···
-
use crate::TokenVerifier;
Endpoint, EndpointExt, Route, Server,
endpoint::{StaticFileEndpoint, make_sync},
-
middleware::{CatchPanic, Cors, SizeLimit, Tracing},
ApiResponse, ContactObject, ExternalDocumentObject, Object, OpenApi, OpenApiService,
···
use serde_json::{Value, json};
#[derive(Debug, SecurityScheme)]
···
-
struct GetBskyPrefsResponseObject {
/// at-uri for this record
-
impl Example for GetBskyPrefsResponseObject {
···
enum GetBskyPrefsResponse {
-
Ok(Json<GetBskyPrefsResponseObject>),
/// Bad request or no preferences to return
···
···
Err(e) => return GetBskyPrefsResponse::BadRequest(xrpc_error("boooo", e.to_string())),
log::info!("verified did: {did}/{aud}");
-
// TODO: fetch from storage
-
GetBskyPrefsResponse::Ok(Json(GetBskyPrefsResponseObject::example()))
/// com.bad-example.pocket.putPreferences
···
async fn pocket_put_prefs(
XrpcAuth(auth): XrpcAuth,
-
Json(prefs): Json<Value>,
) -> PutBskyPrefsResponse {
let (did, aud) = match self
···
log::info!("verified did: {did}/{aud}");
log::warn!("received prefs: {prefs:?}");
-
// TODO: put prefs into storage
-
PutBskyPrefsResponse::Ok(PlainText("hiiiiii".to_string()))
···
make_sync(move |_| doc.clone())
-
pub async fn serve(domain: &str) -> () {
let verifier = TokenVerifier::default();
-
let api_service = OpenApiService::new(Xrpc { verifier }, "Pocket", env!("CARGO_PKG_VERSION"))
-
.name("@microcosm.blue")
-
.url("https://bsky.app/profile/microcosm.blue"),
-
.description(include_str!("../api-description.md"))
-
.external_document(ExternalDocumentObject::new("https://microcosm.blue/pocket"));
.nest("/openapi", api_service.spec_endpoint())
.nest("/xrpc/", api_service)
.at("/.well-known/did.json", get_did_doc(domain))
.at("/", StaticFileEndpoint::new("./static/index.html"))
-
.with(SizeLimit::new(100 * 2_usize.pow(10)))
.allow_method(Method::GET)
···
+
use crate::{Storage, TokenVerifier};
Endpoint, EndpointExt, Route, Server,
endpoint::{StaticFileEndpoint, make_sync},
+
middleware::{CatchPanic, Cors, Tracing},
ApiResponse, ContactObject, ExternalDocumentObject, Object, OpenApi, OpenApiService,
···
use serde_json::{Value, json};
+
use std::sync::{Arc, Mutex};
#[derive(Debug, SecurityScheme)]
···
+
#[derive(Debug, Object)]
+
struct BskyPrefsObject {
/// at-uri for this record
+
impl Example for BskyPrefsObject {
···
enum GetBskyPrefsResponse {
+
Ok(Json<BskyPrefsObject>),
/// Bad request or no preferences to return
···
+
storage: Arc<Mutex<Storage>>,
···
Err(e) => return GetBskyPrefsResponse::BadRequest(xrpc_error("boooo", e.to_string())),
log::info!("verified did: {did}/{aud}");
+
let storage = self.storage.clone();
+
let Ok(Ok(res)) = tokio::task::spawn_blocking(move || {
+
.inspect_err(|e| log::error!("failed to get prefs: {e}"))
+
return GetBskyPrefsResponse::BadRequest(xrpc_error("boooo", "failed to get from db"));
+
let Some(serialized) = res else {
+
return GetBskyPrefsResponse::BadRequest(xrpc_error(
+
"could not find prefs for u",
+
let preferences = match serde_json::from_str(&serialized) {
+
log::error!("failed to deserialize prefs: {e}");
+
return GetBskyPrefsResponse::BadRequest(xrpc_error(
+
"failed to deserialize prefs",
+
GetBskyPrefsResponse::Ok(Json(BskyPrefsObject { preferences }))
/// com.bad-example.pocket.putPreferences
···
async fn pocket_put_prefs(
XrpcAuth(auth): XrpcAuth,
+
Json(prefs): Json<BskyPrefsObject>,
) -> PutBskyPrefsResponse {
let (did, aud) = match self
···
log::info!("verified did: {did}/{aud}");
log::warn!("received prefs: {prefs:?}");
+
let storage = self.storage.clone();
+
let serialized = prefs.preferences.to_string();
+
let Ok(Ok(())) = tokio::task::spawn_blocking(move || {
+
.put(&did, &aud, &serialized)
+
.inspect_err(|e| log::error!("failed to insert prefs: {e}"))
+
return PutBskyPrefsResponse::BadRequest(xrpc_error("boooo", "failed to put to db"));
+
PutBskyPrefsResponse::Ok(PlainText("saved.".to_string()))
···
make_sync(move |_| doc.clone())
+
pub async fn serve(domain: &str, storage: Storage) -> () {
let verifier = TokenVerifier::default();
+
let api_service = OpenApiService::new(
+
storage: Arc::new(Mutex::new(storage)),
+
env!("CARGO_PKG_VERSION"),
+
.name("@microcosm.blue")
+
.url("https://bsky.app/profile/microcosm.blue"),
+
.description(include_str!("../api-description.md"))
+
.external_document(ExternalDocumentObject::new("https://microcosm.blue/pocket"));
.nest("/openapi", api_service.spec_endpoint())
.nest("/xrpc/", api_service)
.at("/.well-known/did.json", get_did_doc(domain))
.at("/", StaticFileEndpoint::new("./static/index.html"))
.allow_method(Method::GET)