From 337c4309f173045fdac842a52e3fbb4c23069fe7 Mon Sep 17 00:00:00 2001 From: Salman Manoe Date: Fri, 29 Nov 2024 10:13:40 +0700 Subject: [PATCH] Update service absensi pegawai Penerapan MinIO untuk penyimpanan object storage presensi pegawai --- jasamedika-business/pom.xml | 19 ++++ .../impl/AbsensiPegawaiServiceImpl.java | 91 ++++++++++--------- .../util/minio/MinioClientUtil.java | 31 +++++++ .../util/minio/MinioClientWrapper.java | 22 +++++ 4 files changed, 120 insertions(+), 43 deletions(-) create mode 100644 jasamedika-business/src/main/java/com/jasamedika/medifirst2000/util/minio/MinioClientUtil.java create mode 100644 jasamedika-business/src/main/java/com/jasamedika/medifirst2000/util/minio/MinioClientWrapper.java diff --git a/jasamedika-business/pom.xml b/jasamedika-business/pom.xml index f35e83dc..60219c96 100644 --- a/jasamedika-business/pom.xml +++ b/jasamedika-business/pom.xml @@ -283,6 +283,25 @@ ${commons-io.version} + + + io.minio + minio + 8.3.0 + + + com.squareup.okhttp3 + okhttp + 4.9.1 + + + + com.google.guava + guava + 31.0-jre + + + Jasa Medika diff --git a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/impl/AbsensiPegawaiServiceImpl.java b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/impl/AbsensiPegawaiServiceImpl.java index 586c20af..56e506f9 100644 --- a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/impl/AbsensiPegawaiServiceImpl.java +++ b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/impl/AbsensiPegawaiServiceImpl.java @@ -11,21 +11,25 @@ import com.jasamedika.medifirst2000.entities.AbsensiPegawai; import com.jasamedika.medifirst2000.entities.Habsen; import com.jasamedika.medifirst2000.entities.JadwalDokter; import com.jasamedika.medifirst2000.entities.ShiftKerja; +import com.jasamedika.medifirst2000.exception.ServiceVOException; import com.jasamedika.medifirst2000.service.AbsensiPegawaiService; import com.jasamedika.medifirst2000.service.LogAccService; import com.jasamedika.medifirst2000.util.CommonUtil; import com.jasamedika.medifirst2000.util.ImageUtil; +import com.jasamedika.medifirst2000.util.minio.MinioClientUtil; import com.jasamedika.medifirst2000.vo.AbsensiPegawaiVO; import com.jasamedika.medifirst2000.vo.HabsenVO; +import io.minio.PutObjectArgs; import org.apache.commons.codec.binary.Base64; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import java.io.ByteArrayInputStream; import java.io.File; -import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; +import java.nio.file.Files; import java.text.DateFormat; import java.text.NumberFormat; import java.text.SimpleDateFormat; @@ -65,7 +69,7 @@ public class AbsensiPegawaiServiceImpl extends BaseVoServiceImpl implements Abse @Override public Map saveAbsensiPegawai(AbsensiPegawaiVO vo) { - Map result = new HashMap(); + Map result = new HashMap<>(); AbsensiPegawai model = new AbsensiPegawai(); model = absensiPegawaiConverter.transferVOToModel(vo, model); @@ -92,13 +96,7 @@ public class AbsensiPegawaiServiceImpl extends BaseVoServiceImpl implements Abse @Override public Map findByName(String nama) { - Map result = new HashMap(); - try { - - } catch (IllegalArgumentException e) { - e.printStackTrace(); - } - return result; + return new HashMap<>(); } @Override @@ -114,7 +112,7 @@ public class AbsensiPegawaiServiceImpl extends BaseVoServiceImpl implements Abse @Override public Map saveHabsensiPegawai(HabsenVO vo) { - Map result = new HashMap(); + Map result = new HashMap<>(); Habsen model = presensiConverter.transferVOToModel(vo, new Habsen()); @@ -125,7 +123,7 @@ public class AbsensiPegawaiServiceImpl extends BaseVoServiceImpl implements Abse model.setRemoteno(Master.PresensiPegawai.SMART_REMOTE_NO); model.setAcc_code(Master.PresensiPegawai.DEFAULT_ACC_CODE); - /** + /* * automatic reverse geocoding was disabled due to too many request to * nominatim.openstreetmap.org */ @@ -169,28 +167,35 @@ public class AbsensiPegawaiServiceImpl extends BaseVoServiceImpl implements Abse } public void uploadPhotoCapture(String imageURLData, String idFinger, Date trDate, Date trTime, Integer trNo) { - DateFormat mf = new SimpleDateFormat("yyyyMM"); + byte[] imageData = Base64.decodeBase64(imageURLData.substring(imageURLData.indexOf(",") + 1)); + if (trDate.after(new Date(MinioClientUtil.CUTOFF_TIMESTAMP))) { + uploadToMinio(imageData, idFinger, trDate, trTime, trNo); + } else { + try { + DateFormat mf = new SimpleDateFormat("yyyyMM"); + DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + DateFormat tf = new SimpleDateFormat("HH.mm.ss"); + String directory = getDirPathPresensiPegawai(mf.format(trDate)); + String filename = directory + idFinger + "_" + df.format(trDate) + "_" + tf.format(trTime) + "#" + trNo + + ".jpg"; + File outputFile = new File(filename); + OutputStream stream = Files.newOutputStream(outputFile.toPath()); + stream.write(imageData); + stream.close(); + } catch (IOException e) { + throw new ServiceVOException(e.getMessage()); + } + } + } + + private void uploadToMinio(byte[] imageData, String idFinger, Date trDate, Date trTime, Integer trNo) { + ByteArrayInputStream inputStream = new ByteArrayInputStream(imageData); DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); DateFormat tf = new SimpleDateFormat("HH.mm.ss"); - - String directory = getDirPathPresensiPegawai(mf.format(trDate)); - String filename = directory + idFinger.toString() + "_" + df.format(trDate) + "_" + tf.format(trTime) + "#" - + trNo + ".jpg"; - - String str = imageURLData; - - byte[] imagedata = Base64.decodeBase64(str.substring(str.indexOf(",") + 1)); - try { - File dire = new File(directory); - if (!dire.exists()) - dire.mkdirs(); - File outputFile = new File(filename); - OutputStream stream = new FileOutputStream(outputFile); - stream.write(imagedata); - stream.close(); - } catch (IOException e) { - e.printStackTrace(); - } + String filename = idFinger + "_" + df.format(trDate) + "_" + tf.format(trTime) + "#" + trNo + ".jpg"; + PutObjectArgs objectArgs = PutObjectArgs.builder().bucket("presensi-pegawai").object(filename) + .stream(inputStream, imageData.length, -1).contentType("image/jpeg").build(); + MinioClientUtil.upload(objectArgs); } private Double getDecimal(Double n) { @@ -207,13 +212,13 @@ public class AbsensiPegawaiServiceImpl extends BaseVoServiceImpl implements Abse nf.setMaximumFractionDigits(2); String latSecStr = nf.format(getDecimal(getDecimal(Math.abs(latitude)) * 60) * 60); - String latStr = ""; + String latStr; if (latitude < 0) { - latStr = latDegStr + "\u00B0" + latMinStr + "\u2032" + latSecStr + "\u2033 LS"; + latStr = latDegStr + "°" + latMinStr + "′" + latSecStr + "″ LS"; } else if (latitude > 0) { - latStr = latDegStr + "\u00B0" + latMinStr + "\u2032" + latSecStr + "\u2033 LU"; + latStr = latDegStr + "°" + latMinStr + "′" + latSecStr + "″ LU"; } else { - latStr = latDegStr + "\u00B0" + latMinStr + "\u2032" + latSecStr + "\u2033"; + latStr = latDegStr + "°" + latMinStr + "′" + latSecStr + "″"; } nf.setMaximumFractionDigits(0); @@ -223,13 +228,13 @@ public class AbsensiPegawaiServiceImpl extends BaseVoServiceImpl implements Abse nf.setMaximumFractionDigits(2); String longSecStr = nf.format(getDecimal(getDecimal(Math.abs(longitude)) * 60) * 60); - String longStr = ""; + String longStr; if (longitude < 0) { - longStr = longDegStr + "\u00B0" + longMinStr + "\u2032" + longSecStr + "\u2033 BB"; + longStr = longDegStr + "°" + longMinStr + "′" + longSecStr + "″ BB"; } else if (longitude > 0) { - longStr = longDegStr + "\u00B0" + longMinStr + "\u2032" + longSecStr + "\u2033 BT"; + longStr = longDegStr + "°" + longMinStr + "′" + longSecStr + "″ BT"; } else { - longStr = longDegStr + "\u00B0" + longMinStr + "\u2032" + longSecStr + "\u2033"; + longStr = longDegStr + "°" + longMinStr + "′" + longSecStr + "″"; } return latStr + ", " + longStr; @@ -298,7 +303,7 @@ public class AbsensiPegawaiServiceImpl extends BaseVoServiceImpl implements Abse @Override public Map findJadwalPegawai(Integer idPegawai) { - Map result = new HashMap<>(); + Map result; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); String today = sdf.format(new Date()); result = habsensiDao.getPegawai(idPegawai); @@ -332,7 +337,7 @@ public class AbsensiPegawaiServiceImpl extends BaseVoServiceImpl implements Abse @Override public List> findHistoriPresensi(Integer idPegawai) { - List> result = new ArrayList<>(); + List> result; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); String today = sdf.format(new Date()); @@ -348,7 +353,7 @@ public class AbsensiPegawaiServiceImpl extends BaseVoServiceImpl implements Abse } else { map.put("processtatus", "WFO"); } - if (vpnIPList.contains(map.get("ip_addr"))) { + if (vpnIPList.contains(map.get("ip_addr").toString())) { boolean isAksesLuar = false; for (String vpnIPX : vpnIPXList) if (map.get("client_ip_addr").toString().startsWith(vpnIPX)) { @@ -361,7 +366,7 @@ public class AbsensiPegawaiServiceImpl extends BaseVoServiceImpl implements Abse map.put("ip_addr", "menggunakan jaringan internet RSAB"); } else { - if (listIp.contains(map.get("ip_addr"))) { + if (listIp.contains(map.get("ip_addr").toString())) { map.put("ip_addr", "menggunakan jaringan internet RSAB"); } else if (CommonUtil.isNullOrEmpty(map.get("ip_addr"))) { map.put("ip_addr", "jaringan internet tidak terdeteksi"); diff --git a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/util/minio/MinioClientUtil.java b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/util/minio/MinioClientUtil.java new file mode 100644 index 00000000..911c5dad --- /dev/null +++ b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/util/minio/MinioClientUtil.java @@ -0,0 +1,31 @@ +package com.jasamedika.medifirst2000.util.minio; + +import com.jasamedika.medifirst2000.exception.ServiceVOException; +import io.minio.MinioClient; +import io.minio.PutObjectArgs; +import io.minio.errors.MinioException; + +import java.io.IOException; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; + +/** + * @author salmanoe + * @version 1.0.0 + * @since 20/11/2024 + */ +public final class MinioClientUtil { + + public static final long CUTOFF_TIMESTAMP = 1732035599000L; + + public static void upload(PutObjectArgs objectArgs) { + MinioClient minioClient; + try { + minioClient = MinioClientWrapper.minioClient(); + minioClient.putObject(objectArgs); + } catch (IOException | MinioException | InvalidKeyException | NoSuchAlgorithmException e) { + throw new ServiceVOException(e.getMessage()); + } + } + +} diff --git a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/util/minio/MinioClientWrapper.java b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/util/minio/MinioClientWrapper.java new file mode 100644 index 00000000..30e7e547 --- /dev/null +++ b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/util/minio/MinioClientWrapper.java @@ -0,0 +1,22 @@ +package com.jasamedika.medifirst2000.util.minio; + +import io.minio.MinioClient; + +import java.io.IOException; + +/** + * @author salmanoe + * @version 1.0.0 + * @since 19/11/2024 + */ +public class MinioClientWrapper { + + private static final String ENDPOINT = "https://minio-2.rsabhk.co.id:90"; + private static final String ACCESS_KEY = "6QLQ3GNgQFf2ax8PJXuu"; + private static final String SECRET_KEY = "nPrfuFezKLd36mI2qqGJ5djLiKxhNExIrPr3j4oq"; + + public static MinioClient minioClient() throws IOException { + return MinioClient.builder().endpoint(ENDPOINT).credentials(ACCESS_KEY, SECRET_KEY).build(); + } + +}