1
0
Fork 0
mirror of https://gitlab.com/famedly/conduit.git synced 2025-07-02 16:38:36 +00:00
conduit/src/database/appservice.rs

87 lines
2.7 KiB
Rust
Raw Normal View History

use crate::{utils, Error, Result};
2021-01-26 21:53:03 -05:00
use std::{
collections::HashMap,
sync::{Arc, RwLock},
};
2021-06-08 18:10:00 +02:00
use super::abstraction::Tree;
pub struct Appservice {
pub(super) cached_registrations: Arc<RwLock<HashMap<String, serde_yaml::Value>>>,
2021-06-08 18:10:00 +02:00
pub(super) id_appserviceregistrations: Arc<dyn Tree>,
}
impl Appservice {
pub fn register_appservice(&self, yaml: serde_yaml::Value) -> Result<Option<String>> {
// TODO: Rumaify
let id = yaml.get("id").unwrap().as_str().unwrap();
2021-06-08 18:10:00 +02:00
self.id_appserviceregistrations.insert(
id.as_bytes(),
serde_yaml::to_string(&yaml).unwrap().as_bytes(),
)?;
self.cached_registrations
.write()
.unwrap()
.insert(id.to_owned(), yaml);
Ok(Some(id.to_owned()))
}
/// Remove an appservice registration
2022-01-13 12:26:23 +01:00
///
/// # Arguments
2022-01-13 12:26:23 +01:00
///
/// * `service_name` - the name you send to register the service previously
2021-12-20 15:46:36 +01:00
pub fn unregister_appservice(&self, service_name: &str) -> Result<()> {
self.id_appserviceregistrations
.remove(service_name.as_bytes())?;
2022-01-13 12:26:23 +01:00
self.cached_registrations
.write()
.unwrap()
.remove(service_name);
2021-12-20 15:46:36 +01:00
Ok(())
}
pub fn get_registration(&self, id: &str) -> Result<Option<serde_yaml::Value>> {
self.cached_registrations
.read()
.unwrap()
.get(id)
.map_or_else(
|| {
2021-06-17 20:34:14 +02:00
self.id_appserviceregistrations
2021-06-08 18:10:00 +02:00
.get(id.as_bytes())?
.map(|bytes| {
2021-06-17 20:34:14 +02:00
serde_yaml::from_slice(&bytes).map_err(|_| {
Error::bad_database(
"Invalid registration bytes in id_appserviceregistrations.",
)
2021-06-17 20:34:14 +02:00
})
})
2021-06-17 20:34:14 +02:00
.transpose()
},
|r| Ok(Some(r.clone())),
)
}
pub fn iter_ids(&self) -> Result<impl Iterator<Item = Result<String>> + '_> {
2021-06-08 18:10:00 +02:00
Ok(self.id_appserviceregistrations.iter().map(|(id, _)| {
2021-06-17 20:34:14 +02:00
utils::string_from_bytes(&id)
.map_err(|_| Error::bad_database("Invalid id bytes in id_appserviceregistrations."))
2021-06-08 18:10:00 +02:00
}))
}
pub fn all(&self) -> Result<Vec<(String, serde_yaml::Value)>> {
self.iter_ids()?
.filter_map(|id| id.ok())
.map(move |id| {
Ok((
id.clone(),
self.get_registration(&id)?
.expect("iter_ids only returns appservices that exist"),
))
})
.collect()
}
}