108 lines
4.9 KiB
Java
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);
|
|
}
|
|
} |