Skip to content

Commit

Permalink
Merge pull request #277 from 6QuizOnTheBlock/and/feat#275-student_rel…
Browse files Browse the repository at this point in the history
…ay_main

And/feat#275 학생 릴레이 메인화면 기능
  • Loading branch information
ghddbwns9808 authored May 12, 2024
2 parents 1956651 + 232b21e commit 491ee9b
Show file tree
Hide file tree
Showing 16 changed files with 322 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,5 @@ data class RunningRelay(
val startTime: LocalDateTime = LocalDateTime.now(),
val endTime: LocalDateTime = LocalDateTime.now(),
val curMemberNickname: String = "",
val myTurnStatus : Boolean = false,
val lastTurnMemberName: String = ""
val myTurnStatus : Boolean = false
)
24 changes: 24 additions & 0 deletions android/data/src/main/java/com/sixkids/data/api/RelayService.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.sixkids.data.api

import com.sixkids.data.model.response.RelayHistoryResponse
import com.sixkids.data.model.response.RunningRelayResponse
import com.sixkids.data.network.ApiResponse
import com.sixkids.data.network.ApiResult
import retrofit2.http.GET
import retrofit2.http.Query

interface RelayService {

@GET("relays")
suspend fun getRelayHistory(
@Query("orgId") organizationId: Int,
@Query("memberId") memberId: Int? = null,
@Query("page") page: Int,
@Query("size") size: Int,
): ApiResult<ApiResponse<RelayHistoryResponse>>

@GET("relays/running")
suspend fun getRunningRelay(
@Query("organizationId") organizationId: Long
): ApiResult<ApiResponse<RunningRelayResponse>>
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ import com.sixkids.data.repository.organization.local.OrganizationLocalDataSourc
import com.sixkids.data.repository.organization.local.OrganizationLocalDataSourceImpl
import com.sixkids.data.repository.post.remote.PostRemoteDataSource
import com.sixkids.data.repository.post.remote.PostRemoteDataSourceImpl
import com.sixkids.data.repository.relay.remote.RelayRemoteDataSource
import com.sixkids.data.repository.relay.remote.RelayRemoteDataSourceImpl
import dagger.Binds
import dagger.Module
import dagger.hilt.InstallIn
Expand Down Expand Up @@ -63,4 +65,9 @@ abstract class DataSourceModule {
abstract fun bindChattingRemoteDataSource(
chattingRemoteDataSource: ChattingRemoteDataSourceImpl
): ChattingRemoteDataSource

@Binds
abstract fun bindRelayRemoteDataSource(
relayRemoteDataSource: RelayRemoteDataSourceImpl
): RelayRemoteDataSource
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,14 @@ import com.sixkids.data.repository.comment.CommentRepositoryImpl
import com.sixkids.data.repository.chatting.ChattingRepositoryImpl
import com.sixkids.data.repository.organization.OrganizationRepositoryImpl
import com.sixkids.data.repository.post.PostRepositoryImpl
import com.sixkids.data.repository.relay.RelayRepositoryImpl
import com.sixkids.domain.repository.ChallengeRepository
import com.sixkids.data.repository.user.UserRepositoryImpl
import com.sixkids.domain.repository.CommentRepository
import com.sixkids.domain.repository.ChattingRepository
import com.sixkids.domain.repository.OrganizationRepository
import com.sixkids.domain.repository.PostRepository
import com.sixkids.domain.repository.RelayRepository
import com.sixkids.domain.repository.TokenRepository
import com.sixkids.domain.repository.UserRepository
import dagger.Binds
Expand Down Expand Up @@ -65,4 +67,10 @@ abstract class RepositoryModule {
abstract fun bindChattingRepository(
chattingRepository: ChattingRepositoryImpl
): ChattingRepository

@Singleton
@Binds
abstract fun bindRelayRepository(
relayRepository: RelayRepositoryImpl
): RelayRepository
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import com.sixkids.data.api.ChattingService
import com.sixkids.data.api.MemberService
import com.sixkids.data.api.OrganizationService
import com.sixkids.data.api.PostService
import com.sixkids.data.api.RelayService
import com.sixkids.data.api.SignInService
import com.sixkids.data.api.TokenService
import dagger.Module
Expand Down Expand Up @@ -83,4 +84,12 @@ object ServiceModule {
return retrofit.create(ChattingService::class.java)
}

@Singleton
@Provides
fun provideRelayService(
@NetworkModule.AuthRetrofit retrofit: Retrofit
): RelayService {
return retrofit.create(RelayService::class.java)
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.sixkids.data.model.response

import com.sixkids.model.Relay
import java.time.LocalDateTime

data class RelayHistoryResponse(
val page: Int,
val size: Int,
val last: Boolean,
val relays: List<RelayResponse>
)

data class RelayResponse(
val id : Long,
val startTime : LocalDateTime = LocalDateTime.now(),
val endTime : LocalDateTime = LocalDateTime.now(),
val lastTurn : Int,
val lastMemberName : String
)

internal fun RelayResponse.toModel() = Relay(
id = id,
startTime = startTime,
endTime = endTime,
lastTurn = lastTurn,
lastMemberName = lastMemberName
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.sixkids.data.model.response

import com.sixkids.model.RunningRelay
import java.time.LocalDateTime

data class RunningRelayResponse(
val id: Long,
val startTime: LocalDateTime = LocalDateTime.now(),
val currentMemberName : String,
val currentTurn : Int,
val totalTurn : Int,
val myTurnStatus : Boolean
)

internal fun RunningRelayResponse.toModel() = RunningRelay(
id = id,
startTime = startTime,
curMemberNickname = currentMemberName,
doneMemberCount = currentTurn,
totalMemberCount = totalTurn,
myTurnStatus = myTurnStatus
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.sixkids.data.repository.relay

import androidx.paging.Pager
import androidx.paging.PagingConfig
import androidx.paging.PagingData
import com.sixkids.data.api.RelayService
import com.sixkids.data.repository.relay.remote.RelayHistoryPagingSource
import com.sixkids.data.repository.relay.remote.RelayRemoteDataSource
import com.sixkids.domain.repository.RelayRepository
import com.sixkids.model.Relay
import com.sixkids.model.RunningRelay
import kotlinx.coroutines.flow.Flow
import javax.inject.Inject

class RelayRepositoryImpl @Inject constructor(
private val relayService: RelayService,
private val relayRemoteDataSource: RelayRemoteDataSource
) : RelayRepository{

override suspend fun getRelayHistory(
organizationId: Int,
memberId: Int?,
): Flow<PagingData<Relay>> =
Pager(
config = PagingConfig(RelayHistoryPagingSource.DEFAULT_SIZE),
pagingSourceFactory = {
RelayHistoryPagingSource(
relayService,
organizationId,
memberId,
)
}
).flow

override suspend fun getRunningRelay(organizationId: Long): RunningRelay {
return relayRemoteDataSource.getRunningRelay(organizationId)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package com.sixkids.data.repository.relay.remote

import androidx.paging.PagingSource
import androidx.paging.PagingState
import com.sixkids.data.api.RelayService
import com.sixkids.data.model.response.toModel
import com.sixkids.model.Relay
import javax.inject.Inject

class RelayHistoryPagingSource @Inject constructor(
private val relayService: RelayService,
private val organizationId: Int,
private val memberId: Int? = null,
) : PagingSource<Int, Relay>() {
override fun getRefreshKey(state: PagingState<Int, Relay>): Int? {
return state.anchorPosition?.let { anchorPosition ->
state.closestPageToPosition(anchorPosition)?.prevKey?.plus(1)
?: state.closestPageToPosition(anchorPosition)?.nextKey?.minus(1)
}
}

override suspend fun load(params: LoadParams<Int>): LoadResult<Int, Relay> {
val page = params.key ?: 0
return try {

val response = relayService.getRelayHistory(
organizationId,
memberId,
page,
DEFAULT_SIZE
)
val challengeHistory = response.getOrThrow().data.relays.map { it.toModel() }

LoadResult.Page(
data = challengeHistory,
prevKey = if (page == 0) null else page.minus(1),
nextKey = if (challengeHistory.isEmpty()) null else page.plus(1)
)
} catch (e: Exception) {
LoadResult.Error(e)
}
}

companion object {
const val DEFAULT_SIZE = 10
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.sixkids.data.repository.relay.remote

import com.sixkids.model.RunningRelay

interface RelayRemoteDataSource {
suspend fun getRunningRelay(organizationId: Long) : RunningRelay
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.sixkids.data.repository.relay.remote

import com.sixkids.data.api.RelayService
import com.sixkids.data.model.response.toModel
import com.sixkids.model.RunningRelay
import javax.inject.Inject

class RelayRemoteDataSourceImpl @Inject constructor(
private val relayService: RelayService
) : RelayRemoteDataSource{
override suspend fun getRunningRelay(organizationId: Long) : RunningRelay =
relayService.getRunningRelay(organizationId).getOrThrow().data.toModel()

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.sixkids.domain.repository

import androidx.paging.PagingData
import com.sixkids.model.Relay
import com.sixkids.model.RunningRelay
import kotlinx.coroutines.flow.Flow

interface RelayRepository {
suspend fun getRelayHistory(
organizationId: Int,
memberId: Int?
): Flow<PagingData<Relay>>

suspend fun getRunningRelay(organizationId: Long): RunningRelay
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.sixkids.domain.usecase.relay

import com.sixkids.domain.repository.RelayRepository
import javax.inject.Inject

class GetRelayHistoryUseCase @Inject constructor(
private val relayRepository: RelayRepository)
{

suspend operator fun invoke(
organizationId: Int,
memberId: Int? = null
) = relayRepository.getRelayHistory(organizationId, memberId)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.sixkids.domain.usecase.relay

import com.sixkids.domain.repository.RelayRepository
import javax.inject.Inject

class GetRunningRelayUseCase @Inject constructor(
private val relayRepository: RelayRepository
){
suspend operator fun invoke(organizationId: Long) = runCatching {
relayRepository.getRunningRelay(organizationId)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,11 @@ import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.paging.compose.LazyPagingItems
import androidx.paging.compose.collectAsLazyPagingItems
import com.sixkids.designsystem.component.appbar.UlbanDefaultAppBar
import com.sixkids.designsystem.component.appbar.UlbanDetailAppBar
import com.sixkids.designsystem.component.item.UlbanRelayItem
import com.sixkids.designsystem.component.screen.LoadingScreen
import com.sixkids.designsystem.theme.Orange
import com.sixkids.designsystem.theme.UlbanTheme
import com.sixkids.designsystem.theme.UlbanTypography
Expand Down Expand Up @@ -72,7 +74,7 @@ fun RelayRoute(

RelayHistoryScreen(
uiState = uiState,
relayItems = null,
relayItems = viewModel.relayHistory?.collectAsLazyPagingItems(),
navigateToDetail = { relayId ->
// viewModel.navigateRelayDetail(relayId)
},
Expand Down Expand Up @@ -140,7 +142,7 @@ fun RelayHistoryScreen(
)
HorizontalDivider(modifier = Modifier.padding(vertical = 4.dp))

if (relayItems == null) {
if (relayItems == null || relayItems.itemCount == 0) {
Spacer(modifier = Modifier.weight(1f))
Text(
modifier = Modifier
Expand Down Expand Up @@ -173,6 +175,9 @@ fun RelayHistoryScreen(
}
}
}
if (uiState.isLoading) {
LoadingScreen()
}
}
}

Expand Down
Loading

0 comments on commit 491ee9b

Please sign in to comment.