use nostr::{Event, FromBech32, PublicKey}; use nostr::prelude::Nip19; use rocket::{Route, State}; use rocket::http::Status; use rocket::serde::json::Json; use crate::store::SledDatabase; pub fn routes() -> Vec { routes![import_event, get_event, get_event_by_kind] } #[rocket::post("/event", data = "")] async fn import_event( db: &State, data: Json, ) -> Status { if data.verify().is_err() { return Status::InternalServerError; } if let Ok(v) = db.save_event(&data).await { match v { true => Status::Ok, false => Status::Conflict } } else { Status::InternalServerError } } #[rocket::get("/event/")] fn get_event( db: &State, id: &str, ) -> Option> { let id = match Nip19::from_bech32(id) { Ok(i) => i, _ => return None }; match db.event_by_id(&id) { Ok(ev) => Some(Json::from(ev)), _ => None } } #[rocket::get("/event//")] fn get_event_by_kind( db: &State, kind: u32, pubkey: &str, ) -> Option> { let pk = match PublicKey::parse(pubkey) { Ok(i) => i, _ => return None }; match db.event_by_kind_pubkey(kind, &pk) { Ok(ev) => Some(Json::from(ev)), _ => None } }