wb_cache/test/simulation/db/entity/
session.rs

1use 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    /// If the session was used to login then it will get an associated customer ID.
29    #[serde(rename = "c")]
30    pub customer_id: Option<i32>,
31    /// On what simulation day the session must be expired.
32    #[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/// The manager and the data controller for the session model.
49#[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    /// Get session by its ID.
63    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}