use modql::field::{SeaField, SeaFields};
use sea_query::{DynIden, IntoIden};
use crate::{
ctx::Session,
model::{
base::{CommonIden, DbBmc, TimestampIden},
Error, Result,
},
};
pub fn prep_fields_for_create<MC>(mut fields: SeaFields, session: &Session) -> SeaFields
where
MC: DbBmc,
{
if MC::has_owner_id() {
fields.push(SeaField::new(CommonIden::OwnerId.into_iden(), session.user_id()));
}
if MC::has_creation_timestamps() {
fields = add_timestamps_for_create(fields, session);
}
fields
}
pub fn prep_fields_for_update<MC>(mut fields: SeaFields, session: &Session) -> SeaFields
where
MC: DbBmc,
{
if MC::has_creation_timestamps() {
fields = add_timestamps_for_update(fields, session);
}
fields
}
fn _exists_in_fields(fields: &[SeaField], iden: DynIden) -> bool {
fields.iter().any(|f| f.iden == iden)
}
fn add_timestamps_for_create(fields: SeaFields, session: &Session) -> SeaFields {
let mut fields = fields.into_vec();
if !_exists_in_fields(&fields, TimestampIden::Cid.into_iden()) {
fields.push(SeaField::new(TimestampIden::Cid, session.user_id()));
}
if !_exists_in_fields(&fields, TimestampIden::Ctime.into_iden()) {
fields.push(SeaField::new(TimestampIden::Ctime, *session.req_time()));
}
SeaFields::new(fields)
}
fn add_timestamps_for_update(fields: SeaFields, session: &Session) -> SeaFields {
let mut fields = fields.into_vec();
if !_exists_in_fields(&fields, TimestampIden::Mid.into_iden()) {
fields.push(SeaField::new(TimestampIden::Mid, session.user_id()));
}
if !_exists_in_fields(&fields, TimestampIden::Mtime.into_iden()) {
fields.push(SeaField::new(TimestampIden::Mtime, *session.req_time()));
}
SeaFields::new(fields)
}
pub fn check_number_of_affected<MC>(expect_n: usize, return_n: u64) -> Result<u64>
where
MC: DbBmc,
{
if return_n as usize != expect_n {
Err(Error::EntityNotFound {
schema: MC::SCHEMA,
entity: MC::TABLE,
id: 0.into(), })
} else {
Ok(return_n)
}
}