feat: implement album sharing functionality with permissions management

This commit is contained in:
2025-11-02 17:39:11 +01:00
parent f49d9179f5
commit a36b59a5fb
11 changed files with 263 additions and 31 deletions

View File

@@ -1,6 +1,6 @@
use uuid::Uuid;
use crate::models::{Album, Media, Role, User};
use crate::models::{Album, AlbumPermission, Media, Role, User};
pub trait Ownable {
fn owner_id(&self) -> Uuid;
@@ -23,3 +23,19 @@ pub fn is_admin(user: &User) -> bool {
pub fn is_owner(user_id: Uuid, entity: &impl Ownable) -> bool {
user_id == entity.owner_id()
}
pub fn can_view_album(
user_id: Uuid,
album: &Album,
share_permission: Option<AlbumPermission>,
) -> bool {
is_owner(user_id, album) || share_permission.is_some()
}
pub fn can_contribute_to_album(
user_id: Uuid,
album: &Album,
share_permission: Option<AlbumPermission>,
) -> bool {
is_owner(user_id, album) || share_permission == Some(AlbumPermission::Contribute)
}

View File

@@ -1,3 +1,5 @@
use serde::Deserialize;
#[derive(Debug, Clone, PartialEq, Eq, sqlx::Type)]
#[sqlx(rename_all = "lowercase")]
#[sqlx(type_name = "TEXT")]
@@ -75,7 +77,9 @@ pub struct AlbumMedia {
pub media_id: uuid::Uuid,
}
#[derive(Clone, Copy)]
#[derive(Debug, Clone, Copy, sqlx::Type, PartialEq, Eq, Deserialize)]
#[sqlx(rename_all = "lowercase")]
#[sqlx(type_name = "album_permission")]
pub enum AlbumPermission {
View,
Contribute,

View File

@@ -3,7 +3,7 @@ use uuid::Uuid;
use crate::{
error::CoreResult,
models::{Album, Media, User},
models::{Album, AlbumPermission, Media, User},
};
#[async_trait]
@@ -37,3 +37,21 @@ pub trait AlbumRepository: Send + Sync {
async fn list_by_user(&self, user_id: Uuid) -> CoreResult<Vec<Album>>;
async fn add_media_to_album(&self, album_id: Uuid, media_ids: &[Uuid]) -> CoreResult<()>;
}
#[async_trait]
pub trait AlbumShareRepository: Send + Sync {
async fn create_or_update_share(
&self,
album_id: Uuid,
user_id: Uuid,
permission: AlbumPermission,
) -> CoreResult<()>;
async fn get_user_permission(
&self,
album_id: Uuid,
user_id: Uuid,
) -> CoreResult<Option<AlbumPermission>>;
async fn is_media_in_shared_album(&self, media_id: Uuid, user_id: Uuid) -> CoreResult<bool>;
}