use async_trait::async_trait;
use chrono::NaiveDate;
use serde::{Deserialize, Serialize};
use sqlx::{any::AnyRow, FromRow, Row as _};
pub mod manager;
#[async_trait]
pub trait Manager {
async fn find_all_non_revoked_publications(
&self,
stele: &str,
) -> anyhow::Result<Vec<Publication>>;
}
#[async_trait]
pub trait TxManager {
async fn create(
&mut self,
hash_id: &str,
name: &str,
date: &NaiveDate,
stele: &str,
last_valid_publication_id: Option<String>,
last_valid_version: Option<String>,
) -> anyhow::Result<Option<i64>>;
async fn update_by_name_and_stele_set_revoked_true(
&mut self,
name: &str,
stele: &str,
) -> anyhow::Result<()>;
async fn find_last_inserted(&mut self, stele: &str) -> anyhow::Result<Option<Publication>>;
async fn find_by_name_and_stele(
&mut self,
name: &str,
stele: &str,
) -> anyhow::Result<Publication>;
async fn find_first_by_date_and_stele_non_revoked(
&mut self,
date: &str,
stele: &str,
) -> anyhow::Result<Publication>;
async fn find_all_by_date_and_stele_order_by_name_desc(
&mut self,
date: String,
stele: String,
) -> anyhow::Result<Vec<Publication>>;
}
#[derive(Deserialize, Serialize, Debug)]
pub struct Publication {
pub id: String,
pub name: String,
pub date: String,
pub stele: String,
pub revoked: i64,
pub last_valid_publication_id: Option<String>,
pub last_valid_version: Option<String>,
}
impl FromRow<'_, AnyRow> for Publication {
fn from_row(row: &AnyRow) -> anyhow::Result<Self, sqlx::Error> {
Ok(Self {
id: row.try_get("id")?,
name: row.try_get("name")?,
date: row.try_get("date")?,
stele: row.try_get("stele")?,
revoked: row.try_get("revoked")?,
last_valid_publication_id: row.try_get("last_valid_publication_id").ok(),
last_valid_version: row.try_get("last_valid_version").ok(),
})
}
}
impl Publication {
#[must_use]
pub const fn new(id: String, name: String, date: String, stele: String) -> Self {
Self {
id,
name,
date,
stele,
revoked: 0,
last_valid_publication_id: None,
last_valid_version: None,
}
}
}