136 lines
3.5 KiB
Go
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
|
|
}()
|
|
}
|