129 lines
4.0 KiB
Go
129 lines
4.0 KiB
Go
package response
|
|
|
|
import (
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
// Response represents a standard API response
|
|
type Response struct {
|
|
Status string `json:"status"`
|
|
Message string `json:"message,omitempty"`
|
|
Data interface{} `json:"data,omitempty"`
|
|
Error interface{} `json:"error,omitempty"`
|
|
Meta interface{} `json:"meta,omitempty"`
|
|
}
|
|
|
|
// Success sends a success response
|
|
func Success(c *gin.Context, statusCode int, message string, data interface{}) {
|
|
c.JSON(statusCode, Response{
|
|
Status: "success",
|
|
Message: message,
|
|
Data: data,
|
|
})
|
|
}
|
|
|
|
// Error sends an error response
|
|
func Error(c *gin.Context, statusCode int, message string, err interface{}) {
|
|
// Handle jika tipe yang dikirim adalah native error Go agar tidak menjadi objek kosong '{}' di JSON
|
|
if e, ok := err.(error); ok {
|
|
err = e.Error()
|
|
}
|
|
|
|
c.JSON(statusCode, Response{
|
|
Status: "error",
|
|
Message: message,
|
|
Error: err,
|
|
})
|
|
}
|
|
|
|
// ErrorWithLog mengirimkan respons error HTTP sekaligus menyisipkan error asli
|
|
// ke dalam context Gin agar bisa direkam oleh LoggingMiddleware.
|
|
func ErrorWithLog(c *gin.Context, err error, statusCode int, message string, details interface{}) {
|
|
if err != nil {
|
|
c.Error(err) // Meneruskan error asli ke Gin Context untuk dicatat logger
|
|
}
|
|
Error(c, statusCode, message, details) // Panggil fungsi Error() standar
|
|
}
|
|
|
|
// Meta contains pagination metadata
|
|
type Meta struct {
|
|
Page int `json:"page"`
|
|
Limit int `json:"limit"`
|
|
Total int `json:"total"`
|
|
TotalPages int `json:"total_pages"`
|
|
}
|
|
|
|
// Paginated sends a paginated response
|
|
func Paginated(c *gin.Context, statusCode int, message string, data interface{}, meta Meta) {
|
|
c.JSON(statusCode, Response{
|
|
Status: "success",
|
|
Message: message,
|
|
Data: data,
|
|
Meta: meta,
|
|
})
|
|
}
|
|
|
|
// =========================================================================
|
|
// BPJS FORMATTER
|
|
// =========================================================================
|
|
|
|
// BPJSMetaData merepresentasikan metadata standar dari API BPJS
|
|
type BPJSMetaData struct {
|
|
Code string `json:"code"`
|
|
Message string `json:"message"`
|
|
}
|
|
|
|
// BPJSResponse merepresentasikan standar response API BPJS
|
|
type BPJSResponse struct {
|
|
MetaData BPJSMetaData `json:"metaData"`
|
|
Response interface{} `json:"response,omitempty"`
|
|
}
|
|
|
|
// BPJS mengirimkan respons dengan format standar API BPJS
|
|
func BPJS(c *gin.Context, httpStatusCode int, bpjsCode string, message string, data interface{}) {
|
|
c.JSON(httpStatusCode, BPJSResponse{
|
|
MetaData: BPJSMetaData{
|
|
Code: bpjsCode, // Contoh: "200" (sukses), "201" (dibuat), atau kode error BPJS lainnya
|
|
Message: message,
|
|
},
|
|
Response: data,
|
|
})
|
|
}
|
|
|
|
// =========================================================================
|
|
// SATU SEHAT (HL7 FHIR) FORMATTER
|
|
// =========================================================================
|
|
|
|
// FHIROperationOutcome merepresentasikan struktur error standar HL7 FHIR
|
|
type FHIROperationOutcome struct {
|
|
ResourceType string `json:"resourceType"` // Harus selalu "OperationOutcome"
|
|
Issue []FHIRErrorIssue `json:"issue"`
|
|
}
|
|
|
|
// FHIRErrorIssue berisi detail issue untuk error Satu Sehat
|
|
type FHIRErrorIssue struct {
|
|
Severity string `json:"severity"` // fatal | error | warning | information
|
|
Code string `json:"code"` // invalid | security | exception | not-found | dll
|
|
Diagnostics string `json:"diagnostics"` // Pesan detail / human-readable
|
|
}
|
|
|
|
// FHIR mengirimkan respons untuk resource FHIR secara langsung (standar Satu Sehat)
|
|
// Satu Sehat tidak menggunakan wrapper "data" atau "status", melainkan me-return object Resource langsung
|
|
func FHIR(c *gin.Context, statusCode int, resource interface{}) {
|
|
c.JSON(statusCode, resource)
|
|
}
|
|
|
|
// FHIRError mengirimkan pesan error yang comply dengan format OperationOutcome FHIR
|
|
func FHIRError(c *gin.Context, statusCode int, severity, code, diagnostics string) {
|
|
c.JSON(statusCode, FHIROperationOutcome{
|
|
ResourceType: "OperationOutcome",
|
|
Issue: []FHIRErrorIssue{
|
|
{
|
|
Severity: severity,
|
|
Code: code,
|
|
Diagnostics: diagnostics,
|
|
},
|
|
},
|
|
})
|
|
}
|