Merge branch 'feat/sync-setting' into feat/sync-from-simgos-161

This commit is contained in:
poetrasapoetra
2025-11-28 17:33:47 +07:00
61 changed files with 1607 additions and 1303 deletions
@@ -9,12 +9,13 @@ import (
sp "github.com/karincake/semprit"
sr "github.com/karincake/serabi"
is "simrs-vx/internal/infra/sync-consumer-cfg"
pa "simrs-vx/internal/lib/auth"
m "simrs-vx/internal/domain/main-entities/user"
mf "simrs-vx/internal/domain/main-entities/user-fes"
pa "simrs-vx/internal/lib/auth"
s "simrs-vx/internal/use-case/main-use-case/authentication"
esga "simrs-vx/internal/domain/sync-entities/authentication"
s "simrs-vx/internal/use-case/main-use-case/authentication"
)
func Login(w http.ResponseWriter, r *http.Request) {
@@ -68,6 +69,10 @@ func Logout(w http.ResponseWriter, r *http.Request) {
}
func GuardMW(next http.Handler) http.Handler {
var (
accessDetail *pa.AuthInfo
err error
)
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// Check if it's from sync
credential := esga.CredentialDto{}
@@ -75,23 +80,26 @@ func GuardMW(next http.Handler) http.Handler {
credential.SecretKey = r.Header.Get("X-Sync-SecretKey")
credential.UserName = r.Header.Get("X-Sync-UserName")
if credential.Source != "" || credential.SecretKey != "" || credential.UserName != "" {
// TODO: ngecall fungsi untuk dapat dari DB menlengkapi authinfo
accessDetail, err := s.GetAuthInfoByUserName(credential.UserName)
// validate secretKey and source
if credential.SecretKey != is.O.SecretKey || credential.Source != is.O.OldSource {
rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": "invalid consumer credential"}, nil)
return
}
accessDetail, err = s.GetAuthInfoByUserName(credential.UserName)
if err != nil {
rw.WriteJSON(w, http.StatusUnauthorized, err.(d.FieldError), nil)
return
}
} else {
// Normal flow goes here
accessDetail, err = s.ExtractToken(r, s.AccessToken)
if err != nil {
rw.WriteJSON(w, http.StatusUnauthorized, err.(d.FieldError), nil)
return
}
ctx := context.WithValue(r.Context(), pa.AuthKey{}, accessDetail)
next.ServeHTTP(w, r.WithContext(ctx))
return
}
// Normal flow goes here
accessDetail, err := s.ExtractToken(r, s.AccessToken)
if err != nil {
rw.WriteJSON(w, http.StatusUnauthorized, err.(d.FieldError), nil)
return
}
ctx := context.WithValue(r.Context(), pa.AuthKey{}, accessDetail)
next.ServeHTTP(w, r.WithContext(ctx))
})
@@ -64,7 +64,7 @@ func (obj myBase) GetDetail(w http.ResponseWriter, r *http.Request) {
}
dto := e.ReadDetailDto{}
sf.UrlQueryParam(&dto, *r.URL)
dto.Id = uint16(id)
dto.Id = uint(id)
res, err := u.ReadDetail(dto)
rw.DataResponse(w, res, err)
}
@@ -84,7 +84,7 @@ func (obj myBase) Update(w http.ResponseWriter, r *http.Request) {
if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res {
return
}
dto.Id = uint16(id)
dto.Id = uint(id)
dto.AuthInfo = *authInfo
res, err := u.Update(dto)
@@ -103,7 +103,7 @@ func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) {
}
dto := e.DeleteDto{}
dto.Id = uint16(id)
dto.Id = uint(id)
dto.AuthInfo = *authInfo
res, err := u.Delete(dto)
@@ -174,9 +174,15 @@ func (obj myBase) Process(w http.ResponseWriter, r *http.Request) {
return
}
authInfo, err := pa.GetAuthInfo(r)
if err != nil {
rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": err.Error()}, nil)
}
dto := e.UpdateStatusDto{
Id: uint16(id),
Id: uint(id),
StatusCode: erc.DSCProcess,
AuthInfo: *authInfo,
}
res, err := u.UpdateStatusCode(dto)
@@ -195,11 +201,11 @@ func (obj myBase) Cancel(w http.ResponseWriter, r *http.Request) {
}
dto := e.UpdateStatusDto{
Id: uint16(id),
Id: uint(id),
StatusCode: erc.DSCCancel,
AuthInfo: *authInfo,
}
dto.AuthInfo = *authInfo
res, err := u.UpdateStatusCode(dto)
rw.DataResponse(w, res, err)
}
@@ -211,7 +217,7 @@ func (obj myBase) Reject(w http.ResponseWriter, r *http.Request) {
}
dto := e.UpdateStatusDto{
Id: uint16(id),
Id: uint(id),
StatusCode: erc.DSCRejected,
}
@@ -226,7 +232,7 @@ func (obj myBase) Skip(w http.ResponseWriter, r *http.Request) {
}
dto := e.UpdateStatusDto{
Id: uint16(id),
Id: uint(id),
StatusCode: erc.DSCSkipped,
}
@@ -250,13 +256,19 @@ func (obj myBase) RequestSwitchUnit(w http.ResponseWriter, r *http.Request) {
return
}
authInfo, err := pa.GetAuthInfo(r)
if err != nil {
rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": err.Error()}, nil)
}
dto.AuthInfo = *authInfo
dto.Id = uint(id)
res, err := u.RequestSwitchUnit(dto)
rw.DataResponse(w, res, err)
}
func (obj myBase) ApproveSwitchUnit(w http.ResponseWriter, r *http.Request) {
dto := e.ApproveUnitDto{}
dto := e.ApproveCancelUnitDto{}
id := rw.ValidateInt(w, "id", r.PathValue("id"))
if id <= 0 {
return
@@ -266,7 +278,37 @@ func (obj myBase) ApproveSwitchUnit(w http.ResponseWriter, r *http.Request) {
return
}
authInfo, err := pa.GetAuthInfo(r)
if err != nil {
rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": err.Error()}, nil)
}
dto.AuthInfo = *authInfo
dto.Id = uint(id)
res, err := u.ApproveSwitchUnit(dto)
rw.DataResponse(w, res, err)
}
func (obj myBase) CancelSwitchUnit(w http.ResponseWriter, r *http.Request) {
dto := e.ApproveCancelUnitDto{}
id := rw.ValidateInt(w, "id", r.PathValue("id"))
if id <= 0 {
return
}
if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res {
return
}
authInfo, err := pa.GetAuthInfo(r)
if err != nil {
rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": err.Error()}, nil)
}
dto.AuthInfo = *authInfo
dto.Id = uint(id)
res, err := u.CancelSwitchUnit(dto)
rw.DataResponse(w, res, err)
}
@@ -59,6 +59,22 @@ func validateRequestCheckIn(w http.ResponseWriter, i e.CheckinDto) (valid bool)
}
func validateRequestSwitchUnit(w http.ResponseWriter, i e.SwitchUnitDto) (valid bool) {
// validate poly-switch-code
if i.PolySwitchCode == nil {
rw.DataResponse(w, nil, d.FieldError{
Code: dataValidationFail,
Message: fmt.Sprintf("polySwitchCode required"),
})
return
}
if *i.PolySwitchCode != ere.PSCConsulPoly && *i.PolySwitchCode != ere.PSCConsulExecutive {
rw.DataResponse(w, nil, d.FieldError{
Code: dataValidationFail,
Message: "invalid PolySwitchCode",
})
}
if i.InternalReferences == nil {
rw.DataResponse(w, nil, d.FieldError{
Code: dataValidationFail,
@@ -39,7 +39,7 @@ func (obj myBase) GetDetail(w http.ResponseWriter, r *http.Request) {
dto := eir.ReadDetailDto{}
sf.UrlQueryParam(&dto, *r.URL)
dto.Id = uint16(id)
dto.Id = uint(id)
res, err := uir.ReadDetail(dto)
rw.DataResponse(w, res, err)
}
@@ -54,7 +54,7 @@ func (obj myBase) Update(w http.ResponseWriter, r *http.Request) {
if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res {
return
}
dto.Id = uint16(id)
dto.Id = uint(id)
res, err := uir.Update(dto)
rw.DataResponse(w, res, err)
}
@@ -66,7 +66,7 @@ func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) {
}
dto := eir.DeleteDto{}
dto.Id = uint16(id)
dto.Id = uint(id)
res, err := uir.Delete(dto)
rw.DataResponse(w, res, err)
}
@@ -175,6 +175,7 @@ func SetRoutes() http.Handler {
"PATCH /{id}/skip": encounter.O.Skip,
"PATCH /{id}/req-switch-unit": encounter.O.RequestSwitchUnit,
"PATCH /{id}/approve-switch-unit": encounter.O.ApproveSwitchUnit,
"PATCH /{id}/cancel-switch-unit": encounter.O.CancelSwitchUnit,
})
hk.GroupRoutes("/v1/mcu-order", r, auth.GuardMW, hk.MapHandlerFunc{
"GET /": mcuorder.O.GetList,
@@ -5,6 +5,7 @@ import (
division "simrs-vx/internal/domain/sync-entities/division"
encounter "simrs-vx/internal/domain/sync-entities/encounter"
installation "simrs-vx/internal/domain/sync-entities/installation"
internalreference "simrs-vx/internal/domain/sync-entities/internal-reference"
patient "simrs-vx/internal/domain/sync-entities/patient"
specialist "simrs-vx/internal/domain/sync-entities/specialist"
subspecialist "simrs-vx/internal/domain/sync-entities/subspecialist"
@@ -34,5 +35,8 @@ func getSyncEntities() []any {
&encounter.EncounterLink{},
&encounter.EncounterSimxLog{},
&encounter.EncounterSimgosLog{},
&internalreference.InternalReferenceLink{},
&internalreference.InternalReferenceSimxLog{},
&internalreference.InternalReferenceSimgosLog{},
}
}
@@ -51,7 +51,7 @@ func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) {
}
dto := e.DeleteDto{}
dto.Id = uint16(id)
dto.Id = uint(id)
res, err := u.Delete(dto)
rw.DataResponse(w, res, err)
@@ -77,12 +77,42 @@ func (obj myBase) Checkout(w http.ResponseWriter, r *http.Request) {
rw.DataResponse(w, res, err)
}
func (obj myBase) Cancel(w http.ResponseWriter, r *http.Request) {
func (obj myBase) UpdateStatus(w http.ResponseWriter, r *http.Request) {
dto := e.Encounter{}
if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res {
return
}
res, err := u.Cancel(dto)
res, err := u.UpdateStatus(dto)
rw.DataResponse(w, res, err)
}
func (obj myBase) RequestSwitchUnit(w http.ResponseWriter, r *http.Request) {
dto := e.Encounter{}
if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res {
return
}
res, err := u.RequestSwitchUnit(dto)
rw.DataResponse(w, res, err)
}
func (obj myBase) ApproveSwitchUnit(w http.ResponseWriter, r *http.Request) {
dto := e.ApproveCancelUnitDto{}
if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res {
return
}
res, err := u.ApproveSwitchUnit(dto)
rw.DataResponse(w, res, err)
}
func (obj myBase) CancelSwitchUnit(w http.ResponseWriter, r *http.Request) {
dto := e.ApproveCancelUnitDto{}
if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res {
return
}
res, err := u.CancelSwitchUnit(dto)
rw.DataResponse(w, res, err)
}
@@ -62,13 +62,16 @@ func SetRoutes() http.Handler {
"POST /nomr": patient.O.GenerateNomr,
})
hk.GroupRoutes(prefixnew+"/v1/encounter", r, hk.MapHandlerFunc{
"POST /": encounter.O.Create,
"POST /log": encounter.O.CreateLog,
"PATCH /{id}": encounter.O.Update,
"DELETE /{id}": encounter.O.Delete,
"PATCH /{id}/checkin": encounter.O.Checkin,
"PATCH /{id}/checkout": encounter.O.Checkout,
"PATCH /{id}/cancel": encounter.O.Cancel,
"POST /": encounter.O.Create,
"POST /log": encounter.O.CreateLog,
"PATCH /{id}": encounter.O.Update,
"DELETE /{id}": encounter.O.Delete,
"PATCH /{id}/checkin": encounter.O.Checkin,
"PATCH /{id}/checkout": encounter.O.Checkout,
"PATCH /{id}/update-status": encounter.O.UpdateStatus,
"PATCH /{id}/req-switch-unit": encounter.O.RequestSwitchUnit,
"PATCH /{id}/approve-switch-unit": encounter.O.ApproveSwitchUnit,
"PATCH /{id}/cancel-switch-unit": encounter.O.CancelSwitchUnit,
})
/******************** SvcToNew ******************/