barreleye_common/models/
mod.rs

1use 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
31// @TODO `https://github.com/SeaQL/sea-orm/issues/1068`
32pub 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}