wb_cache/test/simulation/db/entity/
session.rs1use std::fmt::Debug;
2use std::sync::Arc;
3
4use crate::test::simulation::db::cache::CacheUpdates;
5use crate::test::simulation::db::cache::DBProvider;
6use crate::test::simulation::db::cache::DCCommon;
7use crate::test::simulation::db::driver::DatabaseDriver;
8use crate::test::simulation::types::Result;
9use crate::test::simulation::types::SimErrorAny;
10use crate::types::DataControllerResponse;
11use crate::update_iterator::UpdateIterator;
12use crate::DataController;
13
14use async_trait::async_trait;
15use fieldx_plus::fx_plus;
16use sea_orm::entity::prelude::*;
17use sea_orm::IntoActiveModel;
18use serde::Deserialize;
19use serde::Serialize;
20
21#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Serialize, Deserialize)]
22#[sea_orm(table_name = "sessions")]
23#[serde(deny_unknown_fields)]
24pub struct Model {
25 #[sea_orm(primary_key, auto_increment = false)]
26 #[serde(rename = "i")]
27 pub id: i64,
28 #[serde(rename = "c")]
30 pub customer_id: Option<i32>,
31 #[serde(rename = "e")]
33 pub expires_on: i32,
34}
35
36#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
37pub enum Relation {
38 #[sea_orm(
39 belongs_to = "super::customer::Entity",
40 from = "Column::CustomerId",
41 to = "super::customer::Column::Id"
42 )]
43 Customer,
44}
45
46impl ActiveModelBehavior for ActiveModel {}
47
48#[fx_plus(
50 child(DBCP, unwrap(or_else(SimErrorAny, super::dbcp_gone("session manager")))),
51 sync,
52 rc
53)]
54pub struct Manager<DBCP>
55where
56 DBCP: DBProvider, {}
57
58impl<DBCP> Manager<DBCP>
59where
60 DBCP: DBProvider,
61{
62 pub async fn get_by_session_id(&self, session_id: i64) -> Result<Vec<Model>> {
64 Ok(Entity::find()
65 .filter(Column::Id.eq(session_id))
66 .all(&self.db_provider()?.db_driver()?.connection())
67 .await?)
68 }
69}
70
71impl<DBCP> Debug for Manager<DBCP>
72where
73 DBCP: DBProvider,
74{
75 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
76 write!(f, "SessionManager")
77 }
78}
79
80#[async_trait]
81impl<DBCP> DataController for Manager<DBCP>
82where
83 DBCP: DBProvider,
84{
85 type CacheUpdate = CacheUpdates<ActiveModel>;
86 type Error = SimErrorAny;
87 type Key = i64;
88 type Value = Model;
89
90 async fn get_for_key(&self, id: &Self::Key) -> Result<Option<Self::Value>> {
91 Ok(Entity::find_by_id(*id)
92 .one(&self.db_provider()?.db_connection()?)
93 .await?)
94 }
95
96 fn primary_key_of(&self, value: &Self::Value) -> Self::Key {
97 value.id
98 }
99
100 async fn write_back(&self, update_records: Arc<UpdateIterator<Self>>) -> Result<(), Self::Error> {
101 self.wbdc_write_back(update_records).await
102 }
103
104 async fn on_new(&self, key: &Self::Key, value: &Self::Value) -> Result<DataControllerResponse<Self>, Self::Error> {
105 self.wbdbc_on_new(key, &value.clone().into_active_model()).await
106 }
107
108 async fn on_delete(
109 &self,
110 key: &Self::Key,
111 update: Option<&CacheUpdates<ActiveModel>>,
112 ) -> Result<DataControllerResponse<Self>> {
113 self.wbdc_on_delete(key, update).await
114 }
115
116 async fn on_change(
117 &self,
118 key: &Self::Key,
119 value: &Self::Value,
120 old_value: Self::Value,
121 prev_update: Option<Self::CacheUpdate>,
122 ) -> Result<DataControllerResponse<Self>> {
123 self.wbdc_on_change(key, value, old_value, prev_update).await
124 }
125}
126
127impl<DBCP> DCCommon<Entity, DBCP, true> for Manager<DBCP>
128where
129 DBCP: DBProvider,
130{
131 fn delete_many_condition(dm: sea_orm::DeleteMany<Entity>, keys: Vec<Self::Key>) -> sea_orm::DeleteMany<Entity> {
132 dm.filter(Column::Id.is_in(keys))
133 }
134}