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") }