fish_lib/game/repositories/
pond_repository.rs1use 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}