fish_lib/game/repositories/
item_repository.rs

1use crate::database::DatabaseInterface;
2use crate::game::errors::repository::GameRepositoryError;
3use crate::models::item::{Item, NewItem};
4use crate::schema::fish_items;
5use crate::traits::repository::Repository;
6use chrono::Utc;
7use diesel::prelude::*;
8use std::sync::{Arc, RwLock};
9
10pub trait ItemRepositoryInterface: Repository<Item> + Send + Sync {
11    fn find_by_user(&self, user_id: i64) -> Result<Vec<Item>, GameRepositoryError>;
12    fn find_by_type_and_user(
13        &self,
14        type_id: i32,
15        user_id: i64,
16    ) -> Result<Vec<Item>, GameRepositoryError>;
17}
18
19pub struct ItemRepository {
20    db: Arc<RwLock<dyn DatabaseInterface>>,
21}
22
23impl ItemRepository {
24    pub fn new(db: Arc<RwLock<dyn DatabaseInterface>>) -> Self {
25        Self { db }
26    }
27}
28
29impl ItemRepositoryInterface for ItemRepository {
30    fn find_by_user(&self, user_id: i64) -> Result<Vec<Item>, GameRepositoryError> {
31        let mut connection = self.get_connection()?;
32
33        let results = fish_items::table
34            .filter(fish_items::user_id.eq(user_id))
35            .load::<Item>(&mut connection)?;
36
37        Ok(results)
38    }
39
40    fn find_by_type_and_user(
41        &self,
42        type_id: i32,
43        user_id: i64,
44    ) -> Result<Vec<Item>, GameRepositoryError> {
45        let mut connection = self.get_connection()?;
46
47        let results = fish_items::table
48            .filter(
49                fish_items::type_id
50                    .eq(type_id)
51                    .and(fish_items::user_id.eq(user_id)),
52            )
53            .load::<Item>(&mut connection)?;
54
55        Ok(results)
56    }
57}
58
59impl Repository<Item> for ItemRepository {
60    fn get_db(&self) -> Arc<RwLock<dyn DatabaseInterface>> {
61        self.db.clone()
62    }
63
64    fn create(&self, new_entity: NewItem) -> Result<Item, GameRepositoryError> {
65        let mut connection = self.get_connection()?;
66
67        let new_result = diesel::insert_into(fish_items::table)
68            .values(new_entity)
69            .get_result::<Item>(&mut connection)?;
70
71        Ok(new_result)
72    }
73
74    fn find(&self, id: i64) -> Result<Option<Item>, GameRepositoryError> {
75        let mut connection = self.get_connection()?;
76        let item = fish_items::table
77            .find(id)
78            .first::<Item>(&mut connection)
79            .optional()?;
80        Ok(item)
81    }
82
83    fn save(&self, mut entity: Item) -> Result<Item, GameRepositoryError> {
84        let mut connection = self.get_connection()?;
85        entity.updated_at = Utc::now();
86
87        let updated_item = diesel::update(fish_items::table)
88            .filter(fish_items::id.eq(entity.id))
89            .set(entity)
90            .get_result::<Item>(&mut connection)?;
91
92        Ok(updated_item)
93    }
94
95    fn delete(&self, entity: Item) -> Result<bool, GameRepositoryError> {
96        let mut connection = self.get_connection()?;
97
98        let deleted_count = diesel::delete(fish_items::table)
99            .filter(fish_items::id.eq(entity.id))
100            .execute(&mut connection)?;
101
102        Ok(deleted_count > 0)
103    }
104}