package com.mirna.hospitalmanagementapi.application.services; import com.mirna.hospitalmanagementapi.domain.entities.MedicalImage; import com.mirna.hospitalmanagementapi.domain.entities.MedicalRecord; import com.mirna.hospitalmanagementapi.domain.repositories.MedicalImageRepository; import com.mirna.hospitalmanagementapi.domain.repositories.MedicalRecordRepository; import com.mirna.hospitalmanagementapi.domain.services.MedicalImageService; import io.minio.*; import io.minio.errors.MinioException; import jakarta.persistence.EntityNotFoundException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.io.InputStreamResource; import org.springframework.core.io.Resource; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import java.io.InputStream; import java.time.LocalDateTime; import java.util.UUID; @Service public class MedicalImageServiceImpl implements MedicalImageService { @Autowired private MinioClient minioClient; // เพิ่ม repository สำหรับการจัดการข้อมูลในฐานข้อมูล @Autowired private MedicalImageRepository medicalImageRepository; @Autowired private MedicalRecordRepository medicalRecordRepository; @Value("${minio.bucket-name}") private String bucketName; @Override public MedicalImage uploadImage(Long medicalRecordId, MultipartFile file, String imageType, String notes) { try { // ค้นหา MedicalRecord ที่ต้องการเชื่อมโยง MedicalRecord medicalRecord = medicalRecordRepository.findById(medicalRecordId) .orElseThrow(() -> new EntityNotFoundException("Medical Record not found.")); // สร้าง bucket ถ้ายังไม่มี (โค้ดเดิม) if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) { minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build()); } // สร้างชื่อไฟล์ที่ไม่ซ้ำกัน String fileName = UUID.randomUUID().toString() + "-" + file.getOriginalFilename(); InputStream inputStream = file.getInputStream(); // อัปโหลดไฟล์ไปยัง MinIO (โค้ดเดิม) minioClient.putObject( PutObjectArgs.builder() .bucket(bucketName) .object(fileName) .stream(inputStream, file.getSize(), -1) .contentType(file.getContentType()) .build() ); // บันทึกข้อมูล MedicalImage ลงในฐานข้อมูล MedicalImage medicalImage = new MedicalImage(); medicalImage.setMedicalRecord(medicalRecord); medicalImage.setFileName(fileName); medicalImage.setImageType(imageType); medicalImage.setNotes(notes); medicalImage.setUploadDate(LocalDateTime.now()); return medicalImageRepository.save(medicalImage); } catch (MinioException e) { throw new RuntimeException("MinIO Error: " + e.getMessage()); } catch (Exception e) { throw new RuntimeException("Error uploading file: " + e.getMessage()); } } @Override public Resource downloadImage(UUID id) { try { // ค้นหา MedicalImage จาก ID ในฐานข้อมูล MedicalImage medicalImage = medicalImageRepository.findById(id) .orElseThrow(() -> new EntityNotFoundException("Medical Image not found.")); // ดาวน์โหลดไฟล์จาก MinIO โดยใช้ชื่อไฟล์จากฐานข้อมูล InputStream stream = minioClient.getObject( GetObjectArgs.builder() .bucket(bucketName) .object(medicalImage.getFileName()) .build() ); return new InputStreamResource(stream); } catch (MinioException e) { throw new RuntimeException("MinIO Error: " + e.getMessage()); } catch (Exception e) { throw new RuntimeException("Error downloading file: " + e.getMessage()); } } @Override public boolean isOwner(UUID medicalImageId, Long currentUserId) { return medicalImageRepository.findById(medicalImageId) .map(medicalImage -> medicalImage.getMedicalRecord().getPatient().getUser().getId().equals(currentUserId)) .orElse(false); } }