using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Company.Domain.EmployeeFaceEmbeddingAgg; using CompanyManagment.App.Contracts.EmployeeFaceEmbedding; namespace CompanyManagment.Application; public class EmployeeFaceEmbeddingApplication : IEmployeeFaceEmbeddingApplication { private readonly IEmployeeFaceEmbeddingRepository _repository; public EmployeeFaceEmbeddingApplication(IEmployeeFaceEmbeddingRepository repository) { _repository = repository; } public async Task GetByIdAsync(string id) { var entity = await _repository.GetByIdAsync(id); return entity == null ? null : MapToDto(entity); } public async Task GetByEmployeeIdAsync(long employeeId) { var entity = await _repository.GetByEmployeeIdAsync(employeeId); return entity == null ? null : MapToDto(entity); } public async Task> GetByWorkshopIdAsync(long workshopId) { var entities = await _repository.GetByWorkshopIdAsync(workshopId); return entities.Select(MapToDto).ToList(); } public async Task> GetByWorkshopIdsAsync(List workshopIds) { var entities = await _repository.GetByWorkshopIdsAsync(workshopIds); return entities.Select(MapToDto).ToList(); } public async Task SaveAsync(EmployeeFaceEmbeddingDto dto) { if (string.IsNullOrWhiteSpace(dto.Id)) { // ایجاد جدید var metadata = MapMetadataFromDto(dto.Metadata); var entity = new EmployeeFaceEmbedding( dto.EmployeeFullName, dto.EmployeeId, dto.WorkshopId, dto.Embeddings, metadata ); await _repository.CreateAsync(entity); return entity.Id; } else { // به‌روزرسانی var entity = await _repository.GetByIdAsync(dto.Id); if (entity == null) throw new Exception($"EmployeeFaceEmbedding با شناسه {dto.Id} یافت نشد"); entity.UpdateEmployeeInfo(dto.EmployeeFullName, dto.WorkshopId); entity.UpdateEmbedding(dto.Embeddings, 0, 0); entity.UpdateMetadata(MapMetadataFromDto(dto.Metadata), 0, 0); await _repository.UpdateAsync(entity); return entity.Id; } } public async Task DeleteAsync(string id) { await _repository.DeleteAsync(id); } #region Mapping Methods private EmployeeFaceEmbeddingDto MapToDto(EmployeeFaceEmbedding entity) { return new EmployeeFaceEmbeddingDto { Id = entity.Id, EmployeeFullName = entity.EmployeeFullName, EmployeeId = entity.EmployeeId, WorkshopId = entity.WorkshopId, Embeddings = entity.Embeddings, Metadata = MapMetadataToDto(entity.Metadata) }; } private EmployeeFaceEmbeddingMetadataDto MapMetadataToDto(EmployeeFaceEmbeddingMetadata metadata) { if (metadata == null) return null; return new EmployeeFaceEmbeddingMetadataDto { AvgEyeDistanceNormalized = metadata.AvgEyeDistanceNormalized, AvgEyeToFaceRatio = metadata.AvgEyeToFaceRatio, AvgFaceAspectRatio = metadata.AvgFaceAspectRatio, AvgDetectionConfidence = metadata.AvgDetectionConfidence, AvgKeypointsNormalized = MapKeypointsToDto(metadata.AvgKeypointsNormalized), PerImageMetadata = metadata.PerImageMetadata?.Select(x => new ImageMetadataDto { FaceAspectRatio = x.FaceAspectRatio, EyeDistanceNormalized = x.EyeDistanceNormalized, EyeToFaceRatio = x.EyeToFaceRatio, DetectionConfidence = x.DetectionConfidence, KeypointsNormalized = MapKeypointsToDto(x.KeypointsNormalized) }).ToList() }; } private EmployeeFaceEmbeddingKeypointsDto MapKeypointsToDto(EmployeeFaceEmbeddingKeypoints keypoints) { if (keypoints == null) return null; return new EmployeeFaceEmbeddingKeypointsDto { LeftEye = keypoints.LeftEye, RightEye = keypoints.RightEye, Nose = keypoints.Nose, MouthLeft = keypoints.MouthLeft, MouthRight = keypoints.MouthRight }; } private EmployeeFaceEmbeddingMetadata MapMetadataFromDto(EmployeeFaceEmbeddingMetadataDto dto) { if (dto == null) return null; return new EmployeeFaceEmbeddingMetadata { AvgEyeDistanceNormalized = dto.AvgEyeDistanceNormalized, AvgEyeToFaceRatio = dto.AvgEyeToFaceRatio, AvgFaceAspectRatio = dto.AvgFaceAspectRatio, AvgDetectionConfidence = dto.AvgDetectionConfidence, AvgKeypointsNormalized = MapKeypointsFromDto(dto.AvgKeypointsNormalized), PerImageMetadata = dto.PerImageMetadata?.Select(x => new ImageMetadata { FaceAspectRatio = x.FaceAspectRatio, EyeDistanceNormalized = x.EyeDistanceNormalized, EyeToFaceRatio = x.EyeToFaceRatio, DetectionConfidence = x.DetectionConfidence, KeypointsNormalized = MapKeypointsFromDto(x.KeypointsNormalized) }).ToList() }; } private EmployeeFaceEmbeddingKeypoints MapKeypointsFromDto(EmployeeFaceEmbeddingKeypointsDto dto) { if (dto == null) return null; return new EmployeeFaceEmbeddingKeypoints { LeftEye = dto.LeftEye, RightEye = dto.RightEye, Nose = dto.Nose, MouthLeft = dto.MouthLeft, MouthRight = dto.MouthRight }; } #endregion }