summaryrefslogtreecommitdiff
path: root/src/database/key_value/pusher.rs
blob: 50a6faca7c2e44a23728bf9280a83b9ff1af2bd0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
use ruma::{
    api::client::push::{set_pusher, Pusher},
    UserId,
};

use crate::{database::KeyValueDatabase, service, utils, Error, Result};

impl service::pusher::Data for KeyValueDatabase {
    fn set_pusher(&self, sender: &UserId, pusher: set_pusher::v3::PusherAction) -> Result<()> {
        match &pusher {
            set_pusher::v3::PusherAction::Post(data) => {
                let mut key = sender.as_bytes().to_vec();
                key.push(0xff);
                key.extend_from_slice(data.pusher.ids.pushkey.as_bytes());
                self.senderkey_pusher.insert(
                    &key,
                    &serde_json::to_vec(&pusher).expect("Pusher is valid JSON value"),
                )?;
                Ok(())
            }
            set_pusher::v3::PusherAction::Delete(ids) => {
                let mut key = sender.as_bytes().to_vec();
                key.push(0xff);
                key.extend_from_slice(ids.pushkey.as_bytes());
                self.senderkey_pusher
                    .remove(&key)
                    .map(|_| ())
                    .map_err(Into::into)
            }
        }
    }

    fn get_pusher(&self, sender: &UserId, pushkey: &str) -> Result<Option<Pusher>> {
        let mut senderkey = sender.as_bytes().to_vec();
        senderkey.push(0xff);
        senderkey.extend_from_slice(pushkey.as_bytes());

        self.senderkey_pusher
            .get(&senderkey)?
            .map(|push| {
                serde_json::from_slice(&push)
                    .map_err(|_| Error::bad_database("Invalid Pusher in db."))
            })
            .transpose()
    }

    fn get_pushers(&self, sender: &UserId) -> Result<Vec<Pusher>> {
        let mut prefix = sender.as_bytes().to_vec();
        prefix.push(0xff);

        self.senderkey_pusher
            .scan_prefix(prefix)
            .map(|(_, push)| {
                serde_json::from_slice(&push)
                    .map_err(|_| Error::bad_database("Invalid Pusher in db."))
            })
            .collect()
    }

    fn get_pushkeys<'a>(
        &'a self,
        sender: &UserId,
    ) -> Box<dyn Iterator<Item = Result<String>> + 'a> {
        let mut prefix = sender.as_bytes().to_vec();
        prefix.push(0xff);

        Box::new(self.senderkey_pusher.scan_prefix(prefix).map(|(k, _)| {
            let mut parts = k.splitn(2, |&b| b == 0xff);
            let _senderkey = parts.next();
            let push_key = parts
                .next()
                .ok_or_else(|| Error::bad_database("Invalid senderkey_pusher in db"))?;
            let push_key_string = utils::string_from_bytes(push_key)
                .map_err(|_| Error::bad_database("Invalid pusher bytes in senderkey_pusher"))?;

            Ok(push_key_string)
        }))
    }
}