feat: add lab package registration endpoint
This commit is contained in:
84
internal/http/lab_package.go
Normal file
84
internal/http/lab_package.go
Normal file
@@ -0,0 +1,84 @@
|
||||
package http
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"regexp"
|
||||
"strings"
|
||||
"unicode/utf8"
|
||||
|
||||
"primaya-api/cpone-middleware/internal/repository"
|
||||
)
|
||||
|
||||
var labIdentifier = regexp.MustCompile(`^[A-Za-z0-9-]+$`)
|
||||
|
||||
func (h Handler) AddLabPackage(w http.ResponseWriter, r *http.Request) {
|
||||
regID := strings.TrimSpace(r.PathValue("regId"))
|
||||
if regID == "" || utf8.RuneCountInString(regID) > 50 || !labIdentifier.MatchString(regID) {
|
||||
writeLabResponse(w, http.StatusUnprocessableEntity, false, "validation_error", "Nomor registrasi laboratorium hanya boleh berisi huruf, angka, dan tanda hubung", nil)
|
||||
return
|
||||
}
|
||||
payload, _ := decodeJSONObject(r)
|
||||
params, message := validateAddLabPackage(payload)
|
||||
if message != "" {
|
||||
writeLabResponse(w, http.StatusUnprocessableEntity, false, "validation_error", message, nil)
|
||||
return
|
||||
}
|
||||
outcome, err := h.labRepo.AddLabPackage(r.Context(), strings.ToUpper(regID), params)
|
||||
if err != nil {
|
||||
if validationMessage, ok := asValidationError(err); ok {
|
||||
writeLabResponse(w, http.StatusUnprocessableEntity, false, "validation_error", validationMessage, nil)
|
||||
return
|
||||
}
|
||||
writeLabResponse(w, http.StatusInternalServerError, false, "error", err.Error(), nil)
|
||||
return
|
||||
}
|
||||
writeLabResponse(w, outcome.HTTPStatus, outcome.Success, outcome.Status, outcome.Message, outcome.Data)
|
||||
}
|
||||
|
||||
func validateAddLabPackage(payload map[string]any) (repository.AddLabPackageParams, string) {
|
||||
packageID, message := requiredString(payload, "paket_id", 50, "Paket ID wajib diisi")
|
||||
if message != "" {
|
||||
return repository.AddLabPackageParams{}, message
|
||||
}
|
||||
packageID = strings.ToUpper(strings.TrimSpace(packageID))
|
||||
if !labIdentifier.MatchString(packageID) {
|
||||
return repository.AddLabPackageParams{}, "Paket ID hanya boleh berisi huruf, angka, dan tanda hubung"
|
||||
}
|
||||
cito := false
|
||||
if value, present := nullableValue(payload, "cito"); present {
|
||||
var valid bool
|
||||
cito, valid = parseLaravelBoolean(value)
|
||||
if !valid {
|
||||
return repository.AddLabPackageParams{}, "The cito field must be true or false."
|
||||
}
|
||||
}
|
||||
markup := 0.0
|
||||
if value, present := nullableValue(payload, "markup_cito"); present {
|
||||
var valid bool
|
||||
markup, valid = parseNumeric(value)
|
||||
if !valid {
|
||||
return repository.AddLabPackageParams{}, "The markup cito must be a number."
|
||||
}
|
||||
if markup < 0 || markup > 100 {
|
||||
return repository.AddLabPackageParams{}, "The markup cito must be between 0 and 100."
|
||||
}
|
||||
}
|
||||
if !cito {
|
||||
markup = 0
|
||||
}
|
||||
notes, _, message := optionalString(payload, "catatan", 500)
|
||||
if message != "" {
|
||||
return repository.AddLabPackageParams{}, message
|
||||
}
|
||||
channel, present, message := optionalString(payload, "channel", 50)
|
||||
if message != "" {
|
||||
return repository.AddLabPackageParams{}, message
|
||||
}
|
||||
if !present {
|
||||
channel = "CPONE"
|
||||
}
|
||||
return repository.AddLabPackageParams{
|
||||
PackageID: packageID, Cito: cito, MarkupCito: markup,
|
||||
Notes: strings.TrimSpace(notes), Channel: strings.ToUpper(strings.TrimSpace(channel)),
|
||||
}, ""
|
||||
}
|
||||
Reference in New Issue
Block a user