74 lines
1.7 KiB
Go
74 lines
1.7 KiB
Go
package handlers
|
|
|
|
import (
|
|
"backend/src/core/services"
|
|
"backend/src/logger"
|
|
"encoding/json"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
type createUserInput struct {
|
|
Email string `json:"email"`
|
|
Password string `json:"password"`
|
|
Name string `json:"name"`
|
|
}
|
|
|
|
type createUserOutput struct {
|
|
Id string `json:"id"`
|
|
Email string `json:"email"`
|
|
Name string `json:"name"`
|
|
}
|
|
|
|
func NewUserCreateHandler(logger logger.Logger, userService services.UserService) gin.HandlerFunc {
|
|
return func(c *gin.Context) {
|
|
ctxLogger := logger.WithContext(c)
|
|
|
|
params := createUserInput{}
|
|
if err := c.ShouldBindJSON(¶ms); err != nil {
|
|
ctxLogger.Error().Err(err).Msg("bad input body model")
|
|
c.Data(400, "plain/text", []byte(err.Error()))
|
|
return
|
|
}
|
|
|
|
dto, err := userService.CreateUser(
|
|
c,
|
|
services.UserCreateParams{
|
|
Email: params.Email,
|
|
Password: params.Password,
|
|
Name: params.Name,
|
|
},
|
|
)
|
|
if err == services.ErrUserExists {
|
|
ctxLogger.Error().Err(err).Msg("user already exists")
|
|
c.Data(400, "plain/text", []byte(err.Error()))
|
|
return
|
|
}
|
|
if err == services.ErrUserBadPassword {
|
|
ctxLogger.Error().Err(err).Msg("password does not satisfy requirements")
|
|
c.Data(400, "plain/text", []byte(err.Error()))
|
|
return
|
|
}
|
|
if err != nil {
|
|
ctxLogger.Error().Err(err).Msg("unexpected create user error")
|
|
c.Data(500, "plain/text", []byte(err.Error()))
|
|
return
|
|
}
|
|
|
|
resultBody, err := json.Marshal(
|
|
createUserOutput{
|
|
Id: dto.Id,
|
|
Email: dto.Email,
|
|
Name: dto.Name,
|
|
},
|
|
)
|
|
if err != nil {
|
|
ctxLogger.Error().Err(err).Msg("marshal user model error")
|
|
c.Data(500, "plain/text", []byte(err.Error()))
|
|
return
|
|
}
|
|
|
|
c.Data(200, "application/json", resultBody)
|
|
}
|
|
}
|