fish_lib/game/repositories/
pond_repository.rs

1use crate::database::DatabaseInterface;
2use crate::game::errors::repository::GameRepositoryError;
3use crate::models::pond::{NewPond, Pond};
4use crate::models::user::User;
5use crate::schema::fish_ponds;
6use crate::traits::repository::Repository;
7use chrono::Utc;
8use diesel::prelude::*;
9use std::sync::{Arc, RwLock};
10
11pub trait PondRepositoryInterface: Repository<Pond> + Send + Sync {
12    fn find_by_user(&self, owner_user: &User) -> Result<Vec<Pond>, GameRepositoryError>;
13}
14
15pub struct PondRepository {
16    db: Arc<RwLock<dyn DatabaseInterface>>,
17}
18
19impl PondRepository {
20    pub fn new(db: Arc<RwLock<dyn DatabaseInterface>>) -> Self {
21        PondRepository { db }
22    }
23}
24
25impl PondRepositoryInterface for PondRepository {
26    fn find_by_user(&self, owner_user: &User) -> Result<Vec<Pond>, GameRepositoryError> {
27        let mut connection = self.get_connection()?;
28
29        let pond = fish_ponds::table
30            .filter(fish_ponds::user_id.eq(owner_user.id))
31            .load::<Pond>(&mut connection)?;
32
33        Ok(pond)
34    }
35}
36
37impl Repository<Pond> for PondRepository {
38    fn get_db(&self) -> Arc<RwLock<dyn DatabaseInterface>> {
39        self.db.clone()
40    }
41
42    fn create(&self, new_entity: NewPond) -> Result<Pond, GameRepositoryError> {
43        let mut connection = self.get_connection()?;
44
45        let new_result = diesel::insert_into(fish_ponds::table)
46            .values(new_entity)
47            .get_result::<Pond>(&mut connection)?;
48
49        Ok(new_result)
50    }
51
52    fn find(&self, id: i64) -> Result<Option<Pond>, GameRepositoryError> {
53        let mut connection = self.get_connection()?;
54        let pond = fish_ponds::table
55            .find(id)
56            .first::<Pond>(&mut connection)
57            .optional()?;
58        Ok(pond)
59    }
60
61    fn save(&self, mut entity: Pond) -> Result<Pond, GameRepositoryError> {
62        let mut connection = self.get_connection()?;
63        entity.updated_at = Utc::now();
64
65        let updated_pond = diesel::update(fish_ponds::table)
66            .filter(fish_ponds::id.eq(entity.id))
67            .set(entity)
68            .get_result::<Pond>(&mut connection)?;
69
70        Ok(updated_pond)
71    }
72
73    fn delete(&self, entity: Pond) -> Result<bool, GameRepositoryError> {
74        let mut connection = self.get_connection()?;
75
76        let deleted_count = diesel::delete(fish_ponds::table)
77            .filter(fish_ponds::id.eq(entity.id))
78            .execute(&mut connection)?;
79
80        Ok(deleted_count > 0)
81    }
82}