diff --git a/internal/interface/main-handler/main-handler.go b/internal/interface/main-handler/main-handler.go index 91deb4b1..9d0d549f 100644 --- a/internal/interface/main-handler/main-handler.go +++ b/internal/interface/main-handler/main-handler.go @@ -54,7 +54,15 @@ func SetRoutes() http.Handler { // r.HandleFunc("POST /v1/authentication/logout", auth.Logout) hk.Route("POST /v1/authentication/logout", r, auth.GuardMW, auth.Logout) - hc.RegCrud(r, "/v1/user", user.O) + hk.GroupRoutes("/v1/user", r, hk.MapHandlerFunc{ + "GET /": user.O.GetList, + "GET /{id}": user.O.GetDetail, + "POST /": user.O.Create, + "PATCH /{id}": user.O.Update, + "DELETE /{id}": user.O.Delete, + "PATCH /{id}/block": user.O.Block, + "PATCH /{id}/active": user.O.Active, + }) /******************** sources ********************/ hc.RegCrud(r, "/v1/division", division.O) diff --git a/internal/interface/main-handler/user/handler.go b/internal/interface/main-handler/user/handler.go index 99ea784b..a4f49d0d 100644 --- a/internal/interface/main-handler/user/handler.go +++ b/internal/interface/main-handler/user/handler.go @@ -69,3 +69,27 @@ func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) { res, err := u.Delete(dto) rw.DataResponse(w, res, err) } + +func (obj myBase) Block(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.Block(dto) + rw.DataResponse(w, res, err) +} + +func (obj myBase) Active(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.Active(dto) + rw.DataResponse(w, res, err) +} diff --git a/internal/use-case/main-use-case/user/case.go b/internal/use-case/main-use-case/user/case.go index 63d59d0f..fd252bac 100644 --- a/internal/use-case/main-use-case/user/case.go +++ b/internal/use-case/main-use-case/user/case.go @@ -1,16 +1,18 @@ package user import ( - e "simrs-vx/internal/domain/main-entities/user" "strconv" - dg "github.com/karincake/apem/db-gorm-pg" - d "github.com/karincake/dodol" + "gorm.io/gorm" + + e "simrs-vx/internal/domain/main-entities/user" + erc "simrs-vx/internal/domain/references/common" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" - "gorm.io/gorm" + dg "github.com/karincake/apem/db-gorm-pg" + d "github.com/karincake/dodol" ) const source = "user" @@ -273,3 +275,95 @@ func Delete(input e.DeleteDto) (*d.Data, error) { }, nil } + +func Block(input e.ReadDetailDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.User + var err error + + event := pl.Event{ + Feature: "Block", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "update") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + if data != nil { + pl.SetLogInfo(&event, rdDto, "started", "DBUpdate") + data.Status_Code = erc.SCBlocked + if err := tx.Save(&data).Error; err != nil { + return err + } + } + + pl.SetLogInfo(&event, nil, "complete") + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "updated", + }, + Data: data.ToResponse(), + }, nil + +} + +func Active(input e.ReadDetailDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.User + var err error + + event := pl.Event{ + Feature: "Active", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "update") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + if data != nil { + pl.SetLogInfo(&event, rdDto, "started", "DBUpdate") + data.Status_Code = erc.SCActive + if err := tx.Save(&data).Error; err != nil { + return err + } + } + + pl.SetLogInfo(&event, nil, "complete") + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "updated", + }, + Data: data.ToResponse(), + }, nil + +}