/ api / v1 / users / create.go
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  }