package usecase import ( "errors" "time" "users_management/m/model/dto/req" "users_management/m/model/entity" "users_management/m/repository" "github.com/go-playground/validator/v10" "github.com/google/uuid" ) type TowerUseCase interface { Post(tower req.TowerDTO) error GetAll() ([]entity.Tower, error) GetByID(id uuid.UUID) (entity.Tower, error) UpdateTower(id uuid.UUID, tower req.UpdateTowerDTO) error } type towerUsecase struct { towerRepo repository.TowerRepo validate *validator.Validate } func NewTowerUseCase(towerRepo repository.TowerRepo) TowerUseCase { return &towerUsecase{ towerRepo: towerRepo, validate: validator.New(), } } func (u *towerUsecase) Post(tower req.TowerDTO) error { err := u.validate.Struct(tower) if err != nil { return err } newTower := entity.Tower{ ID: uuid.New(), DeviceID: tower.DeviceID, TowerCode: tower.TowerCode, Longitude: tower.Longitude, Latitude: tower.Latitude, CreatedAt: time.Now(), UpdatedAt: time.Now(), } return u.towerRepo.Post(newTower) } func (u *towerUsecase) GetAll() ([]entity.Tower, error) { towers, err := u.towerRepo.GetAll() if err != nil { return towers, err } return towers, nil } func (u *towerUsecase) GetByID(id uuid.UUID) (entity.Tower, error) { tower, err := u.towerRepo.GetByID(id) if err != nil { return tower, err } return tower, nil } func (u *towerUsecase) UpdateTower(id uuid.UUID, tower req.UpdateTowerDTO) error { err := u.validate.Struct(tower) if err != nil { return err // Return validation error } updates := make(map[string]interface{}) if tower.DeviceID != nil { updates["DeviceID"] = *tower.DeviceID } if tower.TowerCode != nil { updates["TowerCode"] = *tower.TowerCode } if tower.Longitude != nil { updates["Longitude"] = *tower.Longitude } if tower.Latitude != nil { updates["Latitude"] = *tower.Latitude } // If no fields are updated, return an error if len(updates) == 0 { return errors.New("no fields to update") } updates["UpdatedAt"] = time.Now() return u.towerRepo.Update(id, updates) }