You've already forked AstralRinth
forked from didirus/AstralRinth
* wip: affiliate payouts again * Implement affiliate payout queue * Deactivate subscription affiliations on cancellation * Remove a test that never compiled in the first place * Update sqlx cache * address some PR comments * more comments * wip: handle refund charges * cargo sqlx prepare * Address PR comments * cargo sqlx prepare
87 lines
2.3 KiB
Rust
87 lines
2.3 KiB
Rust
use chrono::{DateTime, Utc};
|
|
use serde::{Deserialize, Serialize};
|
|
|
|
use crate::database::models::{
|
|
DBAffiliateCodeId, DBChargeId, DBUserSubscriptionId,
|
|
};
|
|
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
pub struct DBUsersSubscriptionsAffiliations {
|
|
pub subscription_id: DBUserSubscriptionId,
|
|
pub affiliate_code: DBAffiliateCodeId,
|
|
pub deactivated_at: Option<DateTime<Utc>>,
|
|
}
|
|
|
|
impl DBUsersSubscriptionsAffiliations {
|
|
pub async fn insert<'a, E>(&self, exec: E) -> sqlx::Result<()>
|
|
where
|
|
E: sqlx::PgExecutor<'a>,
|
|
{
|
|
sqlx::query_scalar!(
|
|
"
|
|
INSERT INTO users_subscriptions_affiliations
|
|
(subscription_id, affiliate_code, deactivated_at)
|
|
VALUES ($1, $2, $3)
|
|
",
|
|
self.subscription_id.0,
|
|
self.affiliate_code.0,
|
|
self.deactivated_at,
|
|
)
|
|
.fetch_one(exec)
|
|
.await?;
|
|
Ok(())
|
|
}
|
|
|
|
pub async fn deactivate<'a, E>(
|
|
subscription_id: DBUserSubscriptionId,
|
|
exec: E,
|
|
) -> sqlx::Result<()>
|
|
where
|
|
E: sqlx::PgExecutor<'a>,
|
|
{
|
|
sqlx::query!(
|
|
"UPDATE users_subscriptions_affiliations
|
|
SET deactivated_at = NOW()
|
|
WHERE subscription_id = $1",
|
|
subscription_id.0,
|
|
)
|
|
.execute(exec)
|
|
.await?;
|
|
Ok(())
|
|
}
|
|
}
|
|
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
pub struct DBUsersSubscriptionsAffiliationsPayouts {
|
|
pub id: i64,
|
|
pub charge_id: DBChargeId,
|
|
pub subscription_id: DBUserSubscriptionId,
|
|
pub affiliate_code: DBAffiliateCodeId,
|
|
pub payout_value_id: i64,
|
|
}
|
|
|
|
impl DBUsersSubscriptionsAffiliationsPayouts {
|
|
pub async fn insert<'a, E>(&mut self, exec: E) -> sqlx::Result<()>
|
|
where
|
|
E: sqlx::PgExecutor<'a>,
|
|
{
|
|
let id = sqlx::query_scalar!(
|
|
"
|
|
INSERT INTO users_subscriptions_affiliations_payouts
|
|
(charge_id, subscription_id, affiliate_code, payout_value_id)
|
|
VALUES ($1, $2, $3, $4)
|
|
RETURNING id
|
|
",
|
|
self.charge_id.0,
|
|
self.subscription_id.0,
|
|
self.affiliate_code.0,
|
|
self.payout_value_id,
|
|
)
|
|
.fetch_one(exec)
|
|
.await?;
|
|
|
|
self.id = id;
|
|
Ok(())
|
|
}
|
|
}
|