Add MoneroSubscription payment option
This commit is contained in:
parent
703cae0a43
commit
423eec0a2c
6 changed files with 62 additions and 15 deletions
|
@ -663,6 +663,12 @@ paths:
|
||||||
enum:
|
enum:
|
||||||
- ethereum
|
- ethereum
|
||||||
- monero
|
- monero
|
||||||
|
price:
|
||||||
|
description: Subscription price (only for Monero)
|
||||||
|
type: number
|
||||||
|
payout_address:
|
||||||
|
description: Payout address (only for Monero)
|
||||||
|
type: string
|
||||||
required:
|
required:
|
||||||
- type
|
- type
|
||||||
responses:
|
responses:
|
||||||
|
|
|
@ -67,22 +67,27 @@ pub fn attach_payment_option(
|
||||||
user_id: &Uuid,
|
user_id: &Uuid,
|
||||||
payment_option: PaymentOption,
|
payment_option: PaymentOption,
|
||||||
) -> ActorAttachment {
|
) -> ActorAttachment {
|
||||||
match payment_option {
|
let (name, href) = match payment_option {
|
||||||
// Local actors can't have payment links
|
// Local actors can't have payment links
|
||||||
PaymentOption::Link(_) => unimplemented!(),
|
PaymentOption::Link(_) => unimplemented!(),
|
||||||
PaymentOption::EthereumSubscription(_) => {
|
PaymentOption::EthereumSubscription(_) => {
|
||||||
let name = "EthereumSubscription".to_string();
|
let name = "EthereumSubscription".to_string();
|
||||||
let subscription_page_url =
|
let href = get_subscription_page_url(instance_url, user_id);
|
||||||
get_subscription_page_url(instance_url, user_id);
|
(name, href)
|
||||||
ActorAttachment {
|
|
||||||
object_type: LINK.to_string(),
|
|
||||||
name: name,
|
|
||||||
value: None,
|
|
||||||
href: Some(subscription_page_url),
|
|
||||||
signature_algorithm: None,
|
|
||||||
signature_value: None,
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
PaymentOption::MoneroSubscription(_) => {
|
||||||
|
let name = "MoneroSubscription".to_string();
|
||||||
|
let href = get_subscription_page_url(instance_url, user_id);
|
||||||
|
(name, href)
|
||||||
|
},
|
||||||
|
};
|
||||||
|
ActorAttachment {
|
||||||
|
object_type: LINK.to_string(),
|
||||||
|
name: name,
|
||||||
|
value: None,
|
||||||
|
href: Some(href),
|
||||||
|
signature_algorithm: None,
|
||||||
|
signature_value: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -98,7 +98,9 @@ impl Account {
|
||||||
.map(|option| {
|
.map(|option| {
|
||||||
match option {
|
match option {
|
||||||
PaymentOption::Link(link) => link.href,
|
PaymentOption::Link(link) => link.href,
|
||||||
PaymentOption::EthereumSubscription(_) => {
|
PaymentOption::EthereumSubscription(_) |
|
||||||
|
PaymentOption::MoneroSubscription(_) =>
|
||||||
|
{
|
||||||
get_subscription_page_url(instance_url, &profile.id)
|
get_subscription_page_url(instance_url, &profile.id)
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,5 +11,5 @@ pub enum SubscriptionSettings {
|
||||||
#[serde(rename = "ethereum")]
|
#[serde(rename = "ethereum")]
|
||||||
Ethereum,
|
Ethereum,
|
||||||
#[serde(rename = "monero")]
|
#[serde(rename = "monero")]
|
||||||
Monero { },
|
Monero { price: u64, payout_address: String },
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,6 +14,7 @@ use crate::mastodon_api::accounts::types::Account;
|
||||||
use crate::mastodon_api::oauth::auth::get_current_user;
|
use crate::mastodon_api::oauth::auth::get_current_user;
|
||||||
use crate::models::profiles::queries::update_profile;
|
use crate::models::profiles::queries::update_profile;
|
||||||
use crate::models::profiles::types::{
|
use crate::models::profiles::types::{
|
||||||
|
MoneroSubscription,
|
||||||
PaymentOption,
|
PaymentOption,
|
||||||
PaymentType,
|
PaymentType,
|
||||||
ProfileUpdateData,
|
ProfileUpdateData,
|
||||||
|
@ -86,8 +87,21 @@ pub async fn subscriptions_enabled(
|
||||||
));
|
));
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
SubscriptionSettings::Monero { } => {
|
SubscriptionSettings::Monero { price, payout_address } => {
|
||||||
todo!();
|
let monero_config = config.blockchain()
|
||||||
|
.and_then(|conf| conf.monero_config())
|
||||||
|
.ok_or(HttpError::NotSupported)?;
|
||||||
|
if !current_user.profile.payment_options
|
||||||
|
.any(PaymentType::MoneroSubscription)
|
||||||
|
{
|
||||||
|
let payment_info = MoneroSubscription {
|
||||||
|
chain_id: monero_config.chain_id.clone(),
|
||||||
|
price,
|
||||||
|
payout_address,
|
||||||
|
};
|
||||||
|
maybe_payment_option =
|
||||||
|
Some(PaymentOption::MoneroSubscription(payment_info));
|
||||||
|
};
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
if let Some(payment_option) = maybe_payment_option {
|
if let Some(payment_option) = maybe_payment_option {
|
||||||
|
|
|
@ -47,6 +47,7 @@ json_to_sql!(IdentityProofs);
|
||||||
pub enum PaymentType {
|
pub enum PaymentType {
|
||||||
Link,
|
Link,
|
||||||
EthereumSubscription,
|
EthereumSubscription,
|
||||||
|
MoneroSubscription,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<&PaymentType> for i16 {
|
impl From<&PaymentType> for i16 {
|
||||||
|
@ -54,6 +55,7 @@ impl From<&PaymentType> for i16 {
|
||||||
match payment_type {
|
match payment_type {
|
||||||
PaymentType::Link => 1,
|
PaymentType::Link => 1,
|
||||||
PaymentType::EthereumSubscription => 2,
|
PaymentType::EthereumSubscription => 2,
|
||||||
|
PaymentType::MoneroSubscription => 3,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -65,6 +67,7 @@ impl TryFrom<i16> for PaymentType {
|
||||||
let payment_type = match value {
|
let payment_type = match value {
|
||||||
1 => Self::Link,
|
1 => Self::Link,
|
||||||
2 => Self::EthereumSubscription,
|
2 => Self::EthereumSubscription,
|
||||||
|
3 => Self::MoneroSubscription,
|
||||||
_ => return Err(ConversionError),
|
_ => return Err(ConversionError),
|
||||||
};
|
};
|
||||||
Ok(payment_type)
|
Ok(payment_type)
|
||||||
|
@ -82,10 +85,18 @@ pub struct EthereumSubscription {
|
||||||
chain_id: ChainId,
|
chain_id: ChainId,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, Deserialize, Serialize)]
|
||||||
|
pub struct MoneroSubscription {
|
||||||
|
pub chain_id: ChainId,
|
||||||
|
pub price: u64, // piconeros per second
|
||||||
|
pub payout_address: String,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub enum PaymentOption {
|
pub enum PaymentOption {
|
||||||
Link(PaymentLink),
|
Link(PaymentLink),
|
||||||
EthereumSubscription(EthereumSubscription),
|
EthereumSubscription(EthereumSubscription),
|
||||||
|
MoneroSubscription(MoneroSubscription),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl PaymentOption {
|
impl PaymentOption {
|
||||||
|
@ -97,6 +108,7 @@ impl PaymentOption {
|
||||||
match self {
|
match self {
|
||||||
Self::Link(_) => PaymentType::Link,
|
Self::Link(_) => PaymentType::Link,
|
||||||
Self::EthereumSubscription(_) => PaymentType::EthereumSubscription,
|
Self::EthereumSubscription(_) => PaymentType::EthereumSubscription,
|
||||||
|
Self::MoneroSubscription(_) => PaymentType::MoneroSubscription,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -124,6 +136,11 @@ impl<'de> Deserialize<'de> for PaymentOption {
|
||||||
.map_err(DeserializerError::custom)?;
|
.map_err(DeserializerError::custom)?;
|
||||||
Self::EthereumSubscription(payment_info)
|
Self::EthereumSubscription(payment_info)
|
||||||
},
|
},
|
||||||
|
PaymentType::MoneroSubscription => {
|
||||||
|
let payment_info = MoneroSubscription::deserialize(value)
|
||||||
|
.map_err(DeserializerError::custom)?;
|
||||||
|
Self::MoneroSubscription(payment_info)
|
||||||
|
},
|
||||||
};
|
};
|
||||||
Ok(payment_option)
|
Ok(payment_option)
|
||||||
}
|
}
|
||||||
|
@ -142,6 +159,9 @@ impl Serialize for PaymentOption {
|
||||||
Self::EthereumSubscription(payment_info) => {
|
Self::EthereumSubscription(payment_info) => {
|
||||||
payment_info.serialize(FlatMapSerializer(&mut map))?
|
payment_info.serialize(FlatMapSerializer(&mut map))?
|
||||||
},
|
},
|
||||||
|
Self::MoneroSubscription(payment_info) => {
|
||||||
|
payment_info.serialize(FlatMapSerializer(&mut map))?
|
||||||
|
},
|
||||||
};
|
};
|
||||||
map.end()
|
map.end()
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue