Start Schedule development

This commit is contained in:
Shcherbatykh Oleg
2026-02-10 20:20:39 +03:00
parent 2688e44436
commit 04b8164eba
19 changed files with 214 additions and 79 deletions

View File

@@ -1,4 +1,21 @@
package ru.fincode.tsudesk.feature.schedule.data
class ScheduleRepositoryImpl {
}
import ru.fincode.tsudesk.feature.schedule.data.datasource.ScheduleRemoteDataSource
import ru.fincode.tsudesk.feature.schedule.data.mapper.ScheduleDtoToDomainMapper
import ru.fincode.tsudesk.feature.schedule.domain.model.Schedule
import ru.fincode.tsudesk.feature.schedule.domain.repository.ScheduleRepository
import javax.inject.Inject
class ScheduleRepositoryImpl @Inject constructor(
private val remote: ScheduleRemoteDataSource, private val mapper: ScheduleDtoToDomainMapper
) : ScheduleRepository {
override suspend fun loadScheduleByGroup(groupNumber: String): Schedule {
return mapper.map(remote.loadScheduleByGroup(groupNumber))
}
override suspend fun loadScheduleByTeacher(teacherName: String): Schedule {
return mapper.map(remote.loadScheduleByTeacher(teacherName))
}
}

View File

@@ -1,4 +1,10 @@
package ru.fincode.tsudesk.feature.schedule.data.datasource
class ScheduleLocalDataSource {
}
import ru.fincode.tsudesk.feature.schedule.data.local.ScheduleEntity
import ru.fincode.tsudesk.feature.schedule.data.remote.ScheduleDto
interface ScheduleLocalDataSource {
suspend fun getScheduleByGroup(groupNumber: String): ScheduleEntity?
suspend fun getScheduleByTeacherName(teacherName: String): ScheduleEntity?
suspend fun saveSchedule(entity: ScheduleEntity)
}

View File

@@ -1,4 +1,20 @@
package ru.fincode.tsudesk.feature.schedule.data.datasource
class ScheduleRemoteDataSource {
}
import ru.fincode.tsudesk.feature.schedule.data.remote.ScheduleApi
import ru.fincode.tsudesk.feature.schedule.data.remote.ScheduleDto
import ru.fincode.tsudesk.feature.schedule.data.remote.ScheduleXmlParser
import java.io.IOException
class ScheduleRemoteDataSource(
private val api: ScheduleApi, private val xmlParser: ScheduleXmlParser
) {
suspend fun loadScheduleByGroup(groupNumber: String): ScheduleDto {
val response = api.getScheduleByGroup(groupNumber)
return xmlParser.parse(response.body() ?: throw IOException("Response body is null"))
}
suspend fun loadScheduleByTeacher(name: String): ScheduleDto {
val response = api.getScheduleByTeacherName(name)
return xmlParser.parse(response.body() ?: throw IOException("Response body is null"))
}
}

View File

@@ -0,0 +1,20 @@
package ru.fincode.tsudesk.feature.schedule.data.datasource
import ru.fincode.tsudesk.feature.schedule.data.mapper.ScheduleDtoToDomainMapper
import ru.fincode.tsudesk.feature.schedule.domain.model.Schedule
import ru.fincode.tsudesk.feature.schedule.domain.repository.ScheduleRepository
import javax.inject.Inject
class ScheduleRepositoryImpl @Inject constructor(
private val remote: ScheduleRemoteDataSource,
private val mapper: ScheduleDtoToDomainMapper
) : ScheduleRepository {
override suspend fun loadScheduleByGroup(groupNumber: String): Schedule {
return mapper.map(remote.loadScheduleByGroup(groupNumber));
}
override suspend fun loadScheduleByTeacher(teacherName: String): Schedule {
return mapper.map(remote.loadScheduleByTeacher(teacherName));
}
}

View File

@@ -1,4 +1,23 @@
package ru.fincode.tsudesk.feature.schedule.data.mapper
import ru.fincode.tsudesk.feature.schedule.data.remote.ScheduleDto
import ru.fincode.tsudesk.feature.schedule.domain.model.Lesson
import ru.fincode.tsudesk.feature.schedule.domain.model.Schedule
class ScheduleDtoToDomainMapper {
}
fun map(dto: ScheduleDto): Schedule =
Schedule(
lessons = dto.lessons.map { l ->
Lesson(
dayOfWeek = l.dayOfWeek,
dayName = l.dayName,
weekType = l.weekType,
time = l.time,
room = l.room,
subjectName = l.subjectName,
teacherName = l.teacherName
)
}
)
}

View File

@@ -1,4 +0,0 @@
package ru.fincode.tsudesk.feature.schedule.data.mapper
class ScheduleEntityToDomainMapper {
}

View File

@@ -1,4 +1,18 @@
package ru.fincode.tsudesk.feature.schedule.data.remote
class ScheduleApi {
}
import okhttp3.ResponseBody
import retrofit2.Response
import retrofit2.http.GET
import retrofit2.http.Query
interface ScheduleApi {
@GET("schedule")
suspend fun getScheduleByGroup(
@Query("group") groupNumber: String
): Response<ResponseBody>
@GET("schedule")
suspend fun getScheduleByTeacherName(
@Query("fio") teacherName: String
): Response<ResponseBody>
}

View File

@@ -1,4 +1,15 @@
package ru.fincode.tsudesk.feature.schedule.data.remote
class ScheduleDto {
}
data class ScheduleDto(
val lessons: List<LessonDto>
)
data class LessonDto(
val dayOfWeek: String,
val dayName: String,
val time: String,
val room: String,
val subjectName: String,
val teacherName: String,
val weekType: Int
)

View File

@@ -1,4 +1,15 @@
package ru.fincode.tsudesk.feature.schedule.data.remote
class ScheduleXmlParser {
}
import okhttp3.ResponseBody
interface ScheduleXmlParser {
fun parse(body: ResponseBody): ScheduleDto
}
class ScheduleXmlParserImpl : ScheduleXmlParser {
override fun parse(body: ResponseBody): ScheduleDto {
val xml = body.string()
return ScheduleDto(lessons = emptyList())
}
}

View File

@@ -1,4 +0,0 @@
package ru.fincode.tsudesk.feature.schedule.domain.model
class Lesson {
}

View File

@@ -1,4 +1,17 @@
package ru.fincode.tsudesk.feature.schedule.domain.model
class Schedule {
}
data class Schedule(
val lessons: List<Lesson>
)
data class Lesson(
val dayOfWeek: String,
val dayName: String,
val time: String,
val room: String,
val subjectName: String,
val teacherName: String,
val weekType: Int
)

View File

@@ -1,4 +0,0 @@
package ru.fincode.tsudesk.feature.schedule.domain.model
class ScheduleDay {
}

View File

@@ -3,5 +3,6 @@ package ru.fincode.tsudesk.feature.schedule.domain.repository
import ru.fincode.tsudesk.feature.schedule.domain.model.Schedule
interface ScheduleRepository {
suspend fun getSchedule(groupId: String): Schedule
}
suspend fun loadScheduleByGroup(groupNumber: String): Schedule
suspend fun loadScheduleByTeacher(teacherName: String): Schedule
}

View File

@@ -0,0 +1,24 @@
package ru.fincode.tsudesk.feature.schedule.domain.repository
import ru.fincode.tsudesk.feature.schedule.data.datasource.ScheduleLocalDataSource
import ru.fincode.tsudesk.feature.schedule.data.datasource.ScheduleRemoteDataSource
import ru.fincode.tsudesk.feature.schedule.data.mapper.ScheduleDtoToDomainMapper
import ru.fincode.tsudesk.feature.schedule.domain.model.Schedule
import javax.inject.Inject
class ScheduleRepositoryImpl @Inject constructor(
private val remoteDataSource: ScheduleRemoteDataSource,
private val localDataSource: ScheduleLocalDataSource,
private val mapper: ScheduleDtoToDomainMapper
) : ScheduleRepository {
override suspend fun loadScheduleByGroup(groupNumber: String): Schedule {
val dto = remoteDataSource.loadScheduleByGroup(groupNumber)
return mapper.map(dto)
}
override suspend fun loadScheduleByTeacher(teacherName: String): Schedule {
val dto = remoteDataSource.loadScheduleByTeacher(teacherName)
return mapper.map(dto)
}
}