/ api / v1 / users / list.go
list.go
 1  package users
 2  
 3  import (
 4  	"context"
 5  	// "github.com/google/uuid"
 6  
 7  	"github.com/gofiber/fiber/v2"
 8  	"go.uber.org/zap"
 9  	// "github.com/mrusme/journalist/ent/user"
10  	// "github.com/mrusme/journalist/ent"
11  )
12  
13  type UserListResponse struct {
14  	Success bool             `json:"success"`
15  	Users   *[]UserShowModel `json:"users"`
16  	Message string           `json:"message"`
17  }
18  
19  // List godoc
20  // @Summary      List users
21  // @Description  Get all users
22  // @Tags         users
23  // @Accept       json
24  // @Produce      json
25  // @Success      200  {object}  UserListResponse
26  // @Failure      400  {object}  UserListResponse
27  // @Failure      404  {object}  UserListResponse
28  // @Failure      500  {object}  UserListResponse
29  // @Router       /users [get]
30  // @security     BasicAuth
31  func (h *handler) List(ctx *fiber.Ctx) error {
32  	var err error
33  
34  	role := ctx.Locals("role").(string)
35  
36  	if role != "admin" {
37  		h.logger.Debug(
38  			"User not allowed to list users",
39  			zap.Error(err),
40  		)
41  		return ctx.
42  			Status(fiber.StatusForbidden).
43  			JSON(UserListResponse{
44  				Success: false,
45  				Users:   nil,
46  				Message: "Only admins are allowed to list users",
47  			})
48  	}
49  
50  	dbUsers, err := h.entClient.User.
51  		Query().
52  		All(context.Background())
53  	if err != nil {
54  		return ctx.
55  			Status(fiber.StatusInternalServerError).
56  			JSON(UserListResponse{
57  				Success: false,
58  				Users:   nil,
59  				Message: err.Error(),
60  			})
61  	}
62  
63  	showUsers := make([]UserShowModel, len(dbUsers))
64  
65  	for i, dbUser := range dbUsers {
66  		showUsers[i] = UserShowModel{
67  			ID:       dbUser.ID.String(),
68  			Username: dbUser.Username,
69  			Role:     dbUser.Role,
70  		}
71  	}
72  
73  	return ctx.
74  		Status(fiber.StatusOK).
75  		JSON(UserListResponse{
76  			Success: true,
77  			Users:   &showUsers,
78  			Message: "",
79  		})
80  }