feat: implement doctor schedule module, add detail fields to doctor profile, and integrate new appointment API client
This commit is contained in:
@@ -0,0 +1,95 @@
|
||||
package vn.sis.appointment;
|
||||
|
||||
import java.net.URI;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
|
||||
public record ApiConfig(
|
||||
String baseUrl,
|
||||
String tenant,
|
||||
String clientId,
|
||||
String clientSecret,
|
||||
String scope,
|
||||
String cookieHeader) {
|
||||
|
||||
public static ApiConfig fromForm(Map<String, String> form) {
|
||||
return new ApiConfig(
|
||||
value(form, "baseUrl", "https://dhs.sisvietnam.vn"),
|
||||
value(form, "tenant", "3a0f747c-57b6-753b-ba21-3987e8e93b9a"),
|
||||
value(form, "clientId", "DigitalHealthSolutions_LabConn"),
|
||||
value(form, "clientSecret", ""),
|
||||
value(form, "scope", "LabConn"),
|
||||
value(form, "cookie", ""));
|
||||
}
|
||||
|
||||
public ApiConfig {
|
||||
baseUrl = trimTrailingSlash(Objects.requireNonNullElse(baseUrl, ""));
|
||||
tenant = Objects.requireNonNullElse(tenant, "").trim();
|
||||
clientId = Objects.requireNonNullElse(clientId, "").trim();
|
||||
clientSecret = Objects.requireNonNullElse(clientSecret, "");
|
||||
scope = Objects.requireNonNullElse(scope, "").trim();
|
||||
cookieHeader = Objects.requireNonNullElse(cookieHeader, "").trim();
|
||||
}
|
||||
|
||||
public void validate() {
|
||||
URI uri;
|
||||
try {
|
||||
uri = URI.create(baseUrl);
|
||||
} catch (IllegalArgumentException ex) {
|
||||
throw new IllegalArgumentException("Base URL khong hop le.", ex);
|
||||
}
|
||||
|
||||
String scheme = uri.getScheme();
|
||||
if (scheme == null || !(scheme.equalsIgnoreCase("https") || scheme.equalsIgnoreCase("http"))) {
|
||||
throw new IllegalArgumentException("Base URL phai bat dau bang http:// hoac https://.");
|
||||
}
|
||||
if (tenant.isBlank()) {
|
||||
throw new IllegalArgumentException("Tenant khong duoc de trong.");
|
||||
}
|
||||
if (clientId.isBlank()) {
|
||||
throw new IllegalArgumentException("Client ID khong duoc de trong.");
|
||||
}
|
||||
if (clientSecret.isBlank()) {
|
||||
throw new IllegalArgumentException("Client Secret khong duoc de trong.");
|
||||
}
|
||||
if (scope.isBlank()) {
|
||||
throw new IllegalArgumentException("Scope khong duoc de trong.");
|
||||
}
|
||||
}
|
||||
|
||||
public String tokenUrl() {
|
||||
return baseUrl + "/connect/token";
|
||||
}
|
||||
|
||||
public String doctorsUrl() {
|
||||
return baseUrl + "/api/app/his/doctors/work-schedules";
|
||||
}
|
||||
|
||||
public String scheduleUrl(String doctorCode) {
|
||||
return baseUrl + "/api/app/his/doctors/" + Urls.encodePathSegment(doctorCode) + "/work-schedule-days";
|
||||
}
|
||||
|
||||
public String effectiveCookieHeader() {
|
||||
if (!cookieHeader.isBlank()) {
|
||||
return cookieHeader;
|
||||
}
|
||||
return ".AspNetCore.Culture=c%3Den%7Cuic%3Den; __tenant=" + tenant;
|
||||
}
|
||||
|
||||
public String cacheKeyMaterial() {
|
||||
return String.join("|", baseUrl, tenant, clientId, clientSecret, scope);
|
||||
}
|
||||
|
||||
private static String value(Map<String, String> form, String key, String defaultValue) {
|
||||
String value = form.get(key);
|
||||
return value == null ? defaultValue : value;
|
||||
}
|
||||
|
||||
private static String trimTrailingSlash(String value) {
|
||||
String result = value.trim();
|
||||
while (result.endsWith("/")) {
|
||||
result = result.substring(0, result.length() - 1);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user