Files
ErhaCam/src/main/java/ErhaAPI/ErhaAPI.java
2025-05-20 09:41:36 +07:00

191 lines
6.9 KiB
Java

package ErhaAPI;
import Config.SomeCodes;
import com.google.gson.Gson;
import lombok.Getter;
import org.tinylog.Logger;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.file.Files;
import java.util.Base64;
import java.util.UUID;
import static Config.SomeCodes.*;
public class ErhaAPI {
private @Getter String API_USERNAME = "erha-pb-001";
private @Getter String API_PASSWORD = "bM0tH!s";
private String auth;
private final String API_URL;
private final Gson gson = new Gson();
/**
* Create Erha API object
* @param isProduction if true will use Production URL, if false will use Staging URL
*/
public ErhaAPI(boolean isProduction){
final String API_URL_PROD = "https://connect-api.aryanoble.co.id/api";
final String API_URL_STAGING = "https://connect-api-staging.aryanoble.web.id/api";
API_URL = isProduction ? API_URL_PROD : API_URL_STAGING;
update_auth();
}
/**
* Set API Username
* @param API_USERNAME API Username
*/
@SuppressWarnings("unused")
public void setAPI_USERNAME(String API_USERNAME){
if (ValidString(API_USERNAME)){
if (!API_USERNAME.equals(this.API_USERNAME)){
this.API_USERNAME = API_USERNAME;
update_auth();
}
}
}
/**
* Set API Password
* @param API_PASSWORD API Password
*/
@SuppressWarnings("unused")
public void setAPI_PASSWORD(String API_PASSWORD){
if (ValidString(API_PASSWORD)){
if (!API_PASSWORD.equals(this.API_PASSWORD)){
this.API_PASSWORD = API_PASSWORD;
update_auth();
}
}
}
/**
* Validate Barcode data
* @param Barcode Barcode to verify
* @return BarcodeResullt object if success, or null if failed
*/
public BarcodeResullt Validate_Barcode(String Barcode, boolean printdebug){
if (ValidBarCode(Barcode)){
try (HttpClient client = HttpClient.newHttpClient()) {
int medical_record_detail_id = toInt(Barcode);
HttpRequest request = HttpRequest.newBuilder()
.uri(java.net.URI.create(API_URL+"/photobooth/photobooth/" + medical_record_detail_id))
.header("Authorization", "Basic " + auth)
.GET()
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
if (response.statusCode()==200){
String body = response.body();
if (printdebug){
System.out.println("Validate_Barcode status code : " + response.statusCode());
System.out.println("Validate_Barcode HTTP body : ");
System.out.println(body);
}
return gson.fromJson(body, BarcodeResullt.class);
} else {
Logger.error("Validate_Barcode failed, status code : " , response.statusCode());
}
} catch (IOException e) {
Logger.error("Validate_Barcode IO Exception, Msg : " , e.getMessage());
} catch (InterruptedException e) {
Logger.error("Validate_Barcode Interrupted Exception, Msg : " , e.getMessage());
}
}
return null;
}
/**
* Upload File
* @param patientID Patient ID
* @param filename File to upload
* @return null if failed, or response body if success
*/
public UploadResult Upload_File(String patientID, String filename, boolean printdebug) {
if (ValidMedicalRecordId(patientID)){
int medical_record_detail_id = toInt(patientID);
if (ValidFile(filename)){
File ff = new File(filename);
try (HttpClient client = HttpClient.newHttpClient()){
byte[] fileBytes = Files.readAllBytes(new java.io.File(filename).toPath());
String fn = ff.getName();
// Unique boundary for multipart data
String boundary = "----JavaHttpClientBoundary" + UUID.randomUUID();
String CRLF = "\r\n";
// Form Data (Text Field)
String formData1 = "--" + boundary + CRLF +
"Content-Disposition: form-data; name=\"medical_record_detail_id\"" + CRLF + CRLF +
medical_record_detail_id + CRLF;
// Form Data (File)
String formData2 = "--" + boundary + CRLF +
"Content-Disposition: form-data; name=\"file\"; filename=\"" + fn + "\"" + CRLF +
"Content-Type: image/jpeg" + CRLF + CRLF; // Change Content-Type accordingly
// End Boundary
String endBoundary = CRLF + "--" + boundary + "--" + CRLF;
// Combine all parts into a single byte array
byte[] multipartData = SomeCodes.Concat(
formData1.getBytes(),
formData2.getBytes(),
fileBytes,
endBoundary.getBytes()
);
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI(API_URL + "/photobooth/photobooth"))
.header("Authorization", "Basic " + auth)
.header("Content-Type", "multipart/form-data; boundary=" + boundary)
.POST(HttpRequest.BodyPublishers.ofByteArray(multipartData))
.build();
// Send request
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
if (printdebug){
System.out.println("Upload_File status code : " + response.statusCode());
System.out.println("Upload_File HTTP body : ");
System.out.println(response.body());
}
if (response.statusCode()==200){
return gson.fromJson(response.body(), UploadResult.class);
} else {
Logger.error("Upload_File file ",filename," failed, status code : " , response.statusCode());
}
} catch (Exception e){
Logger.error("Upload_File file ",filename," failed, Exception, Msg : " , e.getMessage());
}
}
}
return null;
}
private void update_auth(){
auth = Base64.getEncoder().encodeToString((API_USERNAME + ":" + API_PASSWORD).getBytes());
}
}