koprogo_api/application/ports/
achievement_repository.rs

1use crate::domain::entities::{Achievement, AchievementCategory, UserAchievement};
2use async_trait::async_trait;
3use uuid::Uuid;
4
5/// Repository trait for Achievement persistence operations
6#[async_trait]
7pub trait AchievementRepository: Send + Sync {
8    /// Create a new achievement
9    async fn create(&self, achievement: &Achievement) -> Result<Achievement, String>;
10
11    /// Find achievement by ID
12    async fn find_by_id(&self, id: Uuid) -> Result<Option<Achievement>, String>;
13
14    /// Find all achievements for an organization
15    async fn find_by_organization(&self, organization_id: Uuid)
16        -> Result<Vec<Achievement>, String>;
17
18    /// Find achievements by organization and category
19    async fn find_by_organization_and_category(
20        &self,
21        organization_id: Uuid,
22        category: AchievementCategory,
23    ) -> Result<Vec<Achievement>, String>;
24
25    /// Find visible achievements (non-secret or user has earned them)
26    async fn find_visible_for_user(
27        &self,
28        organization_id: Uuid,
29        user_id: Uuid,
30    ) -> Result<Vec<Achievement>, String>;
31
32    /// Update achievement
33    async fn update(&self, achievement: &Achievement) -> Result<Achievement, String>;
34
35    /// Delete achievement
36    async fn delete(&self, id: Uuid) -> Result<(), String>;
37
38    /// Count achievements by organization
39    async fn count_by_organization(&self, organization_id: Uuid) -> Result<i64, String>;
40}
41
42/// Repository trait for UserAchievement persistence operations
43#[async_trait]
44pub trait UserAchievementRepository: Send + Sync {
45    /// Award achievement to user
46    async fn create(&self, user_achievement: &UserAchievement) -> Result<UserAchievement, String>;
47
48    /// Find user achievement by ID
49    async fn find_by_id(&self, id: Uuid) -> Result<Option<UserAchievement>, String>;
50
51    /// Find all achievements earned by a user
52    async fn find_by_user(&self, user_id: Uuid) -> Result<Vec<UserAchievement>, String>;
53
54    /// Find specific user achievement
55    async fn find_by_user_and_achievement(
56        &self,
57        user_id: Uuid,
58        achievement_id: Uuid,
59    ) -> Result<Option<UserAchievement>, String>;
60
61    /// Update user achievement (for repeatable achievements)
62    async fn update(&self, user_achievement: &UserAchievement) -> Result<UserAchievement, String>;
63
64    /// Calculate total points for user
65    async fn calculate_total_points(&self, user_id: Uuid) -> Result<i32, String>;
66
67    /// Count achievements earned by user
68    async fn count_by_user(&self, user_id: Uuid) -> Result<i64, String>;
69
70    /// Get recent achievements for user (last N)
71    async fn find_recent_by_user(
72        &self,
73        user_id: Uuid,
74        limit: i64,
75    ) -> Result<Vec<UserAchievement>, String>;
76}