use crate::domain::{EventType, TargetRepo};
use crate::model::{CreateSubscription, Subscription, SubscriptionWithBranch, UpdateSubscription};
use crate::repository::RepositoryError;
use async_trait::async_trait;
#[async_trait]
pub trait SubscriptionRepository: Send + Sync {
async fn create(
&self,
subscription: &CreateSubscription,
) -> Result<SubscriptionWithBranch, RepositoryError>;
async fn get_by_id(&self, id: i64) -> Result<Option<Subscription>, RepositoryError>;
async fn get_by_id_with_branch(
&self,
id: i64,
) -> Result<Option<SubscriptionWithBranch>, RepositoryError>;
async fn get_by_keys_with_branch(
&self,
branch_id: i64,
target_repo: &TargetRepo,
event_type: &EventType,
) -> Result<Option<SubscriptionWithBranch>, RepositoryError>;
async fn list_paginated(
&self,
last_id: i64,
limit: i64,
) -> Result<Vec<Subscription>, RepositoryError>;
async fn list_paginated_with_branches(
&self,
last_id: i64,
limit: i64,
) -> Result<Vec<SubscriptionWithBranch>, RepositoryError>;
async fn count_remaining(&self, last_id: i64) -> Result<i64, RepositoryError>;
async fn update(
&self,
id: i64,
subscription: &UpdateSubscription,
) -> Result<Subscription, RepositoryError>;
async fn delete(&self, id: i64) -> Result<(), RepositoryError>;
async fn get_branch_id_by_subscription_id(
&self,
id: i64,
) -> Result<Option<i64>, RepositoryError>;
async fn count_subscriptions_by_branch_id(
&self,
branch_id: i64,
) -> Result<i64, RepositoryError>;
async fn delete_subscription_and_cascade(&self, id: i64) -> Result<(), RepositoryError>;
}