feat: Implement album and person sharing with user search and a dedicated share dialog.
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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]
|
||||
|
||||
Reference in New Issue
Block a user