179 lines
5.6 KiB
Go
179 lines
5.6 KiB
Go
package handlers
|
|
|
|
import (
|
|
"log/slog"
|
|
"strconv"
|
|
|
|
"github.com/SamuelTariku/FortuneBet-Backend/internal/domain"
|
|
"github.com/SamuelTariku/FortuneBet-Backend/internal/services/user"
|
|
"github.com/SamuelTariku/FortuneBet-Backend/internal/web_server/response"
|
|
customvalidator "github.com/SamuelTariku/FortuneBet-Backend/internal/web_server/validator"
|
|
"github.com/gofiber/fiber/v2"
|
|
)
|
|
|
|
type CreateCashierReq struct {
|
|
FirstName string `json:"first_name" example:"John"`
|
|
LastName string `json:"last_name" example:"Doe"`
|
|
Email string `json:"email" example:"john.doe@example.com"`
|
|
PhoneNumber string `json:"phone_number" example:"1234567890"`
|
|
Password string `json:"password" example:"password123"`
|
|
}
|
|
|
|
// CreateCashier godoc
|
|
// @Summary Create cashier
|
|
// @Description Create cashier
|
|
// @Tags cashier
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param cashier body CreateCashierReq true "Create cashier"
|
|
// @Success 200 {object} response.APIResponse
|
|
// @Failure 400 {object} response.APIResponse
|
|
// @Failure 401 {object} response.APIResponse
|
|
// @Failure 500 {object} response.APIResponse
|
|
// @Router /cashiers [post]
|
|
func CreateCashier(logger *slog.Logger, userSvc *user.Service, validator *customvalidator.CustomValidator) fiber.Handler {
|
|
return func(c *fiber.Ctx) error {
|
|
|
|
creatorBranch := c.Locals("branch_id").(int64)
|
|
var req CreateCashierReq
|
|
if err := c.BodyParser(&req); err != nil {
|
|
logger.Error("RegisterUser failed", "error", err)
|
|
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
|
|
"error": "Invalid request",
|
|
})
|
|
}
|
|
valErrs, ok := validator.Validate(c, req)
|
|
if !ok {
|
|
response.WriteJSON(c, fiber.StatusBadRequest, "Invalid request", valErrs, nil)
|
|
return nil
|
|
}
|
|
user := domain.CreateUserReq{
|
|
FirstName: req.FirstName,
|
|
LastName: req.LastName,
|
|
Email: req.Email,
|
|
PhoneNumber: req.PhoneNumber,
|
|
Password: req.Password,
|
|
Role: string(domain.RoleCashier),
|
|
BranchID: creatorBranch,
|
|
}
|
|
_, err := userSvc.CreateUser(c.Context(), user)
|
|
if err != nil {
|
|
logger.Error("CreateCashier failed", "error", err)
|
|
response.WriteJSON(c, fiber.StatusInternalServerError, "Failed to create cashier", nil, nil)
|
|
return nil
|
|
}
|
|
response.WriteJSON(c, fiber.StatusOK, "Cashier created successfully", nil, nil)
|
|
return nil
|
|
}
|
|
|
|
}
|
|
|
|
// GetAllCashiers godoc
|
|
// @Summary Get all cashiers
|
|
// @Description Get all cashiers
|
|
// @Tags cashier
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param page query int false "Page number"
|
|
// @Param page_size query int false "Page size"
|
|
// @Success 200 {object} response.APIResponse
|
|
// @Failure 400 {object} response.APIResponse
|
|
// @Failure 401 {object} response.APIResponse
|
|
// @Failure 500 {object} response.APIResponse
|
|
// @Router /cashiers [get]
|
|
func GetAllCashiers(logger *slog.Logger, userSvc *user.Service, validator *customvalidator.CustomValidator) fiber.Handler {
|
|
return func(c *fiber.Ctx) error {
|
|
branchId := int64(12) //c.Locals("branch_id").(int64)
|
|
filter := user.Filter{
|
|
Role: string(domain.RoleCashier),
|
|
BranchId: user.ValidBranchId{
|
|
Value: branchId,
|
|
Valid: true,
|
|
},
|
|
Page: c.QueryInt("page", 1),
|
|
PageSize: c.QueryInt("page_size", 10),
|
|
}
|
|
valErrs, ok := validator.Validate(c, filter)
|
|
if !ok {
|
|
response.WriteJSON(c, fiber.StatusBadRequest, "Invalid request", valErrs, nil)
|
|
return nil
|
|
}
|
|
cashiers, err := userSvc.GetAllUsers(c.Context(), filter)
|
|
if err != nil {
|
|
logger.Error("GetAllCashiers failed", "error", err)
|
|
response.WriteJSON(c, fiber.StatusInternalServerError, "Failed to get cashiers", nil, nil)
|
|
return nil
|
|
}
|
|
response.WriteJSON(c, fiber.StatusOK, "Cashiers retrieved successfully", cashiers, nil)
|
|
return nil
|
|
}
|
|
|
|
}
|
|
|
|
type updateUserReq struct {
|
|
FirstName string `json:"first_name" example:"John"`
|
|
LastName string `json:"last_name" example:"Doe"`
|
|
Suspended bool `json:"suspended" example:"false"`
|
|
}
|
|
|
|
// UpdateCashier godoc
|
|
// @Summary Update cashier
|
|
// @Description Update cashier
|
|
// @Tags cashier
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param cashier body updateUserReq true "Update cashier"
|
|
// @Success 200 {object} response.APIResponse
|
|
// @Failure 400 {object} response.APIResponse
|
|
// @Failure 401 {object} response.APIResponse
|
|
// @Failure 500 {object} response.APIResponse
|
|
// @Router /cashiers/{id} [put]
|
|
func UpdateCashier(logger *slog.Logger, userSvc *user.Service, validator *customvalidator.CustomValidator) fiber.Handler {
|
|
return func(c *fiber.Ctx) error {
|
|
var req updateUserReq
|
|
if err := c.BodyParser(&req); err != nil {
|
|
logger.Error("UpdateCashier failed", "error", err)
|
|
response.WriteJSON(c, fiber.StatusBadRequest, "Invalid request", nil, nil)
|
|
return nil
|
|
}
|
|
|
|
valErrs, ok := validator.Validate(c, req)
|
|
|
|
if !ok {
|
|
response.WriteJSON(c, fiber.StatusBadRequest, "Invalid request", valErrs, nil)
|
|
return nil
|
|
}
|
|
cashierIdStr := c.Params("id")
|
|
cashierId, err := strconv.ParseInt(cashierIdStr, 10, 64)
|
|
if err != nil {
|
|
logger.Error("UpdateCashier failed", "error", err)
|
|
response.WriteJSON(c, fiber.StatusBadRequest, "Invalid cashier ID", nil, nil)
|
|
return nil
|
|
}
|
|
err = userSvc.UpdateUser(c.Context(), domain.UpdateUserReq{
|
|
UserId: cashierId,
|
|
FirstName: domain.ValidString{
|
|
Value: req.FirstName,
|
|
Valid: req.FirstName != "",
|
|
},
|
|
LastName: domain.ValidString{
|
|
Value: req.LastName,
|
|
Valid: req.LastName != "",
|
|
},
|
|
Suspended: domain.ValidBool{
|
|
Value: req.Suspended,
|
|
Valid: true,
|
|
},
|
|
},
|
|
)
|
|
if err != nil {
|
|
logger.Error("UpdateCashier failed", "error", err)
|
|
response.WriteJSON(c, fiber.StatusInternalServerError, "Failed to update cashier", nil, nil)
|
|
return nil
|
|
}
|
|
response.WriteJSON(c, fiber.StatusOK, "Cashier updated successfully", nil, nil)
|
|
return nil
|
|
}
|
|
|
|
}
|