Start Schedule development
This commit is contained in:
@@ -6,23 +6,16 @@ import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.core.view.ViewCompat
|
||||
import androidx.core.view.WindowInsetsCompat
|
||||
|
||||
import ru.fincode.tsudesk.core.network.NetworkConstants
|
||||
import ru.fincode.tsudesk.core.network.RetrofitProvider
|
||||
import ru.fincode.tsudesk.core.network.NetworkModule
|
||||
import ru.fincode.tsudesk.feature.schedule.data.remote.ScheduleApi
|
||||
|
||||
|
||||
class MainActivity : AppCompatActivity() {
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
enableEdgeToEdge()
|
||||
setContentView(R.layout.activity_main)
|
||||
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
|
||||
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
|
||||
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
|
||||
insets
|
||||
}
|
||||
val okHttpClient = HttpClientProvider.provide()
|
||||
|
||||
val retrofit = RetrofitProvider.provide(
|
||||
baseUrl = NetworkConstants.BASE_URL,
|
||||
client = okHttpClient
|
||||
)
|
||||
|
||||
val api = retrofit.create(ScheduleApi::class.java)
|
||||
}
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
package ru.fincode.tsudesk.core.network
|
||||
|
||||
object HttpClientProvider {
|
||||
|
||||
fun provide(): OkHttpClient =
|
||||
OkHttpClient.Builder()
|
||||
.connectTimeout(15, TimeUnit.SECONDS)
|
||||
.readTimeout(15, TimeUnit.SECONDS)
|
||||
.build()
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
package ru.fincode.tsudesk.core.network
|
||||
|
||||
import dagger.Module
|
||||
import dagger.Provides
|
||||
import dagger.hilt.InstallIn
|
||||
import dagger.hilt.components.SingletonComponent
|
||||
import okhttp3.OkHttpClient
|
||||
import retrofit2.Retrofit
|
||||
import java.util.concurrent.TimeUnit
|
||||
import javax.inject.Singleton
|
||||
|
||||
@Module
|
||||
@InstallIn(SingletonComponent::class)
|
||||
object NetworkModule {
|
||||
|
||||
private const val TIMEOUT_SEC = 30L
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
fun provideOkHttpClient(): OkHttpClient =
|
||||
OkHttpClient.Builder()
|
||||
.connectTimeout(TIMEOUT_SEC, TimeUnit.SECONDS)
|
||||
.readTimeout(TIMEOUT_SEC, TimeUnit.SECONDS)
|
||||
.writeTimeout(TIMEOUT_SEC, TimeUnit.SECONDS)
|
||||
.retryOnConnectionFailure(true)
|
||||
.build()
|
||||
|
||||
@Provides
|
||||
fun provideRetrofit(
|
||||
provider: RetrofitProvider,
|
||||
client: OkHttpClient
|
||||
): Retrofit = provider.process(NetworkConstants.BASE_URL, client)
|
||||
|
||||
}
|
||||
@@ -1,8 +1,11 @@
|
||||
package ru.fincode.tsudesk.core.network
|
||||
|
||||
object RetrofitProvider {
|
||||
import okhttp3.OkHttpClient
|
||||
import retrofit2.Retrofit
|
||||
import retrofit2.converter.simplexml.SimpleXmlConverterFactory
|
||||
|
||||
fun provide(baseUrl: String, client: OkHttpClient): Retrofit =
|
||||
class RetrofitProvider {
|
||||
fun process(baseUrl: String, client: OkHttpClient): Retrofit =
|
||||
Retrofit.Builder()
|
||||
.baseUrl(baseUrl)
|
||||
.client(client)
|
||||
|
||||
@@ -1,25 +0,0 @@
|
||||
package ru.fincode.tsudesk.core.network.di
|
||||
|
||||
import okhttp3.OkHttpClient
|
||||
import retrofit2.Retrofit
|
||||
import ru.fincode.tsudesk.core.network.HttpClientProvider
|
||||
import ru.fincode.tsudesk.core.network.NetworkConstants
|
||||
import ru.fincode.tsudesk.core.network.RetrofitProvider
|
||||
|
||||
@Module
|
||||
@InstallIn(SingletonComponent::class)
|
||||
object NetworkModule {
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
fun provideOkHttpClient(): OkHttpClient =
|
||||
HttpClientProvider.provide()
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
fun provideRetrofit(client: OkHttpClient): Retrofit =
|
||||
RetrofitProvider.provide(
|
||||
baseUrl = NetworkConstants.BASE_URL,
|
||||
client = client
|
||||
)
|
||||
}
|
||||
@@ -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))
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
@@ -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"))
|
||||
}
|
||||
}
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
)
|
||||
}
|
||||
)
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
package ru.fincode.tsudesk.feature.schedule.data.mapper
|
||||
|
||||
class ScheduleEntityToDomainMapper {
|
||||
}
|
||||
@@ -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>
|
||||
}
|
||||
@@ -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
|
||||
)
|
||||
|
||||
@@ -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())
|
||||
}
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
package ru.fincode.tsudesk.feature.schedule.domain.model
|
||||
|
||||
class Lesson {
|
||||
}
|
||||
@@ -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
|
||||
)
|
||||
|
||||
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
package ru.fincode.tsudesk.feature.schedule.domain.model
|
||||
|
||||
class ScheduleDay {
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user