fish_lib/game/repositories/
user_repository.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
use crate::get_db_connection;
use crate::models::user::{NewUser, User};
use crate::schema::fish_users;
use crate::traits::repository::Repository;
use chrono::Utc;
use diesel::prelude::*;
use std::error::Error;

pub struct UserRepository;

impl UserRepository {
    pub fn find_by_external_id(external_id: i64) -> Result<Option<User>, Box<dyn Error>> {
        let mut connection = get_db_connection()?;
        let user = fish_users::table
            .filter(fish_users::external_id.eq(external_id))
            .first::<User>(&mut connection)
            .optional()?;
        Ok(user)
    }
}

impl Repository<User> for UserRepository {
    fn create(new_entity: NewUser) -> Result<User, Box<dyn Error>> {
        let mut connection = get_db_connection()?;

        let new_result = diesel::insert_into(fish_users::table)
            .values(new_entity)
            .get_result::<User>(&mut connection)?;

        Ok(new_result)
    }

    fn find(id: i64) -> Result<Option<User>, Box<dyn Error>> {
        let mut connection = get_db_connection()?;
        let user = fish_users::table
            .find(id)
            .first::<User>(&mut connection)
            .optional()?;
        Ok(user)
    }

    fn save(mut entity: User) -> Result<User, Box<dyn Error>> {
        let mut connection = get_db_connection()?;
        entity.updated_at = Utc::now();

        let updated_user = diesel::update(fish_users::table)
            .filter(fish_users::id.eq(entity.id))
            .set(entity)
            .get_result::<User>(&mut connection)?;

        Ok(updated_user)
    }

    fn delete(entity: &User) -> Result<bool, Box<dyn Error>> {
        let mut connection = get_db_connection()?;

        let deleted_count = diesel::delete(fish_users::table)
            .filter(fish_users::id.eq(entity.id))
            .execute(&mut connection)?;

        Ok(deleted_count > 0)
    }
}