2025-09-12 01:12:11 +07:00
package handler
import (
"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"
"strconv"
"github.com/gin-gonic/gin"
"github.com/google/uuid"
)
type IngredientUnitConverterHandler struct {
converterService service . IngredientUnitConverterService
converterValidator validator . IngredientUnitConverterValidator
}
func NewIngredientUnitConverterHandler (
converterService service . IngredientUnitConverterService ,
converterValidator validator . IngredientUnitConverterValidator ,
) * IngredientUnitConverterHandler {
return & IngredientUnitConverterHandler {
converterService : converterService ,
converterValidator : converterValidator ,
}
}
func ( h * IngredientUnitConverterHandler ) CreateIngredientUnitConverter ( c * gin . Context ) {
ctx := c . Request . Context ( )
contextInfo := appcontext . FromGinContext ( ctx )
var req contract . CreateIngredientUnitConverterRequest
if err := c . ShouldBindJSON ( & req ) ; err != nil {
logger . FromContext ( c . Request . Context ( ) ) . WithError ( err ) . Error ( "IngredientUnitConverterHandler::CreateIngredientUnitConverter -> request binding failed" )
validationResponseError := contract . NewResponseError ( constants . MissingFieldErrorCode , constants . RequestEntity , err . Error ( ) )
util . HandleResponse ( c . Writer , c . Request , contract . BuildErrorResponse ( [ ] * contract . ResponseError { validationResponseError } ) , "IngredientUnitConverterHandler::CreateIngredientUnitConverter" )
return
}
validationError , validationErrorCode := h . converterValidator . ValidateCreateIngredientUnitConverterRequest ( & req )
if validationError != nil {
validationResponseError := contract . NewResponseError ( validationErrorCode , constants . RequestEntity , validationError . Error ( ) )
util . HandleResponse ( c . Writer , c . Request , contract . BuildErrorResponse ( [ ] * contract . ResponseError { validationResponseError } ) , "IngredientUnitConverterHandler::CreateIngredientUnitConverter" )
return
}
converterResponse := h . converterService . CreateIngredientUnitConverter ( ctx , contextInfo , & req )
if converterResponse . HasErrors ( ) {
errorResp := converterResponse . GetErrors ( ) [ 0 ]
logger . FromContext ( ctx ) . WithError ( errorResp ) . Error ( "IngredientUnitConverterHandler::CreateIngredientUnitConverter -> Failed to create ingredient unit converter from service" )
}
util . HandleResponse ( c . Writer , c . Request , converterResponse , "IngredientUnitConverterHandler::CreateIngredientUnitConverter" )
}
func ( h * IngredientUnitConverterHandler ) UpdateIngredientUnitConverter ( c * gin . Context ) {
ctx := c . Request . Context ( )
contextInfo := appcontext . FromGinContext ( ctx )
converterIDStr := c . Param ( "id" )
converterID , err := uuid . Parse ( converterIDStr )
if err != nil {
logger . FromContext ( ctx ) . WithError ( err ) . Error ( "IngredientUnitConverterHandler::UpdateIngredientUnitConverter -> Invalid converter ID" )
validationResponseError := contract . NewResponseError ( constants . MalformedFieldErrorCode , constants . RequestEntity , "Invalid converter ID" )
util . HandleResponse ( c . Writer , c . Request , contract . BuildErrorResponse ( [ ] * contract . ResponseError { validationResponseError } ) , "IngredientUnitConverterHandler::UpdateIngredientUnitConverter" )
return
}
var req contract . UpdateIngredientUnitConverterRequest
if err := c . ShouldBindJSON ( & req ) ; err != nil {
logger . FromContext ( ctx ) . WithError ( err ) . Error ( "IngredientUnitConverterHandler::UpdateIngredientUnitConverter -> request binding failed" )
validationResponseError := contract . NewResponseError ( constants . MissingFieldErrorCode , constants . RequestEntity , "Invalid request body" )
util . HandleResponse ( c . Writer , c . Request , contract . BuildErrorResponse ( [ ] * contract . ResponseError { validationResponseError } ) , "IngredientUnitConverterHandler::UpdateIngredientUnitConverter" )
return
}
validationError , validationErrorCode := h . converterValidator . ValidateUpdateIngredientUnitConverterRequest ( & req )
if validationError != nil {
validationResponseError := contract . NewResponseError ( validationErrorCode , constants . RequestEntity , validationError . Error ( ) )
util . HandleResponse ( c . Writer , c . Request , contract . BuildErrorResponse ( [ ] * contract . ResponseError { validationResponseError } ) , "IngredientUnitConverterHandler::UpdateIngredientUnitConverter" )
return
}
converterResponse := h . converterService . UpdateIngredientUnitConverter ( ctx , contextInfo , converterID , & req )
if converterResponse . HasErrors ( ) {
errorResp := converterResponse . GetErrors ( ) [ 0 ]
logger . FromContext ( ctx ) . WithError ( errorResp ) . Error ( "IngredientUnitConverterHandler::UpdateIngredientUnitConverter -> Failed to update ingredient unit converter from service" )
}
util . HandleResponse ( c . Writer , c . Request , converterResponse , "IngredientUnitConverterHandler::UpdateIngredientUnitConverter" )
}
func ( h * IngredientUnitConverterHandler ) DeleteIngredientUnitConverter ( c * gin . Context ) {
ctx := c . Request . Context ( )
contextInfo := appcontext . FromGinContext ( ctx )
converterIDStr := c . Param ( "id" )
converterID , err := uuid . Parse ( converterIDStr )
if err != nil {
logger . FromContext ( ctx ) . WithError ( err ) . Error ( "IngredientUnitConverterHandler::DeleteIngredientUnitConverter -> Invalid converter ID" )
validationResponseError := contract . NewResponseError ( constants . MalformedFieldErrorCode , constants . RequestEntity , "Invalid converter ID" )
util . HandleResponse ( c . Writer , c . Request , contract . BuildErrorResponse ( [ ] * contract . ResponseError { validationResponseError } ) , "IngredientUnitConverterHandler::DeleteIngredientUnitConverter" )
return
}
converterResponse := h . converterService . DeleteIngredientUnitConverter ( ctx , contextInfo , converterID )
if converterResponse . HasErrors ( ) {
errorResp := converterResponse . GetErrors ( ) [ 0 ]
logger . FromContext ( ctx ) . WithError ( errorResp ) . Error ( "IngredientUnitConverterHandler::DeleteIngredientUnitConverter -> Failed to delete ingredient unit converter from service" )
}
util . HandleResponse ( c . Writer , c . Request , converterResponse , "IngredientUnitConverterHandler::DeleteIngredientUnitConverter" )
}
func ( h * IngredientUnitConverterHandler ) GetIngredientUnitConverter ( c * gin . Context ) {
ctx := c . Request . Context ( )
contextInfo := appcontext . FromGinContext ( ctx )
converterIDStr := c . Param ( "id" )
converterID , err := uuid . Parse ( converterIDStr )
if err != nil {
logger . FromContext ( ctx ) . WithError ( err ) . Error ( "IngredientUnitConverterHandler::GetIngredientUnitConverter -> Invalid converter ID" )
validationResponseError := contract . NewResponseError ( constants . MalformedFieldErrorCode , constants . RequestEntity , "Invalid converter ID" )
util . HandleResponse ( c . Writer , c . Request , contract . BuildErrorResponse ( [ ] * contract . ResponseError { validationResponseError } ) , "IngredientUnitConverterHandler::GetIngredientUnitConverter" )
return
}
converterResponse := h . converterService . GetIngredientUnitConverter ( ctx , contextInfo , converterID )
if converterResponse . HasErrors ( ) {
errorResp := converterResponse . GetErrors ( ) [ 0 ]
logger . FromContext ( ctx ) . WithError ( errorResp ) . Error ( "IngredientUnitConverterHandler::GetIngredientUnitConverter -> Failed to get ingredient unit converter from service" )
}
util . HandleResponse ( c . Writer , c . Request , converterResponse , "IngredientUnitConverterHandler::GetIngredientUnitConverter" )
}
func ( h * IngredientUnitConverterHandler ) ListIngredientUnitConverters ( c * gin . Context ) {
ctx := c . Request . Context ( )
contextInfo := appcontext . FromGinContext ( ctx )
req := & contract . ListIngredientUnitConvertersRequest {
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 ingredientIDStr := c . Query ( "ingredient_id" ) ; ingredientIDStr != "" {
if ingredientID , err := uuid . Parse ( ingredientIDStr ) ; err == nil {
req . IngredientID = & ingredientID
}
}
if fromUnitIDStr := c . Query ( "from_unit_id" ) ; fromUnitIDStr != "" {
if fromUnitID , err := uuid . Parse ( fromUnitIDStr ) ; err == nil {
req . FromUnitID = & fromUnitID
}
}
if toUnitIDStr := c . Query ( "to_unit_id" ) ; toUnitIDStr != "" {
if toUnitID , err := uuid . Parse ( toUnitIDStr ) ; err == nil {
req . ToUnitID = & toUnitID
}
}
if isActiveStr := c . Query ( "is_active" ) ; isActiveStr != "" {
if isActive , err := strconv . ParseBool ( isActiveStr ) ; err == nil {
req . IsActive = & isActive
}
}
validationError , validationErrorCode := h . converterValidator . ValidateListIngredientUnitConvertersRequest ( req )
if validationError != nil {
validationResponseError := contract . NewResponseError ( validationErrorCode , constants . RequestEntity , validationError . Error ( ) )
util . HandleResponse ( c . Writer , c . Request , contract . BuildErrorResponse ( [ ] * contract . ResponseError { validationResponseError } ) , "IngredientUnitConverterHandler::ListIngredientUnitConverters" )
return
}
converterResponse := h . converterService . ListIngredientUnitConverters ( ctx , contextInfo , req )
if converterResponse . HasErrors ( ) {
errorResp := converterResponse . GetErrors ( ) [ 0 ]
logger . FromContext ( ctx ) . WithError ( errorResp ) . Error ( "IngredientUnitConverterHandler::ListIngredientUnitConverters -> Failed to list ingredient unit converters from service" )
}
util . HandleResponse ( c . Writer , c . Request , converterResponse , "IngredientUnitConverterHandler::ListIngredientUnitConverters" )
}
func ( h * IngredientUnitConverterHandler ) GetConvertersForIngredient ( c * gin . Context ) {
ctx := c . Request . Context ( )
contextInfo := appcontext . FromGinContext ( ctx )
ingredientIDStr := c . Param ( "ingredient_id" )
ingredientID , err := uuid . Parse ( ingredientIDStr )
if err != nil {
logger . FromContext ( ctx ) . WithError ( err ) . Error ( "IngredientUnitConverterHandler::GetConvertersForIngredient -> Invalid ingredient ID" )
validationResponseError := contract . NewResponseError ( constants . MalformedFieldErrorCode , constants . RequestEntity , "Invalid ingredient ID" )
util . HandleResponse ( c . Writer , c . Request , contract . BuildErrorResponse ( [ ] * contract . ResponseError { validationResponseError } ) , "IngredientUnitConverterHandler::GetConvertersForIngredient" )
return
}
converterResponse := h . converterService . GetConvertersForIngredient ( ctx , contextInfo , ingredientID )
if converterResponse . HasErrors ( ) {
errorResp := converterResponse . GetErrors ( ) [ 0 ]
logger . FromContext ( ctx ) . WithError ( errorResp ) . Error ( "IngredientUnitConverterHandler::GetConvertersForIngredient -> Failed to get converters for ingredient from service" )
}
util . HandleResponse ( c . Writer , c . Request , converterResponse , "IngredientUnitConverterHandler::GetConvertersForIngredient" )
}
func ( h * IngredientUnitConverterHandler ) ConvertUnit ( c * gin . Context ) {
ctx := c . Request . Context ( )
contextInfo := appcontext . FromGinContext ( ctx )
var req contract . ConvertUnitRequest
if err := c . ShouldBindJSON ( & req ) ; err != nil {
logger . FromContext ( c . Request . Context ( ) ) . WithError ( err ) . Error ( "IngredientUnitConverterHandler::ConvertUnit -> request binding failed" )
validationResponseError := contract . NewResponseError ( constants . MissingFieldErrorCode , constants . RequestEntity , err . Error ( ) )
util . HandleResponse ( c . Writer , c . Request , contract . BuildErrorResponse ( [ ] * contract . ResponseError { validationResponseError } ) , "IngredientUnitConverterHandler::ConvertUnit" )
return
}
validationError , validationErrorCode := h . converterValidator . ValidateConvertUnitRequest ( & req )
if validationError != nil {
validationResponseError := contract . NewResponseError ( validationErrorCode , constants . RequestEntity , validationError . Error ( ) )
util . HandleResponse ( c . Writer , c . Request , contract . BuildErrorResponse ( [ ] * contract . ResponseError { validationResponseError } ) , "IngredientUnitConverterHandler::ConvertUnit" )
return
}
converterResponse := h . converterService . ConvertUnit ( ctx , contextInfo , & req )
if converterResponse . HasErrors ( ) {
errorResp := converterResponse . GetErrors ( ) [ 0 ]
logger . FromContext ( ctx ) . WithError ( errorResp ) . Error ( "IngredientUnitConverterHandler::ConvertUnit -> Failed to convert unit from service" )
}
util . HandleResponse ( c . Writer , c . Request , converterResponse , "IngredientUnitConverterHandler::ConvertUnit" )
}
2025-09-12 15:37:19 +07:00
func ( h * IngredientUnitConverterHandler ) GetUnitsByIngredientID ( c * gin . Context ) {
ctx := c . Request . Context ( )
contextInfo := appcontext . FromGinContext ( ctx )
ingredientIDStr := c . Param ( "ingredient_id" )
ingredientID , err := uuid . Parse ( ingredientIDStr )
if err != nil {
logger . FromContext ( ctx ) . WithError ( err ) . Error ( "IngredientUnitConverterHandler::GetUnitsByIngredientID -> Invalid ingredient ID" )
validationResponseError := contract . NewResponseError ( constants . MalformedFieldErrorCode , constants . RequestEntity , "Invalid ingredient ID" )
util . HandleResponse ( c . Writer , c . Request , contract . BuildErrorResponse ( [ ] * contract . ResponseError { validationResponseError } ) , "IngredientUnitConverterHandler::GetUnitsByIngredientID" )
return
}
unitsResponse := h . converterService . GetUnitsByIngredientID ( ctx , contextInfo , ingredientID )
if unitsResponse . HasErrors ( ) {
errorResp := unitsResponse . GetErrors ( ) [ 0 ]
logger . FromContext ( ctx ) . WithError ( errorResp ) . Error ( "IngredientUnitConverterHandler::GetUnitsByIngredientID -> Failed to get units for ingredient from service" )
}
util . HandleResponse ( c . Writer , c . Request , unitsResponse , "IngredientUnitConverterHandler::GetUnitsByIngredientID" )
}