Files
simrsx-be/internal/use-case/main-use-case/user/helper.go
T
2025-08-21 16:24:48 +07:00

136 lines
3.5 KiB
Go

/*
DESCRIPTION:
Any functions that are used internally by the use-case
*/
package user
import (
"fmt"
e "simrs-vx/internal/domain/main-entities/user"
pl "simrs-vx/pkg/logger"
p "simrs-vx/pkg/password"
"gorm.io/gorm"
)
func setCreate(src e.CreateDto, dst *e.User) error {
pass, err := p.Hash(src.Password)
if err != nil {
return err
}
dst.Name = src.Name
dst.Password = pass
dst.Status_Code = src.Status_Code
return nil
}
func setUpdate(src e.UpdateDto, dst *e.User) error {
dst.Name = src.Name
dst.Status_Code = src.Status_Code
return nil
}
// executeCreateMiddleware executes create middleware (pre or post)
func executeCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.User, tx *gorm.DB, event *pl.Event, mwType string) error {
for i := range middlewares {
mwName := fmt.Sprintf("%s[%d]", mwType, i)
pl.SetLogInfo(event, data, "started", mwName)
if err := middlewares[i](input, data, tx); err != nil {
event.Status = "failed"
event.ErrInfo = pl.ErrorInfo{
Code: getMiddlewareErrorCode(mwType),
Detail: fmt.Sprintf("%s middleware %s failed", getMiddlewareTypeLabel(mwType), mwName),
Raw: err,
}
return pl.SetLogError(*event, data)
}
pl.SetLogInfo(event, nil, "complete")
}
return nil
}
// executeReadListMiddleware executes read list middleware (pre or post)
func executeReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.User, tx *gorm.DB, event *pl.Event, mwType string) error {
for i := range middlewares {
mwName := fmt.Sprintf("%s[%d]", mwType, i)
pl.SetLogInfo(event, input, "started", mwName)
if err := middlewares[i](input, data, tx); err != nil {
event.Status = "failed"
event.ErrInfo = pl.ErrorInfo{
Code: getMiddlewareErrorCode(mwType),
Detail: fmt.Sprintf("%s middleware %s failed", getMiddlewareTypeLabel(mwType), mwName),
Raw: err,
}
return pl.SetLogError(*event, input)
}
pl.SetLogInfo(event, nil, "complete")
}
return nil
}
// executeReadDetailMiddleware executes read detail middleware (pre or post)
func executeReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.User, tx *gorm.DB, event *pl.Event, mwType string) error {
for i := range middlewares {
mwName := fmt.Sprintf("%s[%d]", mwType, i)
// Use data for logging if available, otherwise use input
logData := interface{}(input)
if data != nil {
logData = data
}
pl.SetLogInfo(event, logData, "started", mwName)
if err := middlewares[i](input, data, tx); err != nil {
event.Status = "failed"
event.ErrInfo = pl.ErrorInfo{
Code: getMiddlewareErrorCode(mwType),
Detail: fmt.Sprintf("%s middleware %s failed", getMiddlewareTypeLabel(mwType), mwName),
Raw: err,
}
return pl.SetLogError(*event, logData)
}
pl.SetLogInfo(event, nil, "complete")
}
return nil
}
// Helper functions to determine error codes and labels based on middleware type
func getMiddlewareErrorCode(mwType string) string {
if containsString(mwType, "Pre") {
return "MW_PRE_FAILED"
}
return "MW_POST_FAILED"
}
func getMiddlewareTypeLabel(mwType string) string {
if containsString(mwType, "Pre") {
return "Pre"
}
return "Post"
}
func containsString(str, substr string) bool {
return len(str) >= len(substr) && str[len(str)-len(substr):] != substr &&
(len(str) == len(substr) || str[len(str)-len(substr)-1:len(str)-len(substr)] != substr) &&
func() bool {
for i := 0; i <= len(str)-len(substr); i++ {
if str[i:i+len(substr)] == substr {
return true
}
}
return false
}()
}