use async_trait::async_trait;
use chrono::{DateTime, Utc};
use uuid::Uuid;
#[derive(Debug, Clone)]
pub struct JournalStatusRow {
pub status: String,
pub currency: String,
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct JournalAuthors {
pub submitted_by: Option<Uuid>,
pub created_by: Option<Uuid>,
}
#[async_trait]
pub trait JournalWorkflowRepository: Send + Sync {
async fn find_status(
&self,
journal_id: Uuid,
) -> anyhow::Result<Option<JournalStatusRow>>;
async fn current_status(
&self,
journal_id: Uuid,
) -> anyhow::Result<Option<String>>;
async fn submit(&self, journal_id: Uuid,) -> anyhow::Result<bool>;
async fn submit_as(&self, journal_id: Uuid, submitted_by: Option<Uuid>) -> anyhow::Result<bool> {
let _ = submitted_by;
self.submit(journal_id).await
}
async fn authors(&self, journal_id: Uuid) -> anyhow::Result<JournalAuthors> {
let _ = journal_id;
Ok(JournalAuthors::default())
}
async fn self_approval_allowed(&self) -> anyhow::Result<bool> {
Ok(false)
}
async fn approve(
&self,
journal_id: Uuid,
approved_by: Option<Uuid>,
at: DateTime<Utc>,
) -> anyhow::Result<bool>;
async fn reject(
&self,
journal_id: Uuid,
reason: &str,
rejected_by: Option<Uuid>,
at: DateTime<Utc>,
) -> anyhow::Result<bool>;
async fn mark_voided(
&self,
journal_id: Uuid,
voided_by: Option<Uuid>,
reason: &str,
at: DateTime<Utc>,
) -> anyhow::Result<()>;
async fn original_post(
&self,
journal_id: Uuid,
) -> anyhow::Result<Option<Uuid>>;
}