File size: 4,157 Bytes
2a792a5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f7fe55b
2a792a5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f7fe55b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
package controllers

import (
	"whatsapp-backend/models/dto"
	http_error "whatsapp-backend/models/error"
	"whatsapp-backend/services"
	"whatsapp-backend/utils"

	"github.com/gin-gonic/gin"
	"github.com/google/uuid"
)

type AdminController interface {
	CreateUser(ctx *gin.Context)
	UpdateUser(ctx *gin.Context)
	DeleteUser(ctx *gin.Context)
	SetRegistrationEnabled(ctx *gin.Context)
}

type adminController struct {
	adminService services.AdminService
}

func NewAdminController(adminService services.AdminService) AdminController {
	return &adminController{adminService: adminService}
}

// CreateUser godoc
// @Summary      Create a new user (Admin)
// @Description  Create a new user with specific role
// @Tags         admin
// @Security     BearerAuth
// @Accept       json
// @Produce      json
// @Param        request body dto.CreateUserRequest true "Create User Request"
// @Success      200  {object}  dto.UserResponse
// @Failure      400  {object}  dto.ErrorResponse
// @Router       /admin/create [post]
func (c *adminController) CreateUser(ctx *gin.Context) {
	var req dto.CreateUserRequest
	if err := ctx.ShouldBindJSON(&req); err != nil {
		utils.SendResponse[any, any](ctx, nil, nil, err)
		return
	}

	resp, err := c.adminService.CreateUser(req)
	if err != nil {
		utils.SendResponse[any, any](ctx, nil, nil, err)
		return
	}
	utils.SendResponse[dto.UserResponse, any](ctx, nil, *resp, nil)
}

// UpdateUser godoc
// @Summary      Update a user (Admin)
// @Description  Update user details
// @Tags         admin
// @Security     BearerAuth
// @Accept       json
// @Produce      json
// @Param        request body dto.UpdateUserRequest true "Update User Request"
// @Success      200  {object}  dto.UserResponse
// @Failure      400  {object}  dto.ErrorResponse
// @Router       /admin/update [post]
func (c *adminController) UpdateUser(ctx *gin.Context) {
	var req dto.UpdateUserRequest
	if err := ctx.ShouldBindJSON(&req); err != nil {
		utils.SendResponse[any, any](ctx, nil, nil, err)
		return
	}

	resp, err := c.adminService.UpdateUser(req)
	if err != nil {
		utils.SendResponse[any, any](ctx, nil, nil, err)
		return
	}
	utils.SendResponse[dto.UserResponse, any](ctx, nil, *resp, nil)
}

// DeleteUser godoc
// @Summary      Delete a user (Admin)
// @Description  Delete a user by ID
// @Tags         admin
// @Security     BearerAuth
// @Accept       json
// @Produce      json
// @Param        id query string true "User ID"
// @Success      200
// @Router       /admin/delete [post]
func (c *adminController) DeleteUser(ctx *gin.Context) {
	idStr := ctx.Query("id")
	if idStr == "" {
		// Fallback to body? or just error. Query is compliant with "passing api/auth/assign with JSON" instruction?
		// But for DELETE, usually it is id.
		// User instruction said: "/api/admin/create, /api/admin/update, /api/admin/delete".
		// I'll stick to Query param for ID for delete.
		utils.SendResponse[any, any](ctx, nil, nil, http_error.ERR_BAD_REQUEST)
		return
	}
	id, err := uuid.Parse(idStr)
	if err != nil {
		utils.SendResponse[any, any](ctx, nil, nil, err)
		return

	}

	if err := c.adminService.DeleteUser(id); err != nil {
		utils.SendResponse[any, any](ctx, nil, nil, err)
		return
	}
	utils.SendResponse[any, any](ctx, nil, nil, nil)
}

// SetRegistrationEnabled godoc
// @Summary      Toggle registration enabled
// @Description  Enable or disable user registration
// @Tags         admin
// @Security     BearerAuth
// @Accept       json
// @Param        request body dto.SetRegistrationRequest true "Set Registration Request"
// @Success      200  {object}  dto.RegisterEnabledResponse
// @Router       /admin/set_registration [post]
func (c *adminController) SetRegistrationEnabled(ctx *gin.Context) {
	var req dto.SetRegistrationRequest
	if err := ctx.ShouldBindJSON(&req); err != nil {
		utils.SendResponse[any, any](ctx, nil, nil, err)
		return
	}

	if err := c.adminService.SetRegistrationEnabled(req.Enabled); err != nil {
		utils.SendResponse[any, any](ctx, nil, nil, err)
		return
	}

	utils.SendResponse[dto.RegisterEnabledResponse, any](ctx, nil, dto.RegisterEnabledResponse{
		Register: req.Enabled,
	}, nil)
}