Files
satusehat-service/pkg/errors/satusehat.go
T

44 lines
1.5 KiB
Go

package errors
import (
"strings"
)
// ParseSatuSehatError mengekstrak dan menerjemahkan balasan OperationOutcome
// dari Kemenkes (SatuSehat) menjadi standard AppError aplikasi.
func ParseSatuSehatError(result map[string]interface{}) Error {
errMsg := "Gagal memproses data ke SatuSehat"
var errMessages []string
// Ekstrak pesan dari array "issue"
if issues, ok := result["issue"].([]interface{}); ok && len(issues) > 0 {
for _, issueItem := range issues {
if issue, ok := issueItem.(map[string]interface{}); ok {
if diagnostics, ok := issue["diagnostics"].(string); ok {
diagLower := strings.ToLower(diagnostics)
// Translasi pesan error spesifik SatuSehat
if strings.Contains(diagLower, "reference target(s) not found") {
errMessages = append(errMessages, "Data referensi (seperti ID) tidak ditemukan di SatuSehat")
} else if strings.Contains(diagLower, "nik") {
errMessages = append(errMessages, "NIK tidak valid atau tidak terdaftar di SatuSehat")
} else {
errMessages = append(errMessages, diagnostics) // Tampilkan pesan aslinya jika belum ada di kamus translasi
}
}
}
}
}
// Gabungkan semua error (jika > 1) dengan pemisah koma atau titik koma
if len(errMessages) > 0 {
errMsg = "Validasi SatuSehat: " + strings.Join(errMessages, "; ")
}
// Gunakan NewValidationError agar status HTTP menjadi 400 (Bad Request)
return NewValidationError().
Message(errMsg).
Metadata("operation_outcome", result).
Build()
}