use crate::ctx::Context;
use crate::iam::Auth;
use crate::iam::{Level, Role};
use crate::sql::value::Value;
use std::sync::Arc;
#[derive(Clone, Debug, Default, Eq, PartialEq)]
pub struct Session {
pub au: Arc<Auth>,
pub rt: bool,
pub ip: Option<String>,
pub or: Option<String>,
pub id: Option<String>,
pub ns: Option<String>,
pub db: Option<String>,
pub sc: Option<String>,
pub tk: Option<Value>,
pub sd: Option<Value>,
}
impl Session {
pub fn with_ns(mut self, ns: &str) -> Session {
self.ns = Some(ns.to_owned());
self
}
pub fn with_db(mut self, db: &str) -> Session {
self.db = Some(db.to_owned());
self
}
pub fn with_sc(mut self, sc: &str) -> Session {
self.sc = Some(sc.to_owned());
self
}
pub fn with_rt(mut self, rt: bool) -> Session {
self.rt = rt;
self
}
pub(crate) fn ns(&self) -> Option<Arc<str>> {
self.ns.as_deref().map(Into::into)
}
pub(crate) fn db(&self) -> Option<Arc<str>> {
self.db.as_deref().map(Into::into)
}
pub(crate) fn live(&self) -> bool {
self.rt
}
pub(crate) fn context<'a>(&self, mut ctx: Context<'a>) -> Context<'a> {
let val: Value = self.sd.to_owned().into();
ctx.add_value("auth", val);
let val: Value = self.sc.to_owned().into();
ctx.add_value("scope", val);
let val: Value = self.tk.to_owned().into();
ctx.add_value("token", val);
let val: Value = Value::from(map! {
"db".to_string() => self.db.to_owned().into(),
"id".to_string() => self.id.to_owned().into(),
"ip".to_string() => self.ip.to_owned().into(),
"ns".to_string() => self.ns.to_owned().into(),
"or".to_string() => self.or.to_owned().into(),
"sc".to_string() => self.sc.to_owned().into(),
"sd".to_string() => self.sd.to_owned().into(),
"tk".to_string() => self.tk.to_owned().into(),
});
ctx.add_value("session", val);
ctx
}
pub fn for_level(level: Level, role: Role) -> Session {
let mut sess = Session::default();
match level {
Level::Root => {
sess.au = Arc::new(Auth::for_root(role));
}
Level::Namespace(ns) => {
sess.au = Arc::new(Auth::for_ns(role, &ns));
sess.ns = Some(ns);
}
Level::Database(ns, db) => {
sess.au = Arc::new(Auth::for_db(role, &ns, &db));
sess.ns = Some(ns);
sess.db = Some(db);
}
_ => {}
}
sess
}
pub fn for_scope(ns: &str, db: &str, sc: &str, rid: Value) -> Session {
Session {
au: Arc::new(Auth::for_sc(rid.to_string(), ns, db, sc)),
rt: false,
ip: None,
or: None,
id: None,
ns: Some(ns.to_owned()),
db: Some(db.to_owned()),
sc: Some(sc.to_owned()),
tk: None,
sd: Some(rid),
}
}
pub fn owner() -> Session {
Session::for_level(Level::Root, Role::Owner)
}
pub fn editor() -> Session {
Session::for_level(Level::Root, Role::Editor)
}
pub fn viewer() -> Session {
Session::for_level(Level::Root, Role::Viewer)
}
}