Fix schedule query params, fix hilt bindings

This commit is contained in:
2026-02-12 17:31:39 +03:00
parent d157fd921e
commit 4b79a2de8f
8 changed files with 80 additions and 44 deletions

View File

@@ -1,19 +1,9 @@
package ru.fincode.tsudesk.feature.schedule.data.datasource package ru.fincode.tsudesk.feature.schedule.data.datasource
import ru.fincode.tsudesk.core.network.model.NetworkResult import ru.fincode.tsudesk.core.network.model.NetworkResult
import ru.fincode.tsudesk.core.network.safeApiCall
import ru.fincode.tsudesk.feature.schedule.data.remote.ScheduleApi
import ru.fincode.tsudesk.feature.schedule.data.remote.model.LessonDto.ScheduleSearchField.GROUP_P
import ru.fincode.tsudesk.feature.schedule.data.remote.model.LessonDto.ScheduleSearchField.PREP
import ru.fincode.tsudesk.feature.schedule.data.remote.model.ScheduleDto import ru.fincode.tsudesk.feature.schedule.data.remote.model.ScheduleDto
import javax.inject.Inject
class ScheduleRemoteDataSource @Inject constructor( interface ScheduleRemoteDataSource {
private val api: ScheduleApi suspend fun loadScheduleByGroup(number: String): NetworkResult<ScheduleDto>
) { suspend fun loadScheduleByTeacher(name: String): NetworkResult<ScheduleDto>
suspend fun loadScheduleByGroup(number: String): NetworkResult<ScheduleDto> =
safeApiCall { api.getSchedule(GROUP_P, number) }
suspend fun loadScheduleByTeacher(name: String): NetworkResult<ScheduleDto> =
safeApiCall { api.getSchedule(PREP, name) }
} }

View File

@@ -1,21 +0,0 @@
package ru.fincode.tsudesk.feature.schedule.data.datasource
import ru.fincode.tsudesk.core.network.model.NetworkResult
import ru.fincode.tsudesk.core.network.model.map
import ru.fincode.tsudesk.feature.schedule.data.mapper.ScheduleDtoToDomainMapper
import ru.fincode.tsudesk.feature.schedule.domain.model.ScheduleEntity
import ru.fincode.tsudesk.feature.schedule.domain.repository.ScheduleRepository
import javax.inject.Inject
class ScheduleRemoteDataSourceImpl @Inject constructor(
private val remote: ScheduleRemoteDataSource,
private val mapper: ScheduleDtoToDomainMapper
) : ScheduleRepository {
override suspend fun loadScheduleByGroup(number: String): NetworkResult<ScheduleEntity> =
remote.loadScheduleByGroup(number).map(mapper::invoke)
override suspend fun loadScheduleByTeacher(name: String): NetworkResult<ScheduleEntity> =
remote.loadScheduleByTeacher(name).map(mapper::invoke)
}

View File

@@ -2,7 +2,7 @@ package ru.fincode.tsudesk.feature.schedule.data.mapper
import ru.fincode.tsudesk.feature.schedule.data.remote.model.LessonDto import ru.fincode.tsudesk.feature.schedule.data.remote.model.LessonDto
import ru.fincode.tsudesk.feature.schedule.data.remote.model.ScheduleDto import ru.fincode.tsudesk.feature.schedule.data.remote.model.ScheduleDto
import ru.fincode.tsudesk.feature.schedule.domain.model.Lesson import ru.fincode.tsudesk.feature.schedule.domain.model.LessonEntity
import ru.fincode.tsudesk.feature.schedule.domain.model.ScheduleEntity import ru.fincode.tsudesk.feature.schedule.domain.model.ScheduleEntity
import javax.inject.Inject import javax.inject.Inject
@@ -11,8 +11,8 @@ class ScheduleDtoToDomainMapper @Inject constructor() {
operator fun invoke(dto: ScheduleDto): ScheduleEntity = operator fun invoke(dto: ScheduleDto): ScheduleEntity =
ScheduleEntity(lessons = dto.map(::mapLesson)) ScheduleEntity(lessons = dto.map(::mapLesson))
private fun mapLesson(item: LessonDto): Lesson = private fun mapLesson(item: LessonDto): LessonEntity =
Lesson( LessonEntity(
date = item.date.trim(), date = item.date.trim(),
time = item.time.trim(), time = item.time.trim(),
subject = item.discipline.trim(), subject = item.discipline.trim(),

View File

@@ -2,8 +2,10 @@ package ru.fincode.tsudesk.feature.schedule.data.remote
import retrofit2.http.GET import retrofit2.http.GET
import retrofit2.http.Query import retrofit2.http.Query
import ru.fincode.tsudesk.feature.schedule.data.remote.model.LessonDto import ru.fincode.tsudesk.feature.schedule.data.remote.ScheduleApiContract.Path.GET_SCHEDULE_METHOD
import ru.fincode.tsudesk.feature.schedule.data.remote.model.LessonDto.* import ru.fincode.tsudesk.feature.schedule.data.remote.ScheduleApiContract.Query.SEARCH_FIELD
import ru.fincode.tsudesk.feature.schedule.data.remote.ScheduleApiContract.Query.SEARCH_VALUE
import ru.fincode.tsudesk.feature.schedule.data.remote.model.ScheduleDto import ru.fincode.tsudesk.feature.schedule.data.remote.model.ScheduleDto
interface ScheduleApi { interface ScheduleApi {
@@ -20,9 +22,10 @@ interface ScheduleApi {
* Важно: Retrofit сам URL-энкодит параметр search_value * Важно: Retrofit сам URL-энкодит параметр search_value
* https://tulsu.ru/schedule/queries/GetDates.php?search_value=%D0%9D%D0%B0%D0%B1%D1%80%D0%BE%D0%B4%D0%BE%D0%B2%D0%B0%20%D0%98%D1%80%D0%B8%D0%BD%D0%B0%20%D0%9D%D0%B8%D0%BA%D0%BE%D0%BB%D0%B0%D0%B5%D0%B2%D0%BD%D0%B0 * https://tulsu.ru/schedule/queries/GetDates.php?search_value=%D0%9D%D0%B0%D0%B1%D1%80%D0%BE%D0%B4%D0%BE%D0%B2%D0%B0%20%D0%98%D1%80%D0%B8%D0%BD%D0%B0%20%D0%9D%D0%B8%D0%BA%D0%BE%D0%BB%D0%B0%D0%B5%D0%B2%D0%BD%D0%B0
*/ */
@GET("GetSchedule.php") @GET(GET_SCHEDULE_METHOD)
suspend fun getSchedule( suspend fun getSchedule(
@Query("search_field") searchField: String, @Query(SEARCH_FIELD) searchField: String,
@Query("search_value") searchValue: String @Query(SEARCH_VALUE) searchValue: String
): ScheduleDto ): ScheduleDto
} }

View File

@@ -0,0 +1,16 @@
package ru.fincode.tsudesk.feature.schedule.data.remote
object ScheduleApiContract {
object Path {
const val GET_SCHEDULE_METHOD = "GetSchedule.php"
}
object Query {
const val SEARCH_FIELD = "search_field"
const val SEARCH_VALUE = "search_value"
const val FIELD_GROUP = "GROUP_P"
const val FIELD_TEACHER = "PREP"
}
}

View File

@@ -0,0 +1,28 @@
package ru.fincode.tsudesk.feature.schedule.data.remote
import ru.fincode.tsudesk.core.network.model.NetworkResult
import ru.fincode.tsudesk.core.network.safeApiCall
import ru.fincode.tsudesk.feature.schedule.data.datasource.ScheduleRemoteDataSource
import ru.fincode.tsudesk.feature.schedule.data.remote.model.ScheduleDto
import javax.inject.Inject
class ScheduleRemoteDataSourceImpl @Inject constructor(
private val api: ScheduleApi
) : ScheduleRemoteDataSource {
override suspend fun loadScheduleByGroup(number: String): NetworkResult<ScheduleDto> =
safeApiCall {
api.getSchedule(
searchField = ScheduleApiContract.Query.FIELD_GROUP,
searchValue = number
)
}
override suspend fun loadScheduleByTeacher(name: String): NetworkResult<ScheduleDto> =
safeApiCall {
api.getSchedule(
searchField = ScheduleApiContract.Query.FIELD_TEACHER,
searchValue = name
)
}
}

View File

@@ -0,0 +1,20 @@
package ru.fincode.tsudesk.feature.schedule.di
import dagger.Binds
import dagger.Module
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import ru.fincode.tsudesk.feature.schedule.data.datasource.ScheduleRemoteDataSource
import ru.fincode.tsudesk.feature.schedule.data.remote.ScheduleRemoteDataSourceImpl
import javax.inject.Singleton
@Module
@InstallIn(SingletonComponent::class)
abstract class ScheduleRemoteDataSourceModule {
@Binds
@Singleton
abstract fun bindScheduleRemoteDataSource(
impl: ScheduleRemoteDataSourceImpl
): ScheduleRemoteDataSource
}

View File

@@ -1,10 +1,10 @@
package ru.fincode.tsudesk.feature.schedule.domain.model package ru.fincode.tsudesk.feature.schedule.domain.model
data class ScheduleEntity( data class ScheduleEntity(
val lessons: List<Lesson> val lessons: List<LessonEntity>
) )
data class Lesson( data class LessonEntity(
val date: String, // "12.01.2026" val date: String, // "12.01.2026"
val time: String, // "11:00 - 13:55" val time: String, // "11:00 - 13:55"
val subject: String, // discipline val subject: String, // discipline