r2_data_persistence/operations/
session.rs

1use crate::entities::Session;
2use crate::models::session::{CreateSessionModel, GetSessionModel, UpdateSessionModel};
3use crate::schema::session::dsl::session;
4use diesel::associations::HasTable;
5use diesel::{PgConnection, QueryDsl, QueryResult, RunQueryDsl, SelectableHelper};
6use uuid::Uuid;
7
8pub fn create_session(connection: &mut PgConnection, model: CreateSessionModel) {
9    diesel::insert_into(session::table())
10        .values(to_entity(model))
11        .returning(Session::as_returning())
12        .get_result(connection)
13        .expect("Error saving new session");
14}
15
16pub fn get_session(connection: &mut PgConnection, key: &str) -> Option<GetSessionModel> {
17    let result: QueryResult<Session> = session
18        .find(key)
19        .select(Session::as_select())
20        .first(connection);
21
22    if let Ok(entity) = result {
23        return Some(to_model(entity));
24    }
25
26    None
27}
28
29pub fn get_all_sessions(connection: &mut PgConnection) -> Vec<GetSessionModel> {
30    session
31        .select(Session::as_select())
32        .load(connection)
33        .expect("Error loading sessions")
34        .into_iter()
35        .map(to_model)
36        .collect()
37}
38
39pub fn update_session(connection: &mut PgConnection, key: &str, model: UpdateSessionModel) {
40    diesel::update(session.find(key))
41        .set::<UpdateSessionModel>(model)
42        .returning(Session::as_returning())
43        .get_result(connection)
44        .expect("Error updating session");
45}
46
47pub fn delete_session(connection: &mut PgConnection, key: &str) {
48    diesel::delete(session.find(key))
49        .execute(connection)
50        .expect("Error deleting session");
51}
52
53fn to_model(entity: Session) -> GetSessionModel {
54    GetSessionModel {
55        id: entity.id,
56        user_uuid: entity.user_uuid,
57        map_id: entity.map_id,
58        session_date: entity.session_date,
59        difficulty: entity.difficulty,
60        accuracy: entity.accuracy,
61        level: entity.level,
62        game_time: entity.game_time,
63        score_value: entity.score_value,
64        targets_hit: entity.targets_hit,
65        targets_miss: entity.targets_miss,
66        average_offset_time: entity.average_offset_time,
67        personal_best: entity.personal_best,
68    }
69}
70
71fn to_entity(model: CreateSessionModel) -> Session {
72    Session {
73        id: Uuid::new_v4().to_string(),
74        user_uuid: model.user_uuid,
75        map_id: model.map_id,
76        session_date: model.session_date,
77        difficulty: model.difficulty,
78        accuracy: model.accuracy,
79        level: model.level,
80        game_time: model.game_time,
81        score_value: model.score_value,
82        targets_hit: model.targets_hit,
83        targets_miss: model.targets_miss,
84        average_offset_time: model.average_offset_time,
85        personal_best: model.personal_best,
86    }
87}