package handlers import ( "log/slog" "strconv" "time" "github.com/SamuelTariku/FortuneBet-Backend/internal/domain" "github.com/SamuelTariku/FortuneBet-Backend/internal/services/branch" "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"` BranchID int64 `json:"branch_id" example:"1"` } // 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, branchSvc *branch.Service, validator *customvalidator.CustomValidator) fiber.Handler { return func(c *fiber.Ctx) error { 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 } userRequest := domain.CreateUserReq{ FirstName: req.FirstName, LastName: req.LastName, Email: req.Email, PhoneNumber: req.PhoneNumber, Password: req.Password, Role: string(domain.RoleCashier), } newUser, err := userSvc.CreateUser(c.Context(), userRequest) if err != nil { logger.Error("CreateCashier failed", "error", err) response.WriteJSON(c, fiber.StatusInternalServerError, "Failed to create cashier", nil, nil) return nil } err = branchSvc.CreateBranchCashier(c.Context(), req.BranchID, newUser.ID) 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 } } type GetCashierRes struct { ID int64 `json:"id"` FirstName string `json:"first_name"` LastName string `json:"last_name"` Email string `json:"email"` PhoneNumber string `json:"phone_number"` Role domain.Role `json:"role"` EmailVerified bool `json:"email_verified"` PhoneVerified bool `json:"phone_verified"` CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` SuspendedAt time.Time `json:"suspended_at"` Suspended bool `json:"suspended"` } // 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.GetAllCashiers(c.Context()) if err != nil { logger.Error("GetAllCashiers failed", "error", err) response.WriteJSON(c, fiber.StatusInternalServerError, "Failed to get cashiers", nil, nil) return nil } var result []GetCashierRes for _, cashier := range cashiers { result = append(result, GetCashierRes{ ID: cashier.ID, FirstName: cashier.FirstName, LastName: cashier.LastName, Email: cashier.Email, PhoneNumber: cashier.PhoneNumber, Role: cashier.Role, EmailVerified: cashier.EmailVerified, PhoneVerified: cashier.PhoneVerified, CreatedAt: cashier.CreatedAt, UpdatedAt: cashier.UpdatedAt, SuspendedAt: cashier.SuspendedAt, Suspended: cashier.Suspended, }) } response.WriteJSON(c, fiber.StatusOK, "Cashiers retrieved successfully", result, 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 } }