feat: Implement album and person sharing with user search and a dedicated share dialog.

This commit is contained in:
2025-12-04 00:58:10 +01:00
parent 74d74a128b
commit 7f07169064
23 changed files with 816 additions and 66 deletions

View File

@@ -1,4 +1,4 @@
use serde::Deserialize;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq)]
@@ -120,7 +120,8 @@ pub struct AlbumMedia {
pub media_id: uuid::Uuid,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum AlbumPermission {
View,
Contribute,
@@ -166,7 +167,8 @@ pub struct Tag {
pub name: String,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum PersonPermission {
View,
CanUse,

View File

@@ -36,6 +36,7 @@ pub trait UserRepository: Send + Sync {
async fn find_by_username(&self, username: &str) -> CoreResult<Option<User>>;
async fn find_by_id(&self, id: Uuid) -> CoreResult<Option<User>>;
async fn update_storage_used(&self, user_id: Uuid, bytes: i64) -> CoreResult<()>;
async fn search_users(&self, query: &str) -> CoreResult<Vec<User>>;
}
#[async_trait]
@@ -73,6 +74,13 @@ pub trait AlbumShareRepository: Send + Sync {
media_id: Uuid,
user_id: Uuid,
) -> CoreResult<bool>;
async fn list_shares_for_album(
&self,
album_id: Uuid,
) -> CoreResult<Vec<(User, AlbumPermission)>>;
async fn remove_share(&self, album_id: Uuid, user_id: Uuid) -> CoreResult<()>;
}
#[async_trait]
@@ -131,6 +139,11 @@ pub trait PersonShareRepository: Send + Sync {
&self,
user_id: Uuid,
) -> CoreResult<Vec<(Person, PersonPermission)>>;
async fn list_shares_for_person(
&self,
person_id: Uuid,
) -> CoreResult<Vec<(User, PersonPermission)>>;
}
#[async_trait]

View File

@@ -5,8 +5,8 @@ use crate::{
authz::Permission,
error::CoreResult,
models::{
Album, FaceRegion, Media, MediaBundle, Person, PersonPermission, PublicAlbumBundle, Tag,
User,
Album, AlbumPermission, FaceRegion, Media, MediaBundle, Person, PersonPermission,
PublicAlbumBundle, Tag, User,
},
schema::{
AddMediaToAlbumData, CreateAlbumData, CreateUserData, ListMediaOptions, LoginUserData,
@@ -35,6 +35,7 @@ pub trait UserService: Send + Sync {
async fn register(&self, data: CreateUserData<'_>) -> CoreResult<User>;
async fn login(&self, data: LoginUserData<'_>) -> CoreResult<String>;
async fn get_user_details(&self, user_id: uuid::Uuid) -> CoreResult<User>;
async fn search_users(&self, query: &str) -> CoreResult<Vec<User>>;
}
#[async_trait]
@@ -65,6 +66,18 @@ pub trait AlbumService: Send + Sync {
media_ids: &[Uuid],
user_id: Uuid,
) -> CoreResult<()>;
async fn get_album_shares(
&self,
album_id: Uuid,
user_id: Uuid,
) -> CoreResult<Vec<(User, AlbumPermission)>>;
async fn unshare_album(
&self,
album_id: Uuid,
target_user_id: Uuid,
owner_id: Uuid,
) -> CoreResult<()>;
}
#[async_trait]
@@ -143,6 +156,12 @@ pub trait PersonService: Send + Sync {
user_id: Uuid,
options: ListMediaOptions,
) -> CoreResult<PaginatedResponse<Media>>;
async fn get_person_shares(
&self,
person_id: Uuid,
user_id: Uuid,
) -> CoreResult<Vec<(User, PersonPermission)>>;
}
#[async_trait]