forked from coracle/caravel
Use invoice items instead of amount
This commit is contained in:
+4
-4
@@ -696,7 +696,7 @@ async fn list_invoices(
|
||||
let pubkey = state.api.extract_auth_pubkey(&headers)?;
|
||||
state.api.require_admin(&pubkey)?;
|
||||
|
||||
match state.api.repo.list_invoices().await {
|
||||
match state.api.repo.list_invoices_with_items().await {
|
||||
Ok(invoices) => Ok(ok(StatusCode::OK, invoices)),
|
||||
Err(e) => Ok(err(
|
||||
StatusCode::INTERNAL_SERVER_ERROR,
|
||||
@@ -714,7 +714,7 @@ async fn list_tenant_invoices(
|
||||
let auth = state.api.extract_auth_pubkey(&headers)?;
|
||||
state.api.require_admin_or_tenant(&auth, &pubkey)?;
|
||||
|
||||
match state.api.repo.list_invoices_for_tenant(&pubkey).await {
|
||||
match state.api.repo.list_invoices_for_tenant_with_items(&pubkey).await {
|
||||
Ok(invoices) => Ok(ok(StatusCode::OK, invoices)),
|
||||
Err(e) => Ok(err(
|
||||
StatusCode::INTERNAL_SERVER_ERROR,
|
||||
@@ -731,7 +731,7 @@ async fn get_invoice(
|
||||
) -> std::result::Result<Response, ApiError> {
|
||||
let auth = state.api.extract_auth_pubkey(&headers)?;
|
||||
|
||||
let invoice = match state.api.repo.get_invoice(&id).await {
|
||||
let invoice = match state.api.repo.get_invoice_with_items(&id).await {
|
||||
Ok(Some(i)) => i,
|
||||
Ok(None) => return Ok(err(StatusCode::NOT_FOUND, "not-found", "invoice not found")),
|
||||
Err(e) => {
|
||||
@@ -743,7 +743,7 @@ async fn get_invoice(
|
||||
}
|
||||
};
|
||||
|
||||
state.api.require_admin_or_tenant(&auth, &invoice.tenant)?;
|
||||
state.api.require_admin_or_tenant(&auth, &invoice.invoice.tenant)?;
|
||||
|
||||
Ok(ok(StatusCode::OK, invoice))
|
||||
}
|
||||
|
||||
@@ -75,3 +75,10 @@ pub struct InvoiceItem {
|
||||
pub relay: String,
|
||||
pub sats: i64,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Serialize)]
|
||||
pub struct InvoiceWithItems {
|
||||
#[serde(flatten)]
|
||||
pub invoice: Invoice,
|
||||
pub items: Vec<InvoiceItem>,
|
||||
}
|
||||
|
||||
+34
-1
@@ -7,7 +7,7 @@ use sqlx::{
|
||||
sqlite::{SqliteConnectOptions, SqlitePoolOptions},
|
||||
};
|
||||
|
||||
use crate::models::{Activity, Invoice, InvoiceItem, Plan, Relay, Tenant};
|
||||
use crate::models::{Activity, Invoice, InvoiceItem, InvoiceWithItems, Plan, Relay, Tenant};
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct Repo {
|
||||
@@ -529,6 +529,39 @@ impl Repo {
|
||||
Ok(rows)
|
||||
}
|
||||
|
||||
pub async fn list_invoices_with_items(&self) -> Result<Vec<InvoiceWithItems>> {
|
||||
let invoices = self.list_invoices().await?;
|
||||
let mut result = Vec::with_capacity(invoices.len());
|
||||
for invoice in invoices {
|
||||
let items = self.get_invoice_items(&invoice.id).await?;
|
||||
result.push(InvoiceWithItems { invoice, items });
|
||||
}
|
||||
Ok(result)
|
||||
}
|
||||
|
||||
pub async fn list_invoices_for_tenant_with_items(
|
||||
&self,
|
||||
tenant_id: &str,
|
||||
) -> Result<Vec<InvoiceWithItems>> {
|
||||
let invoices = self.list_invoices_for_tenant(tenant_id).await?;
|
||||
let mut result = Vec::with_capacity(invoices.len());
|
||||
for invoice in invoices {
|
||||
let items = self.get_invoice_items(&invoice.id).await?;
|
||||
result.push(InvoiceWithItems { invoice, items });
|
||||
}
|
||||
Ok(result)
|
||||
}
|
||||
|
||||
pub async fn get_invoice_with_items(&self, id: &str) -> Result<Option<InvoiceWithItems>> {
|
||||
match self.get_invoice(id).await? {
|
||||
Some(invoice) => {
|
||||
let items = self.get_invoice_items(&invoice.id).await?;
|
||||
Ok(Some(InvoiceWithItems { invoice, items }))
|
||||
}
|
||||
None => Ok(None),
|
||||
}
|
||||
}
|
||||
|
||||
pub async fn get_invoice_items(&self, invoice_id: &str) -> Result<Vec<InvoiceItem>> {
|
||||
let rows = sqlx::query_as::<_, InvoiceItem>(
|
||||
"SELECT id, invoice, relay, sats
|
||||
|
||||
Reference in New Issue
Block a user