use crate::{
data::{Agent, Person},
db::actor::find_person,
emit_response,
lrs::{headers::Headers, resources::WithResource, User, DB},
MyError,
};
use rocket::{get, http::Status, routes, State};
use sqlx::PgPool;
use std::str::FromStr;
use tracing::{debug, info};
#[doc(hidden)]
pub fn routes() -> Vec<rocket::Route> {
routes![get]
}
#[get("/?<agent>")]
async fn get(
c: Headers,
agent: &str,
db: &State<DB>,
user: User,
) -> Result<WithResource<Person>, MyError> {
debug!("----- get ----- {}", user);
user.can_use_xapi()?;
let agent =
Agent::from_str(agent).map_err(|x| MyError::Data(x).with_status(Status::BadRequest))?;
debug!("agent = {}", agent);
let resource = get_resource(db.pool(), &agent).await?;
debug!("resource = {}", resource);
emit_response!(c, resource => Person)
}
async fn get_resource(conn: &PgPool, agent: &Agent) -> Result<Person, MyError> {
let x = find_person(conn, agent).await?;
match x {
None => {
info!("No known Person");
Ok(Person::unknown())
}
Some(x) => Ok(x),
}
}