use chrono::NaiveDateTime; use rusqlite::Row; use sea_query::{IntoColumnRef, IntoIden, IntoTableRef, Order, SimpleExpr, enum_def}; use serde::{Deserialize, Serialize}; use ts_rs::TS; use yaak_database::{Result as DbResult, UpdateSource, UpsertModelInfo, generate_prefixed_id, upsert_date}; #[derive(Debug, Clone, Default, Serialize, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_models.ts")] pub struct ProxyHeader { pub name: String, pub value: String, } #[derive(Debug, Clone, Default, Serialize, Deserialize, TS)] #[serde(default, rename_all = "camelCase")] #[ts(export, export_to = "gen_models.ts")] #[enum_def(table_name = "proxy_entries")] pub struct ProxyEntry { pub id: String, pub created_at: NaiveDateTime, pub updated_at: NaiveDateTime, pub url: String, pub method: String, pub req_headers: Vec, pub req_body: Option>, pub res_status: Option, pub res_headers: Vec, pub res_body: Option>, pub error: Option, } impl UpsertModelInfo for ProxyEntry { fn table_name() -> impl IntoTableRef + IntoIden { ProxyEntryIden::Table } fn id_column() -> impl IntoIden + Eq + Clone { ProxyEntryIden::Id } fn generate_id() -> String { generate_prefixed_id("pe") } fn order_by() -> (impl IntoColumnRef, Order) { (ProxyEntryIden::CreatedAt, Order::Desc) } fn get_id(&self) -> String { self.id.clone() } fn insert_values( self, source: &UpdateSource, ) -> DbResult)>> { use ProxyEntryIden::*; Ok(vec![ (CreatedAt, upsert_date(source, self.created_at)), (UpdatedAt, upsert_date(source, self.updated_at)), (Url, self.url.into()), (Method, self.method.into()), (ReqHeaders, serde_json::to_string(&self.req_headers)?.into()), (ReqBody, self.req_body.into()), (ResStatus, self.res_status.into()), (ResHeaders, serde_json::to_string(&self.res_headers)?.into()), (ResBody, self.res_body.into()), (Error, self.error.into()), ]) } fn update_columns() -> Vec { vec![ ProxyEntryIden::UpdatedAt, ProxyEntryIden::Url, ProxyEntryIden::Method, ProxyEntryIden::ReqHeaders, ProxyEntryIden::ReqBody, ProxyEntryIden::ResStatus, ProxyEntryIden::ResHeaders, ProxyEntryIden::ResBody, ProxyEntryIden::Error, ] } fn from_row(r: &Row) -> rusqlite::Result where Self: Sized, { let req_headers: String = r.get("req_headers")?; let res_headers: String = r.get("res_headers")?; Ok(Self { id: r.get("id")?, created_at: r.get("created_at")?, updated_at: r.get("updated_at")?, url: r.get("url")?, method: r.get("method")?, req_headers: serde_json::from_str(&req_headers).unwrap_or_default(), req_body: r.get("req_body")?, res_status: r.get("res_status")?, res_headers: serde_json::from_str(&res_headers).unwrap_or_default(), res_body: r.get("res_body")?, error: r.get("error")?, }) } }