From bc6e1f7398f15f683e9331f1d48cb8f483138652 Mon Sep 17 00:00:00 2001 From: areeqakbr Date: Thu, 27 Mar 2025 10:05:45 +0700 Subject: [PATCH] adding additional responses for geocoding --- manager/usecase_manager.go | 2 +- model/dto/res/device_res.go | 20 ++++++++++ usecase/device_usecase.go | 30 +++++++++----- usecase/tower_usecase.go | 13 +++++-- utils/helper/deviceHelperRes.go | 69 +++++++++++++++++++++++++++++++++ utils/helper/towerHelperRes.go | 27 +++++++++++++ 6 files changed, 147 insertions(+), 14 deletions(-) create mode 100644 model/dto/res/device_res.go diff --git a/manager/usecase_manager.go b/manager/usecase_manager.go index 630f6d6..62583c9 100644 --- a/manager/usecase_manager.go +++ b/manager/usecase_manager.go @@ -39,7 +39,7 @@ func (um *usecaseManager) NewAuthUsecase() usecase.AuthUsecase { } func (um *usecaseManager) NewDeviceUsecase() usecase.DeviceUseCase { - return usecase.NewDeviceUseCase(um.repo.NewDeviceRepository()) + return usecase.NewDeviceUseCase(um.repo.NewDeviceRepository(),um.geocoder) } func (um *usecaseManager) NewBackboneUsecase() usecase.BackboneUseCase { diff --git a/model/dto/res/device_res.go b/model/dto/res/device_res.go new file mode 100644 index 0000000..4ff9af5 --- /dev/null +++ b/model/dto/res/device_res.go @@ -0,0 +1,20 @@ +package res + +import ( + "time" + + "github.com/google/uuid" +) + +type DeviceResponse struct { + ID uuid.UUID `json:"id"` + DeviceCode string `json:"device_code"` + DeviceType string `json:"device_type"` + Longitude float64 `json:"longitude"` + Latitude float64 `json:"latitude"` + Address string `json:"address"` + PortAmount int `json:"port_amount"` + Status string `json:"status"` + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` +} \ No newline at end of file diff --git a/usecase/device_usecase.go b/usecase/device_usecase.go index 189a1a4..4420c10 100644 --- a/usecase/device_usecase.go +++ b/usecase/device_usecase.go @@ -8,6 +8,7 @@ import ( "users_management/m/model/entity" "users_management/m/repository" "users_management/m/utils/helper" + "users_management/m/utils/service" "github.com/go-playground/validator/v10" "github.com/google/uuid" @@ -15,9 +16,9 @@ import ( type DeviceUseCase interface { CreateDevice(device req.DeviceDTO) error - GetAllDevices() ([]entity.Device, error) + GetAllDevices() ([]res.DeviceResponse, error) - GetByID(id uuid.UUID) (entity.Device, error) + GetByID(id uuid.UUID) (res.DeviceResponse, error) UpdateDevice(id uuid.UUID, device req.UpdateDeviceDTO) error GetByType(deviceType string) ([]res.DeviceTypeResponse, error) } @@ -25,11 +26,13 @@ type DeviceUseCase interface { type deviceUseCase struct { deviceRepo repository.DevicesRepo validate *validator.Validate + geocoder service.GeocodingService } -func NewDeviceUseCase(deviceRepo repository.DevicesRepo) DeviceUseCase { +func NewDeviceUseCase(deviceRepo repository.DevicesRepo, geocoder service.GeocodingService) DeviceUseCase { return &deviceUseCase{ deviceRepo: deviceRepo, + geocoder: geocoder, validate: validator.New(), } } @@ -55,20 +58,29 @@ func (u *deviceUseCase) CreateDevice(device req.DeviceDTO) error { return u.deviceRepo.Post(newDevice) } -func (u *deviceUseCase) GetAllDevices() ([]entity.Device, error) { +func (u *deviceUseCase) GetAllDevices() ([]res.DeviceResponse, error) { devices, err := u.deviceRepo.GetAll() if err != nil { - return devices, err + return []res.DeviceResponse{}, err } - return devices, nil + devicesResponse,err := helper.ConvertToDeviceResponse(devices, u.geocoder) + if err != nil { + return []res.DeviceResponse{}, err + } + return devicesResponse, nil } -func (u *deviceUseCase) GetByID(id uuid.UUID) (entity.Device, error) { +func (u *deviceUseCase) GetByID(id uuid.UUID) (res.DeviceResponse, error) { device, err := u.deviceRepo.GetByID(id) if err != nil { - return device, err + return res.DeviceResponse{}, err } - return device, nil + + deviceResp, err := helper.ConvertToDeviceResponseId(device, u.geocoder) + if err != nil { + return res.DeviceResponse{}, err + } + return deviceResp, nil } func (u *deviceUseCase) UpdateDevice(id uuid.UUID, device req.UpdateDeviceDTO) error { diff --git a/usecase/tower_usecase.go b/usecase/tower_usecase.go index 75dfe8a..86456b5 100644 --- a/usecase/tower_usecase.go +++ b/usecase/tower_usecase.go @@ -17,7 +17,7 @@ import ( type TowerUseCase interface { Post(tower req.TowerDTO) error GetAll() ([]res.TowerResponse, error) - GetByID(id uuid.UUID) (entity.Tower, error) + GetByID(id uuid.UUID) (res.TowerResponse, error) UpdateTower(id uuid.UUID, tower req.UpdateTowerDTO) error } @@ -67,12 +67,17 @@ func (u *towerUsecase) GetAll() ([]res.TowerResponse, error) { } -func (u *towerUsecase) GetByID(id uuid.UUID) (entity.Tower, error) { +func (u *towerUsecase) GetByID(id uuid.UUID) (res.TowerResponse, error) { tower, err := u.towerRepo.GetByID(id) if err != nil { - return tower, err + return res.TowerResponse{}, err } - return tower, nil + + towerResp, err := helper.ConvertToTowerIDResponses(tower,u.geocoder) + if err != nil { + return res.TowerResponse{}, err + } + return towerResp, nil } func (u *towerUsecase) UpdateTower(id uuid.UUID, tower req.UpdateTowerDTO) error { diff --git a/utils/helper/deviceHelperRes.go b/utils/helper/deviceHelperRes.go index 6ada43e..710ae61 100644 --- a/utils/helper/deviceHelperRes.go +++ b/utils/helper/deviceHelperRes.go @@ -1,8 +1,10 @@ package helper import ( + "log" "users_management/m/model/dto/res" "users_management/m/model/entity" + "users_management/m/utils/service" ) func ConvertToDeviceTypeResponse(devices []entity.Device) []res.DeviceTypeResponse { @@ -17,4 +19,71 @@ func ConvertToDeviceTypeResponse(devices []entity.Device) []res.DeviceTypeRespon } return responses +} + + +func ConvertToDeviceResponse (devices []entity.Device, geocoder service.GeocodingService) ([]res.DeviceResponse, error) { + var responses []res.DeviceResponse + for _, devices := range devices { + var address string + + if geocoder != nil { + generatedAddress, err := geocoder.GetAddressFromCoordinates(devices.Latitude, devices.Longitude) + if err != nil { + // Log specific geocoding error + log.Printf("Geocoding error for device %s: %v", devices.DeviceCode, err) + } else { + address = generatedAddress + } + } else{ + log.Println("WARNING: Geocoder is nil") + } + + deviceResp := res.DeviceResponse{ + ID: devices.ID, + DeviceCode: devices.DeviceCode, + DeviceType: string(devices.DeviceType), + Longitude: devices.Longitude, + Latitude: devices.Latitude, + Address: address, + PortAmount: devices.PortAmount, + Status: string(devices.Status), + CreatedAt: devices.CreatedAt, + UpdatedAt: devices.UpdatedAt, + } + responses = append(responses, deviceResp) + } + + return responses, nil +} + +func ConvertToDeviceResponseId (devices entity.Device, geocoder service.GeocodingService) (res.DeviceResponse, error) { + var address string + + if geocoder != nil { + generatedAddress, err := geocoder.GetAddressFromCoordinates(devices.Latitude, devices.Longitude) + if err != nil { + // Log specific geocoding error + log.Printf("Geocoding error for device %s: %v", devices.DeviceCode, err) + } else { + address = generatedAddress + } + } else{ + log.Println("WARNING: Geocoder is nil") + } + + deviceResp := res.DeviceResponse{ + ID: devices.ID, + DeviceCode: devices.DeviceCode, + DeviceType: string(devices.DeviceType), + Longitude: devices.Longitude, + Latitude: devices.Latitude, + Address: address, + PortAmount: devices.PortAmount, + Status: string(devices.Status), + CreatedAt: devices.CreatedAt, + UpdatedAt: devices.UpdatedAt, + } + + return deviceResp, nil } \ No newline at end of file diff --git a/utils/helper/towerHelperRes.go b/utils/helper/towerHelperRes.go index 46b3bfe..2533c1a 100644 --- a/utils/helper/towerHelperRes.go +++ b/utils/helper/towerHelperRes.go @@ -38,4 +38,31 @@ func ConvertToTowerResponses(towers []entity.Tower, geocoder service.GeocodingSe responses = append(responses, towerResp) } return responses, nil +} + +func ConvertToTowerIDResponses(tower entity.Tower, geocoder service.GeocodingService) (res.TowerResponse, error) { + var address string + + if geocoder != nil { + generatedAddress, err := geocoder.GetAddressFromCoordinates(tower.Latitude, tower.Longitude) + if err != nil { + // Log specific geocoding error + log.Printf("Geocoding error for tower %s: %v", tower.TowerCode, err) + } else { + address = generatedAddress + } + } else { + log.Println("WARNING: Geocoder is nil") + } + + towerResp := res.TowerResponse{ + ID: tower.ID, + DeviceCode: tower.Device.DeviceCode, + TowerCode: tower.TowerCode, + Longitude: tower.Longitude, + Latitude: tower.Latitude, + Address: address, + CreatedAt: tower.CreatedAt, + } + return towerResp, nil } \ No newline at end of file