Update Worker Satu Sehat

This commit is contained in:
meninjar
2026-04-14 05:14:09 +00:00
parent 35c101725f
commit 9a15d74283
162 changed files with 538 additions and 9489 deletions

No files matched your search

@@ -1,38 +0,0 @@
package antrol
import (
"net/http"
antrolService "service/internal/bpjs/antrol/reference"
"service/pkg/errors"
"service/pkg/response"
"github.com/gin-gonic/gin"
)
type AntrolHandler struct {
service antrolService.Service
}
func NewAntrolHandler(service antrolService.Service) *AntrolHandler {
return &AntrolHandler{service: service}
}
func (h *AntrolHandler) RegisterRoutes(router *gin.RouterGroup) {
group := router.Group("/bpjs/antrol/reference")
{
group.GET("/poli", h.GetRefPoli)
}
}
func (h *AntrolHandler) GetRefPoli(c *gin.Context) {
ctx := c.Request.Context()
res, err := h.service.GetRefPoli(ctx)
if err != nil {
appErr := errors.FromError(err)
response.Error(c, appErr.HTTPStatus(), appErr.Error(), appErr.Metadata())
return
}
response.Success(c, http.StatusOK, "Successfully retrieved BPJS Antrol Poli reference", res)
}
@@ -1,100 +0,0 @@
package aplicare
import (
"net/http"
"strconv"
bedService "service/internal/bpjs/aplicare/bed"
"service/pkg/errors"
"service/pkg/response"
"github.com/gin-gonic/gin"
)
type BedHandler struct {
service bedService.Service
}
func NewBedHandler(service bedService.Service) *BedHandler {
return &BedHandler{service: service}
}
func (h *BedHandler) RegisterRoutes(router *gin.RouterGroup) {
group := router.Group("/bpjs/aplicare/bed")
{
group.GET("/:kdppk/:start/:limit", h.GetBedList)
group.POST("/:kdppk", h.CreateBed)
group.PUT("/:kdppk", h.UpdateBed)
group.DELETE("/:kdppk", h.DeleteBed)
}
}
func (h *BedHandler) GetBedList(c *gin.Context) {
kdPpk := c.Param("kdppk")
start, _ := strconv.Atoi(c.Param("start"))
limit, _ := strconv.Atoi(c.Param("limit"))
ctx := c.Request.Context()
res, err := h.service.GetBedList(ctx, kdPpk, start, limit)
if err != nil {
appErr := errors.FromError(err)
response.Error(c, appErr.HTTPStatus(), appErr.Error(), appErr.Metadata())
return
}
response.Success(c, http.StatusOK, "Successfully retrieved BPJS Aplicares bed list", res)
}
func (h *BedHandler) CreateBed(c *gin.Context) {
kdPpk := c.Param("kdppk")
var req bedService.BedData
if err := c.ShouldBindJSON(&req); err != nil {
response.Error(c, http.StatusBadRequest, "Invalid request body", err.Error())
return
}
ctx := c.Request.Context()
if err := h.service.CreateBed(ctx, kdPpk, req); err != nil {
appErr := errors.FromError(err)
response.Error(c, appErr.HTTPStatus(), appErr.Error(), appErr.Metadata())
return
}
response.Success(c, http.StatusCreated, "Successfully created BPJS Aplicares bed data", nil)
}
func (h *BedHandler) UpdateBed(c *gin.Context) {
kdPpk := c.Param("kdppk")
var req bedService.BedData
if err := c.ShouldBindJSON(&req); err != nil {
response.Error(c, http.StatusBadRequest, "Invalid request body", err.Error())
return
}
ctx := c.Request.Context()
if err := h.service.UpdateBed(ctx, kdPpk, req); err != nil {
appErr := errors.FromError(err)
response.Error(c, appErr.HTTPStatus(), appErr.Error(), appErr.Metadata())
return
}
response.Success(c, http.StatusOK, "Successfully updated BPJS Aplicares bed data", nil)
}
func (h *BedHandler) DeleteBed(c *gin.Context) {
kdPpk := c.Param("kdppk")
var req bedService.BedDeletePayload
if err := c.ShouldBindJSON(&req); err != nil {
response.Error(c, http.StatusBadRequest, "Invalid request body", err.Error())
return
}
ctx := c.Request.Context()
if err := h.service.DeleteBed(ctx, kdPpk, req); err != nil {
appErr := errors.FromError(err)
response.Error(c, appErr.HTTPStatus(), appErr.Error(), appErr.Metadata())
return
}
response.Success(c, http.StatusOK, "Successfully deleted BPJS Aplicares bed data", nil)
}
@@ -1,53 +0,0 @@
package apotek
import (
"net/http"
dphoService "service/internal/bpjs/apotek/reference/dpho"
poliService "service/internal/bpjs/apotek/reference/poli"
"service/pkg/errors"
"service/pkg/response"
"github.com/gin-gonic/gin"
)
type ReferenceHandler struct {
dphoService dphoService.Service
poliService poliService.Service
}
func NewReferenceHandler(dpho dphoService.Service, poli poliService.Service) *ReferenceHandler {
return &ReferenceHandler{
dphoService: dpho,
poliService: poli,
}
}
func (h *ReferenceHandler) RegisterRoutes(router *gin.RouterGroup) {
group := router.Group("/bpjs/apotek/reference")
{
group.GET("/dpho", h.GetDPHO)
group.GET("/poli/:param", h.GetPoli)
}
}
func (h *ReferenceHandler) GetDPHO(c *gin.Context) {
res, err := h.dphoService.GetDPHO(c.Request.Context())
if err != nil {
appErr := errors.FromError(err)
response.Error(c, appErr.HTTPStatus(), appErr.Error(), appErr.Metadata())
return
}
response.Success(c, http.StatusOK, "Successfully retrieved BPJS Apotek DPHO reference", res)
}
func (h *ReferenceHandler) GetPoli(c *gin.Context) {
param := c.Param("param")
res, err := h.poliService.GetPoli(c.Request.Context(), param)
if err != nil {
appErr := errors.FromError(err)
response.Error(c, appErr.HTTPStatus(), appErr.Error(), appErr.Metadata())
return
}
response.Success(c, http.StatusOK, "Successfully retrieved BPJS Apotek Poli reference", res)
}
@@ -1,64 +0,0 @@
package vclaim
import (
"net/http"
"time"
pesertaService "service/internal/bpjs/vclaim/peserta"
"service/pkg/errors"
"service/pkg/response"
"github.com/gin-gonic/gin"
)
type PesertaHandler struct {
service pesertaService.Service
}
func NewPesertaHandler(service pesertaService.Service) *PesertaHandler {
return &PesertaHandler{service: service}
}
func (h *PesertaHandler) RegisterRoutes(router *gin.RouterGroup) {
group := router.Group("/bpjs/vclaim/peserta")
{
group.GET("/nik/:nik", h.GetPesertaByNIK)
group.GET("/nokartu/:nokartu", h.GetPesertaByNoKartu)
}
}
func (h *PesertaHandler) GetPesertaByNIK(c *gin.Context) {
nik := c.Param("nik")
tglSEP := c.Query("tgl_sep")
if tglSEP == "" {
tglSEP = time.Now().Format("2006-01-02")
}
ctx := c.Request.Context()
res, err := h.service.GetPesertaByNIK(ctx, nik, tglSEP)
if err != nil {
appErr := errors.FromError(err)
response.Error(c, appErr.HTTPStatus(), appErr.Error(), appErr.Metadata())
return
}
response.Success(c, http.StatusOK, "Successfully retrieved participant data by NIK", res)
}
func (h *PesertaHandler) GetPesertaByNoKartu(c *gin.Context) {
noKartu := c.Param("nokartu")
tglSEP := c.Query("tgl_sep")
if tglSEP == "" {
tglSEP = time.Now().Format("2006-01-02")
}
ctx := c.Request.Context()
res, err := h.service.GetPesertaByNoKartu(ctx, noKartu, tglSEP)
if err != nil {
appErr := errors.FromError(err)
response.Error(c, appErr.HTTPStatus(), appErr.Error(), appErr.Metadata())
return
}
response.Success(c, http.StatusOK, "Successfully retrieved participant data by card number", res)
}
@@ -1,105 +0,0 @@
package vclaim
import (
"net/http"
sepService "service/internal/bpjs/vclaim/sep"
"service/pkg/errors"
"service/pkg/response"
"github.com/gin-gonic/gin"
)
// SepHandler menangani semua request HTTP terkait VClaim.
type SepHandler struct {
sepService sepService.Service
}
// NewSepHandler membuat instance SepHandler baru.
func NewSepHandler(sepService sepService.Service) *SepHandler {
return &SepHandler{
sepService: sepService,
}
}
// RegisterRoutes mendaftarkan semua rute untuk BPJS VClaim.
func (h *SepHandler) RegisterRoutes(router *gin.RouterGroup) {
bpjsGroup := router.Group("/bpjs/vclaim")
{
sepGroup := bpjsGroup.Group("/sep")
{
sepGroup.POST("", h.CreateSEP)
sepGroup.PUT("", h.UpdateSEP)
// BPJS API untuk delete menggunakan method POST, tapi kita ekspos sebagai DELETE untuk konsistensi RESTful.
sepGroup.DELETE("", h.DeleteSEP)
sepGroup.GET("/:nosep", h.GetSEPDetail)
}
}
}
// CreateSEP menangani request untuk membuat SEP baru.
func (h *SepHandler) CreateSEP(c *gin.Context) {
var req sepService.CreateSEPRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.Error(c, http.StatusBadRequest, "Invalid request body", err.Error())
return
}
result, err := h.sepService.Create(c.Request.Context(), req)
if err != nil {
appErr := errors.FromError(err)
response.Error(c, appErr.HTTPStatus(), appErr.Error(), nil)
return
}
response.Success(c, http.StatusCreated, "Successfully created SEP", result)
}
// UpdateSEP menangani request untuk memperbarui SEP.
func (h *SepHandler) UpdateSEP(c *gin.Context) {
var req sepService.UpdateSEPRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.Error(c, http.StatusBadRequest, "Invalid request body", err.Error())
return
}
result, err := h.sepService.Update(c.Request.Context(), req)
if err != nil {
appErr := errors.FromError(err)
response.Error(c, appErr.HTTPStatus(), appErr.Error(), nil)
return
}
response.Success(c, http.StatusOK, "Successfully updated SEP", result)
}
// GetSEPDetail menangani request untuk mendapatkan detail SEP.
func (h *SepHandler) GetSEPDetail(c *gin.Context) {
noSEP := c.Param("no_sep")
result, err := h.sepService.GetDetail(c.Request.Context(), noSEP)
if err != nil {
appErr := errors.FromError(err)
response.Error(c, appErr.HTTPStatus(), appErr.Error(), nil)
return
}
response.Success(c, http.StatusOK, "Successfully retrieved SEP detail", result)
}
// DeleteSEP menangani request untuk menghapus SEP.
func (h *SepHandler) DeleteSEP(c *gin.Context) {
var req sepService.DeleteSEPRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.Error(c, http.StatusBadRequest, "Invalid request body for SEP deletion", err.Error())
return
}
result, err := h.sepService.Delete(c.Request.Context(), req)
if err != nil {
appErr := errors.FromError(err)
response.Error(c, appErr.HTTPStatus(), appErr.Error(), nil)
return
}
response.Success(c, http.StatusOK, "Successfully deleted SEP", result)
}
@@ -1,90 +0,0 @@
package reference
import (
stdErrors "errors"
"net/http"
"service/internal/interfaces/satusehat"
"service/internal/satusehat/reference/auth"
"service/pkg/errors"
"service/pkg/response"
"time"
"github.com/gin-gonic/gin"
)
// AuthHandler menangani endpoint HTTP untuk Auth Satu Sehat.
type AuthHandler struct {
service auth.Service
}
// RegisterRoutes mendaftarkan endpoint handler ini ke router Gin
func (h *AuthHandler) RegisterRoutes(router *gin.RouterGroup) {
group := router.Group("/satusehat/reference")
{
group.GET("/auth/token", h.GetToken)
group.POST("/auth/token/refresh", h.RefreshToken)
}
}
// NewAuthHandler membuat instance baru dari AuthHandler.
func NewAuthHandler(service auth.Service) *AuthHandler {
return &AuthHandler{
service: service,
}
}
// handleSatuSehatError mengekstrak OperationOutcome agar JSON bisa tampil terstruktur di response
func handleSatuSehatError(c *gin.Context, err error) {
var ssErr *satusehat.ErrorOperationOutcome
if stdErrors.As(err, &ssErr) {
c.JSON(ssErr.StatusCode, gin.H{
"status": "error",
"message": ssErr.Outcome,
"error": gin.H{
"severity": "error",
"timestamp": time.Now().UTC().Format(time.RFC3339),
},
})
return
}
appErr := errors.FromError(err)
response.Error(c, appErr.HTTPStatus(), appErr.Error(), appErr.Metadata())
}
// GetToken godoc
//
// @Summary Get SatuSehat Access Token
// @Description Mendapatkan token aktif untuk API Satu Sehat Kemenkes (menggunakan cache internal)
// @Tags Satu Sehat - Auth
// @Produce json
// @Success 200 {object} response.Response
// @Failure 500 {object} response.Response
// @Router /satusehat/reference/auth/token [get]
// @Security BearerAuth
func (h *AuthHandler) GetToken(c *gin.Context) {
data, err := h.service.GetToken(c.Request.Context())
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Berhasil mendapatkan token Satu Sehat", data)
}
// RefreshToken godoc
//
// @Summary Refresh SatuSehat Access Token
// @Description Memaksa request token baru dari API Satu Sehat Kemenkes (bypass cache)
// @Tags Satu Sehat - Auth
// @Produce json
// @Success 200 {object} response.Response
// @Failure 500 {object} response.Response
// @Router /satusehat/reference/auth/token/refresh [post]
// @Security BearerAuth
func (h *AuthHandler) RefreshToken(c *gin.Context) {
data, err := h.service.RefreshToken(c.Request.Context())
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Berhasil me-refresh token Satu Sehat", data)
}
@@ -1,77 +0,0 @@
package reference
import (
"net/http"
"service/internal/satusehat/reference/kfa"
"service/pkg/response"
"github.com/gin-gonic/gin"
)
type KFAHandler struct {
service kfa.Service
}
func NewKFAHandler(service kfa.Service) *KFAHandler {
return &KFAHandler{
service: service,
}
}
// GetByCode godoc
//
// @Summary Cari Produk KFA berdasarkan Kode
// @Description Mencari detail produk farmasi/alkes dari API Kamus Farmasi dan Alat Kesehatan (KFA) Satu Sehat
// @Tags Satu Sehat - KFA
// @Produce json
// @Param code path string true "Kode KFA (contoh: 93000469)"
// @Success 200 {object} response.Response
// @Router /satusehat/reference/kfa/products/{code} [get]
// @Security BearerAuth
func (h *KFAHandler) GetByCode(c *gin.Context) {
code := c.Param("code")
data, err := h.service.GetByCode(c.Request.Context(), code)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Berhasil mendapatkan data produk KFA", data)
}
// GetProducts godoc
//
// @Summary Daftar Produk KFA
// @Description Mengambil daftar produk KFA dengan kapabilitas paginasi
// @Tags Satu Sehat - KFA
// @Produce json
// @Param page query int false "Nomor Halaman (default: 1)"
// @Param size query int false "Jumlah Data (default: 10)"
// @Param product_type query string false "Tipe Produk (farmasi/alkes)"
// @Param keyword query string false "Kata Kunci Pencarian"
// @Param from_ query string false "Parameter waktu (from_)"
// @Success 200 {object} response.Response
// @Router /satusehat/reference/kfa/products [get]
// @Security BearerAuth
func (h *KFAHandler) GetProducts(c *gin.Context) {
var params kfa.KFASearchParams
if err := c.ShouldBindQuery(&params); err != nil {
response.Error(c, http.StatusBadRequest, "Format parameter tidak valid", err.Error())
return
}
data, err := h.service.GetProducts(c.Request.Context(), params)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Berhasil mengambil daftar produk KFA", data)
}
func (h *KFAHandler) RegisterRoutes(router *gin.RouterGroup) {
group := router.Group("/satusehat/reference/kfa")
{
group.GET("/products/:code", h.GetByCode)
group.GET("/products", h.GetProducts)
}
}
@@ -1,126 +0,0 @@
package reference
import (
"net/http"
"service/internal/satusehat/reference/location"
"service/pkg/response"
"github.com/gin-gonic/gin"
)
type LocationHandler struct {
service location.Service
}
func NewLocationHandler(service location.Service) *LocationHandler {
return &LocationHandler{
service: service,
}
}
// GetByID godoc
//
// @Summary Cari Lokasi (Satu Sehat) berdasarkan ID
// @Description Mencari data Location FHIR Satu Sehat berdasarkan ID
// @Tags Satu Sehat - Location
// @Produce json
// @Param id path string true "Location ID"
// @Success 200 {object} response.Response
// @Router /satusehat/reference/location/{id} [get]
// @Security BearerAuth
func (h *LocationHandler) GetByID(c *gin.Context) {
id := c.Param("id")
data, err := h.service.GetByID(c.Request.Context(), id)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Berhasil mendapatkan data lokasi", data)
}
// Search godoc
//
// @Summary Pencarian Lokasi (Satu Sehat)
// @Description Mencari data Location berdasarkan parameter
// @Tags Satu Sehat - Location
// @Produce json
// @Param name query string false "Nama Lokasi"
// @Param organization query string false "ID Organisasi Pemilik"
// @Param identifier query string false "Identifier Lokasi"
// @Success 200 {object} response.Response
// @Router /satusehat/reference/location [get]
// @Security BearerAuth
func (h *LocationHandler) Search(c *gin.Context) {
var params location.LocationSearchParams
if err := c.ShouldBindQuery(&params); err != nil {
response.Error(c, http.StatusBadRequest, "Format pencarian tidak valid", err.Error())
return
}
data, err := h.service.Search(c.Request.Context(), params)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Berhasil mendapatkan data lokasi", data)
}
func (h *LocationHandler) Create(c *gin.Context) {
var payload map[string]interface{}
if err := c.ShouldBindJSON(&payload); err != nil {
response.Error(c, http.StatusBadRequest, "Format request tidak valid", err.Error())
return
}
data, err := h.service.Create(c.Request.Context(), payload)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusCreated, "Berhasil membuat data lokasi", data)
}
func (h *LocationHandler) Update(c *gin.Context) {
id := c.Param("id")
var payload map[string]interface{}
if err := c.ShouldBindJSON(&payload); err != nil {
response.Error(c, http.StatusBadRequest, "Format request tidak valid", err.Error())
return
}
data, err := h.service.Update(c.Request.Context(), id, payload)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Berhasil mengubah data lokasi", data)
}
func (h *LocationHandler) Patch(c *gin.Context) {
id := c.Param("id")
var payload interface{}
if err := c.ShouldBindJSON(&payload); err != nil {
response.Error(c, http.StatusBadRequest, "Format request tidak valid", err.Error())
return
}
data, err := h.service.Patch(c.Request.Context(), id, payload)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Berhasil melakukan patch data lokasi", data)
}
// RegisterRoutes mendaftarkan endpoint handler ini ke router Gin
func (h *LocationHandler) RegisterRoutes(router *gin.RouterGroup) {
group := router.Group("/satusehat/reference")
{
group.GET("/location/:id", h.GetByID)
group.GET("/location", h.Search)
group.POST("/location", h.Create)
group.PUT("/location/:id", h.Update)
group.PATCH("/location/:id", h.Patch)
}
}
@@ -1,133 +0,0 @@
package reference
import (
"net/http"
"service/internal/satusehat/reference/organization"
"service/pkg/response"
"github.com/gin-gonic/gin"
)
type OrganizationHandler struct {
service organization.Service
}
func NewOrganizationHandler(service organization.Service) *OrganizationHandler {
return &OrganizationHandler{
service: service,
}
}
// GetByID godoc
//
// @Summary Cari Organisasi (Satu Sehat) berdasarkan ID
// @Description Mencari data Organization FHIR Satu Sehat berdasarkan ID
// @Tags Satu Sehat - Organization
// @Produce json
// @Param id path string true "Organization ID"
// @Success 200 {object} response.Response
// @Router /satusehat/reference/organization/{id} [get]
// @Security BearerAuth
func (h *OrganizationHandler) GetByID(c *gin.Context) {
id := c.Param("id")
data, err := h.service.GetByID(c.Request.Context(), id)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Berhasil mendapatkan data organisasi", data)
}
// Search godoc
//
// @Summary Pencarian Organisasi (Satu Sehat)
// @Description Mencari data Organization berdasarkan Name atau PartOf
// @Tags Satu Sehat - Organization
// @Produce json
// @Param name query string false "Nama Organisasi"
// @Param partof query string false "ID Organisasi Induk"
// @Param identifier query string false "Identifier Organisasi"
// @Success 200 {object} response.Response
// @Router /satusehat/reference/organization [get]
// @Security BearerAuth
func (h *OrganizationHandler) Search(c *gin.Context) {
var params organization.OrganizationSearchParams
if err := c.ShouldBindQuery(&params); err != nil {
response.Error(c, http.StatusBadRequest, "Format pencarian tidak valid", err.Error())
return
}
// Validasi mandiri sebelum menembak ke API Kemenkes
if params.Name == "" && params.PartOf == "" && params.Identifier == "" {
response.Error(c, http.StatusBadRequest, "Parameter pencarian tidak lengkap", "Harap masukkan minimal salah satu parameter query: name, partof, atau identifier")
return
}
data, err := h.service.Search(c.Request.Context(), params)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Berhasil mendapatkan data organisasi", data)
}
func (h *OrganizationHandler) Create(c *gin.Context) {
var payload map[string]interface{}
if err := c.ShouldBindJSON(&payload); err != nil {
response.Error(c, http.StatusBadRequest, "Format request tidak valid", err.Error())
return
}
data, err := h.service.Create(c.Request.Context(), payload)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusCreated, "Berhasil membuat data organisasi", data)
}
func (h *OrganizationHandler) Update(c *gin.Context) {
id := c.Param("id")
var payload map[string]interface{}
if err := c.ShouldBindJSON(&payload); err != nil {
response.Error(c, http.StatusBadRequest, "Format request tidak valid", err.Error())
return
}
data, err := h.service.Update(c.Request.Context(), id, payload)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Berhasil mengubah data organisasi", data)
}
func (h *OrganizationHandler) Patch(c *gin.Context) {
id := c.Param("id")
// JSON Patch biasanya array of objects, jadi gunakan interface{} general
var payload interface{}
if err := c.ShouldBindJSON(&payload); err != nil {
response.Error(c, http.StatusBadRequest, "Format request tidak valid", err.Error())
return
}
data, err := h.service.Patch(c.Request.Context(), id, payload)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Berhasil melakukan patch data organisasi", data)
}
// RegisterRoutes mendaftarkan endpoint handler ini ke router Gin
func (h *OrganizationHandler) RegisterRoutes(router *gin.RouterGroup) {
group := router.Group("/satusehat/reference")
{
group.GET("/organization/:id", h.GetByID)
group.GET("/organization", h.Search)
group.POST("/organization", h.Create)
group.PUT("/organization/:id", h.Update)
group.PATCH("/organization/:id", h.Patch)
}
}
@@ -1,127 +0,0 @@
package reference
import (
"net/http"
"service/internal/satusehat/reference/patient"
"service/pkg/response"
"github.com/gin-gonic/gin"
)
// PatientHandler menangani endpoint HTTP untuk resource Patient Satu Sehat.
type PatientHandler struct {
service patient.Service
}
// RegisterRoutes mendaftarkan endpoint handler ini ke router Gin
func (h *PatientHandler) RegisterRoutes(router *gin.RouterGroup) {
group := router.Group("/satusehat/reference")
{
group.GET("/patient/nik/:nik", h.GetByNIK)
group.GET("/patient/:id", h.GetByID)
group.GET("/patient", h.Search)
group.POST("/patient", h.Create)
}
}
// NewPatientHandler membuat instance baru dari PatientHandler.
func NewPatientHandler(service patient.Service) *PatientHandler {
return &PatientHandler{
service: service,
}
}
// GetByNIK godoc
//
// @Summary Cari Pasien (Satu Sehat) berdasarkan NIK
// @Description Mencari data pasien FHIR Satu Sehat berdasarkan Nomor Induk Kependudukan (NIK)
// @Tags Satu Sehat - Patient
// @Produce json
// @Param nik path string true "Nomor Induk Kependudukan"
// @Success 200 {object} response.Response
// @Router /satusehat/reference/patient/nik/{nik} [get]
// @Security BearerAuth
func (h *PatientHandler) GetByNIK(c *gin.Context) {
nik := c.Param("nik")
data, err := h.service.GetByNIK(c.Request.Context(), nik)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Berhasil mendapatkan data pasien", data)
}
// GetByID godoc
//
// @Summary Cari Pasien (Satu Sehat) berdasarkan ID
// @Description Mencari data pasien FHIR Satu Sehat berdasarkan IHS Number / ID
// @Tags Satu Sehat - Patient
// @Produce json
// @Param id path string true "IHS Number / Patient ID"
// @Success 200 {object} response.Response
// @Router /satusehat/reference/patient/{id} [get]
// @Security BearerAuth
func (h *PatientHandler) GetByID(c *gin.Context) {
id := c.Param("id")
data, err := h.service.GetByID(c.Request.Context(), id)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Berhasil mendapatkan data pasien", data)
}
// Search godoc
//
// @Summary Pencarian Pasien (Satu Sehat) Multi-Parameter
// @Description Mencari data pasien FHIR Satu Sehat berdasarkan kombinasi parameter (Nama, NIK, NIK Ibu, Tanggal Lahir, Gender)
// @Tags Satu Sehat - Patient
// @Produce json
// @Param nik query string false "Nomor Induk Kependudukan"
// @Param nik_ibu query string false "Nomor Induk Kependudukan Ibu (Untuk bayi)"
// @Param name query string false "Nama Pasien"
// @Param birthdate query string false "Tanggal Lahir (YYYY-MM-DD)"
// @Param gender query string false "Jenis Kelamin (male/female)"
// @Success 200 {object} response.Response
// @Router /satusehat/reference/patient [get]
// @Security BearerAuth
func (h *PatientHandler) Search(c *gin.Context) {
var params patient.PatientSearchParams
if err := c.ShouldBindQuery(&params); err != nil {
response.Error(c, http.StatusBadRequest, "Format pencarian tidak valid", err.Error())
return
}
data, err := h.service.Search(c.Request.Context(), params)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Berhasil mendapatkan data pasien", data)
}
// Create godoc
//
// @Summary Daftar Pasien Baru (Satu Sehat)
// @Description Mendaftarkan data pasien baru ke API Satu Sehat dan mengembalikan IHS Number
// @Tags Satu Sehat - Patient
// @Accept json
// @Produce json
// @Param request body patient.CreatePatientRequest true "Data Pasien Baru"
// @Success 201 {object} response.Response
// @Router /satusehat/reference/patient [post]
// @Security BearerAuth
func (h *PatientHandler) Create(c *gin.Context) {
var req patient.CreatePatientRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.Error(c, http.StatusBadRequest, "Format request tidak valid", err.Error())
return
}
data, err := h.service.Create(c.Request.Context(), req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusCreated, "Berhasil mendaftarkan pasien", data)
}
@@ -1,98 +0,0 @@
package reference
import (
"net/http"
"service/internal/satusehat/reference/practitioner"
"service/pkg/response"
"github.com/gin-gonic/gin"
)
type PractitionerHandler struct {
service practitioner.Service
}
func NewPractitionerHandler(service practitioner.Service) *PractitionerHandler {
return &PractitionerHandler{
service: service,
}
}
// GetByNIK godoc
//
// @Summary Cari Tenaga Medis (Satu Sehat) berdasarkan NIK
// @Description Mencari data Practitioner FHIR Satu Sehat berdasarkan NIK
// @Tags Satu Sehat - Practitioner
// @Produce json
// @Param nik path string true "Nomor Induk Kependudukan"
// @Success 200 {object} response.Response
// @Router /satusehat/reference/practitioner/nik/{nik} [get]
// @Security BearerAuth
func (h *PractitionerHandler) GetByNIK(c *gin.Context) {
nik := c.Param("nik")
data, err := h.service.GetByNIK(c.Request.Context(), nik)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Berhasil mendapatkan data tenaga medis", data)
}
// GetByID godoc
//
// @Summary Cari Tenaga Medis (Satu Sehat) berdasarkan ID
// @Description Mencari data Practitioner FHIR Satu Sehat berdasarkan IHS Number / ID
// @Tags Satu Sehat - Practitioner
// @Produce json
// @Param id path string true "IHS Number / Practitioner ID"
// @Success 200 {object} response.Response
// @Router /satusehat/reference/practitioner/{id} [get]
// @Security BearerAuth
func (h *PractitionerHandler) GetByID(c *gin.Context) {
id := c.Param("id")
data, err := h.service.GetByID(c.Request.Context(), id)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Berhasil mendapatkan data tenaga medis", data)
}
// Search godoc
//
// @Summary Pencarian Tenaga Medis (Satu Sehat) Multi-Parameter
// @Description Mencari data Practitioner FHIR Satu Sehat berdasarkan parameter
// @Tags Satu Sehat - Practitioner
// @Produce json
// @Param nik query string false "Nomor Induk Kependudukan"
// @Param name query string false "Nama Tenaga Medis"
// @Param gender query string false "Jenis Kelamin (male/female)"
// @Param birthdate query string false "Tanggal Lahir (YYYY-MM-DD)"
// @Success 200 {object} response.Response
// @Router /satusehat/reference/practitioner [get]
// @Security BearerAuth
func (h *PractitionerHandler) Search(c *gin.Context) {
var params practitioner.PractitionerSearchParams
if err := c.ShouldBindQuery(&params); err != nil {
response.Error(c, http.StatusBadRequest, "Format pencarian tidak valid", err.Error())
return
}
data, err := h.service.Search(c.Request.Context(), params)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Berhasil mendapatkan data tenaga medis", data)
}
// RegisterRoutes mendaftarkan endpoint handler ini ke router Gin
func (h *PractitionerHandler) RegisterRoutes(router *gin.RouterGroup) {
group := router.Group("/satusehat/reference")
{
group.GET("/practitioner/nik/:nik", h.GetByNIK)
group.GET("/practitioner/:id", h.GetByID)
group.GET("/practitioner", h.Search)
}
}
@@ -1,81 +0,0 @@
package usecase
import (
"net/http"
"service/internal/satusehat/usecase/allergyintolerance"
"service/pkg/response"
"service/pkg/utils/validator"
"github.com/gin-gonic/gin"
)
type AllergyIntoleranceHandler struct{ service allergyintolerance.Service }
func NewAllergyIntoleranceHandler(s allergyintolerance.Service) *AllergyIntoleranceHandler {
return &AllergyIntoleranceHandler{service: s}
}
func (h *AllergyIntoleranceHandler) RegisterRoutes(router *gin.RouterGroup) {
g := router.Group("/satusehat/allergyintolerance")
g.POST("", h.Create)
g.GET("", h.Search)
g.GET("/:id", h.GetByID)
g.PUT("/:id", h.Update)
g.PATCH("/:id", h.Patch)
}
func (h *AllergyIntoleranceHandler) Create(c *gin.Context) {
var req allergyintolerance.AllergyIntoleranceRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.ErrorWithLog(c, err, http.StatusBadRequest, "Invalid request", validator.TranslateError(err))
return
}
res, err := h.service.Create(c.Request.Context(), req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusCreated, "Success", res.FullResponse)
}
func (h *AllergyIntoleranceHandler) Update(c *gin.Context) {
var req allergyintolerance.AllergyIntoleranceRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.ErrorWithLog(c, err, http.StatusBadRequest, "Invalid request", validator.TranslateError(err))
return
}
res, err := h.service.Update(c.Request.Context(), c.Param("id"), req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Success", res.FullResponse)
}
func (h *AllergyIntoleranceHandler) Patch(c *gin.Context) {
var req allergyintolerance.AllergyIntolerancePatchRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.ErrorWithLog(c, err, http.StatusBadRequest, "Invalid patch", validator.TranslateError(err))
return
}
res, err := h.service.Patch(c.Request.Context(), c.Param("id"), req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Success", res.FullResponse)
}
func (h *AllergyIntoleranceHandler) GetByID(c *gin.Context) {
res, err := h.service.GetByID(c.Request.Context(), c.Param("id"))
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Success", res.FullResponse)
}
func (h *AllergyIntoleranceHandler) Search(c *gin.Context) {
res, err := h.service.Search(c.Request.Context(), c.Request.URL.Query())
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Success", res.FullResponse)
}
@@ -1,79 +0,0 @@
package usecase
import (
"net/http"
"service/internal/satusehat/usecase/careplan"
"service/pkg/response"
"service/pkg/utils/validator"
"github.com/gin-gonic/gin"
)
type CarePlanHandler struct{ service careplan.Service }
func NewCarePlanHandler(s careplan.Service) *CarePlanHandler { return &CarePlanHandler{service: s} }
func (h *CarePlanHandler) RegisterRoutes(router *gin.RouterGroup) {
g := router.Group("/satusehat/careplan")
g.POST("", h.Create)
g.GET("", h.Search)
g.GET("/:id", h.GetByID)
g.PUT("/:id", h.Update)
g.PATCH("/:id", h.Patch)
}
func (h *CarePlanHandler) Create(c *gin.Context) {
var req careplan.CarePlanRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.ErrorWithLog(c, err, http.StatusBadRequest, "Invalid request", validator.TranslateError(err))
return
}
res, err := h.service.Create(c.Request.Context(), req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusCreated, "Success", res.FullResponse)
}
func (h *CarePlanHandler) Update(c *gin.Context) {
var req careplan.CarePlanRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.ErrorWithLog(c, err, http.StatusBadRequest, "Invalid request", validator.TranslateError(err))
return
}
res, err := h.service.Update(c.Request.Context(), c.Param("id"), req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Success", res.FullResponse)
}
func (h *CarePlanHandler) Patch(c *gin.Context) {
var req careplan.CarePlanPatchRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.ErrorWithLog(c, err, http.StatusBadRequest, "Invalid patch", validator.TranslateError(err))
return
}
res, err := h.service.Patch(c.Request.Context(), c.Param("id"), req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Success", res.FullResponse)
}
func (h *CarePlanHandler) GetByID(c *gin.Context) {
res, err := h.service.GetByID(c.Request.Context(), c.Param("id"))
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Success", res.FullResponse)
}
func (h *CarePlanHandler) Search(c *gin.Context) {
res, err := h.service.Search(c.Request.Context(), c.Request.URL.Query())
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Success", res.FullResponse)
}
@@ -1,81 +0,0 @@
package usecase
import (
"net/http"
clinicalimpression "service/internal/satusehat/usecase/clinicalImpression"
"service/pkg/response"
"service/pkg/utils/validator"
"github.com/gin-gonic/gin"
)
type ClinicalImpressionHandler struct{ service clinicalimpression.Service }
func NewClinicalImpressionHandler(s clinicalimpression.Service) *ClinicalImpressionHandler {
return &ClinicalImpressionHandler{service: s}
}
func (h *ClinicalImpressionHandler) RegisterRoutes(router *gin.RouterGroup) {
g := router.Group("/satusehat/clinicalimpression")
g.POST("", h.Create)
g.GET("", h.Search)
g.GET("/:id", h.GetByID)
g.PUT("/:id", h.Update)
g.PATCH("/:id", h.Patch)
}
func (h *ClinicalImpressionHandler) Create(c *gin.Context) {
var req clinicalimpression.ClinicalImpressionRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.ErrorWithLog(c, err, http.StatusBadRequest, "Invalid request", validator.TranslateError(err))
return
}
res, err := h.service.Create(c.Request.Context(), req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusCreated, "Success", res.FullResponse)
}
func (h *ClinicalImpressionHandler) Update(c *gin.Context) {
var req clinicalimpression.ClinicalImpressionRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.ErrorWithLog(c, err, http.StatusBadRequest, "Invalid request", validator.TranslateError(err))
return
}
res, err := h.service.Update(c.Request.Context(), c.Param("id"), req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Success", res.FullResponse)
}
func (h *ClinicalImpressionHandler) Patch(c *gin.Context) {
var req clinicalimpression.ClinicalImpressionPatchRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.ErrorWithLog(c, err, http.StatusBadRequest, "Invalid patch", validator.TranslateError(err))
return
}
res, err := h.service.Patch(c.Request.Context(), c.Param("id"), req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Success", res.FullResponse)
}
func (h *ClinicalImpressionHandler) GetByID(c *gin.Context) {
res, err := h.service.GetByID(c.Request.Context(), c.Param("id"))
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Success", res.FullResponse)
}
func (h *ClinicalImpressionHandler) Search(c *gin.Context) {
res, err := h.service.Search(c.Request.Context(), c.Request.URL.Query())
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Success", res.FullResponse)
}
@@ -1,102 +0,0 @@
package usecase
import (
"net/http"
"service/internal/satusehat/usecase/composition"
"service/pkg/response"
"service/pkg/utils/validator"
"github.com/gin-gonic/gin"
)
type CompositionHandler struct {
service composition.Service
}
func NewCompositionHandler(service composition.Service) *CompositionHandler {
return &CompositionHandler{
service: service,
}
}
func (h *CompositionHandler) RegisterRoutes(router *gin.RouterGroup) {
group := router.Group("/satusehat/composition")
{
group.POST("", h.Create)
group.GET("", h.Search)
group.GET("/:id", h.GetByID)
group.PUT("/:id", h.Update)
group.PATCH("/:id", h.Patch)
}
}
func (h *CompositionHandler) Create(c *gin.Context) {
var req composition.CompositionRequest
if err := c.ShouldBindJSON(&req); err != nil {
customErr := validator.TranslateError(err)
response.ErrorWithLog(c, err, http.StatusBadRequest, "Format permintaan tidak valid", customErr)
return
}
result, err := h.service.Create(c.Request.Context(), req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusCreated, "Successfully created Composition", result.FullResponse)
}
func (h *CompositionHandler) Update(c *gin.Context) {
id := c.Param("id")
var req composition.CompositionRequest
if err := c.ShouldBindJSON(&req); err != nil {
customErr := validator.TranslateError(err)
response.ErrorWithLog(c, err, http.StatusBadRequest, "Format permintaan tidak valid", customErr)
return
}
result, err := h.service.Update(c.Request.Context(), id, req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully updated Composition", result.FullResponse)
}
func (h *CompositionHandler) Patch(c *gin.Context) {
id := c.Param("id")
var req composition.CompositionPatchRequest
if err := c.ShouldBindJSON(&req); err != nil {
customErr := validator.TranslateError(err)
response.ErrorWithLog(c, err, http.StatusBadRequest, "Format permintaan patch tidak valid", customErr)
return
}
result, err := h.service.Patch(c.Request.Context(), id, req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully patched Composition", result.FullResponse)
}
func (h *CompositionHandler) GetByID(c *gin.Context) {
id := c.Param("id")
result, err := h.service.GetByID(c.Request.Context(), id)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully retrieved Composition", result.FullResponse)
}
func (h *CompositionHandler) Search(c *gin.Context) {
queryParams := c.Request.URL.Query()
result, err := h.service.Search(c.Request.Context(), queryParams)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully retrieved Compositions", result.FullResponse)
}
@@ -1,102 +0,0 @@
package usecase
import (
"net/http"
"service/internal/satusehat/usecase/condition"
"service/pkg/response"
"service/pkg/utils/validator"
"github.com/gin-gonic/gin"
)
type ConditionHandler struct {
service condition.Service
}
func NewConditionHandler(service condition.Service) *ConditionHandler {
return &ConditionHandler{
service: service,
}
}
func (h *ConditionHandler) RegisterRoutes(router *gin.RouterGroup) {
group := router.Group("/satusehat/condition")
{
group.POST("", h.Create)
group.GET("", h.Search)
group.GET("/:id", h.GetByID)
group.PUT("/:id", h.Update)
group.PATCH("/:id", h.Patch)
}
}
func (h *ConditionHandler) Create(c *gin.Context) {
var req condition.ConditionRequest
if err := c.ShouldBindJSON(&req); err != nil {
customErr := validator.TranslateError(err)
response.ErrorWithLog(c, err, http.StatusBadRequest, "Format permintaan tidak valid", customErr)
return
}
result, err := h.service.Create(c.Request.Context(), req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusCreated, "Successfully created Condition", result)
}
func (h *ConditionHandler) Update(c *gin.Context) {
id := c.Param("id")
var req condition.ConditionRequest
if err := c.ShouldBindJSON(&req); err != nil {
customErr := validator.TranslateError(err)
response.ErrorWithLog(c, err, http.StatusBadRequest, "Format permintaan tidak valid", customErr)
return
}
result, err := h.service.Update(c.Request.Context(), id, req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully updated Condition", result)
}
func (h *ConditionHandler) Patch(c *gin.Context) {
id := c.Param("id")
var req condition.ConditionPatchRequest
if err := c.ShouldBindJSON(&req); err != nil {
customErr := validator.TranslateError(err)
response.ErrorWithLog(c, err, http.StatusBadRequest, "Format permintaan patch tidak valid", customErr)
return
}
result, err := h.service.Patch(c.Request.Context(), id, req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully patched Condition", result)
}
func (h *ConditionHandler) GetByID(c *gin.Context) {
id := c.Param("id")
result, err := h.service.GetByID(c.Request.Context(), id)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully retrieved Condition", result)
}
func (h *ConditionHandler) Search(c *gin.Context) {
queryParams := c.Request.URL.Query()
result, err := h.service.Search(c.Request.Context(), queryParams)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully retrieved Conditions", result)
}
@@ -1,81 +0,0 @@
package usecase
import (
"net/http"
"service/internal/satusehat/usecase/diagnosticreport"
"service/pkg/response"
"service/pkg/utils/validator"
"github.com/gin-gonic/gin"
)
type DiagnosticReportHandler struct{ service diagnosticreport.Service }
func NewDiagnosticReportHandler(s diagnosticreport.Service) *DiagnosticReportHandler {
return &DiagnosticReportHandler{service: s}
}
func (h *DiagnosticReportHandler) RegisterRoutes(router *gin.RouterGroup) {
g := router.Group("/satusehat/diagnosticreport")
g.POST("", h.Create)
g.GET("", h.Search)
g.GET("/:id", h.GetByID)
g.PUT("/:id", h.Update)
g.PATCH("/:id", h.Patch)
}
func (h *DiagnosticReportHandler) Create(c *gin.Context) {
var req diagnosticreport.DiagnosticReportRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.ErrorWithLog(c, err, http.StatusBadRequest, "Invalid request", validator.TranslateError(err))
return
}
res, err := h.service.Create(c.Request.Context(), req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusCreated, "Success", res.FullResponse)
}
func (h *DiagnosticReportHandler) Update(c *gin.Context) {
var req diagnosticreport.DiagnosticReportRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.ErrorWithLog(c, err, http.StatusBadRequest, "Invalid request", validator.TranslateError(err))
return
}
res, err := h.service.Update(c.Request.Context(), c.Param("id"), req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Success", res.FullResponse)
}
func (h *DiagnosticReportHandler) Patch(c *gin.Context) {
var req diagnosticreport.DiagnosticReportPatchRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.ErrorWithLog(c, err, http.StatusBadRequest, "Invalid patch", validator.TranslateError(err))
return
}
res, err := h.service.Patch(c.Request.Context(), c.Param("id"), req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Success", res.FullResponse)
}
func (h *DiagnosticReportHandler) GetByID(c *gin.Context) {
res, err := h.service.GetByID(c.Request.Context(), c.Param("id"))
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Success", res.FullResponse)
}
func (h *DiagnosticReportHandler) Search(c *gin.Context) {
res, err := h.service.Search(c.Request.Context(), c.Request.URL.Query())
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Success", res.FullResponse)
}
@@ -1,149 +0,0 @@
package usecase
import (
"errors"
"net/http"
"strconv"
"time"
"service/internal/interfaces/satusehat"
"service/internal/satusehat/usecase/encounter"
pkgErrors "service/pkg/errors"
"service/pkg/response"
"service/pkg/utils/validator"
"github.com/gin-gonic/gin"
)
type EncounterHandler struct {
service encounter.Service
}
func NewEncounterHandler(service encounter.Service) *EncounterHandler {
return &EncounterHandler{
service: service,
}
}
func (h *EncounterHandler) RegisterRoutes(router *gin.RouterGroup) {
group := router.Group("/satusehat/encounter")
{
group.POST("", h.Create)
group.POST("/sync/:idxdaftar", h.SyncFromSIMRS)
group.GET("", h.Search)
group.GET("/:id", h.GetByID)
group.PUT("/:id", h.Update)
group.PATCH("/:id", h.Patch)
}
}
// handleSatuSehatError mengekstrak OperationOutcome agar JSON bisa tampil terstruktur
func handleSatuSehatError(c *gin.Context, err error) {
var ssErr *satusehat.ErrorOperationOutcome
if errors.As(err, &ssErr) {
c.Error(err) // Log error asli
c.JSON(ssErr.StatusCode, gin.H{
"status": "error",
"message": ssErr.Outcome,
"error": gin.H{
"severity": "error",
"timestamp": time.Now().UTC().Format(time.RFC3339),
},
})
return
}
appErr := pkgErrors.FromError(err)
response.ErrorWithLog(c, err, appErr.HTTPStatus(), appErr.Error(), appErr.Metadata())
}
func (h *EncounterHandler) Create(c *gin.Context) {
var req encounter.EncounterRequest
if err := c.ShouldBindJSON(&req); err != nil {
customErr := validator.TranslateError(err)
response.ErrorWithLog(c, err, http.StatusBadRequest, "Format permintaan tidak valid", customErr)
return
}
result, err := h.service.Create(c.Request.Context(), req)
if err != nil {
handleSatuSehatError(c, err)
return
}
// Di sini, Anda bisa menyimpan result.RawResponse atau result.ID ke database log jika diperlukan.
// Contoh:
// go logService.Create(c.Request.Context(), "encounter_create", req, result.RawResponse, http.StatusCreated)
response.Success(c, http.StatusCreated, "Successfully created Encounter", result.FullResponse)
}
func (h *EncounterHandler) Update(c *gin.Context) {
id := c.Param("id")
var req encounter.EncounterRequest
if err := c.ShouldBindJSON(&req); err != nil {
customErr := validator.TranslateError(err)
response.ErrorWithLog(c, err, http.StatusBadRequest, "Format permintaan tidak valid", customErr)
return
}
result, err := h.service.Update(c.Request.Context(), id, req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully updated Encounter", result.FullResponse)
}
func (h *EncounterHandler) Patch(c *gin.Context) {
id := c.Param("id")
var req encounter.EncounterPatchRequest
if err := c.ShouldBindJSON(&req); err != nil {
customErr := validator.TranslateError(err)
response.ErrorWithLog(c, err, http.StatusBadRequest, "Format permintaan patch tidak valid", customErr)
return
}
result, err := h.service.Patch(c.Request.Context(), id, req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully patched Encounter", result.FullResponse)
}
func (h *EncounterHandler) GetByID(c *gin.Context) {
id := c.Param("id")
result, err := h.service.GetByID(c.Request.Context(), id)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully retrieved Encounter", result.FullResponse)
}
func (h *EncounterHandler) Search(c *gin.Context) {
// Get query parameters string natively and fetch it directly (like: ?patient=xxx&status=active)
queryParams := c.Request.URL.Query()
result, err := h.service.Search(c.Request.Context(), queryParams)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully retrieved Encounters", result.FullResponse)
}
func (h *EncounterHandler) SyncFromSIMRS(c *gin.Context) {
idxdaftarStr := c.Param("idxdaftar")
idxdaftar, err := strconv.ParseInt(idxdaftarStr, 10, 64)
if err != nil {
response.ErrorWithLog(c, err, http.StatusBadRequest, "Format idxdaftar tidak valid", nil)
return
}
result, err := h.service.SyncFromSIMRS(c.Request.Context(), idxdaftar)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully synced Encounter from SIMRS", result.FullResponse)
}
@@ -1,102 +0,0 @@
package usecase
import (
"net/http"
"service/internal/satusehat/usecase/episodeofcare"
"service/pkg/response"
"service/pkg/utils/validator"
"github.com/gin-gonic/gin"
)
type EpisodeOfCareHandler struct {
service episodeofcare.Service
}
func NewEpisodeOfCareHandler(service episodeofcare.Service) *EpisodeOfCareHandler {
return &EpisodeOfCareHandler{
service: service,
}
}
func (h *EpisodeOfCareHandler) RegisterRoutes(router *gin.RouterGroup) {
group := router.Group("/satusehat/episodeofcare")
{
group.POST("", h.Create)
group.GET("", h.Search)
group.GET("/:id", h.GetByID)
group.PUT("/:id", h.Update)
group.PATCH("/:id", h.Patch)
}
}
func (h *EpisodeOfCareHandler) Create(c *gin.Context) {
var req episodeofcare.EpisodeOfCareRequest
if err := c.ShouldBindJSON(&req); err != nil {
customErr := validator.TranslateError(err)
response.ErrorWithLog(c, err, http.StatusBadRequest, "Format permintaan tidak valid", customErr)
return
}
result, err := h.service.Create(c.Request.Context(), req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusCreated, "Successfully created EpisodeOfCare", result)
}
func (h *EpisodeOfCareHandler) Update(c *gin.Context) {
id := c.Param("id")
var req episodeofcare.EpisodeOfCareRequest
if err := c.ShouldBindJSON(&req); err != nil {
customErr := validator.TranslateError(err)
response.ErrorWithLog(c, err, http.StatusBadRequest, "Format permintaan tidak valid", customErr)
return
}
result, err := h.service.Update(c.Request.Context(), id, req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully updated EpisodeOfCare", result)
}
func (h *EpisodeOfCareHandler) Patch(c *gin.Context) {
id := c.Param("id")
var req episodeofcare.EpisodeOfCarePatchRequest
if err := c.ShouldBindJSON(&req); err != nil {
customErr := validator.TranslateError(err)
response.ErrorWithLog(c, err, http.StatusBadRequest, "Format permintaan patch tidak valid", customErr)
return
}
result, err := h.service.Patch(c.Request.Context(), id, req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully patched EpisodeOfCare", result)
}
func (h *EpisodeOfCareHandler) GetByID(c *gin.Context) {
id := c.Param("id")
result, err := h.service.GetByID(c.Request.Context(), id)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully retrieved EpisodeOfCare", result)
}
func (h *EpisodeOfCareHandler) Search(c *gin.Context) {
queryParams := c.Request.URL.Query()
result, err := h.service.Search(c.Request.Context(), queryParams)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully retrieved EpisodeOfCare records", result)
}
@@ -1,102 +0,0 @@
package usecase
import (
"net/http"
"service/internal/satusehat/usecase/imagingstudy"
"service/pkg/response"
"service/pkg/utils/validator"
"github.com/gin-gonic/gin"
)
type ImagingStudyHandler struct {
service imagingstudy.Service
}
func NewImagingStudyHandler(service imagingstudy.Service) *ImagingStudyHandler {
return &ImagingStudyHandler{
service: service,
}
}
func (h *ImagingStudyHandler) RegisterRoutes(router *gin.RouterGroup) {
group := router.Group("/satusehat/imagingstudy")
{
group.POST("", h.Create)
group.GET("", h.Search)
group.GET("/:id", h.GetByID)
group.PUT("/:id", h.Update)
group.PATCH("/:id", h.Patch)
}
}
func (h *ImagingStudyHandler) Create(c *gin.Context) {
var req imagingstudy.ImagingStudyRequest
if err := c.ShouldBindJSON(&req); err != nil {
customErr := validator.TranslateError(err)
response.ErrorWithLog(c, err, http.StatusBadRequest, "Format permintaan tidak valid", customErr)
return
}
result, err := h.service.Create(c.Request.Context(), req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusCreated, "Successfully created ImagingStudy", result)
}
func (h *ImagingStudyHandler) Update(c *gin.Context) {
id := c.Param("id")
var req imagingstudy.ImagingStudyRequest
if err := c.ShouldBindJSON(&req); err != nil {
customErr := validator.TranslateError(err)
response.ErrorWithLog(c, err, http.StatusBadRequest, "Format permintaan tidak valid", customErr)
return
}
result, err := h.service.Update(c.Request.Context(), id, req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully updated ImagingStudy", result)
}
func (h *ImagingStudyHandler) Patch(c *gin.Context) {
id := c.Param("id")
var req imagingstudy.ImagingStudyPatchRequest
if err := c.ShouldBindJSON(&req); err != nil {
customErr := validator.TranslateError(err)
response.ErrorWithLog(c, err, http.StatusBadRequest, "Format permintaan patch tidak valid", customErr)
return
}
result, err := h.service.Patch(c.Request.Context(), id, req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully patched ImagingStudy", result)
}
func (h *ImagingStudyHandler) GetByID(c *gin.Context) {
id := c.Param("id")
result, err := h.service.GetByID(c.Request.Context(), id)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully retrieved ImagingStudy", result)
}
func (h *ImagingStudyHandler) Search(c *gin.Context) {
queryParams := c.Request.URL.Query()
result, err := h.service.Search(c.Request.Context(), queryParams)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully retrieved ImagingStudies", result)
}
@@ -1,81 +0,0 @@
package usecase
import (
"net/http"
"service/internal/satusehat/usecase/immunization"
"service/pkg/response"
"service/pkg/utils/validator"
"github.com/gin-gonic/gin"
)
type ImmunizationHandler struct{ service immunization.Service }
func NewImmunizationHandler(s immunization.Service) *ImmunizationHandler {
return &ImmunizationHandler{service: s}
}
func (h *ImmunizationHandler) RegisterRoutes(router *gin.RouterGroup) {
g := router.Group("/satusehat/immunization")
g.POST("", h.Create)
g.GET("", h.Search)
g.GET("/:id", h.GetByID)
g.PUT("/:id", h.Update)
g.PATCH("/:id", h.Patch)
}
func (h *ImmunizationHandler) Create(c *gin.Context) {
var req immunization.ImmunizationRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.ErrorWithLog(c, err, http.StatusBadRequest, "Invalid request", validator.TranslateError(err))
return
}
res, err := h.service.Create(c.Request.Context(), req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusCreated, "Success", res.FullResponse)
}
func (h *ImmunizationHandler) Update(c *gin.Context) {
var req immunization.ImmunizationRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.ErrorWithLog(c, err, http.StatusBadRequest, "Invalid request", validator.TranslateError(err))
return
}
res, err := h.service.Update(c.Request.Context(), c.Param("id"), req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Success", res.FullResponse)
}
func (h *ImmunizationHandler) Patch(c *gin.Context) {
var req immunization.ImmunizationPatchRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.ErrorWithLog(c, err, http.StatusBadRequest, "Invalid patch", validator.TranslateError(err))
return
}
res, err := h.service.Patch(c.Request.Context(), c.Param("id"), req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Success", res.FullResponse)
}
func (h *ImmunizationHandler) GetByID(c *gin.Context) {
res, err := h.service.GetByID(c.Request.Context(), c.Param("id"))
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Success", res.FullResponse)
}
func (h *ImmunizationHandler) Search(c *gin.Context) {
res, err := h.service.Search(c.Request.Context(), c.Request.URL.Query())
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Success", res.FullResponse)
}
@@ -1,102 +0,0 @@
package usecase
import (
"net/http"
"service/internal/satusehat/usecase/medication"
"service/pkg/response"
"service/pkg/utils/validator"
"github.com/gin-gonic/gin"
)
type MedicationHandler struct {
service medication.Service
}
func NewMedicationHandler(service medication.Service) *MedicationHandler {
return &MedicationHandler{
service: service,
}
}
func (h *MedicationHandler) RegisterRoutes(router *gin.RouterGroup) {
group := router.Group("/satusehat/medication")
{
group.POST("", h.Create)
group.GET("", h.Search)
group.GET("/:id", h.GetByID)
group.PUT("/:id", h.Update)
group.PATCH("/:id", h.Patch)
}
}
func (h *MedicationHandler) Create(c *gin.Context) {
var req medication.MedicationRequest
if err := c.ShouldBindJSON(&req); err != nil {
customErr := validator.TranslateError(err)
response.ErrorWithLog(c, err, http.StatusBadRequest, "Format permintaan tidak valid", customErr)
return
}
result, err := h.service.Create(c.Request.Context(), req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusCreated, "Successfully created Medication", result.FullResponse)
}
func (h *MedicationHandler) Update(c *gin.Context) {
id := c.Param("id")
var req medication.MedicationRequest
if err := c.ShouldBindJSON(&req); err != nil {
customErr := validator.TranslateError(err)
response.ErrorWithLog(c, err, http.StatusBadRequest, "Format permintaan tidak valid", customErr)
return
}
result, err := h.service.Update(c.Request.Context(), id, req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully updated Medication", result.FullResponse)
}
func (h *MedicationHandler) Patch(c *gin.Context) {
id := c.Param("id")
var req medication.MedicationPatchRequest
if err := c.ShouldBindJSON(&req); err != nil {
customErr := validator.TranslateError(err)
response.ErrorWithLog(c, err, http.StatusBadRequest, "Format permintaan patch tidak valid", customErr)
return
}
result, err := h.service.Patch(c.Request.Context(), id, req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully patched Medication", result.FullResponse)
}
func (h *MedicationHandler) GetByID(c *gin.Context) {
id := c.Param("id")
result, err := h.service.GetByID(c.Request.Context(), id)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully retrieved Medication", result.FullResponse)
}
func (h *MedicationHandler) Search(c *gin.Context) {
queryParams := c.Request.URL.Query()
result, err := h.service.Search(c.Request.Context(), queryParams)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully retrieved Medications", result.FullResponse)
}
@@ -1,91 +0,0 @@
package usecase
import (
"net/http"
"service/internal/satusehat/usecase/medicationdispense"
"service/pkg/response"
"service/pkg/utils/validator"
"github.com/gin-gonic/gin"
)
type MedicationDispenseHandler struct {
service medicationdispense.Service
}
func NewMedicationDispenseHandler(service medicationdispense.Service) *MedicationDispenseHandler {
return &MedicationDispenseHandler{service: service}
}
func (h *MedicationDispenseHandler) RegisterRoutes(router *gin.RouterGroup) {
group := router.Group("/satusehat/medicationdispense")
{
group.POST("", h.Create)
group.GET("", h.Search)
group.GET("/:id", h.GetByID)
group.PUT("/:id", h.Update)
group.PATCH("/:id", h.Patch)
}
}
func (h *MedicationDispenseHandler) Create(c *gin.Context) {
var req medicationdispense.MedicationDispenseRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.ErrorWithLog(c, err, http.StatusBadRequest, "Format permintaan tidak valid", validator.TranslateError(err))
return
}
result, err := h.service.Create(c.Request.Context(), req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusCreated, "Successfully created MedicationDispense", result.FullResponse)
}
func (h *MedicationDispenseHandler) Update(c *gin.Context) {
id := c.Param("id")
var req medicationdispense.MedicationDispenseRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.ErrorWithLog(c, err, http.StatusBadRequest, "Format permintaan tidak valid", validator.TranslateError(err))
return
}
result, err := h.service.Update(c.Request.Context(), id, req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully updated MedicationDispense", result.FullResponse)
}
func (h *MedicationDispenseHandler) Patch(c *gin.Context) {
id := c.Param("id")
var req medicationdispense.MedicationDispensePatchRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.ErrorWithLog(c, err, http.StatusBadRequest, "Format permintaan patch tidak valid", validator.TranslateError(err))
return
}
result, err := h.service.Patch(c.Request.Context(), id, req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully patched MedicationDispense", result.FullResponse)
}
func (h *MedicationDispenseHandler) GetByID(c *gin.Context) {
result, err := h.service.GetByID(c.Request.Context(), c.Param("id"))
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully retrieved", result.FullResponse)
}
func (h *MedicationDispenseHandler) Search(c *gin.Context) {
result, err := h.service.Search(c.Request.Context(), c.Request.URL.Query())
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully retrieved", result.FullResponse)
}
@@ -1,91 +0,0 @@
package usecase
import (
"net/http"
"service/internal/satusehat/usecase/medicationrequest"
"service/pkg/response"
"service/pkg/utils/validator"
"github.com/gin-gonic/gin"
)
type MedicationRequestHandler struct {
service medicationrequest.Service
}
func NewMedicationRequestHandler(service medicationrequest.Service) *MedicationRequestHandler {
return &MedicationRequestHandler{service: service}
}
func (h *MedicationRequestHandler) RegisterRoutes(router *gin.RouterGroup) {
group := router.Group("/satusehat/medicationrequest")
{
group.POST("", h.Create)
group.GET("", h.Search)
group.GET("/:id", h.GetByID)
group.PUT("/:id", h.Update)
group.PATCH("/:id", h.Patch)
}
}
func (h *MedicationRequestHandler) Create(c *gin.Context) {
var req medicationrequest.MedicationRequestRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.ErrorWithLog(c, err, http.StatusBadRequest, "Format permintaan tidak valid", validator.TranslateError(err))
return
}
result, err := h.service.Create(c.Request.Context(), req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusCreated, "Successfully created MedicationRequest", result.FullResponse)
}
func (h *MedicationRequestHandler) Update(c *gin.Context) {
id := c.Param("id")
var req medicationrequest.MedicationRequestRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.ErrorWithLog(c, err, http.StatusBadRequest, "Format permintaan tidak valid", validator.TranslateError(err))
return
}
result, err := h.service.Update(c.Request.Context(), id, req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully updated MedicationRequest", result.FullResponse)
}
func (h *MedicationRequestHandler) Patch(c *gin.Context) {
id := c.Param("id")
var req medicationrequest.MedicationRequestPatchRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.ErrorWithLog(c, err, http.StatusBadRequest, "Format permintaan patch tidak valid", validator.TranslateError(err))
return
}
result, err := h.service.Patch(c.Request.Context(), id, req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully patched MedicationRequest", result.FullResponse)
}
func (h *MedicationRequestHandler) GetByID(c *gin.Context) {
result, err := h.service.GetByID(c.Request.Context(), c.Param("id"))
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully retrieved", result.FullResponse)
}
func (h *MedicationRequestHandler) Search(c *gin.Context) {
result, err := h.service.Search(c.Request.Context(), c.Request.URL.Query())
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully retrieved", result.FullResponse)
}
@@ -1,91 +0,0 @@
package usecase
import (
"net/http"
"service/internal/satusehat/usecase/medicationstatement"
"service/pkg/response"
"service/pkg/utils/validator"
"github.com/gin-gonic/gin"
)
type MedicationStatementHandler struct {
service medicationstatement.Service
}
func NewMedicationStatementHandler(service medicationstatement.Service) *MedicationStatementHandler {
return &MedicationStatementHandler{service: service}
}
func (h *MedicationStatementHandler) RegisterRoutes(router *gin.RouterGroup) {
group := router.Group("/satusehat/medicationstatement")
{
group.POST("", h.Create)
group.GET("", h.Search)
group.GET("/:id", h.GetByID)
group.PUT("/:id", h.Update)
group.PATCH("/:id", h.Patch)
}
}
func (h *MedicationStatementHandler) Create(c *gin.Context) {
var req medicationstatement.MedicationStatementRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.ErrorWithLog(c, err, http.StatusBadRequest, "Format permintaan tidak valid", validator.TranslateError(err))
return
}
result, err := h.service.Create(c.Request.Context(), req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusCreated, "Successfully created MedicationStatement", result.FullResponse)
}
func (h *MedicationStatementHandler) Update(c *gin.Context) {
id := c.Param("id")
var req medicationstatement.MedicationStatementRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.ErrorWithLog(c, err, http.StatusBadRequest, "Format permintaan tidak valid", validator.TranslateError(err))
return
}
result, err := h.service.Update(c.Request.Context(), id, req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully updated MedicationStatement", result.FullResponse)
}
func (h *MedicationStatementHandler) Patch(c *gin.Context) {
id := c.Param("id")
var req medicationstatement.MedicationStatementPatchRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.ErrorWithLog(c, err, http.StatusBadRequest, "Format permintaan patch tidak valid", validator.TranslateError(err))
return
}
result, err := h.service.Patch(c.Request.Context(), id, req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully patched MedicationStatement", result.FullResponse)
}
func (h *MedicationStatementHandler) GetByID(c *gin.Context) {
result, err := h.service.GetByID(c.Request.Context(), c.Param("id"))
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully retrieved", result.FullResponse)
}
func (h *MedicationStatementHandler) Search(c *gin.Context) {
result, err := h.service.Search(c.Request.Context(), c.Request.URL.Query())
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully retrieved", result.FullResponse)
}
@@ -1,102 +0,0 @@
package usecase
import (
"net/http"
"service/internal/satusehat/usecase/observation"
"service/pkg/response"
"service/pkg/utils/validator"
"github.com/gin-gonic/gin"
)
type ObservationHandler struct {
service observation.Service
}
func NewObservationHandler(service observation.Service) *ObservationHandler {
return &ObservationHandler{
service: service,
}
}
func (h *ObservationHandler) RegisterRoutes(router *gin.RouterGroup) {
group := router.Group("/satusehat/observation")
{
group.POST("", h.Create)
group.GET("", h.Search)
group.GET("/:id", h.GetByID)
group.PUT("/:id", h.Update)
group.PATCH("/:id", h.Patch)
}
}
func (h *ObservationHandler) Create(c *gin.Context) {
var req observation.ObservationRequest
if err := c.ShouldBindJSON(&req); err != nil {
customErr := validator.TranslateError(err)
response.ErrorWithLog(c, err, http.StatusBadRequest, "Format permintaan tidak valid", customErr)
return
}
result, err := h.service.Create(c.Request.Context(), req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusCreated, "Successfully created Observation", result.FullResponse)
}
func (h *ObservationHandler) Update(c *gin.Context) {
id := c.Param("id")
var req observation.ObservationRequest
if err := c.ShouldBindJSON(&req); err != nil {
customErr := validator.TranslateError(err)
response.ErrorWithLog(c, err, http.StatusBadRequest, "Format permintaan tidak valid", customErr)
return
}
result, err := h.service.Update(c.Request.Context(), id, req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully updated Observation", result.FullResponse)
}
func (h *ObservationHandler) Patch(c *gin.Context) {
id := c.Param("id")
var req observation.ObservationPatchRequest
if err := c.ShouldBindJSON(&req); err != nil {
customErr := validator.TranslateError(err)
response.ErrorWithLog(c, err, http.StatusBadRequest, "Format permintaan patch tidak valid", customErr)
return
}
result, err := h.service.Patch(c.Request.Context(), id, req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully patched Observation", result.FullResponse)
}
func (h *ObservationHandler) GetByID(c *gin.Context) {
id := c.Param("id")
result, err := h.service.GetByID(c.Request.Context(), id)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully retrieved Observation", result.FullResponse)
}
func (h *ObservationHandler) Search(c *gin.Context) {
queryParams := c.Request.URL.Query()
result, err := h.service.Search(c.Request.Context(), queryParams)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully retrieved Observations", result.FullResponse)
}
@@ -1,102 +0,0 @@
package usecase
import (
"net/http"
"service/internal/satusehat/usecase/procedure"
"service/pkg/response"
"service/pkg/utils/validator"
"github.com/gin-gonic/gin"
)
type ProcedureHandler struct {
service procedure.Service
}
func NewProcedureHandler(service procedure.Service) *ProcedureHandler {
return &ProcedureHandler{
service: service,
}
}
func (h *ProcedureHandler) RegisterRoutes(router *gin.RouterGroup) {
group := router.Group("/satusehat/procedure")
{
group.POST("", h.Create)
group.GET("", h.Search)
group.GET("/:id", h.GetByID)
group.PUT("/:id", h.Update)
group.PATCH("/:id", h.Patch)
}
}
func (h *ProcedureHandler) Create(c *gin.Context) {
var req procedure.ProcedureRequest
if err := c.ShouldBindJSON(&req); err != nil {
customErr := validator.TranslateError(err)
response.ErrorWithLog(c, err, http.StatusBadRequest, "Format permintaan tidak valid", customErr)
return
}
result, err := h.service.Create(c.Request.Context(), req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusCreated, "Successfully created Procedure", result.FullResponse)
}
func (h *ProcedureHandler) Update(c *gin.Context) {
id := c.Param("id")
var req procedure.ProcedureRequest
if err := c.ShouldBindJSON(&req); err != nil {
customErr := validator.TranslateError(err)
response.ErrorWithLog(c, err, http.StatusBadRequest, "Format permintaan tidak valid", customErr)
return
}
result, err := h.service.Update(c.Request.Context(), id, req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully updated Procedure", result.FullResponse)
}
func (h *ProcedureHandler) Patch(c *gin.Context) {
id := c.Param("id")
var req procedure.ProcedurePatchRequest
if err := c.ShouldBindJSON(&req); err != nil {
customErr := validator.TranslateError(err)
response.ErrorWithLog(c, err, http.StatusBadRequest, "Format permintaan patch tidak valid", customErr)
return
}
result, err := h.service.Patch(c.Request.Context(), id, req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully patched Procedure", result.FullResponse)
}
func (h *ProcedureHandler) GetByID(c *gin.Context) {
id := c.Param("id")
result, err := h.service.GetByID(c.Request.Context(), id)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully retrieved Procedure", result.FullResponse)
}
func (h *ProcedureHandler) Search(c *gin.Context) {
queryParams := c.Request.URL.Query()
result, err := h.service.Search(c.Request.Context(), queryParams)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully retrieved Procedures", result.FullResponse)
}
@@ -1,91 +0,0 @@
package usecase
import (
"net/http"
"service/internal/satusehat/usecase/questionnaireresponse"
"service/pkg/response"
"service/pkg/utils/validator"
"github.com/gin-gonic/gin"
)
type QuestionnaireResponseHandler struct {
service questionnaireresponse.Service
}
func NewQuestionnaireResponseHandler(service questionnaireresponse.Service) *QuestionnaireResponseHandler {
return &QuestionnaireResponseHandler{service: service}
}
func (h *QuestionnaireResponseHandler) RegisterRoutes(router *gin.RouterGroup) {
group := router.Group("/satusehat/questionnaireresponse")
{
group.POST("", h.Create)
group.GET("", h.Search)
group.GET("/:id", h.GetByID)
group.PUT("/:id", h.Update)
group.PATCH("/:id", h.Patch)
}
}
func (h *QuestionnaireResponseHandler) Create(c *gin.Context) {
var req questionnaireresponse.QuestionnaireResponseRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.ErrorWithLog(c, err, http.StatusBadRequest, "Format permintaan tidak valid", validator.TranslateError(err))
return
}
result, err := h.service.Create(c.Request.Context(), req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusCreated, "Successfully created QuestionnaireResponse", result.FullResponse)
}
func (h *QuestionnaireResponseHandler) Update(c *gin.Context) {
id := c.Param("id")
var req questionnaireresponse.QuestionnaireResponseRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.ErrorWithLog(c, err, http.StatusBadRequest, "Format permintaan tidak valid", validator.TranslateError(err))
return
}
result, err := h.service.Update(c.Request.Context(), id, req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully updated QuestionnaireResponse", result.FullResponse)
}
func (h *QuestionnaireResponseHandler) Patch(c *gin.Context) {
id := c.Param("id")
var req questionnaireresponse.QuestionnaireResponsePatchRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.ErrorWithLog(c, err, http.StatusBadRequest, "Format permintaan patch tidak valid", validator.TranslateError(err))
return
}
result, err := h.service.Patch(c.Request.Context(), id, req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully patched QuestionnaireResponse", result.FullResponse)
}
func (h *QuestionnaireResponseHandler) GetByID(c *gin.Context) {
result, err := h.service.GetByID(c.Request.Context(), c.Param("id"))
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully retrieved", result.FullResponse)
}
func (h *QuestionnaireResponseHandler) Search(c *gin.Context) {
result, err := h.service.Search(c.Request.Context(), c.Request.URL.Query())
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully retrieved", result.FullResponse)
}
@@ -1,102 +0,0 @@
package usecase
import (
"net/http"
"service/internal/satusehat/usecase/servicerequest"
"service/pkg/response"
"service/pkg/utils/validator"
"github.com/gin-gonic/gin"
)
type ServiceRequestHandler struct {
service servicerequest.Service
}
func NewServiceRequestHandler(service servicerequest.Service) *ServiceRequestHandler {
return &ServiceRequestHandler{
service: service,
}
}
func (h *ServiceRequestHandler) RegisterRoutes(router *gin.RouterGroup) {
group := router.Group("/satusehat/servicerequest")
{
group.POST("", h.Create)
group.GET("", h.Search)
group.GET("/:id", h.GetByID)
group.PUT("/:id", h.Update)
group.PATCH("/:id", h.Patch)
}
}
func (h *ServiceRequestHandler) Create(c *gin.Context) {
var req servicerequest.ServiceRequestRequest
if err := c.ShouldBindJSON(&req); err != nil {
customErr := validator.TranslateError(err)
response.ErrorWithLog(c, err, http.StatusBadRequest, "Format permintaan tidak valid", customErr)
return
}
result, err := h.service.Create(c.Request.Context(), req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusCreated, "Successfully created ServiceRequest", result.FullResponse)
}
func (h *ServiceRequestHandler) Update(c *gin.Context) {
id := c.Param("id")
var req servicerequest.ServiceRequestRequest
if err := c.ShouldBindJSON(&req); err != nil {
customErr := validator.TranslateError(err)
response.ErrorWithLog(c, err, http.StatusBadRequest, "Format permintaan tidak valid", customErr)
return
}
result, err := h.service.Update(c.Request.Context(), id, req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully updated ServiceRequest", result.FullResponse)
}
func (h *ServiceRequestHandler) Patch(c *gin.Context) {
id := c.Param("id")
var req servicerequest.ServiceRequestPatchRequest
if err := c.ShouldBindJSON(&req); err != nil {
customErr := validator.TranslateError(err)
response.ErrorWithLog(c, err, http.StatusBadRequest, "Format permintaan patch tidak valid", customErr)
return
}
result, err := h.service.Patch(c.Request.Context(), id, req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully patched ServiceRequest", result.FullResponse)
}
func (h *ServiceRequestHandler) GetByID(c *gin.Context) {
id := c.Param("id")
result, err := h.service.GetByID(c.Request.Context(), id)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully retrieved ServiceRequest", result.FullResponse)
}
func (h *ServiceRequestHandler) Search(c *gin.Context) {
queryParams := c.Request.URL.Query()
result, err := h.service.Search(c.Request.Context(), queryParams)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Successfully retrieved ServiceRequests", result.FullResponse)
}
@@ -1,79 +0,0 @@
package usecase
import (
"net/http"
"service/internal/satusehat/usecase/specimen"
"service/pkg/response"
"service/pkg/utils/validator"
"github.com/gin-gonic/gin"
)
type SpecimenHandler struct{ service specimen.Service }
func NewSpecimenHandler(s specimen.Service) *SpecimenHandler { return &SpecimenHandler{service: s} }
func (h *SpecimenHandler) RegisterRoutes(router *gin.RouterGroup) {
g := router.Group("/satusehat/specimen")
g.POST("", h.Create)
g.GET("", h.Search)
g.GET("/:id", h.GetByID)
g.PUT("/:id", h.Update)
g.PATCH("/:id", h.Patch)
}
func (h *SpecimenHandler) Create(c *gin.Context) {
var req specimen.SpecimenRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.ErrorWithLog(c, err, http.StatusBadRequest, "Invalid request", validator.TranslateError(err))
return
}
res, err := h.service.Create(c.Request.Context(), req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusCreated, "Success", res.FullResponse)
}
func (h *SpecimenHandler) Update(c *gin.Context) {
var req specimen.SpecimenRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.ErrorWithLog(c, err, http.StatusBadRequest, "Invalid request", validator.TranslateError(err))
return
}
res, err := h.service.Update(c.Request.Context(), c.Param("id"), req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Success", res.FullResponse)
}
func (h *SpecimenHandler) Patch(c *gin.Context) {
var req specimen.SpecimenPatchRequest
if err := c.ShouldBindJSON(&req); err != nil {
response.ErrorWithLog(c, err, http.StatusBadRequest, "Invalid patch", validator.TranslateError(err))
return
}
res, err := h.service.Patch(c.Request.Context(), c.Param("id"), req)
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Success", res.FullResponse)
}
func (h *SpecimenHandler) GetByID(c *gin.Context) {
res, err := h.service.GetByID(c.Request.Context(), c.Param("id"))
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Success", res.FullResponse)
}
func (h *SpecimenHandler) Search(c *gin.Context) {
res, err := h.service.Search(c.Request.Context(), c.Request.URL.Query())
if err != nil {
handleSatuSehatError(c, err)
return
}
response.Success(c, http.StatusOK, "Success", res.FullResponse)
}