Skip to content

Commit f8134d6

Browse files
committed
fu: add database schema v1 for subscription to support future migrations
1 parent 7fb6a43 commit f8134d6

File tree

5 files changed

+70
-7
lines changed

5 files changed

+70
-7
lines changed

common/src/database/redis.rs

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ use crate::heartbeat::{HeartbeatData, HeartbeatKey, HeartbeatValue, HeartbeatsCa
4141
use crate::subscription::{
4242
SubscriptionData, SubscriptionMachine, SubscriptionMachineState, SubscriptionStatsCounters
4343
};
44+
use crate::database::schema::redis::v1::subscription::*;
4445
use futures_util::stream::StreamExt;
4546

4647
use super::schema::{Migration, MigrationBase, Version};
@@ -440,11 +441,11 @@ impl Database for RedisDatabase {
440441
let mut subscriptions = Vec::new();
441442

442443
for key in keys {
443-
let subscription_json: Option<String> = conn.get(&key).await.context("Failed to get subscription data")?;
444+
let subscription_redis_data: Option<String> = conn.get(&key).await.context("Failed to get subscription data")?;
444445

445-
if let Some(subscription_json) = subscription_json {
446-
match serde_json::from_str::<SubscriptionData>(&subscription_json) {
447-
Ok(subscription) => subscriptions.push(subscription),
446+
if let Some(subscription_redis_data) = subscription_redis_data {
447+
match serde_json::from_str::<SubscriptionRedisData>(&subscription_redis_data) {
448+
Ok(subscription) => subscriptions.push(subscription.into_subscription_data()),
448449
Err(err) => {
449450
log::warn!("Failed to deserialize subscription data for key {}: {}", key, err);
450451
}
@@ -473,8 +474,8 @@ impl Database for RedisDatabase {
473474
if !filtered.is_empty() {
474475
let result: Option<String> = conn.get(&filtered[0]).await.context("Failed to get subscription data")?;
475476
if result.is_some() {
476-
let subscription: SubscriptionData = serde_json::from_str(&result.unwrap()).context("Failed to deserialize subscription data")?;
477-
return Ok(Some(subscription));
477+
let subscription_redis_data: SubscriptionRedisData = serde_json::from_str(&result.unwrap()).context("Failed to deserialize subscription data")?;
478+
return Ok(Some(subscription_redis_data.into_subscription_data()));
478479
}
479480
}
480481
Ok(None)
@@ -489,8 +490,11 @@ impl Database for RedisDatabase {
489490
let _:() = conn.del(keys).await?;
490491
}
491492

493+
494+
let subscription_redis_data = SubscriptionRedisData::from_subscription_data(subscription);
495+
492496
let key = format!("{}:{}:{}", RedisDomain::Subscription, subscription.uuid().to_string().to_uppercase(), subscription.name());
493-
let value = serde_json::to_string(subscription).context("Failed to serialize subscription data")?;
497+
let value = serde_json::to_string(&subscription_redis_data).context("Failed to serialize subscription data")?;
494498
let _ : String = conn.set(key, value).await.context("Failed to store subscription data")?;
495499
Ok(())
496500
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
use crate::database::redis::RedisDatabase;
22

3+
pub mod v1;
4+
35
pub fn register_migrations(_redis_db: &mut RedisDatabase) {
46
// for future changes
57
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
pub mod subscription;
2+
3+
pub const VERSION: &str = module_path!();
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
use serde::{Deserialize, Serialize};
2+
use crate::subscription::*;
3+
4+
use super::VERSION;
5+
6+
#[derive(Debug, PartialEq, Clone, Eq, Serialize, Deserialize)]
7+
pub struct SubscriptionRedisData {
8+
version: String,
9+
uuid: SubscriptionUuid,
10+
internal_version: InternalVersion,
11+
revision: Option<String>,
12+
uri: Option<String>,
13+
enabled: bool,
14+
princs_filter: PrincsFilter,
15+
parameters: SubscriptionParameters,
16+
outputs: Vec<SubscriptionOutput>,
17+
}
18+
19+
impl SubscriptionRedisData {
20+
pub fn from_subscription_data(from: &SubscriptionData) -> Self {
21+
Self {
22+
version: VERSION.to_string(),
23+
uuid: *from.uuid(),
24+
internal_version: from.internal_version(),
25+
revision: from.revision().cloned(),
26+
uri: from.uri().cloned(),
27+
enabled: from.enabled(),
28+
princs_filter: from.princs_filter().clone(),
29+
parameters: from.parameters().clone(),
30+
outputs: from.outputs().to_vec(),
31+
}
32+
}
33+
pub fn into_subscription_data(self) -> SubscriptionData {
34+
let mut sd = SubscriptionData::new(&self.parameters.name, &self.parameters.query);
35+
sd.set_revision(self.revision).
36+
set_uuid(self.uuid).
37+
set_uri(self.uri).
38+
set_enabled(self.enabled).
39+
set_princs_filter(self.princs_filter).
40+
set_parameters(self.parameters).
41+
set_outputs(self.outputs);
42+
sd.set_internal_version(self.internal_version);
43+
sd
44+
}
45+
}

common/src/subscription.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -661,6 +661,15 @@ impl SubscriptionData {
661661
Ok(PublicVersion(Uuid::from_u64_pair(result, result)))
662662
}
663663

664+
pub fn parameters(&self) -> &SubscriptionParameters {
665+
&self.parameters
666+
}
667+
668+
pub fn set_parameters(&mut self, parameters: SubscriptionParameters) -> &mut SubscriptionData {
669+
self.parameters = parameters;
670+
self
671+
}
672+
664673
/// Get a reference to the subscription's name.
665674
pub fn name(&self) -> &str {
666675
self.parameters.name.as_ref()

0 commit comments

Comments
 (0)