MeilCli/FoodSearch

View on GitHub
features/base/src/main/kotlin/net/meilcli/foodsearch/services/GnaviService.kt

Summary

Maintainability
A
0 mins
Test Coverage
package net.meilcli.foodsearch.services

import net.meilcli.foodsearch.Language
import net.meilcli.foodsearch.api.gnavi.*
import net.meilcli.foodsearch.api.gnavi.entities.*
import net.meilcli.foodsearch.models.RestaurantRequestModel

class GnaviService(private val configurationService: IConfigurationService) : IGnaviService {

    private var largeCategoriesCache: List<LargeCategory>? = null
    private var smallCategoriesCache: List<SmallCategory>? = null
    private var prefectureAreaCache: List<PrefectureArea>? = null
    private var largeAreaCache: List<LargeArea>? = null
    private var middleAreaCache: List<MiddleArea>? = null
    private var smallAreaCache: List<SmallArea>? = null

    override fun createRestaurantRequestModel(): RestaurantRequestModel {
        return when (val language = configurationService.currentLanguage) {
            Language.Japanese -> RestaurantRequestModel.Japanese(RestaurantRequestQuery())
            Language.English -> RestaurantRequestModel.Foreign(ForeignRestaurantRequestQuery(), language)
        }
    }

    override fun createRestaurantRequestModel(id: String): RestaurantRequestModel {
        return when (val language = configurationService.currentLanguage) {
            Language.Japanese -> RestaurantRequestModel.Japanese(RestaurantRequestQuery(), id)
            Language.English -> RestaurantRequestModel.Foreign(ForeignRestaurantRequestQuery(), id, language)
        }
    }

    override fun createRestaurantRequestModel(ids: Array<String>): RestaurantRequestModel {
        return when (val language = configurationService.currentLanguage) {
            Language.Japanese -> RestaurantRequestModel.Japanese(RestaurantRequestQuery(), ids)
            Language.English -> RestaurantRequestModel.Foreign(ForeignRestaurantRequestQuery(), ids, language)
        }
    }

    override fun createRestaurantRequestModel(
        largeArea: LargeArea,
        middleArea: MiddleArea,
        smallArea: SmallArea
    ): RestaurantRequestModel {
        return when (val language = configurationService.currentLanguage) {
            Language.Japanese -> RestaurantRequestModel.Japanese(
                RestaurantRequestQuery(),
                largeArea,
                middleArea,
                smallArea
            )
            Language.English -> RestaurantRequestModel.Foreign(
                ForeignRestaurantRequestQuery(),
                largeArea,
                middleArea,
                smallArea,
                language
            )
        }
    }

    override fun createRestaurantRequestModel(latitude: Double, longitude: Double): RestaurantRequestModel {
        return when (val language = configurationService.currentLanguage) {
            Language.Japanese -> RestaurantRequestModel.Japanese(
                RestaurantRequestQuery(),
                latitude = latitude,
                longitude = longitude
            )
            Language.English -> RestaurantRequestModel.Foreign(
                ForeignRestaurantRequestQuery(),
                latitude = latitude,
                longitude = longitude,
                language = language
            )
        }
    }

    override suspend fun searchRestaurant(requestModel: RestaurantRequestModel): ISearchResponse<IRestaurant> {
        return when (requestModel) {
            is RestaurantRequestModel.Japanese -> GnaviApiClient.searchRestaurant(requestModel.requestQuery)
            is RestaurantRequestModel.Foreign -> GnaviApiClient.searchForeignRestaurant(requestModel.requestQuery)
        }
    }

    private fun createCategoryRequestQuery(): CategoryRequestQuery {
        return CategoryRequestQuery().apply {
            language = configurationService.currentLanguage.toGnaviLanguage()
        }
    }

    private fun createAreaRequestQuery(): AreaRequestQuery {
        return AreaRequestQuery().apply {
            language = configurationService.currentLanguage.toGnaviLanguage()
        }
    }

    override suspend fun getLargeCategories(): List<LargeCategory> {
        val largeCategories =
            largeCategoriesCache ?: GnaviApiClient.getLargeCategories(createCategoryRequestQuery()).largeCategories
        largeCategoriesCache = largeCategories
        return largeCategories
    }

    override suspend fun getSmallCategories(): List<SmallCategory> {
        val smallCategories =
            smallCategoriesCache ?: GnaviApiClient.getSmallCategories(createCategoryRequestQuery()).smallCategories
        smallCategoriesCache = smallCategories
        return smallCategories
    }

    override suspend fun getPrefectureArea(): List<PrefectureArea> {
        val prefectureArea =
            prefectureAreaCache ?: GnaviApiClient.getPrefectureArea(createAreaRequestQuery()).prefectureArea
        prefectureAreaCache = prefectureArea
        return prefectureArea
    }

    override suspend fun getLargeArea(prefectureArea: PrefectureArea): List<LargeArea> {
        val largeArea = largeAreaCache ?: GnaviApiClient.getLargeArea(createAreaRequestQuery()).largeArea
        largeAreaCache = largeArea
        return largeArea.filter { it.prefectureArea.code == prefectureArea.code }
    }

    override suspend fun getMiddleArea(largeArea: LargeArea): List<MiddleArea> {
        val middleArea = middleAreaCache ?: GnaviApiClient.getMiddleArea(createAreaRequestQuery()).middleArea
        middleAreaCache = middleArea
        return middleArea.filter { it.largeArea.code == largeArea.code }
    }

    override suspend fun getSmallArea(middleArea: MiddleArea): List<SmallArea> {
        val smallArea = smallAreaCache ?: GnaviApiClient.getSmallArea(createAreaRequestQuery()).smallArea
        smallAreaCache = smallArea
        return smallArea.filter { it.middleArea.code == middleArea.code }
    }
}