288 lines
12 KiB
Go
Raw Normal View History

2025-07-30 23:18:20 +07:00
package handler
import (
2025-08-03 00:34:25 +07:00
"apskel-pos-be/internal/appcontext"
"apskel-pos-be/internal/constants"
2025-07-30 23:18:20 +07:00
"apskel-pos-be/internal/contract"
2025-08-03 00:34:25 +07:00
"apskel-pos-be/internal/logger"
"apskel-pos-be/internal/util"
"apskel-pos-be/internal/validator"
2025-07-30 23:18:20 +07:00
"strconv"
"github.com/gin-gonic/gin"
"github.com/google/uuid"
)
type TableHandler struct {
2025-08-03 00:34:25 +07:00
tableService TableService
tableValidator *validator.TableValidator
2025-07-30 23:18:20 +07:00
}
2025-08-03 00:34:25 +07:00
func NewTableHandler(tableService TableService, tableValidator *validator.TableValidator) *TableHandler {
2025-07-30 23:18:20 +07:00
return &TableHandler{
2025-08-03 00:34:25 +07:00
tableService: tableService,
tableValidator: tableValidator,
2025-07-30 23:18:20 +07:00
}
}
func (h *TableHandler) Create(c *gin.Context) {
2025-08-03 00:34:25 +07:00
ctx := c.Request.Context()
contextInfo := appcontext.FromGinContext(ctx)
2025-07-30 23:18:20 +07:00
var req contract.CreateTableRequest
if err := c.ShouldBindJSON(&req); err != nil {
2025-08-03 00:34:25 +07:00
logger.FromContext(ctx).WithError(err).Error("TableHandler::Create -> request binding failed")
validationResponseError := contract.NewResponseError(constants.MissingFieldErrorCode, constants.RequestEntity, err.Error())
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{validationResponseError}), "TableHandler::Create")
2025-07-30 23:18:20 +07:00
return
}
2025-08-03 00:34:25 +07:00
if err := h.tableValidator.ValidateCreateTableRequest(req); err != nil {
logger.FromContext(ctx).WithError(err).Error("TableHandler::Create -> validation failed")
validationResponseError := contract.NewResponseError(constants.ValidationErrorCode, constants.RequestEntity, err.Error())
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{validationResponseError}), "TableHandler::Create")
2025-07-30 23:18:20 +07:00
return
}
2025-08-03 00:34:25 +07:00
response := h.tableService.CreateTable(ctx, contextInfo, &req)
if response.HasErrors() {
errorResp := response.GetErrors()[0]
logger.FromContext(ctx).WithError(errorResp).Error("TableHandler::Create -> service failed")
2025-07-30 23:18:20 +07:00
}
2025-08-03 00:34:25 +07:00
util.HandleResponse(c.Writer, c.Request, response, "TableHandler::Create")
2025-07-30 23:18:20 +07:00
}
func (h *TableHandler) GetByID(c *gin.Context) {
2025-08-03 00:34:25 +07:00
ctx := c.Request.Context()
2025-07-30 23:18:20 +07:00
id := c.Param("id")
tableID, err := uuid.Parse(id)
if err != nil {
2025-08-03 00:34:25 +07:00
logger.FromContext(ctx).WithError(err).Error("TableHandler::GetByID -> Invalid table ID")
validationResponseError := contract.NewResponseError(constants.MalformedFieldErrorCode, constants.RequestEntity, "Invalid table ID")
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{validationResponseError}), "TableHandler::GetByID")
2025-07-30 23:18:20 +07:00
return
}
2025-08-03 00:34:25 +07:00
response := h.tableService.GetTableByID(ctx, tableID)
if response.HasErrors() {
errorResp := response.GetErrors()[0]
logger.FromContext(ctx).WithError(errorResp).Error("TableHandler::GetByID -> service failed")
2025-07-30 23:18:20 +07:00
}
2025-08-03 00:34:25 +07:00
util.HandleResponse(c.Writer, c.Request, response, "TableHandler::GetByID")
2025-07-30 23:18:20 +07:00
}
func (h *TableHandler) Update(c *gin.Context) {
2025-08-03 00:34:25 +07:00
ctx := c.Request.Context()
2025-07-30 23:18:20 +07:00
id := c.Param("id")
tableID, err := uuid.Parse(id)
if err != nil {
2025-08-03 00:34:25 +07:00
logger.FromContext(ctx).WithError(err).Error("TableHandler::Update -> Invalid table ID")
validationResponseError := contract.NewResponseError(constants.MalformedFieldErrorCode, constants.RequestEntity, "Invalid table ID")
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{validationResponseError}), "TableHandler::Update")
2025-07-30 23:18:20 +07:00
return
}
var req contract.UpdateTableRequest
if err := c.ShouldBindJSON(&req); err != nil {
2025-08-03 00:34:25 +07:00
logger.FromContext(ctx).WithError(err).Error("TableHandler::Update -> request binding failed")
validationResponseError := contract.NewResponseError(constants.MissingFieldErrorCode, constants.RequestEntity, err.Error())
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{validationResponseError}), "TableHandler::Update")
2025-07-30 23:18:20 +07:00
return
}
2025-08-03 00:34:25 +07:00
if err := h.tableValidator.ValidateUpdateTableRequest(req); err != nil {
logger.FromContext(ctx).WithError(err).Error("TableHandler::Update -> validation failed")
validationResponseError := contract.NewResponseError(constants.ValidationErrorCode, constants.RequestEntity, err.Error())
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{validationResponseError}), "TableHandler::Update")
2025-07-30 23:18:20 +07:00
return
}
2025-08-03 00:34:25 +07:00
response := h.tableService.UpdateTable(ctx, tableID, &req)
if response.HasErrors() {
errorResp := response.GetErrors()[0]
logger.FromContext(ctx).WithError(errorResp).Error("TableHandler::Update -> service failed")
}
util.HandleResponse(c.Writer, c.Request, response, "TableHandler::Update")
2025-07-30 23:18:20 +07:00
}
func (h *TableHandler) Delete(c *gin.Context) {
2025-08-03 00:34:25 +07:00
ctx := c.Request.Context()
2025-07-30 23:18:20 +07:00
id := c.Param("id")
tableID, err := uuid.Parse(id)
if err != nil {
2025-08-03 00:34:25 +07:00
logger.FromContext(ctx).WithError(err).Error("TableHandler::Delete -> Invalid table ID")
validationResponseError := contract.NewResponseError(constants.MalformedFieldErrorCode, constants.RequestEntity, "Invalid table ID")
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{validationResponseError}), "TableHandler::Delete")
2025-07-30 23:18:20 +07:00
return
}
2025-08-03 00:34:25 +07:00
response := h.tableService.DeleteTable(ctx, tableID)
if response.HasErrors() {
errorResp := response.GetErrors()[0]
logger.FromContext(ctx).WithError(errorResp).Error("TableHandler::Delete -> service failed")
2025-07-30 23:18:20 +07:00
}
2025-08-03 00:34:25 +07:00
util.HandleResponse(c.Writer, c.Request, response, "TableHandler::Delete")
2025-07-30 23:18:20 +07:00
}
func (h *TableHandler) List(c *gin.Context) {
2025-08-03 00:34:25 +07:00
ctx := c.Request.Context()
2025-07-30 23:18:20 +07:00
query := contract.ListTablesQuery{
OrganizationID: c.Query("organization_id"),
OutletID: c.Query("outlet_id"),
Status: c.Query("status"),
IsActive: c.Query("is_active"),
Search: c.Query("search"),
Page: 1,
Limit: 10,
}
if pageStr := c.Query("page"); pageStr != "" {
if page, err := strconv.Atoi(pageStr); err == nil && page > 0 {
query.Page = page
}
}
if limitStr := c.Query("limit"); limitStr != "" {
if limit, err := strconv.Atoi(limitStr); err == nil && limit > 0 && limit <= 100 {
query.Limit = limit
}
}
2025-08-03 00:34:25 +07:00
if err := h.tableValidator.ValidateListTablesQuery(query); err != nil {
logger.FromContext(ctx).WithError(err).Error("TableHandler::List -> validation failed")
validationResponseError := contract.NewResponseError(constants.ValidationErrorCode, constants.RequestEntity, err.Error())
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{validationResponseError}), "TableHandler::List")
2025-07-30 23:18:20 +07:00
return
}
2025-08-03 00:34:25 +07:00
response := h.tableService.ListTables(ctx, &query)
if response.HasErrors() {
errorResp := response.GetErrors()[0]
logger.FromContext(ctx).WithError(errorResp).Error("TableHandler::List -> service failed")
}
util.HandleResponse(c.Writer, c.Request, response, "TableHandler::List")
2025-07-30 23:18:20 +07:00
}
func (h *TableHandler) OccupyTable(c *gin.Context) {
2025-08-03 00:34:25 +07:00
ctx := c.Request.Context()
2025-07-30 23:18:20 +07:00
id := c.Param("id")
tableID, err := uuid.Parse(id)
if err != nil {
2025-08-03 00:34:25 +07:00
logger.FromContext(ctx).WithError(err).Error("TableHandler::OccupyTable -> Invalid table ID")
validationResponseError := contract.NewResponseError(constants.MalformedFieldErrorCode, constants.RequestEntity, "Invalid table ID")
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{validationResponseError}), "TableHandler::OccupyTable")
2025-07-30 23:18:20 +07:00
return
}
var req contract.OccupyTableRequest
if err := c.ShouldBindJSON(&req); err != nil {
2025-08-03 00:34:25 +07:00
logger.FromContext(ctx).WithError(err).Error("TableHandler::OccupyTable -> request binding failed")
validationResponseError := contract.NewResponseError(constants.MissingFieldErrorCode, constants.RequestEntity, err.Error())
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{validationResponseError}), "TableHandler::OccupyTable")
2025-07-30 23:18:20 +07:00
return
}
2025-08-03 00:34:25 +07:00
if err := h.tableValidator.ValidateOccupyTableRequest(req); err != nil {
logger.FromContext(ctx).WithError(err).Error("TableHandler::OccupyTable -> validation failed")
validationResponseError := contract.NewResponseError(constants.ValidationErrorCode, constants.RequestEntity, err.Error())
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{validationResponseError}), "TableHandler::OccupyTable")
2025-07-30 23:18:20 +07:00
return
}
2025-08-03 00:34:25 +07:00
response := h.tableService.OccupyTable(ctx, tableID, &req)
if response.HasErrors() {
errorResp := response.GetErrors()[0]
logger.FromContext(ctx).WithError(errorResp).Error("TableHandler::OccupyTable -> service failed")
}
util.HandleResponse(c.Writer, c.Request, response, "TableHandler::OccupyTable")
2025-07-30 23:18:20 +07:00
}
func (h *TableHandler) ReleaseTable(c *gin.Context) {
2025-08-03 00:34:25 +07:00
ctx := c.Request.Context()
2025-07-30 23:18:20 +07:00
id := c.Param("id")
tableID, err := uuid.Parse(id)
if err != nil {
2025-08-03 00:34:25 +07:00
logger.FromContext(ctx).WithError(err).Error("TableHandler::ReleaseTable -> Invalid table ID")
validationResponseError := contract.NewResponseError(constants.MalformedFieldErrorCode, constants.RequestEntity, "Invalid table ID")
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{validationResponseError}), "TableHandler::ReleaseTable")
2025-07-30 23:18:20 +07:00
return
}
var req contract.ReleaseTableRequest
if err := c.ShouldBindJSON(&req); err != nil {
2025-08-03 00:34:25 +07:00
logger.FromContext(ctx).WithError(err).Error("TableHandler::ReleaseTable -> request binding failed")
validationResponseError := contract.NewResponseError(constants.MissingFieldErrorCode, constants.RequestEntity, err.Error())
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{validationResponseError}), "TableHandler::ReleaseTable")
2025-07-30 23:18:20 +07:00
return
}
2025-08-03 00:34:25 +07:00
if err := h.tableValidator.ValidateReleaseTableRequest(req); err != nil {
logger.FromContext(ctx).WithError(err).Error("TableHandler::ReleaseTable -> validation failed")
validationResponseError := contract.NewResponseError(constants.ValidationErrorCode, constants.RequestEntity, err.Error())
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{validationResponseError}), "TableHandler::ReleaseTable")
2025-07-30 23:18:20 +07:00
return
}
2025-08-03 00:34:25 +07:00
response := h.tableService.ReleaseTable(ctx, tableID, &req)
if response.HasErrors() {
errorResp := response.GetErrors()[0]
logger.FromContext(ctx).WithError(errorResp).Error("TableHandler::ReleaseTable -> service failed")
}
util.HandleResponse(c.Writer, c.Request, response, "TableHandler::ReleaseTable")
2025-07-30 23:18:20 +07:00
}
func (h *TableHandler) GetAvailableTables(c *gin.Context) {
2025-08-03 00:34:25 +07:00
ctx := c.Request.Context()
2025-07-30 23:18:20 +07:00
outletIDStr := c.Param("outlet_id")
outletID, err := uuid.Parse(outletIDStr)
if err != nil {
2025-08-03 00:34:25 +07:00
logger.FromContext(ctx).WithError(err).Error("TableHandler::GetAvailableTables -> Invalid outlet ID")
validationResponseError := contract.NewResponseError(constants.MalformedFieldErrorCode, constants.RequestEntity, "Invalid outlet ID")
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{validationResponseError}), "TableHandler::GetAvailableTables")
2025-07-30 23:18:20 +07:00
return
}
2025-08-03 00:34:25 +07:00
response := h.tableService.GetAvailableTables(ctx, outletID)
if response.HasErrors() {
errorResp := response.GetErrors()[0]
logger.FromContext(ctx).WithError(errorResp).Error("TableHandler::GetAvailableTables -> service failed")
2025-07-30 23:18:20 +07:00
}
2025-08-03 00:34:25 +07:00
util.HandleResponse(c.Writer, c.Request, response, "TableHandler::GetAvailableTables")
2025-07-30 23:18:20 +07:00
}
func (h *TableHandler) GetOccupiedTables(c *gin.Context) {
2025-08-03 00:34:25 +07:00
ctx := c.Request.Context()
2025-07-30 23:18:20 +07:00
outletIDStr := c.Param("outlet_id")
outletID, err := uuid.Parse(outletIDStr)
if err != nil {
2025-08-03 00:34:25 +07:00
logger.FromContext(ctx).WithError(err).Error("TableHandler::GetOccupiedTables -> Invalid outlet ID")
validationResponseError := contract.NewResponseError(constants.MalformedFieldErrorCode, constants.RequestEntity, "Invalid outlet ID")
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{validationResponseError}), "TableHandler::GetOccupiedTables")
2025-07-30 23:18:20 +07:00
return
}
2025-08-03 00:34:25 +07:00
response := h.tableService.GetOccupiedTables(ctx, outletID)
if response.HasErrors() {
errorResp := response.GetErrors()[0]
logger.FromContext(ctx).WithError(errorResp).Error("TableHandler::GetOccupiedTables -> service failed")
2025-07-30 23:18:20 +07:00
}
2025-08-03 00:34:25 +07:00
util.HandleResponse(c.Writer, c.Request, response, "TableHandler::GetOccupiedTables")
2025-07-30 23:18:20 +07:00
}