feat: add dynamic hospital database registry
This commit is contained in:
72
internal/http/database_settings.go
Normal file
72
internal/http/database_settings.go
Normal file
@@ -0,0 +1,72 @@
|
||||
package http
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"net/http"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"primaya-api/cpone-middleware/internal/databaseconfig"
|
||||
)
|
||||
|
||||
type DatabaseSettingsStore interface {
|
||||
List() []databaseconfig.PublicSetting
|
||||
Get(code string) (databaseconfig.PublicSetting, bool)
|
||||
Upsert(ctx context.Context, setting databaseconfig.Setting) (databaseconfig.PublicSetting, bool, error)
|
||||
}
|
||||
|
||||
type DatabaseSettingsHandler struct{ store DatabaseSettingsStore }
|
||||
|
||||
func NewDatabaseSettingsHandler(store DatabaseSettingsStore) DatabaseSettingsHandler {
|
||||
return DatabaseSettingsHandler{store: store}
|
||||
}
|
||||
|
||||
func (h DatabaseSettingsHandler) List(w http.ResponseWriter, _ *http.Request) {
|
||||
WriteJSON(w, http.StatusOK, Response{Success: true, Message: "ok", Data: h.store.List()})
|
||||
}
|
||||
|
||||
func (h DatabaseSettingsHandler) Get(w http.ResponseWriter, r *http.Request) {
|
||||
setting, found := h.store.Get(r.PathValue("kodeRs"))
|
||||
if !found {
|
||||
WriteJSON(w, http.StatusNotFound, Response{Success: false, Message: "Setting database tidak ditemukan", Data: nil})
|
||||
return
|
||||
}
|
||||
WriteJSON(w, http.StatusOK, Response{Success: true, Message: "ok", Data: setting})
|
||||
}
|
||||
|
||||
func (h DatabaseSettingsHandler) Store(w http.ResponseWriter, r *http.Request) {
|
||||
var payload databaseconfig.Setting
|
||||
decoder := json.NewDecoder(http.MaxBytesReader(w, r.Body, 1<<20))
|
||||
decoder.DisallowUnknownFields()
|
||||
if err := decoder.Decode(&payload); err != nil {
|
||||
WriteJSON(w, http.StatusUnprocessableEntity, Response{Success: false, Message: "Payload JSON tidak valid: " + err.Error(), Data: nil})
|
||||
return
|
||||
}
|
||||
if err := databaseconfig.Validate(payload); err != nil {
|
||||
WriteJSON(w, http.StatusUnprocessableEntity, Response{Success: false, Message: err.Error(), Data: nil})
|
||||
return
|
||||
}
|
||||
|
||||
ctx, cancel := context.WithTimeout(r.Context(), 10*time.Second)
|
||||
defer cancel()
|
||||
setting, created, err := h.store.Upsert(ctx, payload)
|
||||
if err != nil {
|
||||
status := http.StatusInternalServerError
|
||||
message := "Gagal menyimpan setting database"
|
||||
if errors.Is(err, context.DeadlineExceeded) || strings.Contains(err.Error(), "koneksi database") {
|
||||
status = http.StatusBadGateway
|
||||
message = err.Error()
|
||||
}
|
||||
WriteJSON(w, status, Response{Success: false, Message: message, Data: nil})
|
||||
return
|
||||
}
|
||||
status := http.StatusOK
|
||||
message := "Setting database berhasil diperbarui"
|
||||
if created {
|
||||
status = http.StatusCreated
|
||||
message = "Setting database berhasil ditambahkan"
|
||||
}
|
||||
WriteJSON(w, status, Response{Success: true, Message: message, Data: setting})
|
||||
}
|
||||
Reference in New Issue
Block a user