surrealdb_core/sql/statements/remove/
user.rs1use crate::ctx::Context;
2use crate::dbs::Options;
3use crate::err::Error;
4use crate::iam::{Action, ResourceKind};
5use crate::sql::{Base, Ident, Value};
6
7use revision::revisioned;
8use serde::{Deserialize, Serialize};
9use std::fmt::{self, Display, Formatter};
10
11#[revisioned(revision = 2)]
12#[derive(Clone, Debug, Default, Eq, PartialEq, PartialOrd, Serialize, Deserialize, Hash)]
13#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
14#[non_exhaustive]
15pub struct RemoveUserStatement {
16 pub name: Ident,
17 pub base: Base,
18 #[revision(start = 2)]
19 pub if_exists: bool,
20}
21
22impl RemoveUserStatement {
23 pub(crate) async fn compute(&self, ctx: &Context, opt: &Options) -> Result<Value, Error> {
25 let future = async {
26 opt.is_allowed(Action::Edit, ResourceKind::Actor, &self.base)?;
28 match self.base {
30 Base::Root => {
31 let txn = ctx.tx();
33 let us = txn.get_root_user(&self.name).await?;
35 let key = crate::key::root::us::new(&us.name);
37 txn.del(key).await?;
38 txn.clear();
40 Ok(Value::None)
42 }
43 Base::Ns => {
44 let txn = ctx.tx();
46 let us = txn.get_ns_user(opt.ns()?, &self.name).await?;
48 let key = crate::key::namespace::us::new(opt.ns()?, &us.name);
50 txn.del(key).await?;
51 txn.clear();
53 Ok(Value::None)
55 }
56 Base::Db => {
57 let txn = ctx.tx();
59 let (ns, db) = opt.ns_db()?;
61 let us = txn.get_db_user(ns, db, &self.name).await?;
62 let key = crate::key::database::us::new(ns, db, &us.name);
64 txn.del(key).await?;
65 txn.clear();
67 Ok(Value::None)
69 }
70 _ => Err(Error::InvalidLevel(self.base.to_string())),
71 }
72 }
73 .await;
74 match future {
75 Err(e) if self.if_exists => match e {
76 Error::UserRootNotFound {
77 ..
78 } => Ok(Value::None),
79 Error::UserNsNotFound {
80 ..
81 } => Ok(Value::None),
82 Error::UserDbNotFound {
83 ..
84 } => Ok(Value::None),
85 e => Err(e),
86 },
87 v => v,
88 }
89 }
90}
91
92impl Display for RemoveUserStatement {
93 fn fmt(&self, f: &mut Formatter) -> fmt::Result {
94 write!(f, "REMOVE USER")?;
95 if self.if_exists {
96 write!(f, " IF EXISTS")?
97 }
98 write!(f, " {} ON {}", self.name, self.base)?;
99 Ok(())
100 }
101}