r2_data_persistence/operations/
session.rs1use 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}