1use super::core::*;
2use miette::IntoDiagnostic;
3use native_db::*;
4use native_model::{native_model, Model};
5use serde::{Deserialize, Serialize};
6
7#[derive(Serialize, Deserialize, Debug, Clone)]
8#[native_model(id = 3, version = 1)]
9#[native_db(
10 primary_key(primary_key -> (Vec<u8>, Vec<u8>))
11)]
12pub struct ReplicaAnnouncement {
14 #[primary_key]
16 pub key: Vec<u8>,
17 pub signature: Vec<u8>,
19}
20
21impl OkuDatabase {
22 pub fn upsert_announcement(
32 &self,
33 announcement: &ReplicaAnnouncement,
34 ) -> miette::Result<Option<ReplicaAnnouncement>> {
35 let rw = self.database.rw_transaction().into_diagnostic()?;
36 let old_value: Option<ReplicaAnnouncement> =
37 rw.upsert(announcement.to_owned()).into_diagnostic()?;
38 rw.commit().into_diagnostic()?;
39 Ok(old_value)
40 }
41
42 pub fn upsert_announcements(
52 &self,
53 announcements: &[ReplicaAnnouncement],
54 ) -> miette::Result<Vec<Option<ReplicaAnnouncement>>> {
55 let rw = self.database.rw_transaction().into_diagnostic()?;
56 let old_announcements: Vec<_> = announcements
57 .iter()
58 .cloned()
59 .filter_map(|announcement| rw.upsert(announcement).ok())
60 .collect();
61 rw.commit().into_diagnostic()?;
62 Ok(old_announcements)
63 }
64
65 pub fn delete_announcement(
75 &self,
76 announcement: &ReplicaAnnouncement,
77 ) -> miette::Result<ReplicaAnnouncement> {
78 let rw = self.database.rw_transaction().into_diagnostic()?;
79 let removed_announcement = rw.remove(announcement.to_owned()).into_diagnostic()?;
80 rw.commit().into_diagnostic()?;
81 Ok(removed_announcement)
82 }
83
84 pub fn delete_announcements(
94 &self,
95 announcements: &[ReplicaAnnouncement],
96 ) -> miette::Result<Vec<ReplicaAnnouncement>> {
97 let rw = self.database.rw_transaction().into_diagnostic()?;
98 let removed_announcements = announcements
99 .iter()
100 .filter_map(|announcement| rw.remove(announcement.to_owned()).ok())
101 .collect();
102 rw.commit().into_diagnostic()?;
103 Ok(removed_announcements)
104 }
105
106 pub fn get_announcements(&self) -> miette::Result<Vec<ReplicaAnnouncement>> {
112 let r = self.database.r_transaction().into_diagnostic()?;
113 r.scan()
114 .primary()
115 .into_diagnostic()?
116 .all()
117 .into_diagnostic()?
118 .collect::<Result<Vec<_>, _>>()
119 .into_diagnostic()
120 }
121
122 pub fn get_announcement(&self, key: &Vec<u8>) -> miette::Result<Option<ReplicaAnnouncement>> {
132 let r = self.database.r_transaction().into_diagnostic()?;
133 r.get().primary(key.to_owned()).into_diagnostic()
134 }
135}