feat: Implement face clustering and media retrieval for persons

This commit is contained in:
2025-11-15 23:39:51 +01:00
parent 0f3e098d6d
commit d444871829
9 changed files with 239 additions and 8 deletions

View File

@@ -10,10 +10,12 @@ use uuid::Uuid;
use crate::{
error::ApiError,
extractors::query_options::ApiListMediaOptions,
middleware::auth::UserId,
schema::{
AssignFaceRequest, CreatePersonRequest, FaceRegionResponse, MergePersonRequest,
PersonResponse, SetPersonThumbnailRequest, SharePersonRequest, UpdatePersonRequest,
AssignFaceRequest, CreatePersonRequest, FaceRegionResponse, MediaResponse,
MergePersonRequest, PaginatedResponse, PersonResponse, SetPersonThumbnailRequest,
SharePersonRequest, UpdatePersonRequest, map_paginated_response,
},
state::AppState,
};
@@ -31,6 +33,8 @@ pub fn people_routes() -> Router<AppState> {
)
.route("/{person_id}/merge", post(merge_person))
.route("/{person_id}/thumbnail", put(set_person_thumbnail))
.route("/cluster", post(cluster_faces))
.route("/{person_id}/media", get(list_media_for_person))
}
pub fn face_routes() -> Router<AppState> {
@@ -176,3 +180,29 @@ async fn set_person_thumbnail(
.await?;
Ok(StatusCode::OK)
}
async fn cluster_faces(
State(state): State<AppState>,
UserId(user_id): UserId,
) -> Result<StatusCode, ApiError> {
state
.person_service
.cluster_unassigned_faces(user_id)
.await?;
Ok(StatusCode::OK)
}
async fn list_media_for_person(
State(state): State<AppState>,
UserId(user_id): UserId,
Path(person_id): Path<Uuid>,
ApiListMediaOptions(options): ApiListMediaOptions,
) -> Result<Json<PaginatedResponse<MediaResponse>>, ApiError> {
let core_paginated_result = state
.person_service
.list_media_for_person(person_id, user_id, options)
.await?;
let api_response = map_paginated_response(core_paginated_result);
Ok(Json(api_response))
}