150 lines
4.3 KiB
Go
150 lines
4.3 KiB
Go
package handler
|
|
|
|
import (
|
|
"context"
|
|
"rijig/dto"
|
|
"rijig/internal/services"
|
|
"rijig/utils"
|
|
"time"
|
|
|
|
"github.com/gofiber/fiber/v2"
|
|
)
|
|
|
|
type RequestPickupHandler interface {
|
|
CreateRequestPickup(c *fiber.Ctx) error
|
|
SelectCollector(c *fiber.Ctx) error
|
|
GetAssignedPickup(c *fiber.Ctx) error
|
|
ConfirmPickup(c *fiber.Ctx) error
|
|
UpdatePickupStatus(c *fiber.Ctx) error
|
|
UpdatePickupItemActualAmount(c *fiber.Ctx) error
|
|
}
|
|
|
|
type requestPickupHandler struct {
|
|
service services.RequestPickupService
|
|
}
|
|
|
|
func NewRequestPickupHandler(service services.RequestPickupService) RequestPickupHandler {
|
|
return &requestPickupHandler{service: service}
|
|
}
|
|
|
|
func (h *requestPickupHandler) CreateRequestPickup(c *fiber.Ctx) error {
|
|
userID := c.Locals("userID").(string)
|
|
|
|
var req dto.RequestPickupDTO
|
|
if err := c.BodyParser(&req); err != nil {
|
|
return utils.ValidationErrorResponse(c, map[string][]string{
|
|
"body": {"format JSON tidak valid"},
|
|
})
|
|
}
|
|
|
|
if errs, ok := req.Validate(); !ok {
|
|
return utils.ValidationErrorResponse(c, errs)
|
|
}
|
|
|
|
if err := h.service.ConvertCartToRequestPickup(context.Background(), userID, req); err != nil {
|
|
return utils.InternalServerErrorResponse(c, err.Error())
|
|
}
|
|
|
|
return utils.SuccessResponse(c, nil, "Request pickup berhasil dibuat")
|
|
}
|
|
|
|
func (h *requestPickupHandler) SelectCollector(c *fiber.Ctx) error {
|
|
pickupID := c.Params("id")
|
|
if pickupID == "" {
|
|
return utils.ValidationErrorResponse(c, map[string][]string{
|
|
"pickup_id": {"pickup ID harus disertakan"},
|
|
})
|
|
}
|
|
|
|
var req dto.SelectCollectorDTO
|
|
if err := c.BodyParser(&req); err != nil {
|
|
return utils.ValidationErrorResponse(c, map[string][]string{
|
|
"body": {"format JSON tidak valid"},
|
|
})
|
|
}
|
|
|
|
if errs, ok := req.Validate(); !ok {
|
|
return utils.ValidationErrorResponse(c, errs)
|
|
}
|
|
|
|
if err := h.service.AssignCollectorToRequest(context.Background(), pickupID, req); err != nil {
|
|
return utils.InternalServerErrorResponse(c, err.Error())
|
|
}
|
|
|
|
return utils.SuccessResponse(c, nil, "Collector berhasil dipilih untuk pickup")
|
|
}
|
|
|
|
func (h *requestPickupHandler) GetAssignedPickup(c *fiber.Ctx) error {
|
|
collectorID := c.Locals("userID").(string)
|
|
result, err := h.service.FindRequestsAssignedToCollector(context.Background(), collectorID)
|
|
if err != nil {
|
|
return utils.InternalServerErrorResponse(c, err.Error())
|
|
}
|
|
return utils.SuccessResponse(c, result, "Data pickup yang ditugaskan berhasil diambil")
|
|
}
|
|
|
|
func (h *requestPickupHandler) ConfirmPickup(c *fiber.Ctx) error {
|
|
pickupID := c.Params("id")
|
|
if pickupID == "" {
|
|
return utils.ValidationErrorResponse(c, map[string][]string{
|
|
"pickup_id": {"pickup ID wajib diisi"},
|
|
})
|
|
}
|
|
|
|
err := h.service.ConfirmPickupByCollector(context.Background(), pickupID, time.Now())
|
|
if err != nil {
|
|
return utils.InternalServerErrorResponse(c, err.Error())
|
|
}
|
|
return utils.SuccessResponse(c, nil, "Pickup berhasil dikonfirmasi oleh collector")
|
|
}
|
|
|
|
func (h *requestPickupHandler) UpdatePickupStatus(c *fiber.Ctx) error {
|
|
pickupID := c.Params("id")
|
|
if pickupID == "" {
|
|
return utils.ValidationErrorResponse(c, map[string][]string{
|
|
"pickup_id": {"pickup ID tidak boleh kosong"},
|
|
})
|
|
}
|
|
|
|
if err := h.service.UpdatePickupStatusToPickingUp(context.Background(), pickupID); err != nil {
|
|
return utils.InternalServerErrorResponse(c, err.Error())
|
|
}
|
|
|
|
return utils.SuccessResponse(c, nil, "Status pickup berhasil diperbarui menjadi 'collector_are_picking_up'")
|
|
}
|
|
|
|
func (h *requestPickupHandler) UpdatePickupItemActualAmount(c *fiber.Ctx) error {
|
|
pickupID := c.Params("id")
|
|
if pickupID == "" {
|
|
return utils.ValidationErrorResponse(c, map[string][]string{
|
|
"pickup_id": {"pickup ID tidak boleh kosong"},
|
|
})
|
|
}
|
|
|
|
var req dto.UpdatePickupItemsRequest
|
|
if err := c.BodyParser(&req); err != nil {
|
|
return utils.ValidationErrorResponse(c, map[string][]string{
|
|
"body": {"format JSON tidak valid"},
|
|
})
|
|
}
|
|
|
|
if len(req.Items) == 0 {
|
|
return utils.ValidationErrorResponse(c, map[string][]string{
|
|
"items": {"daftar item tidak boleh kosong"},
|
|
})
|
|
}
|
|
|
|
for _, item := range req.Items {
|
|
if item.ItemID == "" || item.Amount <= 0 {
|
|
return utils.ValidationErrorResponse(c, map[string][]string{
|
|
"item": {"item_id harus valid dan amount > 0"},
|
|
})
|
|
}
|
|
}
|
|
|
|
if err := h.service.UpdateActualPickupItems(context.Background(), pickupID, req.Items); err != nil {
|
|
return utils.InternalServerErrorResponse(c, err.Error())
|
|
}
|
|
|
|
return utils.SuccessResponse(c, nil, "Berat aktual dan harga berhasil diperbarui")
|
|
} |