use serde_json::Value as JsonValue;
use std::collections::HashMap;
use std::sync::atomic::AtomicUsize;
pub use super::auth::ScriptUser;
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct Service {
#[serde(rename = "_key")]
pub key: String,
pub name: String,
pub description: Option<String>,
pub version: Option<String>,
pub database: String,
#[serde(default = "default_enabled")]
pub enabled: bool,
#[serde(default = "default_require_auth")]
pub require_auth: bool,
pub created_at: String,
pub updated_at: String,
}
fn default_enabled() -> bool {
true
}
fn default_require_auth() -> bool {
true
}
#[derive(Debug, Clone)]
pub struct ScriptContext {
pub method: String,
pub path: String,
pub query_params: HashMap<String, String>,
pub params: HashMap<String, String>,
pub headers: HashMap<String, String>,
pub body: Option<JsonValue>,
pub is_websocket: bool,
pub user: ScriptUser,
}
impl ScriptContext {
pub fn write_actor(&self) -> crate::storage::WriteActor {
crate::storage::WriteActor::client(self.user.authenticated && self.user.has_role("admin"))
}
pub fn query_principal(&self) -> crate::sdbql::QueryPrincipal {
if self.user.authenticated {
crate::sdbql::QueryPrincipal::from_roles(
self.user.username.clone(),
self.user.roles.clone(),
)
} else {
crate::sdbql::QueryPrincipal::anonymous()
}
}
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct Script {
#[serde(rename = "_key")]
pub key: String,
pub name: String,
pub methods: Vec<String>,
pub path: String,
#[serde(default = "default_database")]
pub database: String,
#[serde(default = "default_service")]
pub service: String,
pub collection: Option<String>,
pub code: String,
pub description: Option<String>,
pub created_at: String,
pub updated_at: String,
}
fn default_database() -> String {
"_system".to_string()
}
fn default_service() -> String {
"default".to_string()
}
#[derive(Debug, Default)]
pub struct ScriptStats {
pub active_scripts: AtomicUsize,
pub active_ws: AtomicUsize,
pub total_scripts_executed: AtomicUsize,
pub total_ws_connections: AtomicUsize,
}
pub(crate) struct ScriptDbName(pub String);
pub(crate) fn script_db_name(lua: &mlua::Lua) -> mlua::Result<String> {
lua.app_data_ref::<ScriptDbName>()
.map(|d| d.0.clone())
.ok_or_else(|| mlua::Error::RuntimeError("no database context for this script".to_string()))
}
#[derive(Debug)]
pub struct ScriptResult {
pub status: u16,
pub body: JsonValue,
pub headers: HashMap<String, String>,
pub raw_body: Option<Vec<u8>>,
}