2025-07-18 20:10:29 +07:00
package handler
import (
"strconv"
"apskel-pos-be/internal/appcontext"
"apskel-pos-be/internal/constants"
"apskel-pos-be/internal/contract"
"apskel-pos-be/internal/logger"
"apskel-pos-be/internal/service"
"apskel-pos-be/internal/util"
"apskel-pos-be/internal/validator"
"github.com/gin-gonic/gin"
"github.com/google/uuid"
)
type PaymentMethodHandler struct {
paymentMethodService service . PaymentMethodService
paymentMethodValidator validator . PaymentMethodValidator
}
func NewPaymentMethodHandler (
paymentMethodService service . PaymentMethodService ,
paymentMethodValidator validator . PaymentMethodValidator ,
) * PaymentMethodHandler {
return & PaymentMethodHandler {
paymentMethodService : paymentMethodService ,
paymentMethodValidator : paymentMethodValidator ,
}
}
func ( h * PaymentMethodHandler ) CreatePaymentMethod ( c * gin . Context ) {
ctx := c . Request . Context ( )
contextInfo := appcontext . FromGinContext ( ctx )
var req contract . CreatePaymentMethodRequest
if err := c . ShouldBindJSON ( & req ) ; err != nil {
logger . FromContext ( c . Request . Context ( ) ) . WithError ( err ) . Error ( "PaymentMethodHandler::CreatePaymentMethod -> request binding failed" )
validationResponseError := contract . NewResponseError ( constants . MissingFieldErrorCode , constants . RequestEntity , err . Error ( ) )
util . HandleResponse ( c . Writer , c . Request , contract . BuildErrorResponse ( [ ] * contract . ResponseError { validationResponseError } ) , "PaymentMethodHandler::CreatePaymentMethod" )
return
}
validationError , validationErrorCode := h . paymentMethodValidator . ValidateCreatePaymentMethodRequest ( & req )
if validationError != nil {
validationResponseError := contract . NewResponseError ( validationErrorCode , constants . RequestEntity , validationError . Error ( ) )
util . HandleResponse ( c . Writer , c . Request , contract . BuildErrorResponse ( [ ] * contract . ResponseError { validationResponseError } ) , "PaymentMethodHandler::CreatePaymentMethod" )
return
}
2025-08-03 23:55:51 +07:00
req . OrganizationID = contextInfo . OrganizationID
req . OutletID = contextInfo . OutletID
2025-07-18 20:10:29 +07:00
paymentMethodResponse := h . paymentMethodService . CreatePaymentMethod ( ctx , contextInfo , & req )
if paymentMethodResponse . HasErrors ( ) {
errorResp := paymentMethodResponse . GetErrors ( ) [ 0 ]
logger . FromContext ( ctx ) . WithError ( errorResp ) . Error ( "PaymentMethodHandler::CreatePaymentMethod -> Failed to create payment method from service" )
}
util . HandleResponse ( c . Writer , c . Request , paymentMethodResponse , "PaymentMethodHandler::CreatePaymentMethod" )
}
func ( h * PaymentMethodHandler ) GetPaymentMethod ( c * gin . Context ) {
ctx := c . Request . Context ( )
paymentMethodIDStr := c . Param ( "id" )
paymentMethodID , err := uuid . Parse ( paymentMethodIDStr )
if err != nil {
logger . FromContext ( ctx ) . WithError ( err ) . Error ( "PaymentMethodHandler::GetPaymentMethod -> Invalid payment method ID" )
validationResponseError := contract . NewResponseError ( constants . MalformedFieldErrorCode , constants . RequestEntity , "Invalid payment method ID" )
util . HandleResponse ( c . Writer , c . Request , contract . BuildErrorResponse ( [ ] * contract . ResponseError { validationResponseError } ) , "PaymentMethodHandler::GetPaymentMethod" )
return
}
paymentMethodResponse := h . paymentMethodService . GetPaymentMethodByID ( ctx , paymentMethodID )
if paymentMethodResponse . HasErrors ( ) {
errorResp := paymentMethodResponse . GetErrors ( ) [ 0 ]
logger . FromContext ( ctx ) . WithError ( errorResp ) . Error ( "PaymentMethodHandler::GetPaymentMethod -> Failed to get payment method from service" )
}
util . HandleResponse ( c . Writer , c . Request , paymentMethodResponse , "PaymentMethodHandler::GetPaymentMethod" )
}
func ( h * PaymentMethodHandler ) ListPaymentMethods ( c * gin . Context ) {
ctx := c . Request . Context ( )
req := & contract . ListPaymentMethodsRequest {
Page : 1 ,
Limit : 10 ,
}
// Parse query parameters
if pageStr := c . Query ( "page" ) ; pageStr != "" {
if page , err := strconv . Atoi ( pageStr ) ; err == nil {
req . Page = page
}
}
if limitStr := c . Query ( "limit" ) ; limitStr != "" {
if limit , err := strconv . Atoi ( limitStr ) ; err == nil {
req . Limit = limit
}
}
if search := c . Query ( "search" ) ; search != "" {
req . Search = search
}
if paymentMethodType := c . Query ( "type" ) ; paymentMethodType != "" {
req . Type = & paymentMethodType
}
if organizationIDStr := c . Query ( "organization_id" ) ; organizationIDStr != "" {
if organizationID , err := uuid . Parse ( organizationIDStr ) ; err == nil {
req . OrganizationID = & organizationID
}
}
if isActiveStr := c . Query ( "is_active" ) ; isActiveStr != "" {
if isActive , err := strconv . ParseBool ( isActiveStr ) ; err == nil {
req . IsActive = & isActive
}
}
validationError , validationErrorCode := h . paymentMethodValidator . ValidateListPaymentMethodsRequest ( req )
if validationError != nil {
logger . FromContext ( ctx ) . WithError ( validationError ) . Error ( "PaymentMethodHandler::ListPaymentMethods -> request validation failed" )
validationResponseError := contract . NewResponseError ( validationErrorCode , constants . RequestEntity , validationError . Error ( ) )
util . HandleResponse ( c . Writer , c . Request , contract . BuildErrorResponse ( [ ] * contract . ResponseError { validationResponseError } ) , "PaymentMethodHandler::ListPaymentMethods" )
return
}
paymentMethodsResponse := h . paymentMethodService . ListPaymentMethods ( ctx , req )
if paymentMethodsResponse . HasErrors ( ) {
errorResp := paymentMethodsResponse . GetErrors ( ) [ 0 ]
logger . FromContext ( ctx ) . WithError ( errorResp ) . Error ( "PaymentMethodHandler::ListPaymentMethods -> Failed to list payment methods from service" )
}
util . HandleResponse ( c . Writer , c . Request , paymentMethodsResponse , "PaymentMethodHandler::ListPaymentMethods" )
}
func ( h * PaymentMethodHandler ) UpdatePaymentMethod ( c * gin . Context ) {
ctx := c . Request . Context ( )
paymentMethodIDStr := c . Param ( "id" )
paymentMethodID , err := uuid . Parse ( paymentMethodIDStr )
if err != nil {
logger . FromContext ( ctx ) . WithError ( err ) . Error ( "PaymentMethodHandler::UpdatePaymentMethod -> Invalid payment method ID" )
validationResponseError := contract . NewResponseError ( constants . MalformedFieldErrorCode , constants . RequestEntity , "Invalid payment method ID" )
util . HandleResponse ( c . Writer , c . Request , contract . BuildErrorResponse ( [ ] * contract . ResponseError { validationResponseError } ) , "PaymentMethodHandler::UpdatePaymentMethod" )
return
}
var req contract . UpdatePaymentMethodRequest
if err := c . ShouldBindJSON ( & req ) ; err != nil {
logger . FromContext ( ctx ) . WithError ( err ) . Error ( "PaymentMethodHandler::UpdatePaymentMethod -> request binding failed" )
validationResponseError := contract . NewResponseError ( constants . MissingFieldErrorCode , constants . RequestEntity , "Invalid request body" )
util . HandleResponse ( c . Writer , c . Request , contract . BuildErrorResponse ( [ ] * contract . ResponseError { validationResponseError } ) , "PaymentMethodHandler::UpdatePaymentMethod" )
return
}
validationError , validationErrorCode := h . paymentMethodValidator . ValidateUpdatePaymentMethodRequest ( & req )
if validationError != nil {
validationResponseError := contract . NewResponseError ( validationErrorCode , constants . RequestEntity , validationError . Error ( ) )
util . HandleResponse ( c . Writer , c . Request , contract . BuildErrorResponse ( [ ] * contract . ResponseError { validationResponseError } ) , "PaymentMethodHandler::UpdatePaymentMethod" )
return
}
paymentMethodResponse := h . paymentMethodService . UpdatePaymentMethod ( ctx , paymentMethodID , & req )
if paymentMethodResponse . HasErrors ( ) {
errorResp := paymentMethodResponse . GetErrors ( ) [ 0 ]
logger . FromContext ( ctx ) . WithError ( errorResp ) . Error ( "PaymentMethodHandler::UpdatePaymentMethod -> Failed to update payment method from service" )
}
util . HandleResponse ( c . Writer , c . Request , paymentMethodResponse , "PaymentMethodHandler::UpdatePaymentMethod" )
}
func ( h * PaymentMethodHandler ) DeletePaymentMethod ( c * gin . Context ) {
ctx := c . Request . Context ( )
paymentMethodIDStr := c . Param ( "id" )
paymentMethodID , err := uuid . Parse ( paymentMethodIDStr )
if err != nil {
logger . FromContext ( ctx ) . WithError ( err ) . Error ( "PaymentMethodHandler::DeletePaymentMethod -> Invalid payment method ID" )
validationResponseError := contract . NewResponseError ( constants . MalformedFieldErrorCode , constants . RequestEntity , "Invalid payment method ID" )
util . HandleResponse ( c . Writer , c . Request , contract . BuildErrorResponse ( [ ] * contract . ResponseError { validationResponseError } ) , "PaymentMethodHandler::DeletePaymentMethod" )
return
}
paymentMethodResponse := h . paymentMethodService . DeletePaymentMethod ( ctx , paymentMethodID )
if paymentMethodResponse . HasErrors ( ) {
errorResp := paymentMethodResponse . GetErrors ( ) [ 0 ]
logger . FromContext ( ctx ) . WithError ( errorResp ) . Error ( "PaymentMethodHandler::DeletePaymentMethod -> Failed to delete payment method from service" )
}
util . HandleResponse ( c . Writer , c . Request , paymentMethodResponse , "PaymentMethodHandler::DeletePaymentMethod" )
}
func ( h * PaymentMethodHandler ) GetActivePaymentMethodsByOrganization ( c * gin . Context ) {
ctx := c . Request . Context ( )
organizationIDStr := c . Param ( "organization_id" )
organizationID , err := uuid . Parse ( organizationIDStr )
if err != nil {
logger . FromContext ( ctx ) . WithError ( err ) . Error ( "PaymentMethodHandler::GetActivePaymentMethodsByOrganization -> Invalid organization ID" )
validationResponseError := contract . NewResponseError ( constants . MalformedFieldErrorCode , constants . RequestEntity , "Invalid organization ID" )
util . HandleResponse ( c . Writer , c . Request , contract . BuildErrorResponse ( [ ] * contract . ResponseError { validationResponseError } ) , "PaymentMethodHandler::GetActivePaymentMethodsByOrganization" )
return
}
paymentMethodsResponse := h . paymentMethodService . GetActivePaymentMethodsByOrganization ( ctx , organizationID )
if paymentMethodsResponse . HasErrors ( ) {
errorResp := paymentMethodsResponse . GetErrors ( ) [ 0 ]
logger . FromContext ( ctx ) . WithError ( errorResp ) . Error ( "PaymentMethodHandler::GetActivePaymentMethodsByOrganization -> Failed to get active payment methods from service" )
}
util . HandleResponse ( c . Writer , c . Request , paymentMethodsResponse , "PaymentMethodHandler::GetActivePaymentMethodsByOrganization" )
}