using Foxel.Controllers; using Foxel.Models; using Foxel.Models.Response.Face; using Foxel.Models.Response.Picture; using Foxel.Services.Management; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace Foxel.Api; [Authorize] [Route("api/face")] public class FaceController( IFaceManagementService faceManagementService, IFaceClusteringService faceClusteringService, ILogger logger) : BaseApiController { /// /// 获取当前用户的人脸聚类列表 /// [HttpGet("clusters")] public async Task>>> GetMyFaceClusters( [FromQuery] int page = 1, [FromQuery] int pageSize = 20) { try { var userId = GetCurrentUserId(); if (!userId.HasValue) return Error>("用户未认证", 401); var result = await faceManagementService.GetUserFaceClustersAsync(userId.Value, page, pageSize); return Success(result, "获取人脸聚类列表成功"); } catch (Exception ex) { logger.LogError(ex, "获取用户人脸聚类列表失败: UserId={UserId}", GetCurrentUserId()); return Error>("获取人脸聚类列表失败", 500); } } /// /// 根据聚类获取当前用户的图片 /// [HttpGet("clusters/{clusterId}/pictures")] public async Task>>> GetMyPicturesByCluster( int clusterId, [FromQuery] int page = 1, [FromQuery] int pageSize = 20) { try { var userId = GetCurrentUserId(); if (!userId.HasValue) return Error>("用户未认证", 401); var result = await faceManagementService.GetUserPicturesByClusterAsync( userId.Value, clusterId, page, pageSize); return Success(result, "获取聚类图片成功"); } catch (KeyNotFoundException) { return Error>("找不到指定的人脸聚类或无权访问", 404); } catch (Exception ex) { logger.LogError(ex, "获取用户聚类图片失败: UserId={UserId}, ClusterId={ClusterId}", GetCurrentUserId(), clusterId); return Error>("获取聚类图片失败", 500); } } /// /// 更新当前用户的人脸聚类信息 /// [HttpPut("clusters/{clusterId}")] public async Task>> UpdateMyCluster( int clusterId, [FromBody] UpdateClusterRequest request) { try { var userId = GetCurrentUserId(); if (!userId.HasValue) return Error("用户未认证", 401); var result = await faceManagementService.UpdateUserClusterAsync( userId.Value, clusterId, request.PersonName, request.Description); return Success(result, "更新聚类信息成功"); } catch (KeyNotFoundException) { return Error("找不到指定的人脸聚类或无权访问", 404); } catch (Exception ex) { logger.LogError(ex, "更新用户聚类信息失败: UserId={UserId}, ClusterId={ClusterId}", GetCurrentUserId(), clusterId); return Error("更新聚类信息失败", 500); } } /// /// 开始当前用户的人脸聚类 /// [HttpPost("clusters/analyze")] public async Task>> StartMyFaceClustering() { try { var userId = GetCurrentUserId(); if (!userId.HasValue) return Error("用户未认证", 401); await faceClusteringService.ClusterUserFacesAsync(userId.Value); return Success(true, "人脸聚类任务已开始"); } catch (Exception ex) { logger.LogError(ex, "启动用户人脸聚类失败: UserId={UserId}", GetCurrentUserId()); return Error("启动人脸聚类失败", 500); } } /// /// 合并当前用户的聚类 /// [HttpPost("clusters/{targetClusterId}/merge")] public async Task>> MergeMyUserClusters( int targetClusterId, [FromBody] MergeClustersRequest request) { try { var userId = GetCurrentUserId(); if (!userId.HasValue) return Error("用户未认证", 401); var result = await faceManagementService.MergeUserClustersAsync( userId.Value, request.SourceClusterId, targetClusterId); return Success(result, "合并聚类成功"); } catch (KeyNotFoundException ex) { return Error(ex.Message, 404); } catch (Exception ex) { logger.LogError(ex, "合并用户聚类失败: UserId={UserId}", GetCurrentUserId()); return Error("合并聚类失败", 500); } } /// /// 从聚类中移除人脸 /// [HttpDelete("faces/{faceId}/cluster")] public async Task>> RemoveFaceFromCluster(int faceId) { try { var userId = GetCurrentUserId(); if (!userId.HasValue) return Error("用户未认证", 401); var result = await faceManagementService.RemoveUserFaceFromClusterAsync(userId.Value, faceId); return Success(result, "移除人脸成功"); } catch (KeyNotFoundException) { return Error("找不到指定的人脸或无权访问", 404); } catch (Exception ex) { logger.LogError(ex, "移除用户人脸失败: UserId={UserId}, FaceId={FaceId}", GetCurrentUserId(), faceId); return Error("移除人脸失败", 500); } } } public record UpdateClusterRequest { public string? PersonName { get; set; } public string? Description { get; set; } } public record MergeClustersRequest { public int SourceClusterId { get; set; } }