feat: Add thumbnail management for albums and people, implement face embedding functionality

This commit is contained in:
2025-11-15 22:50:53 +01:00
parent 98f56e4f1e
commit 0f3e098d6d
28 changed files with 560 additions and 26 deletions

View File

@@ -170,4 +170,22 @@ impl AlbumService for AlbumServiceImpl {
let media = self.album_repo.list_media_by_album_id(album_id).await?;
Ok(PublicAlbumBundle { album, media })
}
async fn set_album_thumbnail(
&self,
album_id: Uuid,
media_id: Uuid,
user_id: Uuid,
) -> CoreResult<()> {
self.auth_service
.check_permission(Some(user_id), Permission::EditAlbum(album_id))
.await?;
self.auth_service
.check_permission(Some(user_id), Permission::ViewMedia(media_id))
.await?;
self.album_repo
.set_thumbnail_media_id(album_id, media_id)
.await
}
}

View File

@@ -120,7 +120,6 @@ impl AuthorizationService for AuthorizationServiceImpl {
if let Some(ref user) = user {
if authz::is_admin(user) {
// [cite: 115]
return Ok(());
}
}
@@ -135,7 +134,6 @@ impl AuthorizationService for AuthorizationServiceImpl {
if let Some(id) = user_id {
if authz::is_owner(id, &media) {
// [cite: 117]
return Ok(());
}
@@ -144,7 +142,6 @@ impl AuthorizationService for AuthorizationServiceImpl {
.is_media_in_shared_album(media_id, id)
.await?
{
// [cite: 118-119]
return Ok(());
}
}

View File

@@ -215,4 +215,34 @@ impl PersonService for PersonServiceImpl {
self.person_repo.delete(source_person_id).await
}
async fn set_person_thumbnail(
&self,
person_id: Uuid,
face_region_id: Uuid,
user_id: Uuid,
) -> CoreResult<()> {
self.auth_service
.check_permission(Some(user_id), authz::Permission::EditPerson(person_id))
.await?;
let face_region =
self.face_repo
.find_by_id(face_region_id)
.await?
.ok_or(CoreError::NotFound(
"FaceRegion".to_string(),
face_region_id,
))?;
if face_region.person_id != Some(person_id) {
return Err(CoreError::Validation(
"FaceRegion does not belong to the specified person".to_string(),
));
}
self.person_repo
.set_thumbnail_media_id(person_id, face_region.media_id)
.await
}
}