From 4ffec71c24ae27a6e1c1521c6a6e7eedcf3e40d7 Mon Sep 17 00:00:00 2001 From: silverpill Date: Sat, 28 May 2022 00:44:52 +0000 Subject: [PATCH] Send notification when subscription payment is received --- src/ethereum/subscriptions.rs | 14 +++++++++++++ src/mastodon_api/notifications/types.rs | 1 + src/models/notifications/queries.rs | 11 ++++++++++ src/models/notifications/types.rs | 27 ++++++++++++++----------- 4 files changed, 41 insertions(+), 12 deletions(-) diff --git a/src/ethereum/subscriptions.rs b/src/ethereum/subscriptions.rs index 9096b12..c8c0093 100644 --- a/src/ethereum/subscriptions.rs +++ b/src/ethereum/subscriptions.rs @@ -13,6 +13,7 @@ use web3::{ use crate::config::BlockchainConfig; use crate::database::{Pool, get_database_client}; use crate::errors::{ConversionError, DatabaseError}; +use crate::models::notifications::queries::create_subscription_notification; use crate::models::profiles::currencies::Currency; use crate::models::profiles::queries::search_profile_by_wallet_address; use crate::models::relationships::queries::unsubscribe; @@ -94,6 +95,14 @@ pub async fn check_subscriptions( &expires_at, &block_date, ).await?; + if expires_at > subscription.expires_at { + // Subscription was extended + create_subscription_notification( + db_client, + &subscription.sender_id, + &subscription.recipient_id, + ).await?; + }; log::info!( "subscription updated: {0} to {1}", subscription.sender_id, @@ -134,6 +143,11 @@ pub async fn check_subscriptions( &expires_at, &block_date, ).await?; + create_subscription_notification( + db_client, + &sender.id, + &recipient.id, + ).await?; log::info!( "subscription created: {0} to {1}", sender.id, diff --git a/src/mastodon_api/notifications/types.rs b/src/mastodon_api/notifications/types.rs index cd9fe28..4930a2c 100644 --- a/src/mastodon_api/notifications/types.rs +++ b/src/mastodon_api/notifications/types.rs @@ -46,6 +46,7 @@ impl ApiNotification { EventType::Reaction => "favourite", EventType::Mention => "mention", EventType::Repost => "reblog", + EventType::Subscription => "subscription", }; Self { id: notification.id.to_string(), diff --git a/src/models/notifications/queries.rs b/src/models/notifications/queries.rs index 6422971..a6b8be0 100644 --- a/src/models/notifications/queries.rs +++ b/src/models/notifications/queries.rs @@ -93,6 +93,17 @@ pub async fn create_repost_notification( ).await } +pub async fn create_subscription_notification( + db_client: &impl GenericClient, + sender_id: &Uuid, + recipient_id: &Uuid, +) -> Result<(), DatabaseError> { + create_notification( + db_client, sender_id, recipient_id, None, + EventType::Subscription, + ).await +} + pub async fn get_notifications( db_client: &impl GenericClient, recipient_id: &Uuid, diff --git a/src/models/notifications/types.rs b/src/models/notifications/types.rs index e29c89c..79dce50 100644 --- a/src/models/notifications/types.rs +++ b/src/models/notifications/types.rs @@ -11,18 +11,6 @@ use crate::models::attachments::types::DbMediaAttachment; use crate::models::posts::types::{DbPost, Post}; use crate::models::profiles::types::DbActorProfile; -#[allow(dead_code)] -#[derive(FromSql)] -#[postgres(name = "notification")] -struct DbNotification { - id: i32, - sender_id: Uuid, - recipient_id: Uuid, - post_id: Option, - event_type: EventType, - created_at: DateTime, -} - #[derive(Debug)] pub enum EventType { Follow, @@ -31,6 +19,7 @@ pub enum EventType { Reaction, Mention, Repost, + Subscription, } impl From<&EventType> for i16 { @@ -42,6 +31,7 @@ impl From<&EventType> for i16 { EventType::Reaction => 4, EventType::Mention => 5, EventType::Repost => 6, + EventType::Subscription => 7, } } } @@ -57,6 +47,7 @@ impl TryFrom for EventType { 4 => Self::Reaction, 5 => Self::Mention, 6 => Self::Repost, + 7 => Self::Subscription, _ => return Err(ConversionError), }; Ok(event_type) @@ -66,6 +57,18 @@ impl TryFrom for EventType { int_enum_from_sql!(EventType); int_enum_to_sql!(EventType); +#[allow(dead_code)] +#[derive(FromSql)] +#[postgres(name = "notification")] +struct DbNotification { + id: i32, + sender_id: Uuid, + recipient_id: Uuid, + post_id: Option, + event_type: EventType, + created_at: DateTime, +} + pub struct Notification { pub id: i32, pub sender: DbActorProfile,