package controllers import ( "net/http" "situkang/dto" "situkang/services" "situkang/utils" "github.com/gin-gonic/gin" ) type WorkerController interface { GetProfile(ctx *gin.Context) UpdateProfile(ctx *gin.Context) UpdateCoverPhoto(ctx *gin.Context) SubmitVerification(ctx *gin.Context) GetVerification(ctx *gin.Context) GetHome(ctx *gin.Context) UpdateAvailability(ctx *gin.Context) ListIncomingOrders(ctx *gin.Context) GetIncomingOrderDetail(ctx *gin.Context) AcceptOrder(ctx *gin.Context) RejectOrder(ctx *gin.Context) ListOrders(ctx *gin.Context) GetOrderDetail(ctx *gin.Context) UpdateOrderStatus(ctx *gin.Context) GenerateInvoice(ctx *gin.Context) AddPurchase(ctx *gin.Context) AIProcessPurchase(ctx *gin.Context) ReceiptScanPurchase(ctx *gin.Context) UpdatePurchase(ctx *gin.Context) DeletePurchase(ctx *gin.Context) SubmitPurchase(ctx *gin.Context) BulkSubmitPurchase(ctx *gin.Context) ClarifyPurchaseResponse(ctx *gin.Context) ListChatMessages(ctx *gin.Context) SendChatMessage(ctx *gin.Context) MarkChatRead(ctx *gin.Context) ListChats(ctx *gin.Context) CreateCustomerRating(ctx *gin.Context) GetCustomerRating(ctx *gin.Context) GetHistory(ctx *gin.Context) GetStatistics(ctx *gin.Context) GetWallet(ctx *gin.Context) ListWalletTransactions(ctx *gin.Context) Withdraw(ctx *gin.Context) UpdateLocation(ctx *gin.Context) } type workerController struct { workerService services.WorkerService } func NewWorkerController(workerService services.WorkerService) WorkerController { return &workerController{workerService: workerService} } func (wc *workerController) GetProfile(ctx *gin.Context) { data, err := wc.workerService.GetProfile(ctx) if err != nil { utils.ResponseFAILED(ctx, nil, err) return } utils.JSONSuccess(ctx, http.StatusOK, "", data, nil) } func (wc *workerController) UpdateProfile(ctx *gin.Context) { req := RequestJSON[dto.WorkerProfileUpdateRequest](ctx) if ctx.IsAborted() { return } data, err := wc.workerService.UpdateProfile(ctx, req) if err != nil { utils.ResponseFAILED(ctx, nil, err) return } utils.JSONSuccess(ctx, http.StatusOK, "Profil worker berhasil diperbarui", data, nil) } func (wc *workerController) UpdateCoverPhoto(ctx *gin.Context) { file, err := ctx.FormFile("cover_photo") if err != nil { utils.JSONError(ctx, http.StatusBadRequest, "VALIDATION_ERROR", "Cover photo is required", nil) return } coverURL, err := utils.SaveUploadedFile(ctx, file, "worker-cover") if err != nil { utils.JSONError(ctx, http.StatusBadRequest, "VALIDATION_ERROR", err.Error(), nil) return } data, err := wc.workerService.UpdateCoverPhoto(ctx, coverURL) if err != nil { utils.ResponseFAILED(ctx, nil, err) return } utils.JSONSuccess(ctx, http.StatusOK, "", data, nil) } func (wc *workerController) SubmitVerification(ctx *gin.Context) { idCard, err := ctx.FormFile("id_card") if err != nil { utils.JSONError(ctx, http.StatusBadRequest, "VALIDATION_ERROR", "id_card is required", nil) return } idCardURL, err := utils.SaveUploadedFile(ctx, idCard, "verification") if err != nil { utils.JSONError(ctx, http.StatusBadRequest, "VALIDATION_ERROR", err.Error(), nil) return } data, err := wc.workerService.SubmitVerification(ctx, idCardURL, nil) if err != nil { utils.ResponseFAILED(ctx, nil, err) return } utils.JSONSuccess(ctx, http.StatusCreated, "Dokumen verifikasi berhasil dikirim", data, nil) } func (wc *workerController) GetVerification(ctx *gin.Context) { data, err := wc.workerService.GetVerification(ctx) if err != nil { utils.ResponseFAILED(ctx, nil, err) return } utils.JSONSuccess(ctx, http.StatusOK, "", data, nil) } func (wc *workerController) GetHome(ctx *gin.Context) { data, err := wc.workerService.GetHome(ctx) if err != nil { utils.ResponseFAILED(ctx, nil, err) return } utils.JSONSuccess(ctx, http.StatusOK, "", data, nil) } func (wc *workerController) UpdateAvailability(ctx *gin.Context) { req := RequestJSON[dto.WorkerAvailabilityRequest](ctx) if ctx.IsAborted() { return } data, err := wc.workerService.UpdateAvailability(ctx, req) if err != nil { utils.ResponseFAILED(ctx, nil, err) return } utils.JSONSuccess(ctx, http.StatusOK, "Status ketersediaan berhasil diperbarui", data, nil) } func (wc *workerController) ListIncomingOrders(ctx *gin.Context) { data, err := wc.workerService.ListIncomingOrders(ctx) if err != nil { utils.ResponseFAILED(ctx, nil, err) return } utils.JSONSuccess(ctx, http.StatusOK, "", data, nil) } func (wc *workerController) GetIncomingOrderDetail(ctx *gin.Context) { orderID := ctx.Param("order_id") data, err := wc.workerService.GetIncomingOrderDetail(ctx, orderID) if err != nil { utils.ResponseFAILED(ctx, nil, err) return } utils.JSONSuccess(ctx, http.StatusOK, "", data, nil) } func (wc *workerController) AcceptOrder(ctx *gin.Context) { orderID := ctx.Param("order_id") req := RequestJSON[dto.WorkerOrderAcceptRequest](ctx) if ctx.IsAborted() { return } data, err := wc.workerService.AcceptOrder(ctx, orderID, req) if err != nil { utils.ResponseFAILED(ctx, nil, err) return } utils.JSONSuccess(ctx, http.StatusOK, "Order berhasil diterima", data, nil) } func (wc *workerController) RejectOrder(ctx *gin.Context) { orderID := ctx.Param("order_id") req := RequestJSON[dto.WorkerOrderRejectRequest](ctx) if ctx.IsAborted() { return } data, err := wc.workerService.RejectOrder(ctx, orderID, req) if err != nil { utils.ResponseFAILED(ctx, nil, err) return } utils.JSONSuccess(ctx, http.StatusOK, "Order ditolak", data, nil) } func (wc *workerController) ListOrders(ctx *gin.Context) { data, err := wc.workerService.ListOrders(ctx) if err != nil { utils.ResponseFAILED(ctx, nil, err) return } utils.JSONSuccess(ctx, http.StatusOK, "", data, map[string]any{ "current_page": 1, "per_page": 10, "total": 0, "total_pages": 0, }) } func (wc *workerController) GetOrderDetail(ctx *gin.Context) { orderID := ctx.Param("order_id") data, err := wc.workerService.GetOrderDetail(ctx, orderID) if err != nil { utils.ResponseFAILED(ctx, nil, err) return } utils.JSONSuccess(ctx, http.StatusOK, "", data, nil) } func (wc *workerController) UpdateOrderStatus(ctx *gin.Context) { orderID := ctx.Param("order_id") req := RequestJSON[dto.WorkerOrderStatusRequest](ctx) if ctx.IsAborted() { return } data, err := wc.workerService.UpdateOrderStatus(ctx, orderID, req) if err != nil { utils.ResponseFAILED(ctx, nil, err) return } utils.JSONSuccess(ctx, http.StatusOK, "Status order berhasil diperbarui", data, nil) } func (wc *workerController) GenerateInvoice(ctx *gin.Context) { orderID := ctx.Param("order_id") req := RequestJSON[dto.WorkerGenerateInvoiceRequest](ctx) if ctx.IsAborted() { return } data, err := wc.workerService.GenerateInvoice(ctx, orderID, req) if err != nil { utils.ResponseFAILED(ctx, nil, err) return } utils.JSONSuccess(ctx, http.StatusCreated, "Invoice berhasil dibuat", data, nil) } func (wc *workerController) AddPurchase(ctx *gin.Context) { orderID := ctx.Param("order_id") req := RequestJSON[dto.WorkerPurchaseCreateRequest](ctx) if ctx.IsAborted() { return } data, err := wc.workerService.AddPurchase(ctx, orderID, req) if err != nil { utils.ResponseFAILED(ctx, nil, err) return } utils.JSONSuccess(ctx, http.StatusCreated, "Pembelian berhasil ditambahkan", data, nil) } func (wc *workerController) AIProcessPurchase(ctx *gin.Context) { orderID := ctx.Param("order_id") req := RequestJSON[dto.WorkerPurchaseAIProcessRequest](ctx) if ctx.IsAborted() { return } data, err := wc.workerService.AIProcessPurchase(ctx, orderID, req) if err != nil { utils.ResponseFAILED(ctx, nil, err) return } utils.JSONSuccess(ctx, http.StatusOK, "Input berhasil diproses oleh AI", data, nil) } func (wc *workerController) ReceiptScanPurchase(ctx *gin.Context) { orderID := ctx.Param("order_id") file, err := ctx.FormFile("receipt_photo") if err != nil { utils.JSONError(ctx, http.StatusBadRequest, "VALIDATION_ERROR", "receipt_photo is required", nil) return } receiptURL, err := utils.SaveUploadedFile(ctx, file, "receipts") if err != nil { utils.JSONError(ctx, http.StatusBadRequest, "VALIDATION_ERROR", err.Error(), nil) return } data, err := wc.workerService.ReceiptScanPurchase(ctx, orderID, receiptURL) if err != nil { utils.ResponseFAILED(ctx, nil, err) return } utils.JSONSuccess(ctx, http.StatusOK, "Nota berhasil dipindai", data, nil) } func (wc *workerController) UpdatePurchase(ctx *gin.Context) { orderID := ctx.Param("order_id") purchaseID := ctx.Param("purchase_id") req := RequestJSON[dto.WorkerPurchaseUpdateRequest](ctx) if ctx.IsAborted() { return } data, err := wc.workerService.UpdatePurchase(ctx, orderID, purchaseID, req) if err != nil { utils.ResponseFAILED(ctx, nil, err) return } utils.JSONSuccess(ctx, http.StatusOK, "Pembelian berhasil diperbarui", data, nil) } func (wc *workerController) DeletePurchase(ctx *gin.Context) { orderID := ctx.Param("order_id") purchaseID := ctx.Param("purchase_id") err := wc.workerService.DeletePurchase(ctx, orderID, purchaseID) if err != nil { utils.ResponseFAILED(ctx, nil, err) return } utils.JSONSuccess(ctx, http.StatusOK, "Pembelian berhasil dihapus", gin.H{}, nil) } func (wc *workerController) SubmitPurchase(ctx *gin.Context) { orderID := ctx.Param("order_id") purchaseID := ctx.Param("purchase_id") data, err := wc.workerService.SubmitPurchase(ctx, orderID, purchaseID) if err != nil { utils.ResponseFAILED(ctx, nil, err) return } utils.JSONSuccess(ctx, http.StatusOK, "Pembelian berhasil dikirim", data, nil) } func (wc *workerController) BulkSubmitPurchase(ctx *gin.Context) { orderID := ctx.Param("order_id") req := RequestJSON[dto.WorkerPurchaseBulkSubmitRequest](ctx) if ctx.IsAborted() { return } data, err := wc.workerService.BulkSubmitPurchase(ctx, orderID, req) if err != nil { utils.ResponseFAILED(ctx, nil, err) return } utils.JSONSuccess(ctx, http.StatusOK, "Pembelian berhasil dikirim", data, nil) } func (wc *workerController) ClarifyPurchaseResponse(ctx *gin.Context) { orderID := ctx.Param("order_id") purchaseID := ctx.Param("purchase_id") req := RequestJSON[dto.WorkerPurchaseClarifyResponseRequest](ctx) if ctx.IsAborted() { return } data, err := wc.workerService.ClarifyPurchaseResponse(ctx, orderID, purchaseID, req) if err != nil { utils.ResponseFAILED(ctx, nil, err) return } utils.JSONSuccess(ctx, http.StatusOK, "Klarifikasi berhasil dikirim", data, nil) } func (wc *workerController) ListChatMessages(ctx *gin.Context) { orderID := ctx.Param("order_id") data, err := wc.workerService.ListChatMessages(ctx, orderID) if err != nil { utils.ResponseFAILED(ctx, nil, err) return } utils.JSONSuccess(ctx, http.StatusOK, "", data, nil) } func (wc *workerController) SendChatMessage(ctx *gin.Context) { orderID := ctx.Param("order_id") req := RequestJSON[dto.ChatSendRequest](ctx) if ctx.IsAborted() { return } data, err := wc.workerService.SendChatMessage(ctx, orderID, req) if err != nil { utils.ResponseFAILED(ctx, nil, err) return } utils.JSONSuccess(ctx, http.StatusCreated, "", data, nil) } func (wc *workerController) MarkChatRead(ctx *gin.Context) { orderID := ctx.Param("order_id") err := wc.workerService.MarkChatRead(ctx, orderID) if err != nil { utils.ResponseFAILED(ctx, nil, err) return } utils.JSONSuccess(ctx, http.StatusOK, "Semua pesan ditandai sudah dibaca", gin.H{}, nil) } func (wc *workerController) ListChats(ctx *gin.Context) { data, err := wc.workerService.ListChats(ctx) if err != nil { utils.ResponseFAILED(ctx, nil, err) return } utils.JSONSuccess(ctx, http.StatusOK, "", data, map[string]any{ "current_page": 1, "per_page": 20, "total": 0, "total_pages": 0, }) } func (wc *workerController) CreateCustomerRating(ctx *gin.Context) { orderID := ctx.Param("order_id") req := RequestJSON[dto.CustomerRatingCreateRequest](ctx) if ctx.IsAborted() { return } data, err := wc.workerService.CreateCustomerRating(ctx, orderID, req) if err != nil { utils.ResponseFAILED(ctx, nil, err) return } utils.JSONSuccess(ctx, http.StatusCreated, "Rating konsumen berhasil dikirim", data, nil) } func (wc *workerController) GetCustomerRating(ctx *gin.Context) { orderID := ctx.Param("order_id") data, err := wc.workerService.GetCustomerRating(ctx, orderID) if err != nil { utils.ResponseFAILED(ctx, nil, err) return } utils.JSONSuccess(ctx, http.StatusOK, "", data, nil) } func (wc *workerController) GetHistory(ctx *gin.Context) { data, err := wc.workerService.GetHistory(ctx) if err != nil { utils.ResponseFAILED(ctx, nil, err) return } utils.JSONSuccess(ctx, http.StatusOK, "", data, map[string]any{ "current_page": 1, "per_page": 10, "total": 0, "total_pages": 0, }) } func (wc *workerController) GetStatistics(ctx *gin.Context) { data, err := wc.workerService.GetStatistics(ctx) if err != nil { utils.ResponseFAILED(ctx, nil, err) return } utils.JSONSuccess(ctx, http.StatusOK, "", data, nil) } func (wc *workerController) GetWallet(ctx *gin.Context) { data, err := wc.workerService.GetWallet(ctx) if err != nil { utils.ResponseFAILED(ctx, nil, err) return } utils.JSONSuccess(ctx, http.StatusOK, "", data, nil) } func (wc *workerController) ListWalletTransactions(ctx *gin.Context) { data, err := wc.workerService.ListWalletTransactions(ctx) if err != nil { utils.ResponseFAILED(ctx, nil, err) return } utils.JSONSuccess(ctx, http.StatusOK, "", data, map[string]any{ "current_page": 1, "per_page": 20, "total": 0, "total_pages": 0, }) } func (wc *workerController) Withdraw(ctx *gin.Context) { req := RequestJSON[dto.WalletWithdrawRequest](ctx) if ctx.IsAborted() { return } data, err := wc.workerService.Withdraw(ctx, req) if err != nil { utils.ResponseFAILED(ctx, nil, err) return } utils.JSONSuccess(ctx, http.StatusCreated, "Permintaan penarikan berhasil dibuat", data, nil) } func (wc *workerController) UpdateLocation(ctx *gin.Context) { req := RequestJSON[dto.WorkerLocationUpdateRequest](ctx) if ctx.IsAborted() { return } data, err := wc.workerService.UpdateLocation(ctx, req) if err != nil { utils.ResponseFAILED(ctx, nil, err) return } utils.JSONSuccess(ctx, http.StatusOK, "", data, nil) }