Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions app/src/main/kotlin/com/moa/app/main/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ import com.moa.app.feature.onboarding.signup.SignUpProfileScreen
import com.moa.app.feature.onboarding.signup.SignUpSharedViewModel
import com.moa.app.feature.onboarding.splash.SplashScreen
import com.moa.app.feature.senior.home.SeniorHomeScreen
import com.moa.app.feature.senior.quiz.orientation.OrientationQuizScreen
import com.moa.app.feature.senior.quiz.persistence.PersistenceQuizScreen
import com.moa.app.feature.senior.quiz.category.QuizCategoryScreen
import com.moa.app.feature.senior.setting.SeniorSettingScreen
import com.moa.app.navigation.AppRoute
Expand Down Expand Up @@ -75,7 +75,7 @@ class MainActivity : ComponentActivity() {
composable<AppRoute.SelectUserRole> { SelectUserRoleScreen() }
composable<AppRoute.SeniorHome> { SeniorHomeScreen() }
composable<AppRoute.QuizCategory> { QuizCategoryScreen() }
composable<AppRoute.OrientationQuiz> { OrientationQuizScreen() }
composable<AppRoute.PersistenceQuiz> { PersistenceQuizScreen() }
composable<AppRoute.UserConnection> { UserConnectionScreen() }
composable<AppRoute.SeniorSetting> { SeniorSettingScreen() }
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,12 @@ fun MaAlertDialog(
dismissButtonText: String,
onConfirm: () -> Unit,
onDismiss: () -> Unit,
onDialogDismissRequest: (() -> Unit)? = null,
properties: DialogProperties = DialogProperties(),
) {
BasicAlertDialog(
modifier = modifier,
onDismissRequest = onDismiss,
onDismissRequest = onDialogDismissRequest ?: onDismiss,
properties = properties,
) {
Column(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ sealed interface AppRoute {
data object QuizCategory : AppRoute

@Serializable
data object OrientationQuiz : AppRoute
data object PersistenceQuiz : AppRoute

@Serializable
data class UserConnection(val userRole: String) : AppRoute
Expand Down
1 change: 1 addition & 0 deletions data/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ dependencies {
implementation(projects.core.network)
implementation(projects.domain)

implementation(libs.kotlinx.collections.immutable)
implementation(libs.kotlinx.serialization.json)
implementation(platform(libs.retrofit.bom))
implementation(libs.bundles.retrofit)
Expand Down
6 changes: 6 additions & 0 deletions data/src/main/kotlin/com/moa/app/data/di/DataSourceModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import com.moa.app.data.auth.datasource.AuthDataSource
import com.moa.app.data.auth.datasourceImpl.AuthDataSourceImpl
import com.moa.app.data.user.datasource.UserDataSource
import com.moa.app.data.user.datasourceImpl.UserDataSourceImpl
import com.moa.app.data.quiz.datasource.QuizDataSource
import com.moa.app.data.quiz.datasourceImpl.QuizDataSourceImpl
import dagger.Binds
import dagger.Module
import dagger.hilt.InstallIn
Expand All @@ -22,4 +24,8 @@ abstract class DataSourceModule {
@Singleton
abstract fun bindUserDataSource(impl: UserDataSourceImpl): UserDataSource

@Binds
@Singleton
abstract fun bindQuizDataSource(impl: QuizDataSourceImpl): QuizDataSource

}
6 changes: 6 additions & 0 deletions data/src/main/kotlin/com/moa/app/data/di/RepositoryModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@ package com.moa.app.data.di

import com.moa.app.data.auth.repositoryImpl.AuthRepositoryImpl
import com.moa.app.data.user.repositoryImpl.UserRepositoryImpl
import com.moa.app.data.quiz.repositoryImpl.QuizRepositoryImpl
import com.moa.app.domain.auth.repository.AuthRepository
import com.moa.app.domain.user.repository.UserRepository
import com.moa.app.domain.quiz.repository.QuizRepository
import dagger.Binds
import dagger.Module
import dagger.hilt.InstallIn
Expand All @@ -22,4 +24,8 @@ abstract class RepositoryModule {
@Singleton
abstract fun bindUserRepository(impl: UserRepositoryImpl): UserRepository

@Binds
@Singleton
abstract fun bindQuizRepository(impl: QuizRepositoryImpl): QuizRepository

}
6 changes: 6 additions & 0 deletions data/src/main/kotlin/com/moa/app/data/di/ServiceModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.moa.app.data.di

import com.moa.app.data.auth.service.AuthService
import com.moa.app.data.user.service.UserService
import com.moa.app.data.quiz.service.QuizService
import com.moa.app.network.auth.TokenService
import dagger.Module
import dagger.Provides
Expand All @@ -28,4 +29,9 @@ object ServiceModule {
@Singleton
fun provideUserService(retrofit: Retrofit): UserService =
retrofit.create(UserService::class.java)

@Provides
@Singleton
fun provideQuizService(retrofit: Retrofit): QuizService =
retrofit.create(QuizService::class.java)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.moa.app.data.quiz.datasource

import com.moa.app.data.quiz.model.response.PersistenceQuizResponse

interface QuizDataSource {
suspend fun fetchPersistenceQuizzes(type: String): Result<List<PersistenceQuizResponse>>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.moa.app.data.quiz.datasourceImpl

import com.moa.app.data.quiz.datasource.QuizDataSource
import com.moa.app.data.quiz.model.response.PersistenceQuizResponse
import com.moa.app.data.quiz.model.response.toDomain
import com.moa.app.data.quiz.service.QuizService
import com.moa.app.network.extension.toResult
import com.moa.app.network.model.NetworkResult
import javax.inject.Inject

class QuizDataSourceImpl @Inject constructor(
private val quizService: QuizService
) : QuizDataSource {
override suspend fun fetchPersistenceQuizzes(type: String): Result<List<PersistenceQuizResponse>> {
return quizService.fetchPersistenceQuizzes(type).toResult { it }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.moa.app.data.quiz.model.response

import com.moa.app.domain.quiz.model.PersistenceQuiz
import com.moa.app.domain.quiz.model.QuizCategory
import kotlinx.collections.immutable.toImmutableList
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class PersistenceQuizResponse(
@SerialName("questionId") val questionId: Long,
@SerialName("quizType") val quizType: String,
@SerialName("questionFormat") val questionFormat: String,
@SerialName("questionContent") val questionContent: String,
@SerialName("answer") val answer: String,
@SerialName("answerOptions") val answerOptions: List<String>
)

fun PersistenceQuizResponse.toDomain(): PersistenceQuiz {
return PersistenceQuiz(
id = this.questionId,
type = QuizCategory.fromString(this.quizType),
questionFormat = this.questionFormat,
questionContent = this.questionContent,
answer = this.answer,
answerOptions = this.answerOptions.toImmutableList()
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.moa.app.data.quiz.repositoryImpl

import com.moa.app.data.quiz.datasource.QuizDataSource
import com.moa.app.data.quiz.model.response.toDomain
import com.moa.app.domain.quiz.model.PersistenceQuiz
import com.moa.app.domain.quiz.model.QuizCategory
import com.moa.app.domain.quiz.repository.QuizRepository
import javax.inject.Inject

class QuizRepositoryImpl @Inject constructor(
private val quizDataSource: QuizDataSource
) : QuizRepository {
override suspend fun fetchPersistenceQuizzes(category: QuizCategory): Result<List<PersistenceQuiz>> {
return quizDataSource.fetchPersistenceQuizzes(category.toString())
.mapCatching { response ->
response.map { it.toDomain() }
}
}
}
15 changes: 15 additions & 0 deletions data/src/main/kotlin/com/moa/app/data/quiz/service/QuizService.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.moa.app.data.quiz.service

import com.moa.app.data.quiz.model.response.PersistenceQuizResponse
import com.moa.app.network.model.NetworkResult
import retrofit2.http.GET
import retrofit2.http.Query

interface QuizService {

@GET("/api/v1/quiz/set")
suspend fun fetchPersistenceQuizzes(
@Query("type") type: String
): NetworkResult<List<PersistenceQuizResponse>>

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.moa.app.domain.quiz.model

import kotlinx.collections.immutable.ImmutableList

data class PersistenceQuiz(
val id: Long,
val type: QuizCategory,
val questionFormat: String,
val questionContent: String,
val answer: String,
val answerOptions: ImmutableList<String>,
) {
fun getCurrentAnswerIndex(selectedAnswerIndex: Int): Boolean {
return selectedAnswerIndex == answerOptions.indexOf(answer)
}
}
17 changes: 0 additions & 17 deletions domain/src/main/kotlin/com/moa/app/domain/quiz/model/Quiz.kt

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.moa.app.domain.quiz.model

/**
* MMSE 기반 퀴즈 카테고리
*
* PERSISTENCE: 지남력
* LINGUISTIC: 언어능력
* MEMORY: 기억력
* ATTENTION: 주의력
* SPACETIME: 시공간
*/
enum class QuizCategory {
PERSISTENCE,
LINGUISTIC,
MEMORY,
ATTENTION,
SPACETIME,

;

companion object {
fun fromString(value: String): QuizCategory {
return when (value) {
"PERSISTENCE" -> PERSISTENCE
"LINGUISTIC" -> LINGUISTIC
"MEMORY" -> MEMORY
"ATTENTION" -> ATTENTION
"SPACETIME" -> SPACETIME
else -> throw IllegalArgumentException("Invalid QuizCategory value: $value")
}
}
}
}
25 changes: 0 additions & 25 deletions domain/src/main/kotlin/com/moa/app/domain/quiz/model/Quizzes.kt

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.moa.app.domain.quiz.repository

import com.moa.app.domain.quiz.model.PersistenceQuiz
import com.moa.app.domain.quiz.model.QuizCategory

interface QuizRepository {
suspend fun fetchPersistenceQuizzes(category: QuizCategory): Result<List<PersistenceQuiz>>
}

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.moa.app.domain.quiz.usecase

import com.moa.app.domain.quiz.model.PersistenceQuiz
import com.moa.app.domain.quiz.model.QuizCategory
import com.moa.app.domain.quiz.repository.QuizRepository
import javax.inject.Inject

class FetchPersistenceQuizUseCase @Inject constructor(
private val quizRepository: QuizRepository,
) {
suspend operator fun invoke(category: QuizCategory): Result<List<PersistenceQuiz>> {
return quizRepository.fetchPersistenceQuizzes(category)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ class SeniorHomeViewModel @Inject constructor(
}

fun navigateToDailyQuiz() {
navigator.navigate(AppRoute.OrientationQuiz)
navigator.navigate(AppRoute.PersistenceQuiz)
}

fun navigateToSetting() {
Expand Down
Loading