use actionable::{Action, Identifier, ResourceName};
use serde::{Deserialize, Serialize};
use crate::connection::AuthenticationMethod;
use crate::document::{DocumentId, KeyId};
use crate::schema::{CollectionName, ViewName};
#[must_use]
pub fn bonsaidb_resource_name<'a>() -> ResourceName<'a> {
ResourceName::named("bonsaidb")
}
#[must_use]
pub fn database_resource_name<'a>(name: impl Into<Identifier<'a>>) -> ResourceName<'a> {
bonsaidb_resource_name().and(name)
}
#[must_use]
pub fn collection_resource_name<'a>(
database: impl Into<Identifier<'a>>,
collection: &CollectionName,
) -> ResourceName<'a> {
database_resource_name(database).and(collection.to_string())
}
#[must_use]
pub fn document_resource_name<'a>(
database: impl Into<Identifier<'a>>,
collection: &CollectionName,
id: &'a DocumentId,
) -> ResourceName<'a> {
collection_resource_name(database, collection)
.and("document")
.and(id)
}
#[must_use]
pub fn view_resource_name<'a>(database: &'a str, view: &'a ViewName) -> ResourceName<'a> {
database_resource_name(database)
.and(view.collection.to_string())
.and("view")
.and(view.name.as_ref())
}
#[must_use]
pub fn pubsub_topic_resource_name<'a>(database: &'a str, topic: &'a [u8]) -> ResourceName<'a> {
database_resource_name(database).and("pubsub").and(topic)
}
#[must_use]
pub fn kv_resource_name(database: &str) -> ResourceName<'_> {
database_resource_name(database).and("keyvalue")
}
#[must_use]
pub fn keyvalue_key_resource_name<'a>(
database: &'a str,
namespace: Option<&'a str>,
key: &'a str,
) -> ResourceName<'a> {
kv_resource_name(database)
.and(namespace.unwrap_or(""))
.and(key)
}
#[must_use]
pub fn encryption_key_resource_name(key_id: &KeyId) -> ResourceName<'_> {
bonsaidb_resource_name()
.and("vault")
.and("key")
.and(match key_id {
KeyId::Master => "_master",
KeyId::Id(id) => id.as_ref(),
KeyId::None => unreachable!(),
})
}
#[must_use]
pub fn user_resource_name<'a>(user_id: u64) -> ResourceName<'a> {
bonsaidb_resource_name().and("user").and(user_id)
}
#[must_use]
pub fn role_resource_name<'a>(role_id: u64) -> ResourceName<'a> {
bonsaidb_resource_name().and("role").and(role_id)
}
#[must_use]
pub fn authentication_token_resource_name<'a>(token_id: u64) -> ResourceName<'a> {
bonsaidb_resource_name()
.and("authentication-token")
.and(token_id)
}
#[derive(Action, Serialize, Deserialize, Clone, Copy, Debug)]
pub enum BonsaiAction {
Server(ServerAction),
Database(DatabaseAction),
}
#[derive(Action, Serialize, Deserialize, Clone, Copy, Debug)]
pub enum ServerAction {
Connect,
ListAvailableSchemas,
ListDatabases,
CreateDatabase,
DeleteDatabase,
CreateUser,
DeleteUser,
SetPassword,
Authenticate(AuthenticationMethod),
AssumeIdentity,
ModifyUserPermissionGroups,
ModifyUserRoles,
}
#[derive(Action, Serialize, Deserialize, Clone, Copy, Debug)]
pub enum DatabaseAction {
Compact,
Document(DocumentAction),
View(ViewAction),
Transaction(TransactionAction),
PubSub(PubSubAction),
KeyValue(KeyValueAction),
}
#[derive(Action, Serialize, Deserialize, Clone, Copy, Debug)]
pub enum DocumentAction {
Get,
List,
ListHeaders,
Count,
Insert,
Update,
Overwrite,
Delete,
}
#[derive(Action, Serialize, Deserialize, Clone, Copy, Debug)]
pub enum ViewAction {
Query,
Reduce,
DeleteDocs,
}
#[derive(Action, Serialize, Deserialize, Clone, Copy, Debug)]
pub enum TransactionAction {
ListExecuted,
GetLastId,
}
#[derive(Action, Serialize, Deserialize, Clone, Copy, Debug)]
pub enum PubSubAction {
CreateSuscriber,
Publish,
SubscribeTo,
UnsubscribeFrom,
}
#[derive(Action, Serialize, Deserialize, Clone, Copy, Debug)]
pub enum KeyValueAction {
ExecuteOperation,
}
#[derive(Action, Serialize, Deserialize, Clone, Copy, Debug)]
pub enum EncryptionKeyAction {
Encrypt,
Decrypt,
}