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(
9    connection: &mut PgConnection,
10    model: CreateSessionModel,
11) -> Result<GetSessionModel, String> {
12    let result = diesel::insert_into(session::table())
13        .values(to_entity(model))
14        .returning(Session::as_returning())
15        .get_result(connection);
16
17    match result {
18        Ok(entity) => Ok(to_model(entity)),
19        Err(error) => Err(format!("Error creating session: {}", error)),
20    }
21}
22
23pub fn get_session(connection: &mut PgConnection, key: &str) -> Option<GetSessionModel> {
24    let result: QueryResult<Session> = session
25        .find(key)
26        .select(Session::as_select())
27        .first(connection);
28
29    if let Ok(entity) = result {
30        return Some(to_model(entity));
31    }
32
33    None
34}
35
36pub fn get_all_sessions(connection: &mut PgConnection) -> Result<Vec<GetSessionModel>, String> {
37    let result = session.select(Session::as_select()).load(connection);
38
39    match result {
40        Ok(entities) => Ok(entities.into_iter().map(to_model).collect()),
41        Err(error) => Err(format!("Error getting sessions: {}", error)),
42    }
43}
44
45pub fn update_session(
46    connection: &mut PgConnection,
47    key: &str,
48    model: UpdateSessionModel,
49) -> Result<GetSessionModel, String> {
50    let result = diesel::update(session.find(key))
51        .set::<UpdateSessionModel>(model)
52        .returning(Session::as_returning())
53        .get_result(connection);
54
55    match result {
56        Ok(entity) => Ok(to_model(entity)),
57        Err(error) => Err(format!("Error updating session: {}", error)),
58    }
59}
60
61pub fn delete_session(connection: &mut PgConnection, key: &str) -> Result<(), String> {
62    let result = diesel::delete(session.find(key)).execute(connection);
63
64    match result {
65        Ok(_) => Ok(()),
66        Err(error) => Err(format!("Error deleting session: {}", error)),
67    }
68}
69
70fn to_model(entity: Session) -> GetSessionModel {
71    GetSessionModel {
72        id: entity.id,
73        user_uuid: entity.user_uuid,
74        map_id: entity.map_id,
75        session_date: entity.session_date,
76        difficulty: entity.difficulty,
77        accuracy: entity.accuracy,
78        level: entity.level,
79        game_time: entity.game_time,
80        score_value: entity.score_value,
81        targets_hit: entity.targets_hit,
82        targets_miss: entity.targets_miss,
83        average_offset_time: entity.average_offset_time,
84        personal_best: entity.personal_best,
85    }
86}
87
88fn to_entity(model: CreateSessionModel) -> Session {
89    Session {
90        id: Uuid::new_v4().to_string(),
91        user_uuid: model.user_uuid,
92        map_id: model.map_id,
93        session_date: model.session_date,
94        difficulty: model.difficulty,
95        accuracy: model.accuracy,
96        level: model.level,
97        game_time: model.game_time,
98        score_value: model.score_value,
99        targets_hit: model.targets_hit,
100        targets_miss: model.targets_miss,
101        average_offset_time: model.average_offset_time,
102        personal_best: model.personal_best,
103    }
104}