feat: seprate retrofit
This commit is contained in:
@@ -0,0 +1,17 @@
|
||||
package com.approagency.drug.data.remote
|
||||
|
||||
import retrofit2.http.GET
|
||||
import retrofit2.http.Headers
|
||||
import retrofit2.http.Query
|
||||
|
||||
interface DarooyabApiService {
|
||||
@GET("Search")
|
||||
@Headers(
|
||||
"User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
|
||||
"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
|
||||
"Accept-Language: en-US,en;q=0.5"
|
||||
)
|
||||
suspend fun searchDrugs(
|
||||
@Query("SearchText") searchText: String
|
||||
): String // Returns raw HTML for the first page
|
||||
}
|
||||
@@ -28,14 +28,4 @@ interface DrugApiService {
|
||||
@GET("drugs/goroh-darmani")
|
||||
suspend fun getGorohDaroei(): DarmanModel
|
||||
|
||||
|
||||
@GET("Search")
|
||||
@Headers(
|
||||
"User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
|
||||
"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
|
||||
"Accept-Language: en-US,en;q=0.5"
|
||||
)
|
||||
suspend fun searchDrugs(
|
||||
@Query("SearchText") searchText: String
|
||||
): String // Returns raw HTML for the first page
|
||||
}
|
||||
@@ -3,12 +3,20 @@ package com.approagency.drug.data.repository
|
||||
import com.approagency.drug.data.dto.DarmanModel
|
||||
import com.approagency.drug.data.dto.DrugListResponse
|
||||
import com.approagency.drug.data.dto.DrugModels
|
||||
import com.approagency.drug.data.remote.DarooyabApiService
|
||||
import com.approagency.drug.data.remote.DrugApiService
|
||||
import com.approagency.drug.data.remote.DrugHtmlParser
|
||||
import com.approagency.drug.domain.model.DrugSearchParams
|
||||
import com.approagency.drug.domain.model.DrugSearchResult
|
||||
import com.approagency.drug.domain.repository.DrugRepository
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.withContext
|
||||
import java.io.IOException
|
||||
|
||||
class DrugRepositoryImpl(
|
||||
private val apiService: DrugApiService
|
||||
private val apiService: DrugApiService,
|
||||
private val darooyabApiService: DarooyabApiService,
|
||||
private val parser: DrugHtmlParser
|
||||
): DrugRepository {
|
||||
override suspend fun searchDrug(params: DrugSearchParams): Result<DrugListResponse> {
|
||||
return try {
|
||||
@@ -36,4 +44,28 @@ class DrugRepositoryImpl(
|
||||
Result.failure(e)
|
||||
}
|
||||
}
|
||||
|
||||
override suspend fun searchDrugs(params: DrugSearchParams): Result<List<DrugSearchResult>> {
|
||||
return withContext(Dispatchers.IO) {
|
||||
try {
|
||||
// 1. Fetch raw HTML from the website
|
||||
val htmlResponse = darooyabApiService.searchDrugs(params.query!!)
|
||||
|
||||
// 2. Parse the HTML to extract drug data
|
||||
val drugList = parser.parseSearchResults(htmlResponse)
|
||||
|
||||
if (drugList.isNotEmpty()) {
|
||||
Result.success(drugList)
|
||||
} else {
|
||||
Result.failure(Exception("No drugs found for query: '${params.query}'"))
|
||||
}
|
||||
} catch (e: IOException) {
|
||||
// Network error
|
||||
Result.failure(Exception("Network error: ${e.message}", e))
|
||||
} catch (e: Exception) {
|
||||
// Parsing or other error
|
||||
Result.failure(Exception("An error occurred: ${e.message}", e))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3,7 +3,9 @@ package com.approagency.drug.di
|
||||
|
||||
import android.app.Application
|
||||
import com.approagency.drug.data.local.database.LabDatabase
|
||||
import com.approagency.drug.data.remote.DarooyabApiService
|
||||
import com.approagency.drug.data.remote.DrugApiService
|
||||
import com.approagency.drug.data.remote.DrugHtmlParser
|
||||
import com.approagency.drug.data.repository.DrugRepositoryImpl
|
||||
import com.approagency.drug.data.repository.LabRepositoryImpl
|
||||
import com.approagency.drug.domain.repository.DrugRepository
|
||||
@@ -12,15 +14,19 @@ import com.approagency.drug.domain.usecase.GetDrugDetailUseCase
|
||||
import com.approagency.drug.domain.usecase.GetDrugSearchUseCase
|
||||
import com.approagency.drug.domain.usecase.GetTestGroupUseCase
|
||||
import com.approagency.drug.domain.usecase.GetTestItemByGroupId
|
||||
import com.approagency.drug.domain.usecase.SearchDrugsYabUseCase
|
||||
import com.approagency.drug.domain.usecase.SearchTestsUseCase
|
||||
import com.approagency.drug.presentation.viewModel.HomeViewModel
|
||||
import com.approagency.drug.presentation.viewModel.LabViewModel
|
||||
import com.approagency.drug.utils.Config
|
||||
import okhttp3.OkHttpClient
|
||||
import okhttp3.logging.HttpLoggingInterceptor
|
||||
import org.koin.android.ext.koin.androidContext
|
||||
import org.koin.core.module.dsl.viewModel
|
||||
import org.koin.dsl.module
|
||||
import retrofit2.Retrofit
|
||||
import retrofit2.converter.gson.GsonConverterFactory
|
||||
import java.util.concurrent.TimeUnit
|
||||
|
||||
val appModule= module {
|
||||
|
||||
@@ -29,19 +35,47 @@ val appModule= module {
|
||||
single { get<LabDatabase>().testGroupDao() }
|
||||
single { get<LabDatabase>().testItemDao() }
|
||||
|
||||
single {
|
||||
OkHttpClient.Builder()
|
||||
.addInterceptor(HttpLoggingInterceptor().apply {
|
||||
level = HttpLoggingInterceptor.Level.BASIC
|
||||
})
|
||||
.connectTimeout(30, TimeUnit.SECONDS)
|
||||
.readTimeout(30, TimeUnit.SECONDS)
|
||||
.build()
|
||||
}
|
||||
|
||||
// ========== Retrofit for YOUR API ==========
|
||||
single {
|
||||
Retrofit.Builder()
|
||||
.baseUrl(Config.BASE_URL)
|
||||
.client(get<OkHttpClient>())
|
||||
.addConverterFactory(GsonConverterFactory.create())
|
||||
.build()
|
||||
}
|
||||
|
||||
single<DrugApiService> {
|
||||
get<Retrofit>().create(DrugApiService::class.java)
|
||||
}
|
||||
|
||||
// ========== Retrofit for DAROOYAB Website API ==========
|
||||
single {
|
||||
Retrofit.Builder()
|
||||
.baseUrl(Config.Darro_Url) // Darooyab base URL
|
||||
.client(get<OkHttpClient>())
|
||||
.addConverterFactory(GsonConverterFactory.create())
|
||||
.build()
|
||||
.let { retrofit ->
|
||||
retrofit.create(DarooyabApiService::class.java)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
factory { DrugHtmlParser() }
|
||||
|
||||
//repo
|
||||
single<DrugRepository> {
|
||||
DrugRepositoryImpl(get())
|
||||
DrugRepositoryImpl(get<DrugApiService>() , get<DarooyabApiService>() , get())
|
||||
}
|
||||
|
||||
|
||||
@@ -52,6 +86,10 @@ val appModule= module {
|
||||
|
||||
}
|
||||
|
||||
single {
|
||||
SearchDrugsYabUseCase(get())
|
||||
}
|
||||
|
||||
single{
|
||||
GetDrugDetailUseCase(get())
|
||||
}
|
||||
|
||||
@@ -4,9 +4,11 @@ import com.approagency.drug.data.dto.DarmanModel
|
||||
import com.approagency.drug.data.dto.DrugListResponse
|
||||
import com.approagency.drug.data.dto.DrugModels
|
||||
import com.approagency.drug.domain.model.DrugSearchParams
|
||||
import com.approagency.drug.domain.model.DrugSearchResult
|
||||
|
||||
interface DrugRepository {
|
||||
suspend fun searchDrug(params: DrugSearchParams): Result<DrugListResponse>
|
||||
suspend fun drugDetail(cod:Int): Result<DrugModels>
|
||||
suspend fun getGorohDaroei(): Result<DarmanModel>
|
||||
suspend fun searchDrugs(params:DrugSearchParams):Result<List<DrugSearchResult>>
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package com.approagency.drug.domain.usecase
|
||||
|
||||
import com.approagency.drug.data.repository.DrugRepositoryImpl
|
||||
import com.approagency.drug.domain.model.DrugSearchParams
|
||||
import com.approagency.drug.domain.model.DrugSearchResult
|
||||
import com.approagency.drug.domain.repository.DrugRepository
|
||||
|
||||
class SearchDrugsYabUseCase (
|
||||
private val repository: DrugRepository
|
||||
) {
|
||||
suspend operator fun invoke(query: String): Result<List<DrugSearchResult>> {
|
||||
val params = DrugSearchParams(query = query)
|
||||
return repository.searchDrugs(params)
|
||||
}
|
||||
}
|
||||
@@ -2,4 +2,5 @@ package com.approagency.drug.utils
|
||||
|
||||
object Config {
|
||||
const val BASE_URL = "https://drug.approagency.ir/api/"
|
||||
const val Darro_Url = "https://www.darooyab.ir/"
|
||||
}
|
||||
Reference in New Issue
Block a user