use std::future::{ready, Ready};
use actix_web::dev::Payload;
use actix_web::{FromRequest, HttpRequest};
use actix_session::Session;
use actix_session::SessionExt;
use actix_session::{SessionGetError, SessionInsertError};
use crate::core::auth0::UserId;
pub struct TypedSession(pub Session);
impl FromRequest for TypedSession {
type Error = <Session as FromRequest>::Error;
type Future = Ready<Result<TypedSession, Self::Error>>;
fn from_request(req: &HttpRequest, _payload: &mut Payload) -> Self::Future {
ready(Ok(TypedSession(req.get_session())))
}
}
impl TypedSession {
const USER_ID_KEY: &'static str = "user_id";
const USER_LOGIN_FROM_PAGE: &'static str = "login_from_page";
pub fn renew(&self) -> &Self {
self.0.renew();
self
}
pub fn insert_user_id(&self, user_id: UserId) -> Result<(), SessionInsertError> {
self.0.insert(Self::USER_ID_KEY, user_id)
}
pub fn get_user_id(&self) -> Result<Option<UserId>, SessionGetError> {
self.0.get(Self::USER_ID_KEY)
}
pub fn insert_login_from_page(&self, value: &str) -> Result<(), SessionInsertError> {
log::info!("insert_login_from_page={}", value);
self.0.insert(Self::USER_LOGIN_FROM_PAGE, value)
}
pub fn get_login_from_page(&self) -> Result<Option<String>, SessionGetError> {
self.0.get(Self::USER_LOGIN_FROM_PAGE)
}
pub fn log_out(self) {
self.0.purge()
}
}