Skip to content

Commit

Permalink
[feat] #61 subjectInfoUseCase 연결
Browse files Browse the repository at this point in the history
  • Loading branch information
beom84 committed Jan 23, 2025
1 parent 10777dc commit 512d08f
Show file tree
Hide file tree
Showing 18 changed files with 344 additions and 145 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package org.android.bbangzip.data.datasource.remote

import org.android.bbangzip.data.dto.response.ResponseSubjectFilterDto
import org.android.bbangzip.data.service.SubjectService
import org.android.bbangzip.data.util.base.BaseResponse
import javax.inject.Inject

class SubjectRemoteDataSource @Inject constructor(private val subjectService: SubjectService) {
suspend fun getSubjectInfo():BaseResponse<ResponseSubjectFilterDto?> = subjectService.getSubjectInfo()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package org.android.bbangzip.data.dto.response


import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import org.android.bbangzip.domain.model.SubjectCardDetailTodoInfoEntity
import org.android.bbangzip.domain.model.SubjectCardInfoEntity
import org.android.bbangzip.domain.model.SubjectInfoEntity
import timber.log.Timber

@Serializable
data class ResponseSubjectFilterDto(
@SerialName("semester")
val semester: String,
@SerialName("subjectList")
val subjectList: List<SubjectListInfo>,
@SerialName("year")
val year: Int
) {
fun toSubjectInfoEntity() =
SubjectInfoEntity(
semester = semester,
subjectList = subjectList.map { it.toSubjectCardInfoEntity() },
year = year
)
}

@Serializable
data class SubjectListInfo(
@SerialName("studyList")
val studyList: List<SubjectStudyInfo>,
@SerialName("subjectId")
val subjectId: Int,
@SerialName("subjectName")
val subjectName: String
) {
fun toSubjectCardInfoEntity() =
SubjectCardInfoEntity(
subjectId = subjectId,
subjectName = subjectName,
studyList = studyList.filter { data ->
data.examDday < 0
}.map {
it.toSubjectCardDetailTodoInfoEntity()
}
)
}


@Serializable
data class SubjectStudyInfo(
@SerialName("examDDay")
val examDday: Int,
@SerialName("examName")
val examName: String,
@SerialName("pendingCount")
val pendingCount: Int,
@SerialName("remainingCount")
val remainingCount: Int
) {
fun toSubjectCardDetailTodoInfoEntity() =
SubjectCardDetailTodoInfoEntity(
examDday = examDday,
examName = examName,
pendingCount = pendingCount,
remainingCount = remainingCount
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package org.android.bbangzip.data.repositoryImpl.remote

import org.android.bbangzip.data.datasource.remote.ExamRemoteDataSource
import org.android.bbangzip.data.datasource.remote.SubjectRemoteDataSource
import org.android.bbangzip.domain.model.SubjectInfoEntity
import org.android.bbangzip.domain.repository.remote.ExamRepository
import org.android.bbangzip.domain.repository.remote.SubjectRepository
import javax.inject.Inject

class SubjectRepositoryImpl
@Inject
constructor(
private val subjectRemoteDataSource: SubjectRemoteDataSource,
) : SubjectRepository {
override suspend fun getSubjectInfo(): Result<SubjectInfoEntity> =
runCatching {
val response = subjectRemoteDataSource.getSubjectInfo()

val responseData = response.data ?: throw IllegalStateException(response.message ?: "Null Error")

responseData.toSubjectInfoEntity()
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package org.android.bbangzip.data.service

import org.android.bbangzip.data.dto.response.ResponseSubjectFilterDto
import org.android.bbangzip.data.util.base.BaseResponse
import retrofit2.http.GET
import retrofit2.http.Path

interface SubjectService {
@GET("/api/v1/subjects/filter?year=2025&semester=1학기")
suspend fun getSubjectInfo() : BaseResponse<ResponseSubjectFilterDto?>
}
7 changes: 7 additions & 0 deletions app/src/main/java/org/android/bbangzip/di/RepositoryModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,14 @@ import org.android.bbangzip.data.repositoryImpl.remote.DummyRepositoryImpl
import org.android.bbangzip.data.repositoryImpl.remote.ExamRepositoryImpl
import org.android.bbangzip.data.repositoryImpl.remote.MyPageRepositoryImpl
import org.android.bbangzip.data.repositoryImpl.remote.PieceRepositoryImpl
import org.android.bbangzip.data.repositoryImpl.remote.SubjectRepositoryImpl
import org.android.bbangzip.data.repositoryImpl.remote.UserRepositoryImpl
import org.android.bbangzip.domain.repository.local.UserLocalRepository
import org.android.bbangzip.domain.repository.remote.DummyRepository
import org.android.bbangzip.domain.repository.remote.ExamRepository
import org.android.bbangzip.domain.repository.remote.MyPageRepository
import org.android.bbangzip.domain.repository.remote.PieceRepository
import org.android.bbangzip.domain.repository.remote.SubjectRepository
import org.android.bbangzip.domain.repository.remote.UserRepository
import javax.inject.Singleton

Expand Down Expand Up @@ -44,4 +46,9 @@ abstract class RepositoryModule {
@Binds
@Singleton
abstract fun bindsExamRepository(repositoryImpl: ExamRepositoryImpl): ExamRepository

@Binds
@Singleton
abstract fun bindsSubjectRepository(repositoryImpl: SubjectRepositoryImpl): SubjectRepository

}
8 changes: 8 additions & 0 deletions app/src/main/java/org/android/bbangzip/di/ServiceModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import org.android.bbangzip.data.service.DummyService
import org.android.bbangzip.data.service.ExamService
import org.android.bbangzip.data.service.MyPageService
import org.android.bbangzip.data.service.PieceService
import org.android.bbangzip.data.service.SubjectService
import org.android.bbangzip.data.service.UserService
import retrofit2.Retrofit
import javax.inject.Singleton
Expand Down Expand Up @@ -49,4 +50,11 @@ object ServiceModule {
@BbangZip retrofit: Retrofit,
): ExamService =
retrofit.create(ExamService::class.java)

@Provides
@Singleton
fun provideSubjectService(
@BbangZip retrofit: Retrofit,
): SubjectService =
retrofit.create(SubjectService::class.java)
}
7 changes: 7 additions & 0 deletions app/src/main/java/org/android/bbangzip/di/UseCaseModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import org.android.bbangzip.domain.repository.remote.DummyRepository
import org.android.bbangzip.domain.repository.remote.ExamRepository
import org.android.bbangzip.domain.repository.remote.MyPageRepository
import org.android.bbangzip.domain.repository.remote.PieceRepository
import org.android.bbangzip.domain.repository.remote.SubjectRepository
import org.android.bbangzip.domain.repository.remote.UserRepository
import org.android.bbangzip.domain.usecase.DeleteLogoutUseCase
import org.android.bbangzip.domain.usecase.DeleteWithdrawUseCase
Expand All @@ -17,6 +18,7 @@ import org.android.bbangzip.domain.usecase.GetAddTodoListUseCase
import org.android.bbangzip.domain.usecase.GetBadgeCategoryListUseCase
import org.android.bbangzip.domain.usecase.GetBadgeDetailUseCase
import org.android.bbangzip.domain.usecase.GetSubjectDetailUseCase
import org.android.bbangzip.domain.usecase.GetSubjectInfoUseCase
import org.android.bbangzip.domain.usecase.GetToInfoUseCase
import org.android.bbangzip.domain.usecase.PostAddTodoItemListUseCase
import org.android.bbangzip.domain.usecase.PostCompleteCardIdUseCase
Expand Down Expand Up @@ -97,4 +99,9 @@ class UseCaseModule {
@Singleton
fun providesGetSubjectDetailUseCase(examRepository: ExamRepository): GetSubjectDetailUseCase =
GetSubjectDetailUseCase(examRepository = examRepository)

@Provides
@Singleton
fun providesGetSubjectInfoUseCase(subjectRepository: SubjectRepository): GetSubjectInfoUseCase =
GetSubjectInfoUseCase(subjectRepository = subjectRepository)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package org.android.bbangzip.domain.model

data class SubjectInfoEntity(
val semester: String,
val subjectList: List<SubjectCardInfoEntity>,
val year: Int
)

data class SubjectCardInfoEntity(
val studyList: List<SubjectCardDetailTodoInfoEntity?>,
val subjectId: Int,
val subjectName: String
)

data class SubjectCardDetailTodoInfoEntity(
val examDday: Int,
val examName: String?,
val pendingCount: Int,
val remainingCount: Int
)

Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package org.android.bbangzip.domain.repository.remote

import org.android.bbangzip.data.dto.response.ResponseSubjectFilterDto
import org.android.bbangzip.data.util.base.BaseResponse
import org.android.bbangzip.domain.model.SubjectInfoEntity

interface SubjectRepository {
suspend fun getSubjectInfo(): Result<SubjectInfoEntity>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package org.android.bbangzip.domain.usecase

import org.android.bbangzip.domain.model.SubjectInfoEntity
import org.android.bbangzip.domain.repository.remote.SubjectRepository

class GetSubjectInfoUseCase(
private val subjectRepository: SubjectRepository,
) {
suspend operator fun invoke(): Result<SubjectInfoEntity> =
subjectRepository.getSubjectInfo()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package org.android.bbangzip.presentation.model

import org.android.bbangzip.presentation.model.card.SubjectCardModel

data class SubjectInfo(
val semester: String,
val subjectList: List<SubjectCardModel>,
val year: Int
)
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import org.android.bbangzip.presentation.model.BottomNavigationRoute
import org.android.bbangzip.presentation.model.Route
import org.android.bbangzip.presentation.type.BottomNavigationType
import org.android.bbangzip.presentation.ui.friend.navigation.navigateFriend
import org.android.bbangzip.presentation.ui.login.LoginRoute
import org.android.bbangzip.presentation.ui.login.navigateLogin
import org.android.bbangzip.presentation.ui.my.bbangzipdetail.navigation.navigateBbangZipDetail
import org.android.bbangzip.presentation.ui.my.mybadgecategory.navigation.navigateToMyBadgeCategory
Expand All @@ -20,7 +21,6 @@ import org.android.bbangzip.presentation.ui.onboarding.navigation.navigateOnboar
import org.android.bbangzip.presentation.ui.onboarding.navigation.navigateOnboardingEnd
import org.android.bbangzip.presentation.ui.onboarding.navigation.navigateOnboardingStart
import org.android.bbangzip.presentation.ui.subject.navigateSubject
import org.android.bbangzip.presentation.ui.subject.subjectdetail.SubjectDetailRoute
import org.android.bbangzip.presentation.ui.subject.subjectdetail.navigateToSubjectDetail
import org.android.bbangzip.presentation.ui.todo.navigation.navigateTodo
import org.android.bbangzip.presentation.ui.todo.pendingtodoadd.navigation.navigateTodoAddPending
Expand All @@ -33,7 +33,7 @@ class MainNavigator(
private val currentDestination: NavDestination?
@Composable get() = navHostController.currentBackStackEntryAsState().value?.destination

val startDestination = BottomNavigationRoute.Subject
val startDestination = LoginRoute

val currentBottomNavigationBarItem: BottomNavigationType?
@Composable get() =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,49 +9,7 @@ import org.android.bbangzip.presentation.util.base.BaseContract
class SubjectContract {
@Parcelize
data class SubjectState(
val subjectList: List<SubjectCardModel> =
listOf(
SubjectCardModel(
subjectName = "경제통계학",
examName = "",
pendingCount = 0,
inProgressCount = 6,
subjectId = 1,
examRemainingDays = 1,
),
SubjectCardModel(
subjectName = "[경영] 경제통계학",
examName = "중간고사",
pendingCount = 0,
inProgressCount = 6,
subjectId = 2,
examRemainingDays = 1,
),
SubjectCardModel(
subjectName = "[경영] 경제통계학",
examName = "중간고사",
pendingCount = 0,
inProgressCount = 6,
subjectId = 3,
examRemainingDays = 1,
),
SubjectCardModel(
subjectName = "[경영] 경제통계학",
examName = "중간고사",
pendingCount = 0,
inProgressCount = 6,
subjectId = 4,
examRemainingDays = 1,
),
SubjectCardModel(
subjectName = "[경영] 경제통계학",
examName = "중간고사",
pendingCount = 0,
inProgressCount = 6,
subjectId = 5,
examRemainingDays = 1,
),
),
val subjectList: List<SubjectCardModel> = listOf(),
val subjectSetToDelete: Set<Int> = setOf(),
val cardViewType: CardViewType = CardViewType.DEFAULT,
) : BaseContract.State, Parcelable {
Expand Down Expand Up @@ -79,6 +37,8 @@ class SubjectContract {

data class UpdateSubjectCard(val subjectId: Int) : SubjectReduce

data class UpdateSubjectCardList(val subjectList: List<SubjectCardModel>) : SubjectReduce

data class UpdateDeletedSet(val subjectId: Int) : SubjectReduce
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,12 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.toArgb
import androidx.compose.ui.platform.LocalView
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.compose.LifecycleEventEffect
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import kotlinx.coroutines.flow.collectLatest
import org.android.bbangzip.presentation.model.SplitStudyData
import org.android.bbangzip.presentation.ui.todo.TodoContract
import org.android.bbangzip.ui.theme.BbangZipTheme

@Composable
Expand Down Expand Up @@ -44,6 +47,11 @@ fun SubjectRoute(
}
}
}

LifecycleEventEffect(Lifecycle.Event.ON_RESUME) {
viewModel.setEvent(SubjectContract.SubjectEvent.Initialize)
}

when (success) {
true ->
SubjectScreen(
Expand Down
Loading

0 comments on commit 512d08f

Please sign in to comment.