216 lines
8.7 KiB
Go
216 lines
8.7 KiB
Go
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 UserDeviceHandler struct {
|
|
userDeviceService service.UserDeviceService
|
|
userDeviceValidator validator.UserDeviceValidator
|
|
}
|
|
|
|
func NewUserDeviceHandler(
|
|
userDeviceService service.UserDeviceService,
|
|
userDeviceValidator validator.UserDeviceValidator,
|
|
) *UserDeviceHandler {
|
|
return &UserDeviceHandler{
|
|
userDeviceService: userDeviceService,
|
|
userDeviceValidator: userDeviceValidator,
|
|
}
|
|
}
|
|
|
|
func (h *UserDeviceHandler) RegisterDevice(c *gin.Context) {
|
|
ctx := c.Request.Context()
|
|
contextInfo := appcontext.FromGinContext(ctx)
|
|
|
|
var req contract.RegisterUserDeviceRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
logger.FromContext(ctx).WithError(err).Error("UserDeviceHandler::RegisterDevice -> request binding failed")
|
|
validationResponseError := contract.NewResponseError(constants.MissingFieldErrorCode, constants.RequestEntity, err.Error())
|
|
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{validationResponseError}), "UserDeviceHandler::RegisterDevice")
|
|
return
|
|
}
|
|
|
|
validationError, validationErrorCode := h.userDeviceValidator.ValidateRegisterDeviceRequest(&req)
|
|
if validationError != nil {
|
|
validationResponseError := contract.NewResponseError(validationErrorCode, constants.RequestEntity, validationError.Error())
|
|
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{validationResponseError}), "UserDeviceHandler::RegisterDevice")
|
|
return
|
|
}
|
|
|
|
deviceResponse := h.userDeviceService.RegisterDevice(ctx, contextInfo.UserID, &req)
|
|
if deviceResponse.HasErrors() {
|
|
errorResp := deviceResponse.GetErrors()[0]
|
|
logger.FromContext(ctx).WithError(errorResp).Error("UserDeviceHandler::RegisterDevice -> Failed to register device from service")
|
|
}
|
|
|
|
util.HandleResponse(c.Writer, c.Request, deviceResponse, "UserDeviceHandler::RegisterDevice")
|
|
}
|
|
|
|
func (h *UserDeviceHandler) UpdateDevice(c *gin.Context) {
|
|
ctx := c.Request.Context()
|
|
|
|
deviceIDStr := c.Param("id")
|
|
deviceID, err := uuid.Parse(deviceIDStr)
|
|
if err != nil {
|
|
logger.FromContext(ctx).WithError(err).Error("UserDeviceHandler::UpdateDevice -> Invalid device ID")
|
|
validationResponseError := contract.NewResponseError(constants.MalformedFieldErrorCode, constants.RequestEntity, "Invalid device ID")
|
|
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{validationResponseError}), "UserDeviceHandler::UpdateDevice")
|
|
return
|
|
}
|
|
|
|
var req contract.UpdateUserDeviceRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
logger.FromContext(ctx).WithError(err).Error("UserDeviceHandler::UpdateDevice -> request binding failed")
|
|
validationResponseError := contract.NewResponseError(constants.MissingFieldErrorCode, constants.RequestEntity, "Invalid request body")
|
|
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{validationResponseError}), "UserDeviceHandler::UpdateDevice")
|
|
return
|
|
}
|
|
|
|
validationError, validationErrorCode := h.userDeviceValidator.ValidateUpdateDeviceRequest(&req)
|
|
if validationError != nil {
|
|
validationResponseError := contract.NewResponseError(validationErrorCode, constants.RequestEntity, validationError.Error())
|
|
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{validationResponseError}), "UserDeviceHandler::UpdateDevice")
|
|
return
|
|
}
|
|
|
|
deviceResponse := h.userDeviceService.UpdateDevice(ctx, deviceID, &req)
|
|
if deviceResponse.HasErrors() {
|
|
errorResp := deviceResponse.GetErrors()[0]
|
|
logger.FromContext(ctx).WithError(errorResp).Error("UserDeviceHandler::UpdateDevice -> Failed to update device from service")
|
|
}
|
|
|
|
util.HandleResponse(c.Writer, c.Request, deviceResponse, "UserDeviceHandler::UpdateDevice")
|
|
}
|
|
|
|
func (h *UserDeviceHandler) DeleteDevice(c *gin.Context) {
|
|
ctx := c.Request.Context()
|
|
|
|
deviceIDStr := c.Param("id")
|
|
deviceID, err := uuid.Parse(deviceIDStr)
|
|
if err != nil {
|
|
logger.FromContext(ctx).WithError(err).Error("UserDeviceHandler::DeleteDevice -> Invalid device ID")
|
|
validationResponseError := contract.NewResponseError(constants.MalformedFieldErrorCode, constants.RequestEntity, "Invalid device ID")
|
|
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{validationResponseError}), "UserDeviceHandler::DeleteDevice")
|
|
return
|
|
}
|
|
|
|
deviceResponse := h.userDeviceService.DeleteDevice(ctx, deviceID)
|
|
if deviceResponse.HasErrors() {
|
|
errorResp := deviceResponse.GetErrors()[0]
|
|
logger.FromContext(ctx).WithError(errorResp).Error("UserDeviceHandler::DeleteDevice -> Failed to delete device from service")
|
|
}
|
|
|
|
util.HandleResponse(c.Writer, c.Request, deviceResponse, "UserDeviceHandler::DeleteDevice")
|
|
}
|
|
|
|
func (h *UserDeviceHandler) GetDevice(c *gin.Context) {
|
|
ctx := c.Request.Context()
|
|
|
|
deviceIDStr := c.Param("id")
|
|
deviceID, err := uuid.Parse(deviceIDStr)
|
|
if err != nil {
|
|
logger.FromContext(ctx).WithError(err).Error("UserDeviceHandler::GetDevice -> Invalid device ID")
|
|
validationResponseError := contract.NewResponseError(constants.MalformedFieldErrorCode, constants.RequestEntity, "Invalid device ID")
|
|
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{validationResponseError}), "UserDeviceHandler::GetDevice")
|
|
return
|
|
}
|
|
|
|
deviceResponse := h.userDeviceService.GetDeviceByID(ctx, deviceID)
|
|
if deviceResponse.HasErrors() {
|
|
errorResp := deviceResponse.GetErrors()[0]
|
|
logger.FromContext(ctx).WithError(errorResp).Error("UserDeviceHandler::GetDevice -> Failed to get device from service")
|
|
}
|
|
|
|
util.HandleResponse(c.Writer, c.Request, deviceResponse, "UserDeviceHandler::GetDevice")
|
|
}
|
|
|
|
func (h *UserDeviceHandler) GetMyDevices(c *gin.Context) {
|
|
ctx := c.Request.Context()
|
|
contextInfo := appcontext.FromGinContext(ctx)
|
|
|
|
deviceResponse := h.userDeviceService.GetDevicesByUserID(ctx, contextInfo.UserID)
|
|
if deviceResponse.HasErrors() {
|
|
errorResp := deviceResponse.GetErrors()[0]
|
|
logger.FromContext(ctx).WithError(errorResp).Error("UserDeviceHandler::GetMyDevices -> Failed to get devices from service")
|
|
}
|
|
|
|
util.HandleResponse(c.Writer, c.Request, deviceResponse, "UserDeviceHandler::GetMyDevices")
|
|
}
|
|
|
|
func (h *UserDeviceHandler) GetDevicesByUser(c *gin.Context) {
|
|
ctx := c.Request.Context()
|
|
|
|
userIDStr := c.Param("user_id")
|
|
userID, err := uuid.Parse(userIDStr)
|
|
if err != nil {
|
|
logger.FromContext(ctx).WithError(err).Error("UserDeviceHandler::GetDevicesByUser -> Invalid user ID")
|
|
validationResponseError := contract.NewResponseError(constants.MalformedFieldErrorCode, constants.RequestEntity, "Invalid user ID")
|
|
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{validationResponseError}), "UserDeviceHandler::GetDevicesByUser")
|
|
return
|
|
}
|
|
|
|
deviceResponse := h.userDeviceService.GetDevicesByUserID(ctx, userID)
|
|
if deviceResponse.HasErrors() {
|
|
errorResp := deviceResponse.GetErrors()[0]
|
|
logger.FromContext(ctx).WithError(errorResp).Error("UserDeviceHandler::GetDevicesByUser -> Failed to get devices from service")
|
|
}
|
|
|
|
util.HandleResponse(c.Writer, c.Request, deviceResponse, "UserDeviceHandler::GetDevicesByUser")
|
|
}
|
|
|
|
func (h *UserDeviceHandler) ListDevices(c *gin.Context) {
|
|
ctx := c.Request.Context()
|
|
|
|
req := &contract.ListUserDevicesRequest{
|
|
Page: 1,
|
|
Limit: 10,
|
|
}
|
|
|
|
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 userID := c.Query("user_id"); userID != "" {
|
|
req.UserID = userID
|
|
}
|
|
|
|
if platform := c.Query("platform"); platform != "" {
|
|
req.Platform = platform
|
|
}
|
|
|
|
validationError, validationErrorCode := h.userDeviceValidator.ValidateListDevicesRequest(req)
|
|
if validationError != nil {
|
|
validationResponseError := contract.NewResponseError(validationErrorCode, constants.RequestEntity, validationError.Error())
|
|
util.HandleResponse(c.Writer, c.Request, contract.BuildErrorResponse([]*contract.ResponseError{validationResponseError}), "UserDeviceHandler::ListDevices")
|
|
return
|
|
}
|
|
|
|
deviceResponse := h.userDeviceService.ListDevices(ctx, req)
|
|
if deviceResponse.HasErrors() {
|
|
errorResp := deviceResponse.GetErrors()[0]
|
|
logger.FromContext(ctx).WithError(errorResp).Error("UserDeviceHandler::ListDevices -> Failed to list devices from service")
|
|
}
|
|
|
|
util.HandleResponse(c.Writer, c.Request, deviceResponse, "UserDeviceHandler::ListDevices")
|
|
}
|