diff --git a/docs/openapi.yaml b/docs/openapi.yaml index 3792e8d..67a360d 100644 --- a/docs/openapi.yaml +++ b/docs/openapi.yaml @@ -842,6 +842,7 @@ components: - mention - reblog - subscription + - subscription_expiration example: reply created_at: description: The timestamp of the notification. diff --git a/src/ethereum/subscriptions.rs b/src/ethereum/subscriptions.rs index ec546ca..10b6160 100644 --- a/src/ethereum/subscriptions.rs +++ b/src/ethereum/subscriptions.rs @@ -13,9 +13,15 @@ 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::notifications::queries::{ + create_subscription_notification, + create_subscription_expiration_notification, +}; use crate::models::profiles::currencies::Currency; -use crate::models::profiles::queries::search_profile_by_wallet_address; +use crate::models::profiles::queries::{ + get_profile_by_id, + search_profile_by_wallet_address, +}; use crate::models::relationships::queries::unsubscribe; use crate::models::subscriptions::queries::{ create_subscription, @@ -143,6 +149,11 @@ pub async fn check_subscriptions( &expires_at, &block_date, ).await?; + log::info!( + "subscription updated: {0} to {1}", + subscription.sender_id, + subscription.recipient_id, + ); if expires_at > subscription.expires_at { // Subscription was extended create_subscription_notification( @@ -151,11 +162,6 @@ pub async fn check_subscriptions( &subscription.recipient_id, ).await?; }; - log::info!( - "subscription updated: {0} to {1}", - subscription.sender_id, - subscription.recipient_id, - ); }; }, Err(DatabaseError::NotFound(_)) => { @@ -168,16 +174,16 @@ 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, recipient.id, ); + create_subscription_notification( + db_client, + &sender.id, + &recipient.id, + ).await?; }, Err(other_error) => return Err(other_error.into()), }; @@ -191,6 +197,14 @@ pub async fn check_subscriptions( subscription.sender_id, subscription.recipient_id, ); + let sender = get_profile_by_id(db_client, &subscription.sender_id).await?; + if sender.is_local() { + create_subscription_expiration_notification( + db_client, + &subscription.recipient_id, + &subscription.sender_id, + ).await?; + }; }; if sync_state.update(&contract.address(), to_block) { diff --git a/src/mastodon_api/notifications/types.rs b/src/mastodon_api/notifications/types.rs index 4930a2c..7786768 100644 --- a/src/mastodon_api/notifications/types.rs +++ b/src/mastodon_api/notifications/types.rs @@ -47,6 +47,8 @@ impl ApiNotification { EventType::Mention => "mention", EventType::Repost => "reblog", EventType::Subscription => "subscription", + EventType::SubscriptionStart => "", // not supported + EventType::SubscriptionExpiration => "subscription_expiration", }; Self { id: notification.id.to_string(), diff --git a/src/models/notifications/queries.rs b/src/models/notifications/queries.rs index a6b8be0..56285db 100644 --- a/src/models/notifications/queries.rs +++ b/src/models/notifications/queries.rs @@ -104,6 +104,17 @@ pub async fn create_subscription_notification( ).await } +pub async fn create_subscription_expiration_notification( + db_client: &impl GenericClient, + sender_id: &Uuid, + recipient_id: &Uuid, +) -> Result<(), DatabaseError> { + create_notification( + db_client, sender_id, recipient_id, None, + EventType::SubscriptionExpiration, + ).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 79dce50..6eaf210 100644 --- a/src/models/notifications/types.rs +++ b/src/models/notifications/types.rs @@ -20,6 +20,8 @@ pub enum EventType { Mention, Repost, Subscription, + SubscriptionStart, + SubscriptionExpiration, } impl From<&EventType> for i16 { @@ -32,6 +34,8 @@ impl From<&EventType> for i16 { EventType::Mention => 5, EventType::Repost => 6, EventType::Subscription => 7, + EventType::SubscriptionStart => panic!("not supported"), + EventType::SubscriptionExpiration => 9, } } } @@ -48,6 +52,8 @@ impl TryFrom for EventType { 5 => Self::Mention, 6 => Self::Repost, 7 => Self::Subscription, + 8 => Self::SubscriptionStart, + 9 => Self::SubscriptionExpiration, _ => return Err(ConversionError), }; Ok(event_type)