use anyhow::Result;
use chrono::{DateTime, Utc};
use sqlx::PgPool;
use uuid::Uuid;
use backbone_orm::org_scope;
use crate::domain::entity::WarrantyClaim;
pub const TABLE_NAME: &str = "support.warranty_claims";
pub struct WarrantyClaimRepository(
backbone_orm::GenericCrudRepository<WarrantyClaim, backbone_orm::SoftDelete>,
);
impl std::ops::Deref for WarrantyClaimRepository {
type Target = backbone_orm::GenericCrudRepository<WarrantyClaim, backbone_orm::SoftDelete>;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl WarrantyClaimRepository {
pub fn new(pool: PgPool) -> Self {
Self(backbone_orm::GenericCrudRepository::new(pool, TABLE_NAME))
}
}
pub struct NewWarrantyClaimRow<'a> {
pub id: Uuid,
pub customer_id: Option<Uuid>,
pub item_id: Uuid,
pub serial_no: Option<&'a str>,
pub claim_date: DateTime<Utc>,
pub warranty_expiry: Option<DateTime<Utc>>,
pub is_under_warranty: bool,
pub issue_id: Option<Uuid>,
pub description: Option<&'a str>,
}
impl WarrantyClaimRepository {
pub async fn insert_claim(
&self,
pool: &PgPool,
c: &NewWarrantyClaimRow<'_>,
) -> Result<(), sqlx::Error> {
org_scope::execute_scoped(
pool,
sqlx::query(
r#"INSERT INTO support.warranty_claims
(id, customer_id, item_id, serial_no, claim_date, warranty_expiry,
is_under_warranty, status, issue_id, description)
VALUES ($1,$2,$3,$4,$5,$6,$7,'open'::warranty_status,$8,$9)"#,
)
.bind(c.id)
.bind(c.customer_id)
.bind(c.item_id)
.bind(c.serial_no)
.bind(c.claim_date)
.bind(c.warranty_expiry)
.bind(c.is_under_warranty)
.bind(c.issue_id)
.bind(c.description),
)
.await?;
Ok(())
}
pub async fn adjudicate(
&self,
pool: &PgPool,
claim_id: Uuid,
status: &str,
resolution: Option<&str>,
) -> Result<u64, sqlx::Error> {
let moved = org_scope::execute_scoped(
pool,
sqlx::query(
r#"UPDATE support.warranty_claims SET status=$2::warranty_status, resolution=$3
WHERE id=$1 AND status='open'::warranty_status AND (metadata->>'deleted_at') IS NULL"#,
)
.bind(claim_id).bind(status).bind(resolution),
)
.await?;
Ok(moved.rows_affected())
}
}
backbone_core::impl_crud_repository!(WarrantyClaimRepository, WarrantyClaim, soft_delete);