#[cfg(feature="sea-orm")]
use sea_orm::entity::prelude::*;
#[cfg_attr(feature="sea-orm",derive(DeriveEntityModel))]
#[cfg_attr(feature="serde",derive(serde::Serialize, serde::Deserialize))]
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature="sea-orm",sea_orm(table_name = "bills"))]
pub struct Model {
#[cfg_attr(feature="sea-orm",sea_orm(primary_key))]
pub id: i64,
pub user_id: i64,
pub budget: rust_decimal::Decimal,
#[cfg_attr(feature="sea-orm",sea_orm(column_type = "Text"))]
pub description: String,
pub due: chrono::DateTime<chrono::FixedOffset>,
pub actual: rust_decimal::Decimal,
pub repeat_interval: Option<RepeatInteval>,
pub repeat_interval_value:Option<i32>,
pub is_paid: bool,
}
#[cfg_attr(feature="serde",derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature="sea-orm",derive(EnumIter, DeriveActiveEnum))]
#[cfg_attr(feature="sea-orm", derive(clap::ValueEnum))]
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature="sea-orm",sea_orm(rs_type = "String", db_type = "Enum", enum_name = "repeat_interval"))]
pub enum RepeatInteval {
#[cfg_attr(feature="sea-orm",sea_orm(string_value = "days"))]
Days,
#[cfg_attr(feature="sea-orm",sea_orm(string_value = "weeks"))]
Weeks,
#[cfg_attr(feature="sea-orm",sea_orm(string_value = "months"))]
Months,
#[cfg_attr(feature="sea-orm",sea_orm(string_value = "years"))]
Years,
}
#[cfg_attr(feature="serde",derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature="sea-orm", derive(clap::Args))]
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct CreateBillOptions {
#[cfg_attr(feature="clap",arg(long))]
pub user_id: i64,
#[cfg_attr(feature="clap",arg(long))]
pub budget: rust_decimal::Decimal,
#[cfg_attr(feature="clap",arg(long))]
pub description: String,
#[cfg_attr(feature="clap",arg(long))]
pub due: chrono::DateTime<chrono::FixedOffset>,
#[cfg_attr(feature="clap",arg(long))]
pub actual: rust_decimal::Decimal,
#[cfg_attr(feature="clap",arg(long))]
pub is_paid: bool,
#[cfg_attr(feature="clap",arg(long))]
pub id: Option<i64>,
#[cfg_attr(feature="clap",arg(long))]
pub repeat_interval: Option<RepeatInteval>,
#[cfg_attr(feature="clap",arg(long))]
pub repeat_interval_value: Option<i32>,
}
#[cfg(feature="sea-orm")]
pub async fn create(conn: &sea_orm::DatabaseConnection,opts: &CreateBillOptions) -> Result<Model,anyhow::Error> {
let user = crate::user::get_by_id(&conn, opts.user_id).await?.ok_or_else(||anyhow::anyhow!("Could not find a user with user id of {}",opts.user_id))?;
let mut active_model: ActiveModel = <ActiveModel as sea_orm::ActiveModelTrait>::default();
if let Some(id) = opts.id {
active_model.id = sea_orm::ActiveValue::set(id)
}
active_model.user_id = sea_orm::ActiveValue::set(user.id);
active_model.budget = sea_orm::ActiveValue::Set(opts.budget);
active_model.description = sea_orm::ActiveValue::Set(opts.description.clone());
active_model.due = sea_orm::ActiveValue::Set(opts.due);
active_model.actual = sea_orm::ActiveValue::Set(opts.actual);
active_model.repeat_interval = sea_orm::ActiveValue::Set(opts.repeat_interval.clone());
active_model.repeat_interval_value = sea_orm::ActiveValue::Set(opts.repeat_interval_value.clone());
active_model.is_paid = sea_orm::ActiveValue::Set(opts.is_paid);
Ok(Model::try_from(active_model.save(conn).await?)?)
}
#[cfg(feature="sea-orm")]
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
pub enum Relation {}
#[cfg(feature="sea-orm")]
impl ActiveModelBehavior for ActiveModel {}