Skip to content

Commit

Permalink
Rename variables to UkrainianCities and move domain scoped methods to…
Browse files Browse the repository at this point in the history
… separate classes, little methods refactoring

Signed-off-by: Mykhailo Marchuk <[email protected]>
  • Loading branch information
marchuk-engineer committed May 29, 2024
1 parent fbb09fb commit 0d84e8e
Show file tree
Hide file tree
Showing 8 changed files with 52 additions and 54 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UkrainianPlaces {
public class UkrainianCities {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,25 +1,25 @@
package com.booking.app.mapper;

import com.booking.app.dto.CitiesDTO;
import com.booking.app.entity.UkrainianPlaces;
import com.booking.app.dto.CitiesDto;
import com.booking.app.entity.UkrainianCities;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;

import java.util.List;

@Mapper(componentModel = "spring")
public interface UkrainianPlacesMapper {
public interface UkrainianCitiesMapper {

@Mapping(target = "cityUa", source = "nameUa", ignore = true)
@Mapping(target = "cityEng", source = "nameEng", ignore = true)
@Mapping(target = "siteLanguage", ignore = true)
@Mapping(target = "country", source = "country")
CitiesDTO toCitiesDTO(UkrainianPlaces ukrainianPlaces);
CitiesDto toCitiesDTO(UkrainianCities ukrainianCities);

default List<CitiesDTO> toCitiesDTOList(List<UkrainianPlaces> ukrainianPlacesList, String inputLanguage, String siteLanguage) {
return ukrainianPlacesList.stream()
default List<CitiesDto> toCitiesDtoList(List<UkrainianCities> ukrainianCitiesList, String inputLanguage, String siteLanguage) {
return ukrainianCitiesList.stream()
.map(place -> {
CitiesDTO citiesDTO = toCitiesDTO(place);
CitiesDto citiesDTO = toCitiesDTO(place);
citiesDTO.setSiteLanguage(siteLanguage);

switch (siteLanguage) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
package com.booking.app.repositories;

import com.booking.app.entity.UkrainianPlaces;
import com.booking.app.entity.UkrainianCities;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Optional;

@Repository
public interface UkrPlacesRepository extends JpaRepository<UkrainianPlaces, Long> {
public interface UkrainianCitiesRepository extends JpaRepository<UkrainianCities, Long> {

Optional<List<UkrainianPlaces>> findUkrainianPlacesByNameEngStartsWithIgnoreCaseAndNameEngNotContainingIgnoreCase(String startLetters, String exclusion);
Optional<List<UkrainianCities>> findUkrainianPlacesByNameEngStartsWithIgnoreCaseAndNameEngNotContainingIgnoreCase(String startLetters, String exclusion);

Optional<List<UkrainianPlaces>> findUkrainianPlacesByNameUaStartsWithIgnoreCaseAndNameUaNotContainingIgnoreCase(String startLetters, String exclusion);
Optional<List<UkrainianCities>> findUkrainianPlacesByNameUaStartsWithIgnoreCaseAndNameUaNotContainingIgnoreCase(String startLetters, String exclusion);

}
7 changes: 3 additions & 4 deletions src/main/java/com/booking/app/services/TypeAheadService.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.booking.app.services;

import com.booking.app.dto.CitiesDTO;
import com.booking.app.dto.StartLettersDTO;
import com.booking.app.dto.CitiesDto;

import java.io.IOException;
import java.util.List;
Expand All @@ -11,12 +10,12 @@ public interface TypeAheadService {
/**
* Fetches and maps cities based on provided start letters, ignoring case.
*
* @param letters DTO containing the start letters for city search.
* @param startLetters String containing the start letters for city search.
* @param siteLanguage Language of the site.
* @return List of CitiesDTO matching the provided start letters.
* @throws IOException If an I/O error occurs during the process.
*/
List<CitiesDTO> findMatches(StartLettersDTO letters, String siteLanguage) throws IOException;
List<CitiesDto> findMatches(String startLetters, String siteLanguage) throws IOException;

/**
* Gets the ID of a city by its name and language.
Expand Down
14 changes: 14 additions & 0 deletions src/main/java/com/booking/app/services/UkrainianCitiesService.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
package com.booking.app.services;


import com.booking.app.entity.UkrainianCities;

import java.util.List;
import java.util.Optional;

public interface UkrainianCitiesService {

/**
Expand All @@ -12,4 +17,13 @@ public interface UkrainianCitiesService {
*/
String getCity(Long id, String language);

/**
* Retrieves a list of UkrainianPlaces based on start letters and language.
*
* @param startLetters The start letters of the city name.
* @param inputLanguage The language of the city name.
* @return Optional list of UkrainianPlaces.
*/
Optional<List<UkrainianCities>> getCities(String startLetters, String inputLanguage);

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
import com.booking.app.constant.PopularRoutesConstants;
import com.booking.app.dto.City;
import com.booking.app.dto.RequestTicketsDTO;
import com.booking.app.entity.UkrainianPlaces;
import com.booking.app.repositories.UkrPlacesRepository;
import com.booking.app.entity.UkrainianCities;
import com.booking.app.repositories.UkrainianCitiesRepository;
import com.booking.app.services.PopularRoutesService;
import com.booking.app.services.impl.scrape.ScraperManager;
import lombok.RequiredArgsConstructor;
Expand Down Expand Up @@ -35,7 +35,7 @@ public class PopularRoutesServiceImpl implements PopularRoutesService {

private final ScraperManager manager;

private final UkrPlacesRepository placesRepository;
private final UkrainianCitiesRepository placesRepository;

@Override
@Async
Expand All @@ -44,8 +44,8 @@ public void findRoutes() throws IOException, ParseException {
List<CompletableFuture<Boolean>> runningRoutes = new LinkedList<>();

for (City route : routes) {
Optional<UkrainianPlaces> departureCity = placesRepository.findById(route.departureId());
Optional<UkrainianPlaces> arrivalCity = placesRepository.findById(route.arrivalId());
Optional<UkrainianCities> departureCity = placesRepository.findById(route.departureId());
Optional<UkrainianCities> arrivalCity = placesRepository.findById(route.arrivalId());

if (departureCity.isPresent() && arrivalCity.isPresent()) {
runningRoutes.add(findTickets(departureCity.get().getNameUa(), arrivalCity.get().getNameUa(), UKRAINIAN));
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,16 @@
package com.booking.app.services.impl;

import com.booking.app.dto.CitiesDTO;
import com.booking.app.dto.StartLettersDTO;
import com.booking.app.entity.UkrainianPlaces;
import com.booking.app.mapper.UkrainianPlacesMapper;
import com.booking.app.repositories.UkrPlacesRepository;
import com.booking.app.dto.CitiesDto;
import com.booking.app.mapper.UkrainianCitiesMapper;
import com.booking.app.services.LanguageDetectorService;
import com.booking.app.services.TypeAheadService;
import com.booking.app.services.UkrainianCitiesService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.util.Collections;
import java.util.List;
import java.util.Optional;

/**
* Service implementation for providing type-ahead suggestions for cities based on start letters.
Expand All @@ -22,43 +19,24 @@
@RequiredArgsConstructor
public class TypeAheadServiceImpl implements TypeAheadService {

private final UkrPlacesRepository ukrPlacesRepository;

private final LanguageDetectorService languageDetectorService;
private final UkrainianCitiesService ukrainianCitiesService;

private final UkrainianPlacesMapper ukrainianPlacesMapper;
private final UkrainianCitiesMapper ukrainianCitiesMapper;

@Override
public List<CitiesDTO> findMatches(StartLettersDTO startLetters, String siteLanguage) throws IOException {
String inputLanguage = languageDetectorService.detectLanguage(startLetters.getStartLetters()).orElse(null);
if (inputLanguage == null) {
return Collections.emptyList();
}

Optional<List<UkrainianPlaces>> listOfPlaces = getListOfPlaces(startLetters.getStartLetters(), inputLanguage);

return listOfPlaces.map(places -> ukrainianPlacesMapper.toCitiesDTOList(places, inputLanguage, siteLanguage))
.orElse(Collections.emptyList());
public List<CitiesDto> findMatches(String startLetters, String siteLanguage) throws IOException {
return languageDetectorService.detectLanguage(startLetters)
.flatMap(language -> ukrainianCitiesService.getCities(startLetters, language)
.map(cities -> ukrainianCitiesMapper.toCitiesDtoList(cities, language, siteLanguage)))
.orElseGet(Collections::emptyList);
}

@Override
public Long getCityId(String city, String language) {
return getListOfPlaces(city, language)
return ukrainianCitiesService.getCities(city, language)
.map(list -> list.isEmpty() ? null : list.getFirst().getId())
.orElse(null);
}

/**
* Retrieves a list of UkrainianPlaces based on start letters and language.
*
* @param startLetters The start letters of the city name.
* @param inputLanguage The language of the city name.
* @return Optional list of UkrainianPlaces.
*/
private Optional<List<UkrainianPlaces>> getListOfPlaces(String startLetters, String inputLanguage) {
return (inputLanguage.equals("eng"))
? ukrPlacesRepository.findUkrainianPlacesByNameEngStartsWithIgnoreCaseAndNameEngNotContainingIgnoreCase(startLetters, "oblast")
: ukrPlacesRepository.findUkrainianPlacesByNameUaStartsWithIgnoreCaseAndNameUaNotContainingIgnoreCase(startLetters, "область");
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Optional;

@Service
Expand All @@ -22,4 +23,10 @@ public String getCity(Long id, String language) {
return city.orElse(null);
}

public Optional<List<UkrainianCities>> getCities(String startLetters, String inputLanguage) {
return (inputLanguage.equals("eng"))
? ukrainianCitiesRepository.findUkrainianPlacesByNameEngStartsWithIgnoreCaseAndNameEngNotContainingIgnoreCase(startLetters, "oblast")
: ukrainianCitiesRepository.findUkrainianPlacesByNameUaStartsWithIgnoreCaseAndNameUaNotContainingIgnoreCase(startLetters, "область");
}

}

0 comments on commit 0d84e8e

Please sign in to comment.