barreleye_common/models/
mod.rs1use async_trait::async_trait;
2use eyre::Result;
3use sea_orm::{
4 entity::prelude::*,
5 query::*,
6 sea_query::{types::*, Expr, SimpleExpr},
7 ActiveValue, QuerySelect,
8};
9
10pub use self::config::{Config, ConfigKey};
11use crate::{utils, Db};
12pub use amount::Amount;
13pub use api_key::{ApiKey, ApiKeyActiveModel};
14pub use balance::Balance;
15pub use label::{Label, LabelActiveModel};
16pub use labeled_address::{LabeledAddress, LabeledAddressActiveModel};
17pub use link::{Link, Reason as LinkReason};
18pub use network::{Network, NetworkActiveModel};
19pub use transfer::Transfer;
20
21pub mod amount;
22pub mod api_key;
23pub mod balance;
24pub mod config;
25pub mod label;
26pub mod labeled_address;
27pub mod link;
28pub mod network;
29pub mod transfer;
30
31pub type PrimaryId = i64;
33
34pub fn optional_set<T>(o: Option<T>) -> ActiveValue<T>
35where
36 T: Into<sea_orm::Value>,
37{
38 match o {
39 Some(v) => ActiveValue::set(v),
40 _ => ActiveValue::not_set(),
41 }
42}
43
44#[async_trait]
45pub trait BasicModel {
46 type ActiveModel: ActiveModelTrait + ActiveModelBehavior + Sized + Send;
47
48 async fn create(
49 db: &Db,
50 data: Self::ActiveModel,
51 ) -> Result<<<<Self::ActiveModel as ActiveModelTrait>::Entity as EntityTrait>::PrimaryKey as
52 PrimaryKeyTrait>::ValueType>{
53 let insert_result =
54 <Self::ActiveModel as ActiveModelTrait>::Entity::insert(data).exec(db.get()).await?;
55
56 Ok(insert_result.last_insert_id)
57 }
58
59 async fn create_many(
60 db: &Db,
61 data: Vec<Self::ActiveModel>,
62 ) -> Result<<<<Self::ActiveModel as ActiveModelTrait>::Entity as EntityTrait>::PrimaryKey as
63 PrimaryKeyTrait>::ValueType>{
64 let insert_result = <Self::ActiveModel as ActiveModelTrait>::Entity::insert_many(data)
65 .exec(db.get())
66 .await?;
67
68 Ok(insert_result.last_insert_id)
69 }
70
71 async fn get(
72 db: &Db,
73 primary_id: <<<Self::ActiveModel as ActiveModelTrait>::Entity as EntityTrait>::PrimaryKey as
74 PrimaryKeyTrait>::ValueType,
75 ) -> Result<
76 Option<<<Self::ActiveModel as ActiveModelTrait>::Entity as EntityTrait>::Model>,
77 DbErr,
78 > {
79 <Self::ActiveModel as ActiveModelTrait>::Entity::find_by_id(primary_id).one(db.get()).await
80 }
81
82 async fn get_by_id(
83 db: &Db,
84 id: &str,
85 ) -> Result<
86 Option<<<Self::ActiveModel as ActiveModelTrait>::Entity as EntityTrait>::Model>,
87 DbErr,
88 > {
89 <Self::ActiveModel as ActiveModelTrait>::Entity::find()
90 .filter(Expr::col(Alias::new("id")).eq(id))
91 .one(db.get())
92 .await
93 }
94
95 async fn get_all(
96 db: &Db,
97 ) -> Result<Vec<<<Self::ActiveModel as ActiveModelTrait>::Entity as EntityTrait>::Model>, DbErr>
98 {
99 Self::get_all_where(db, vec![], None, None).await
100 }
101
102 async fn get_all_where(
103 db: &Db,
104 conditions: Vec<SimpleExpr>,
105 offset: Option<u64>,
106 limit: Option<u64>,
107 ) -> Result<Vec<<<Self::ActiveModel as ActiveModelTrait>::Entity as EntityTrait>::Model>, DbErr>
108 {
109 let mut filter = Condition::all();
110 for condition in conditions.into_iter() {
111 filter = filter.add(condition);
112 }
113
114 let mut q = <Self::ActiveModel as ActiveModelTrait>::Entity::find().filter(filter);
115
116 if let Some(v) = offset {
117 q = q.offset(v);
118 }
119
120 if let Some(v) = limit {
121 q = q.limit(v);
122 }
123
124 q.all(db.get()).await
125 }
126
127 async fn update_by_id(db: &Db, id: &str, data: Self::ActiveModel) -> Result<bool, DbErr> {
128 let res = <Self::ActiveModel as ActiveModelTrait>::Entity::update_many()
129 .col_expr(Alias::new("updated_at"), Expr::value(utils::now()))
130 .set(data)
131 .filter(Expr::col(Alias::new("id")).eq(id))
132 .exec(db.get())
133 .await?;
134
135 Ok(res.rows_affected == 1)
136 }
137
138 async fn delete(
139 db: &Db,
140 primary_id: <<<Self::ActiveModel as ActiveModelTrait>::Entity as EntityTrait>::PrimaryKey as
141 PrimaryKeyTrait>::ValueType,
142 ) -> Result<bool, DbErr> {
143 let res = <Self::ActiveModel as ActiveModelTrait>::Entity::delete_by_id(primary_id)
144 .exec(db.get())
145 .await?;
146
147 Ok(res.rows_affected == 1)
148 }
149
150 async fn delete_by_id(db: &Db, id: &str) -> Result<bool, DbErr> {
151 let res = <Self::ActiveModel as ActiveModelTrait>::Entity::delete_many()
152 .filter(Expr::col(Alias::new("id")).eq(id))
153 .exec(db.get())
154 .await?;
155
156 Ok(res.rows_affected == 1)
157 }
158
159 async fn delete_by_ids(db: &Db, ids: Vec<String>) -> Result<u64, DbErr> {
160 let res = <Self::ActiveModel as ActiveModelTrait>::Entity::delete_many()
161 .filter(Expr::col(Alias::new("id")).is_in(ids))
162 .exec(db.get())
163 .await?;
164
165 Ok(res.rows_affected)
166 }
167}