koprogo_api/application/ports/
achievement_repository.rs1use crate::domain::entities::{Achievement, AchievementCategory, UserAchievement};
2use async_trait::async_trait;
3use uuid::Uuid;
4
5#[async_trait]
7pub trait AchievementRepository: Send + Sync {
8 async fn create(&self, achievement: &Achievement) -> Result<Achievement, String>;
10
11 async fn find_by_id(&self, id: Uuid) -> Result<Option<Achievement>, String>;
13
14 async fn find_by_organization(&self, organization_id: Uuid)
16 -> Result<Vec<Achievement>, String>;
17
18 async fn find_by_organization_and_category(
20 &self,
21 organization_id: Uuid,
22 category: AchievementCategory,
23 ) -> Result<Vec<Achievement>, String>;
24
25 async fn find_visible_for_user(
27 &self,
28 organization_id: Uuid,
29 user_id: Uuid,
30 ) -> Result<Vec<Achievement>, String>;
31
32 async fn update(&self, achievement: &Achievement) -> Result<Achievement, String>;
34
35 async fn delete(&self, id: Uuid) -> Result<(), String>;
37
38 async fn count_by_organization(&self, organization_id: Uuid) -> Result<i64, String>;
40}
41
42#[async_trait]
44pub trait UserAchievementRepository: Send + Sync {
45 async fn create(&self, user_achievement: &UserAchievement) -> Result<UserAchievement, String>;
47
48 async fn find_by_id(&self, id: Uuid) -> Result<Option<UserAchievement>, String>;
50
51 async fn find_by_user(&self, user_id: Uuid) -> Result<Vec<UserAchievement>, String>;
53
54 async fn find_by_user_and_achievement(
56 &self,
57 user_id: Uuid,
58 achievement_id: Uuid,
59 ) -> Result<Option<UserAchievement>, String>;
60
61 async fn update(&self, user_achievement: &UserAchievement) -> Result<UserAchievement, String>;
63
64 async fn calculate_total_points(&self, user_id: Uuid) -> Result<i32, String>;
66
67 async fn count_by_user(&self, user_id: Uuid) -> Result<i64, String>;
69
70 async fn find_recent_by_user(
72 &self,
73 user_id: Uuid,
74 limit: i64,
75 ) -> Result<Vec<UserAchievement>, String>;
76}