apskel-pos-backend/internal/service/user_device_service.go
2026-05-10 10:42:09 +07:00

123 lines
4.9 KiB
Go

package service
import (
"context"
"apskel-pos-be/internal/constants"
"apskel-pos-be/internal/contract"
"apskel-pos-be/internal/processor"
"apskel-pos-be/internal/transformer"
"github.com/google/uuid"
)
type UserDeviceService interface {
RegisterDevice(ctx context.Context, userID uuid.UUID, req *contract.RegisterUserDeviceRequest) *contract.Response
UpdateDevice(ctx context.Context, id uuid.UUID, req *contract.UpdateUserDeviceRequest) *contract.Response
DeleteDevice(ctx context.Context, id uuid.UUID) *contract.Response
GetDeviceByID(ctx context.Context, id uuid.UUID) *contract.Response
GetDevicesByUserID(ctx context.Context, userID uuid.UUID) *contract.Response
ListDevices(ctx context.Context, req *contract.ListUserDevicesRequest) *contract.Response
}
type UserDeviceServiceImpl struct {
userDeviceProcessor processor.UserDeviceProcessor
}
func NewUserDeviceService(userDeviceProcessor processor.UserDeviceProcessor) *UserDeviceServiceImpl {
return &UserDeviceServiceImpl{
userDeviceProcessor: userDeviceProcessor,
}
}
func (s *UserDeviceServiceImpl) RegisterDevice(ctx context.Context, userID uuid.UUID, req *contract.RegisterUserDeviceRequest) *contract.Response {
modelReq := transformer.RegisterUserDeviceRequestToModel(req)
modelReq.UserID = userID
deviceResponse, err := s.userDeviceProcessor.RegisterDevice(ctx, modelReq)
if err != nil {
errorResp := contract.NewResponseError(constants.InternalServerErrorCode, constants.UserDeviceServiceEntity, err.Error())
return contract.BuildErrorResponse([]*contract.ResponseError{errorResp})
}
contractResponse := transformer.UserDeviceModelResponseToResponse(deviceResponse)
return contract.BuildSuccessResponse(contractResponse)
}
func (s *UserDeviceServiceImpl) UpdateDevice(ctx context.Context, id uuid.UUID, req *contract.UpdateUserDeviceRequest) *contract.Response {
modelReq := transformer.UpdateUserDeviceRequestToModel(req)
deviceResponse, err := s.userDeviceProcessor.UpdateDevice(ctx, id, modelReq)
if err != nil {
errorResp := contract.NewResponseError(constants.InternalServerErrorCode, constants.UserDeviceServiceEntity, err.Error())
return contract.BuildErrorResponse([]*contract.ResponseError{errorResp})
}
contractResponse := transformer.UserDeviceModelResponseToResponse(deviceResponse)
return contract.BuildSuccessResponse(contractResponse)
}
func (s *UserDeviceServiceImpl) DeleteDevice(ctx context.Context, id uuid.UUID) *contract.Response {
err := s.userDeviceProcessor.DeleteDevice(ctx, id)
if err != nil {
errorResp := contract.NewResponseError(constants.InternalServerErrorCode, constants.UserDeviceServiceEntity, err.Error())
return contract.BuildErrorResponse([]*contract.ResponseError{errorResp})
}
return contract.BuildSuccessResponse(map[string]interface{}{
"message": "Device deleted successfully",
})
}
func (s *UserDeviceServiceImpl) GetDeviceByID(ctx context.Context, id uuid.UUID) *contract.Response {
deviceResponse, err := s.userDeviceProcessor.GetDeviceByID(ctx, id)
if err != nil {
errorResp := contract.NewResponseError(constants.NotFoundErrorCode, constants.UserDeviceServiceEntity, err.Error())
return contract.BuildErrorResponse([]*contract.ResponseError{errorResp})
}
contractResponse := transformer.UserDeviceModelResponseToResponse(deviceResponse)
return contract.BuildSuccessResponse(contractResponse)
}
func (s *UserDeviceServiceImpl) GetDevicesByUserID(ctx context.Context, userID uuid.UUID) *contract.Response {
deviceResponses, err := s.userDeviceProcessor.GetDevicesByUserID(ctx, userID)
if err != nil {
errorResp := contract.NewResponseError(constants.InternalServerErrorCode, constants.UserDeviceServiceEntity, err.Error())
return contract.BuildErrorResponse([]*contract.ResponseError{errorResp})
}
contractResponses := transformer.UserDeviceModelResponsesToResponses(deviceResponses)
return contract.BuildSuccessResponse(contractResponses)
}
func (s *UserDeviceServiceImpl) ListDevices(ctx context.Context, req *contract.ListUserDevicesRequest) *contract.Response {
modelReq := transformer.ListUserDevicesRequestToModel(req)
filters := make(map[string]interface{})
if modelReq.UserID != "" {
filters["user_id"] = modelReq.UserID
}
if modelReq.Platform != "" {
filters["platform"] = modelReq.Platform
}
devices, totalPages, err := s.userDeviceProcessor.ListDevices(ctx, filters, modelReq.Page, modelReq.Limit)
if err != nil {
errorResp := contract.NewResponseError(constants.InternalServerErrorCode, constants.UserDeviceServiceEntity, err.Error())
return contract.BuildErrorResponse([]*contract.ResponseError{errorResp})
}
contractResponses := transformer.UserDeviceModelResponsesToResponses(devices)
response := contract.ListUserDevicesResponse{
Devices: contractResponses,
TotalCount: len(contractResponses),
Page: modelReq.Page,
Limit: modelReq.Limit,
TotalPages: totalPages,
}
return contract.BuildSuccessResponse(response)
}