use anyhow::{bail, Result};
use serde::{Deserialize, Serialize};
use crate::{Amount, ConversionRate, InvoiceState, Strike};
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct InvoiceRequest {
pub correlation_id: Option<String>,
pub description: Option<String>,
pub amount: Amount,
}
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct InvoiceResponse {
pub invoice_id: String,
pub amount: Amount,
pub state: InvoiceState,
pub created: String,
pub description: Option<String>,
pub issuer_id: String,
pub receiver_id: String,
}
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct InvoiceQuoteResponse {
pub quote_id: String,
pub description: Option<String>,
pub ln_invoice: String,
pub onchain_address: Option<String>,
pub expiration: String,
pub expiration_in_sec: u64,
pub source_amount: Amount,
pub target_amount: Amount,
pub conversion_rate: ConversionRate,
}
impl Strike {
pub async fn create_invoice(&self, invoice_request: InvoiceRequest) -> Result<InvoiceResponse> {
let url = self.base_url.join("/v1/invoices")?;
let res = self
.make_post(url, Some(serde_json::to_value(invoice_request)?))
.await?;
match serde_json::from_value(res.clone()) {
Ok(res) => Ok(res),
Err(_) => {
log::error!("Api error response on invoice creation");
log::error!("{}", res);
bail!("Could not create invoice")
}
}
}
pub async fn get_incoming_invoice(&self, invoice_id: &str) -> Result<InvoiceResponse> {
let url = self.base_url.join("/v1/invoices/")?.join(invoice_id)?;
let res = self.make_get(url).await?;
match serde_json::from_value(res.clone()) {
Ok(res) => Ok(res),
Err(_) => {
log::error!("Api error response on find invoice");
log::error!("{}", res);
bail!("Could not find invoice")
}
}
}
pub async fn invoice_quote(&self, invoice_id: &str) -> Result<InvoiceQuoteResponse> {
let url = self
.base_url
.join(&format!("/v1/invoices/{invoice_id}/quote"))?;
let res = self.make_post(url, None::<String>).await?;
match serde_json::from_value(res.clone()) {
Ok(res) => Ok(res),
Err(_) => {
log::error!("Api error response on invoice quote");
log::error!("{}", res);
bail!("Could get invoice quote")
}
}
}
}