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