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
@@ -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)
}
@@ -8,15 +8,9 @@ import (
"service/internal/infrastructure/config"
"service/internal/infrastructure/transport/http/middleware"
antrolHttp "service/internal/infrastructure/transport/http/handlers/bpjs/antrol"
aplicareHttp "service/internal/infrastructure/transport/http/handlers/bpjs/aplicare"
apotekHttp "service/internal/infrastructure/transport/http/handlers/bpjs/apotek"
vclaimHttp "service/internal/infrastructure/transport/http/handlers/bpjs/vclaim"
authHttp "service/internal/infrastructure/transport/http/handlers/main/auth"
healthHttp "service/internal/infrastructure/transport/http/handlers/main/health"
roleHttp "service/internal/infrastructure/transport/http/handlers/main/master/roles"
satuSehatRefHttp "service/internal/infrastructure/transport/http/handlers/satusehat/reference"
satuSehatUsecaseHttp "service/internal/infrastructure/transport/http/handlers/satusehat/usecase"
"github.com/gin-gonic/gin"
swaggerFiles "github.com/swaggo/files"
@@ -26,40 +20,10 @@ import (
// ModuleHandlers menampung seluruh HTTP handler opsional dari berbagai modul.
// Jika sebuah handler bernilai nil, maka rutenya akan otomatis diabaikan (disabled).
type ModuleHandlers struct {
Auth *authHttp.AuthHandler
RolePages *roleHttp.RolPagesHandler
RolePermission *roleHttp.RolPermissionHandler
RoleMaster *roleHttp.RoleMasterHandler
Sep *vclaimHttp.SepHandler
Peserta *vclaimHttp.PesertaHandler
Antrol *antrolHttp.AntrolHandler
AplicareBed *aplicareHttp.BedHandler
ApotekReference *apotekHttp.ReferenceHandler
SatuSehatAuth *satuSehatRefHttp.AuthHandler
SatuSehatPatient *satuSehatRefHttp.PatientHandler
SatuSehatPractitioner *satuSehatRefHttp.PractitionerHandler
SatuSehatOrganization *satuSehatRefHttp.OrganizationHandler
SatuSehatLocation *satuSehatRefHttp.LocationHandler
SatuSehatKFA *satuSehatRefHttp.KFAHandler
SSAllergyIntolerance *satuSehatUsecaseHttp.AllergyIntoleranceHandler
SSCarePlan *satuSehatUsecaseHttp.CarePlanHandler
SSClinicalImpression *satuSehatUsecaseHttp.ClinicalImpressionHandler
SSComposition *satuSehatUsecaseHttp.CompositionHandler
SSCondition *satuSehatUsecaseHttp.ConditionHandler
SSDiagnosticReport *satuSehatUsecaseHttp.DiagnosticReportHandler
SSEncounter *satuSehatUsecaseHttp.EncounterHandler
SSEpisodeOfCare *satuSehatUsecaseHttp.EpisodeOfCareHandler
SSImagingStudy *satuSehatUsecaseHttp.ImagingStudyHandler
SSImmunization *satuSehatUsecaseHttp.ImmunizationHandler
SSMedication *satuSehatUsecaseHttp.MedicationHandler
SSMedicationDispense *satuSehatUsecaseHttp.MedicationDispenseHandler
SSMedicationRequest *satuSehatUsecaseHttp.MedicationRequestHandler
SSMedicationStatement *satuSehatUsecaseHttp.MedicationStatementHandler
SSObservation *satuSehatUsecaseHttp.ObservationHandler
SSProcedure *satuSehatUsecaseHttp.ProcedureHandler
SSQuestionnaireResponse *satuSehatUsecaseHttp.QuestionnaireResponseHandler
SSServiceRequest *satuSehatUsecaseHttp.ServiceRequestHandler
SSSpecimen *satuSehatUsecaseHttp.SpecimenHandler
Auth *authHttp.AuthHandler
RolePages *roleHttp.RolPagesHandler
RolePermission *roleHttp.RolPermissionHandler
RoleMaster *roleHttp.RoleMasterHandler
}
// SetupRoutes mendaftarkan seluruh endpoint API secara dinamis berdasarkan
@@ -153,111 +117,6 @@ func SetupRoutes(
if h.RoleMaster != nil {
h.RoleMaster.RegisterRoutes(protected)
}
// --- Routes Modul BPJS VClaim ---
if h.Sep != nil {
h.Sep.RegisterRoutes(protected)
}
if h.Peserta != nil {
h.Peserta.RegisterRoutes(protected)
}
// --- Routes Modul BPJS Antrol ---
if h.Antrol != nil {
h.Antrol.RegisterRoutes(protected)
}
// --- Routes Modul BPJS Aplicares ---
if h.AplicareBed != nil {
h.AplicareBed.RegisterRoutes(protected)
}
// --- Routes Modul BPJS Apotek ---
if h.ApotekReference != nil {
h.ApotekReference.RegisterRoutes(protected)
}
// --- Routes Modul Satu Sehat ---
// Buat grup khusus untuk membatasi traffic hit API ke Kemenkes
satuSehatGroup := protected.Group("")
satuSehatGroup.Use(middleware.MemoryRateLimitMiddleware(5.0, 10)) // Max 5 RPS, Burst capacity 10
{
if h.SatuSehatAuth != nil {
h.SatuSehatAuth.RegisterRoutes(satuSehatGroup)
}
if h.SatuSehatPatient != nil {
h.SatuSehatPatient.RegisterRoutes(satuSehatGroup)
}
if h.SatuSehatPractitioner != nil {
h.SatuSehatPractitioner.RegisterRoutes(satuSehatGroup)
}
if h.SatuSehatOrganization != nil {
h.SatuSehatOrganization.RegisterRoutes(satuSehatGroup)
}
if h.SatuSehatLocation != nil {
h.SatuSehatLocation.RegisterRoutes(satuSehatGroup)
}
if h.SatuSehatKFA != nil {
h.SatuSehatKFA.RegisterRoutes(satuSehatGroup)
}
if h.SSAllergyIntolerance != nil {
h.SSAllergyIntolerance.RegisterRoutes(satuSehatGroup)
}
if h.SSCarePlan != nil {
h.SSCarePlan.RegisterRoutes(satuSehatGroup)
}
if h.SSClinicalImpression != nil {
h.SSClinicalImpression.RegisterRoutes(satuSehatGroup)
}
if h.SSComposition != nil {
h.SSComposition.RegisterRoutes(satuSehatGroup)
}
if h.SSCondition != nil {
h.SSCondition.RegisterRoutes(satuSehatGroup)
}
if h.SSDiagnosticReport != nil {
h.SSDiagnosticReport.RegisterRoutes(satuSehatGroup)
}
if h.SSEncounter != nil {
h.SSEncounter.RegisterRoutes(satuSehatGroup)
}
if h.SSEpisodeOfCare != nil {
h.SSEpisodeOfCare.RegisterRoutes(satuSehatGroup)
}
if h.SSImagingStudy != nil {
h.SSImagingStudy.RegisterRoutes(satuSehatGroup)
}
if h.SSImmunization != nil {
h.SSImmunization.RegisterRoutes(satuSehatGroup)
}
if h.SSMedication != nil {
h.SSMedication.RegisterRoutes(satuSehatGroup)
}
if h.SSMedicationDispense != nil {
h.SSMedicationDispense.RegisterRoutes(satuSehatGroup)
}
if h.SSMedicationRequest != nil {
h.SSMedicationRequest.RegisterRoutes(satuSehatGroup)
}
if h.SSMedicationStatement != nil {
h.SSMedicationStatement.RegisterRoutes(satuSehatGroup)
}
if h.SSObservation != nil {
h.SSObservation.RegisterRoutes(satuSehatGroup)
}
if h.SSProcedure != nil {
h.SSProcedure.RegisterRoutes(satuSehatGroup)
}
if h.SSQuestionnaireResponse != nil {
h.SSQuestionnaireResponse.RegisterRoutes(satuSehatGroup)
}
if h.SSServiceRequest != nil {
h.SSServiceRequest.RegisterRoutes(satuSehatGroup)
}
if h.SSSpecimen != nil {
h.SSSpecimen.RegisterRoutes(satuSehatGroup)
}
}
}
}
}
@@ -8,40 +8,9 @@ import (
"gorm.io/gorm"
"service/internal/auth"
antrol "service/internal/bpjs/antrol/reference"
aplicareBed "service/internal/bpjs/aplicare/bed"
apotekDpho "service/internal/bpjs/apotek/reference/dpho"
apotekPoli "service/internal/bpjs/apotek/reference/poli"
peserta "service/internal/bpjs/vclaim/peserta"
sep "service/internal/bpjs/vclaim/sep"
roleMaster "service/internal/master/role/master"
rolePages "service/internal/master/role/pages"
rolePermission "service/internal/master/role/permission"
satuSehatAuth "service/internal/satusehat/reference/auth"
satuSehatKfa "service/internal/satusehat/reference/kfa"
satuSehatLocation "service/internal/satusehat/reference/location"
satuSehatOrganization "service/internal/satusehat/reference/organization"
satuSehatPatient "service/internal/satusehat/reference/patient"
satuSehatPractitioner "service/internal/satusehat/reference/practitioner"
"service/internal/satusehat/usecase/allergyintolerance"
"service/internal/satusehat/usecase/careplan"
clinicalimpression "service/internal/satusehat/usecase/clinicalImpression"
"service/internal/satusehat/usecase/composition"
"service/internal/satusehat/usecase/condition"
"service/internal/satusehat/usecase/diagnosticreport"
"service/internal/satusehat/usecase/encounter"
"service/internal/satusehat/usecase/episodeofcare"
"service/internal/satusehat/usecase/imagingstudy"
"service/internal/satusehat/usecase/immunization"
"service/internal/satusehat/usecase/medication"
"service/internal/satusehat/usecase/medicationdispense"
"service/internal/satusehat/usecase/medicationrequest"
"service/internal/satusehat/usecase/medicationstatement"
"service/internal/satusehat/usecase/observation"
"service/internal/satusehat/usecase/procedure"
"service/internal/satusehat/usecase/questionnaireresponse"
"service/internal/satusehat/usecase/servicerequest"
"service/internal/satusehat/usecase/specimen"
)
// MasterServices menampung kumpulan service untuk domain Master Data
@@ -51,59 +20,6 @@ type MasterServices struct {
RoleMaster roleMaster.Service
}
// VClaimServices menampung kumpulan service untuk integrasi BPJS VClaim
type VClaimServices struct {
Sep sep.Service
Peserta peserta.Service
}
// AntrolServices menampung kumpulan service untuk integrasi BPJS Antrean RS
type AntrolServices struct {
Reference antrol.Service
}
// AplicaresServices menampung kumpulan service untuk integrasi BPJS Aplicares
type AplicaresServices struct {
Bed aplicareBed.Service
}
// ApotekServices menampung kumpulan service untuk integrasi BPJS Apotek
type ApotekServices struct {
DPHO apotekDpho.Service
Poli apotekPoli.Service
}
// SatuSehatServices menampung kumpulan service untuk integrasi Kemenkes Satu Sehat
type SatuSehatServices struct {
Auth satuSehatAuth.Service
Patient satuSehatPatient.Service
Practitioner satuSehatPractitioner.Service
Organization satuSehatOrganization.Service
Location satuSehatLocation.Service
KFA satuSehatKfa.Service
// Usecase Services
AllergyIntolerance allergyintolerance.Service
CarePlan careplan.Service
ClinicalImpression clinicalimpression.Service
Composition composition.Service
Condition condition.Service
DiagnosticReport diagnosticreport.Service
Encounter encounter.Service
EpisodeOfCare episodeofcare.Service
ImagingStudy imagingstudy.Service
Immunization immunization.Service
Medication medication.Service
MedicationDispense medicationdispense.Service
MedicationRequest medicationrequest.Service
MedicationStatement medicationstatement.Service
Observation observation.Service
Procedure procedure.Service
QuestionnaireResponse questionnaireresponse.Service
ServiceRequest servicerequest.Service
Specimen specimen.Service
}
// ServiceRegistry berfungsi sebagai Dependency Injection Container untuk transport HTTP.
// Struktur ini mencegah membengkaknya parameter pada saat inisialisasi API.
type ServiceRegistry struct {
@@ -115,9 +31,4 @@ type ServiceRegistry struct {
// Modul Aplikasi (Pisahkan berdasarkan Bounded Context)
AuthService auth.Service
Master *MasterServices
VClaim *VClaimServices
Antrol *AntrolServices
Aplicare *AplicaresServices
Apotek *ApotekServices
SatuSehat *SatuSehatServices
}
@@ -13,15 +13,9 @@ import (
"service/internal/infrastructure/transport/http/middleware"
"service/internal/infrastructure/transport/http/routes"
antrolHttp "service/internal/infrastructure/transport/http/handlers/bpjs/antrol"
aplicareHttp "service/internal/infrastructure/transport/http/handlers/bpjs/aplicare"
apotekHttp "service/internal/infrastructure/transport/http/handlers/bpjs/apotek"
vclaimHttp "service/internal/infrastructure/transport/http/handlers/bpjs/vclaim"
authHttp "service/internal/infrastructure/transport/http/handlers/main/auth"
healthHttp "service/internal/infrastructure/transport/http/handlers/main/health"
roleHttp "service/internal/infrastructure/transport/http/handlers/main/master/roles"
satuSehatRefHttp "service/internal/infrastructure/transport/http/handlers/satusehat/reference"
satuSehatUsecaseHttp "service/internal/infrastructure/transport/http/handlers/satusehat/usecase"
// Inisialisasi pkg
"service/pkg/errors"
@@ -88,118 +82,6 @@ func NewHTTPServer(
}
}
// Inisialisasi Handlers Modul VClaim
if registry.VClaim != nil {
if registry.VClaim.Sep != nil {
appHandlers.Sep = vclaimHttp.NewSepHandler(registry.VClaim.Sep)
}
if registry.VClaim.Peserta != nil {
appHandlers.Peserta = vclaimHttp.NewPesertaHandler(registry.VClaim.Peserta)
}
}
// Inisialisasi Handlers Modul Antrol
if registry.Antrol != nil {
if registry.Antrol.Reference != nil {
appHandlers.Antrol = antrolHttp.NewAntrolHandler(registry.Antrol.Reference)
}
}
// Inisialisasi Handlers Modul Aplicares
if registry.Aplicare != nil {
if registry.Aplicare.Bed != nil {
appHandlers.AplicareBed = aplicareHttp.NewBedHandler(registry.Aplicare.Bed)
}
}
// Inisialisasi Handlers Modul Apotek
if registry.Apotek != nil {
if registry.Apotek.DPHO != nil && registry.Apotek.Poli != nil {
appHandlers.ApotekReference = apotekHttp.NewReferenceHandler(registry.Apotek.DPHO, registry.Apotek.Poli)
}
}
// Inisialisasi Handlers Modul Satu Sehat
if registry.SatuSehat != nil {
if registry.SatuSehat.Auth != nil {
appHandlers.SatuSehatAuth = satuSehatRefHttp.NewAuthHandler(registry.SatuSehat.Auth)
}
if registry.SatuSehat.Patient != nil {
appHandlers.SatuSehatPatient = satuSehatRefHttp.NewPatientHandler(registry.SatuSehat.Patient)
}
if registry.SatuSehat.Practitioner != nil {
appHandlers.SatuSehatPractitioner = satuSehatRefHttp.NewPractitionerHandler(registry.SatuSehat.Practitioner)
}
if registry.SatuSehat.Organization != nil {
appHandlers.SatuSehatOrganization = satuSehatRefHttp.NewOrganizationHandler(registry.SatuSehat.Organization)
}
if registry.SatuSehat.Location != nil {
appHandlers.SatuSehatLocation = satuSehatRefHttp.NewLocationHandler(registry.SatuSehat.Location)
}
if registry.SatuSehat.KFA != nil {
appHandlers.SatuSehatKFA = satuSehatRefHttp.NewKFAHandler(registry.SatuSehat.KFA)
}
// Inisialisasi Handlers Modul Satu Sehat Usecase
if registry.SatuSehat.AllergyIntolerance != nil {
appHandlers.SSAllergyIntolerance = satuSehatUsecaseHttp.NewAllergyIntoleranceHandler(registry.SatuSehat.AllergyIntolerance)
}
if registry.SatuSehat.CarePlan != nil {
appHandlers.SSCarePlan = satuSehatUsecaseHttp.NewCarePlanHandler(registry.SatuSehat.CarePlan)
}
if registry.SatuSehat.ClinicalImpression != nil {
appHandlers.SSClinicalImpression = satuSehatUsecaseHttp.NewClinicalImpressionHandler(registry.SatuSehat.ClinicalImpression)
}
if registry.SatuSehat.Composition != nil {
appHandlers.SSComposition = satuSehatUsecaseHttp.NewCompositionHandler(registry.SatuSehat.Composition)
}
if registry.SatuSehat.Condition != nil {
appHandlers.SSCondition = satuSehatUsecaseHttp.NewConditionHandler(registry.SatuSehat.Condition)
}
if registry.SatuSehat.DiagnosticReport != nil {
appHandlers.SSDiagnosticReport = satuSehatUsecaseHttp.NewDiagnosticReportHandler(registry.SatuSehat.DiagnosticReport)
}
if registry.SatuSehat.Encounter != nil {
appHandlers.SSEncounter = satuSehatUsecaseHttp.NewEncounterHandler(registry.SatuSehat.Encounter)
}
if registry.SatuSehat.EpisodeOfCare != nil {
appHandlers.SSEpisodeOfCare = satuSehatUsecaseHttp.NewEpisodeOfCareHandler(registry.SatuSehat.EpisodeOfCare)
}
if registry.SatuSehat.ImagingStudy != nil {
appHandlers.SSImagingStudy = satuSehatUsecaseHttp.NewImagingStudyHandler(registry.SatuSehat.ImagingStudy)
}
if registry.SatuSehat.Immunization != nil {
appHandlers.SSImmunization = satuSehatUsecaseHttp.NewImmunizationHandler(registry.SatuSehat.Immunization)
}
if registry.SatuSehat.Medication != nil {
appHandlers.SSMedication = satuSehatUsecaseHttp.NewMedicationHandler(registry.SatuSehat.Medication)
}
if registry.SatuSehat.MedicationDispense != nil {
appHandlers.SSMedicationDispense = satuSehatUsecaseHttp.NewMedicationDispenseHandler(registry.SatuSehat.MedicationDispense)
}
if registry.SatuSehat.MedicationRequest != nil {
appHandlers.SSMedicationRequest = satuSehatUsecaseHttp.NewMedicationRequestHandler(registry.SatuSehat.MedicationRequest)
}
if registry.SatuSehat.MedicationStatement != nil {
appHandlers.SSMedicationStatement = satuSehatUsecaseHttp.NewMedicationStatementHandler(registry.SatuSehat.MedicationStatement)
}
if registry.SatuSehat.Observation != nil {
appHandlers.SSObservation = satuSehatUsecaseHttp.NewObservationHandler(registry.SatuSehat.Observation)
}
if registry.SatuSehat.Procedure != nil {
appHandlers.SSProcedure = satuSehatUsecaseHttp.NewProcedureHandler(registry.SatuSehat.Procedure)
}
if registry.SatuSehat.QuestionnaireResponse != nil {
appHandlers.SSQuestionnaireResponse = satuSehatUsecaseHttp.NewQuestionnaireResponseHandler(registry.SatuSehat.QuestionnaireResponse)
}
if registry.SatuSehat.ServiceRequest != nil {
appHandlers.SSServiceRequest = satuSehatUsecaseHttp.NewServiceRequestHandler(registry.SatuSehat.ServiceRequest)
}
if registry.SatuSehat.Specimen != nil {
appHandlers.SSSpecimen = satuSehatUsecaseHttp.NewSpecimenHandler(registry.SatuSehat.Specimen)
}
}
// Inisialisasi Health Handler dengan dependensi yang benar
// Gunakan constructor baru yang menerima cache manager
healthHandler := healthHttp.NewHealthHandlerWithCache(registry.PrimaryDB, registry.CacheManager, registry.Config, registry.DBManager)