r2_data_persistence/operations/
user.rs

1use crate::entities::User;
2use crate::models::user::{CreateUserModel, GetUserModel, UpdateUserModel};
3use crate::schema::user::dsl::*;
4use diesel::associations::HasTable;
5use diesel::prelude::*;
6use uuid::Uuid;
7
8pub fn create_user(connection: &mut PgConnection, model: CreateUserModel) {
9    diesel::insert_into(user::table())
10        .values(to_entity(model))
11        .returning(User::as_returning())
12        .get_result(connection)
13        .expect("Error saving new user");
14}
15
16pub fn get_user(connection: &mut PgConnection, key: &str) -> Option<GetUserModel> {
17    let result: QueryResult<User> = user.find(key).select(User::as_select()).first(connection);
18
19    if let Ok(entity) = result {
20        return Some(to_model(entity));
21    }
22
23    None
24}
25
26pub fn get_all_users(connection: &mut PgConnection) -> Vec<GetUserModel> {
27    user.select(User::as_select())
28        .load(connection)
29        .expect("Error loading users")
30        .into_iter()
31        .map(to_model)
32        .collect()
33}
34
35pub fn update_user(connection: &mut PgConnection, key: &str, model: UpdateUserModel) {
36    diesel::update(user.find(key))
37        .set::<UpdateUserModel>(model)
38        .returning(User::as_returning())
39        .get_result(connection)
40        .expect("Error updating user");
41}
42
43pub fn delete_user(connection: &mut PgConnection, key: &str) {
44    diesel::delete(user.find(key))
45        .execute(connection)
46        .expect("Error deleting user");
47}
48
49fn to_model(entity: User) -> GetUserModel {
50    GetUserModel {
51        id: entity.id,
52        email: entity.email,
53        username: entity.username,
54        profile_picture: entity.profile_picture,
55        all_time_accuracy: entity.all_time_accuracy,
56        all_time_highscore: entity.all_time_highscore,
57        rank: entity.rank,
58        percent: entity.percent,
59    }
60}
61
62fn to_entity(model: CreateUserModel) -> User {
63    User {
64        id: Uuid::new_v4().to_string(),
65        email: model.email,
66        password: model.password,
67        username: model.username,
68        profile_picture: model.profile_picture,
69        all_time_accuracy: model.all_time_accuracy,
70        all_time_highscore: model.all_time_highscore,
71        rank: model.rank,
72        percent: model.percent,
73    }
74}