use crate::database::*;

use mongodb::bson::{doc, from_bson, from_document, Bson};
use rauth::auth::Session;
use rocket::http::Status;
use rocket::request::{self, FromRequest, Outcome, Request};

#[rocket::async_trait]
impl<'a, 'r> FromRequest<'a, 'r> for User {
    type Error = rauth::util::Error;

    async fn from_request(request: &'a Request<'r>) -> request::Outcome<Self, Self::Error> {
        let session: Session = try_outcome!(request.guard::<Session>().await);

        if let Ok(result) = get_collection("users")
            .find_one(
                doc! {
                    "_id": &session.user_id
                },
                None,
            )
            .await
        {
            if let Some(doc) = result {
                Outcome::Success(from_document(doc).unwrap())
            } else {
                Outcome::Failure((Status::Forbidden, rauth::util::Error::InvalidSession))
            }
        } else {
            Outcome::Failure((
                Status::InternalServerError,
                rauth::util::Error::DatabaseError,
            ))
        }
    }
}