create.go
1 package users 2 3 import ( 4 "context" 5 // "github.com/google/uuid" 6 "github.com/go-playground/validator/v10" 7 "go.uber.org/zap" 8 9 "github.com/gofiber/fiber/v2" 10 // "github.com/mrusme/journalist/ent/user" 11 // "github.com/mrusme/journalist/ent" 12 ) 13 14 type UserCreateResponse struct { 15 Success bool `json:"success"` 16 User *UserShowModel `json:"user"` 17 Message string `json:"message"` 18 } 19 20 // Create godoc 21 // @Summary Create a user 22 // @Description Add a new user 23 // @Tags users 24 // @Accept json 25 // @Produce json 26 // @Param user body UserCreateModel true "Add user" 27 // @Success 200 {object} UserCreateResponse 28 // @Failure 400 {object} UserCreateResponse 29 // @Failure 404 {object} UserCreateResponse 30 // @Failure 500 {object} UserCreateResponse 31 // @Router /users [post] 32 // @security BasicAuth 33 func (h *handler) Create(ctx *fiber.Ctx) error { 34 var err error 35 36 role := ctx.Locals("role").(string) 37 38 if role != "admin" { 39 h.logger.Debug( 40 "User not allowed to create users", 41 zap.Error(err), 42 ) 43 return ctx. 44 Status(fiber.StatusForbidden). 45 JSON(UserCreateResponse{ 46 Success: false, 47 User: nil, 48 Message: "Only admins are allowed to create users", 49 }) 50 } 51 52 createUser := new(UserCreateModel) 53 if err = ctx.BodyParser(createUser); err != nil { 54 h.logger.Debug( 55 "Body parsing failed", 56 zap.Error(err), 57 ) 58 return ctx. 59 Status(fiber.StatusInternalServerError). 60 JSON(UserCreateResponse{ 61 Success: false, 62 User: nil, 63 Message: err.Error(), 64 }) 65 } 66 67 validate := validator.New() 68 if err = validate.Struct(*createUser); err != nil { 69 h.logger.Debug( 70 "Validation failed", 71 zap.Error(err), 72 ) 73 return ctx. 74 Status(fiber.StatusBadRequest). 75 JSON(UserCreateResponse{ 76 Success: false, 77 User: nil, 78 Message: err.Error(), 79 }) 80 } 81 82 dbUser, err := h.entClient.User. 83 Create(). 84 SetUsername(createUser.Username). 85 SetPassword(createUser.Password). 86 SetRole(createUser.Role). 87 Save(context.Background()) 88 89 if err != nil { 90 h.logger.Debug( 91 "Could not create user", 92 zap.Error(err), 93 ) 94 return ctx. 95 Status(fiber.StatusInternalServerError). 96 JSON(UserCreateResponse{ 97 Success: false, 98 User: nil, 99 Message: err.Error(), 100 }) 101 } 102 103 showUser := UserShowModel{ 104 ID: dbUser.ID.String(), 105 Username: dbUser.Username, 106 Role: dbUser.Role, 107 } 108 109 return ctx. 110 Status(fiber.StatusOK). 111 JSON(UserCreateResponse{ 112 Success: true, 113 User: &showUser, 114 Message: "", 115 }) 116 }