108 lines
4.9 KiB
Java

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);
}
}