almost done, not tested yet

This commit is contained in:
dpurbosakti
2025-10-14 16:39:28 +07:00
parent d3f441dd56
commit 3e4ce7d1bf
15 changed files with 221 additions and 48 deletions
+4 -1
View File
@@ -63,4 +63,7 @@ bpjsCfg:
corsCfg:
allowedOrigins:
- http://example.com
allowedMethod:
allowedMethod:
bpjsCfg:
baseUrl:
@@ -5,9 +5,9 @@ import (
)
type CreateDto struct {
RequestPayload *string `json:"requestPayload"`
ResponseBody *string `json:"responseBody"`
Message *string `json:"message"`
RequestPayload string `json:"requestPayload"`
ResponseBody string `json:"responseBody"`
Message string `json:"message"`
}
type ReadListDto struct {
@@ -25,7 +25,8 @@ type FilterDto struct {
}
type ReadDetailDto struct {
Id uint `json:"id"`
Id uint `json:"id"`
Number *string `json:"number"`
}
type UpdateDto struct {
@@ -34,7 +35,8 @@ type UpdateDto struct {
}
type DeleteDto struct {
Id uint `json:"id"`
Id uint `json:"id"`
Number *string `json:"number"`
}
type MetaDto struct {
@@ -65,3 +67,7 @@ func ToResponseList(data []VclaimSep) []ResponseDto {
}
return resp
}
func (c CreateDto) IsMessageSuccess() bool {
return c.VclaimSepHist.Message == "Sukses"
}
+9
View File
@@ -0,0 +1,9 @@
package bpjs
import (
a "github.com/karincake/apem"
)
func SetConfig() {
a.ParseSingleCfg(&O)
}
+7
View File
@@ -0,0 +1,7 @@
package bpjs
var O BpjsCfg = BpjsCfg{}
type BpjsCfg struct {
BaseUrl string `yaml:"baseUrl"`
}
@@ -4,22 +4,24 @@ import (
"net/http"
/******************** main / transaction ********************/
vclaimsep "simrs-vx/internal/interface/bpjs-handler/vclaim-sep"
vclaimsephist "simrs-vx/internal/interface/bpjs-handler/vclaim-sep-hist"
vclaimsepprint "simrs-vx/internal/interface/bpjs-handler/vclaim-sep-print"
/******************** actor ********************/
/******************** external ********************/
a "github.com/karincake/apem"
hk "github.com/karincake/hongkue"
/******************** infra ********************/
ibpjs "simrs-vx/internal/infra/bpjs"
gs "simrs-vx/internal/infra/gorm-setting"
minio "simrs-vx/internal/infra/minio"
ssdb "simrs-vx/internal/infra/ss-db"
/******************** pkg ********************/
cmw "simrs-vx/pkg/cors-manager-mw"
lh "simrs-vx/pkg/lang-helper"
handlerlogger "simrs-vx/pkg/middleware/handler-logger"
mh "simrs-vx/pkg/minio-helper"
zlc "simrs-vx/pkg/zerolog-ctx"
/******************** sources ********************/
@@ -33,10 +35,8 @@ func SetRoutes() http.Handler {
/////
a.RegisterExtCall(gs.Adjust)
a.RegisterExtCall(zlc.Adjust)
a.RegisterExtCall(ssdb.SetInstance)
a.RegisterExtCall(lh.Populate)
a.RegisterExtCall(minio.Connect)
a.RegisterExtCall(mh.I.SetClient)
a.RegisterExtCall(ibpjs.SetConfig)
a.RegisterExtCall(validation.RegisterValidation)
r := http.NewServeMux()
@@ -44,6 +44,20 @@ func SetRoutes() http.Handler {
/******************** Main ********************/
r.HandleFunc("/", home.Home)
hk.GroupRoutes("/v1/vclaim-sep", r, hk.MapHandlerFunc{
"POST /": vclaimsep.O.Create,
"PATCH /{id}": vclaimsep.O.Update,
"DELETE /{id}": vclaimsep.O.Delete,
})
hk.GroupRoutes("/v1/vclaim-sep-hist", r, hk.MapHandlerFunc{
"GET /": vclaimsephist.O.GetList,
})
hk.GroupRoutes("/v1/vclaim-sep-print", r, hk.MapHandlerFunc{
"POST /": vclaimsepprint.O.Create,
})
/******************** actor ********************/
/******************** sources ********************/
@@ -0,0 +1,22 @@
package vclaimsephist
import (
"net/http"
e "simrs-vx/internal/domain/bpjs-entities/vclaim-sep-hist"
u "simrs-vx/internal/use-case/bpjs-use-case/vclaim-sep-hist"
rw "github.com/karincake/risoles"
sf "github.com/karincake/semprit"
)
type myBase struct{}
var O myBase
func (obj myBase) GetList(w http.ResponseWriter, r *http.Request) {
dto := e.ReadListDto{}
sf.UrlQueryParam(&dto, *r.URL)
res, err := u.ReadList(dto)
rw.DataResponse(w, res, err)
}
@@ -0,0 +1,23 @@
package vclaimsepprint
import (
"net/http"
e "simrs-vx/internal/domain/bpjs-entities/vclaim-sep-print"
u "simrs-vx/internal/use-case/bpjs-use-case/vclaim-sep-print"
rw "github.com/karincake/risoles"
)
type myBase struct{}
var O myBase
func (obj myBase) Create(w http.ResponseWriter, r *http.Request) {
dto := e.CreateDto{}
if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res {
return
}
res, err := u.Create(dto)
rw.DataResponse(w, res, err)
}
@@ -5,7 +5,6 @@ import (
"net/http"
rw "github.com/karincake/risoles"
sf "github.com/karincake/semprit"
e "simrs-vx/internal/domain/bpjs-entities/vclaim-sep"
u "simrs-vx/internal/use-case/bpjs-use-case/vclaim-sep"
@@ -29,27 +28,27 @@ func (obj myBase) Create(w http.ResponseWriter, r *http.Request) {
rw.DataResponse(w, res, err)
}
func (obj myBase) GetList(w http.ResponseWriter, r *http.Request) {
dto := e.ReadListDto{}
sf.UrlQueryParam(&dto, *r.URL)
res, err := u.ReadList(dto)
rw.DataResponse(w, res, err)
}
// func (obj myBase) GetList(w http.ResponseWriter, r *http.Request) {
// dto := e.ReadListDto{}
// sf.UrlQueryParam(&dto, *r.URL)
// res, err := u.ReadList(dto)
// rw.DataResponse(w, res, err)
// }
func (obj myBase) GetDetail(w http.ResponseWriter, r *http.Request) {
id := rw.ValidateInt(w, "id", r.PathValue("id"))
if id <= 0 {
return
}
dto := e.ReadDetailDto{}
dto.Id = uint(id)
res, err := u.ReadDetail(dto)
rw.DataResponse(w, res, err)
}
// func (obj myBase) GetDetail(w http.ResponseWriter, r *http.Request) {
// id := rw.ValidateInt(w, "id", r.PathValue("id"))
// if id <= 0 {
// return
// }
// dto := e.ReadDetailDto{}
// dto.Id = uint(id)
// res, err := u.ReadDetail(dto)
// rw.DataResponse(w, res, err)
// }
func (obj myBase) Update(w http.ResponseWriter, r *http.Request) {
id := rw.ValidateInt(w, "id", r.PathValue("id"))
if id <= 0 {
number := rw.ValidateString(w, "number", r.PathValue("number"))
if number <= "" {
return
}
@@ -57,19 +56,18 @@ func (obj myBase) Update(w http.ResponseWriter, r *http.Request) {
if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res {
return
}
dto.Id = uint(id)
dto.Number = &number
res, err := u.Update(dto)
rw.DataResponse(w, res, err)
}
func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) {
id := rw.ValidateInt(w, "id", r.PathValue("id"))
if id <= 0 {
number := rw.ValidateString(w, "number", r.PathValue("number"))
if number <= "" {
return
}
dto := e.DeleteDto{}
dto.Id = uint(id)
dto.Number = &number
res, err := u.Delete(dto)
rw.DataResponse(w, res, err)
}
@@ -1 +1,58 @@
package vclaimsep
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
e "simrs-vx/internal/domain/bpjs-entities/vclaim-sep"
ibpjs "simrs-vx/internal/infra/bpjs"
"gorm.io/gorm"
)
func CreateSep(input *e.CreateDto, data *e.VclaimSep, tx *gorm.DB) error {
req, err := http.NewRequest("POST", ibpjs.O.BaseUrl+"/sep", bytes.NewReader(input.RequestPayload))
if err != nil {
return err
}
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
return err
}
var vresp vclaimResponse
if err := json.Unmarshal(body, &vresp); err != nil {
return fmt.Errorf("failed to parse response JSON: %w", err)
}
msg := vresp.MetaData.Message
if err := json.Unmarshal(body, data); err != nil {
return fmt.Errorf("failed to unmarshal into VclaimSep: %w", err)
}
// Save request/response details in DTO for further use
input.VclaimSepHist.RequestPayload = string(input.RequestPayload)
input.VclaimSepHist.ResponseBody = string(body)
input.VclaimSepHist.Message = msg
input.Number = func() *string {
number := ""
if vresp.Response != nil && vresp.Response.Sep != nil {
number = vresp.Response.Sep.NoSep
}
return &number
}()
return nil
}
@@ -0,0 +1,12 @@
package vclaimsep
type vclaimResponse struct {
MetaData struct {
Message string `json:"message"`
} `json:"metaData"`
Response *struct {
Sep *struct {
NoSep string `json:"noSep"`
} `json:"sep"`
} `json:"response"`
}
@@ -17,7 +17,7 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.VclaimSepHist) {
inputSrc = &inputTemp.CreateDto
}
data.RequestPayload = inputSrc.RequestPayload
data.ResponseBody = inputSrc.ResponseBody
data.Message = inputSrc.Message
data.RequestPayload = &inputSrc.RequestPayload
data.ResponseBody = &inputSrc.ResponseBody
data.Message = &inputSrc.Message
}
@@ -4,6 +4,9 @@ import (
"strconv"
e "simrs-vx/internal/domain/bpjs-entities/vclaim-sep"
// evsh "simrs-vx/internal/domain/bpjs-entities/vclaim-sep-hist"
uvsh "simrs-vx/internal/use-case/bpjs-use-case/vclaim-sep-hist"
dg "github.com/karincake/apem/db-gorm-pg"
d "github.com/karincake/dodol"
@@ -35,6 +38,14 @@ func Create(input e.CreateDto) (*d.Data, error) {
return err
}
if _, err := uvsh.CreateData(input.VclaimSepHist, &event, tx); err != nil {
return err
}
if !input.IsMessageSuccess() {
return nil
}
if resData, err := CreateData(input, &event, tx); err != nil {
return err
} else {
@@ -167,7 +178,7 @@ func ReadDetail(input e.ReadDetailDto) (*d.Data, error) {
}
func Update(input e.UpdateDto) (*d.Data, error) {
rdDto := e.ReadDetailDto{Id: input.Id}
rdDto := e.ReadDetailDto{Number: input.Number}
var data *e.VclaimSep
var err error
@@ -223,7 +234,7 @@ func Update(input e.UpdateDto) (*d.Data, error) {
}
func Delete(input e.DeleteDto) (*d.Data, error) {
rdDto := e.ReadDetailDto{Id: input.Id}
rdDto := e.ReadDetailDto{Number: input.Number}
var data *e.VclaimSep
var err error
@@ -81,7 +81,14 @@ func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e
tx = dg.I
}
if err := tx.First(&data, input.Id).Error; err != nil {
if input.Number != nil {
tx = tx.Where("\"Number\" = ?", *input.Number)
}
if input.Id != 0 {
tx = tx.Where("\"Id\" = ?", input.Id)
}
if err := tx.First(&data).Error; err != nil {
if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil {
return nil, processedErr
}
@@ -1,9 +1,13 @@
package vclaimsep
import (
pvs "simrs-vx/internal/use-case/bpjs-plugin/vclaim-sep"
)
// example of middleware
// func init() {
// createPreMw = append(createPreMw,
// CreateMw{Name: "modif-input", Func: pm.ModifInput},
// CreateMw{Name: "check-data", Func: pm.CheckData},
// )
// }
func init() {
createPreMw = append(createPreMw,
createMw{Name: "create-sep", Func: pvs.CreateSep},
)
}