Skip to content

Commit

Permalink
Merge pull request #519 from BCSDLab/refactor/timetable_semester
Browse files Browse the repository at this point in the history
[Refactor] 시간표 학기 페이지 리팩토링 1차
  • Loading branch information
nodobi authored Jan 8, 2025
2 parents bb2330d + 7a757e2 commit b470c69
Show file tree
Hide file tree
Showing 12 changed files with 260 additions and 300 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import `in`.koreatech.koin.data.request.timetable.TimetableFrameQueryRequest
import `in`.koreatech.koin.data.request.timetable.TimetableLecturesQueryRequest
import `in`.koreatech.koin.data.response.timetable.SemesterCheckResponse
import `in`.koreatech.koin.data.response.timetable.TimetableFrameResponse
import `in`.koreatech.koin.data.response.timetable.TimetableFramesResponse
import `in`.koreatech.koin.data.response.timetable.TimetableLecturesResponse
import retrofit2.Response
import retrofit2.http.Body
Expand Down Expand Up @@ -46,16 +47,32 @@ interface TimetableAuthApi {
@Body frame: TimetableFrameCreateQueryRequest
): TimetableFrameResponse

@POST("/v2/timetables/frame/rollback")
suspend fun postRollbackFrame(
@Query("timetable_frame_id") frameId: Int
): TimetableLecturesResponse

@DELETE("/v2/timetables/frame")
suspend fun deleteTimetableFrame(
@Query("id") frameId: Int
): Response<Unit>

/**
* @param semester 학기명
* @return 학기의 프레임 리스트
*/
@GET("/v2/timetables/frames")
suspend fun getTimetableFrames(
@Query("semester") semester: String
): List<TimetableFrameResponse>

/**
* 학생이 추가한 모든 학기의 프레임을 불러옴
* @return 학생이 추가한 모든 시간표 프레임
*/
@GET("/v2/timetables/frames")
suspend fun getAllFrames(): TimetableFramesResponse

@DELETE("/v2/timetables/lecture/{id}")
suspend fun deleteTimetableLecture(
@Path("id") id: Int
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,11 @@ class TimetableRepositoryImpl @Inject constructor(
}

override fun getTimetableFrames(semester: String): Flow<List<TimetableFrame>> = flow {
emit(timetableRemoteDataSource.getTimetableFrames(semester).map { it.toTimetableFrameResponse() })
emit(timetableRemoteDataSource.getTimetableFrames(semester).map { it.toTimetableFrame() })
}

override fun getAllFrames(): Flow<Map<String, List<TimetableFrame>>> = flow {
emit(timetableRemoteDataSource.getAllFrames().mapValues { it.value.map { it.toTimetableFrame() } })
}

override suspend fun getTimetableLectures(timetableFrameId: Int): Result<TimetableLectures> = runCatching {
Expand Down Expand Up @@ -83,7 +87,7 @@ class TimetableRepositoryImpl @Inject constructor(
frame.timetableName,
frame.isMain
)
).toTimetableFrameResponse()
).toTimetableFrame()
}

override suspend fun postTimetableLectures(frameId: Int, lectures: List<Lecture>): Result<TimetableLectures> = runCatching {
Expand Down Expand Up @@ -135,12 +139,15 @@ class TimetableRepositoryImpl @Inject constructor(
semester = frame.semester,
timetableName = frame.timetableName
)
).toTimetableFrameResponse()
).toTimetableFrame()
}.recoverCatching {
if(it is HttpException) throw Exception(it.getErrorResponse().message ?: "")
else throw it
}

override suspend fun postRollbackFrame(frameId: Int): Result<TimetableLectures> = runCatching {
timetableRemoteDataSource.postRollbackFrame(frameId).toTimetableLectures()
}

override suspend fun deleteTimetableFrame(frameId: Int): Result<Unit> = runCatching {
timetableRemoteDataSource.deleteTimetableFrame(frameId)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ data class TimetableFrameResponse(
@SerializedName("is_main")
val isMain: Boolean,
) {
fun toTimetableFrameResponse(): TimetableFrame = TimetableFrame(
fun toTimetableFrame(): TimetableFrame = TimetableFrame(
id = id,
timetableName = timetableName.orEmpty(),
isMain = isMain
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package `in`.koreatech.koin.data.response.timetable

import com.google.gson.annotations.SerializedName

data class TimetableFramesResponse(
@SerializedName("semesters")
val semesterFrames: Map<String, List<TimetableFrameResponse>>
)
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@ class TimetableRemoteDataSource @Inject constructor(
semester: String
): List<TimetableFrameResponse> = timetableAuthApi.getTimetableFrames(semester)

suspend fun getAllFrames(): Map<String, List<TimetableFrameResponse>> =
timetableAuthApi.getAllFrames().semesterFrames

suspend fun putTimetableLectures(
lectures: TimetableLecturesQueryRequest
): TimetableLecturesResponse = timetableAuthApi.putTimetableLectures(lectures)
Expand All @@ -47,6 +50,10 @@ class TimetableRemoteDataSource @Inject constructor(
frame: TimetableFrameCreateQueryRequest
): TimetableFrameResponse = timetableAuthApi.postTimetableFrame(frame)

suspend fun postRollbackFrame(
frameId: Int
): TimetableLecturesResponse = timetableAuthApi.postRollbackFrame(frameId)

suspend fun deleteTimetableFrame(
frameId: Int
) = timetableAuthApi.deleteTimetableFrame(frameId)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ interface TimetableRepository {
fun getSemesterCheck(): Flow<List<String>>
fun getLectures(semesterDate: String): Flow<List<Lecture>>
fun getTimetableFrames(semester: String): Flow<List<TimetableFrame>>
fun getAllFrames(): Flow<Map<String, List<TimetableFrame>>>


suspend fun getTimetableLectures(timetableFrameId: Int): Result<TimetableLectures>
suspend fun getTimetableLectures(semester: String): Result<TimetableLectures>
Expand All @@ -26,11 +28,11 @@ interface TimetableRepository {
suspend fun postTimetableCustomLectures(frameId: Int, lectures: List<Lecture>): Result<TimetableLectures>
suspend fun postTimetableBasicLectures(frameId: Int, lectures: List<TimetableLecture>): Result<TimetableLectures>
suspend fun postTimetableFrame(frame: TimetableFrameCreateQuery): Result<TimetableFrame>
suspend fun postRollbackFrame(frameId: Int): Result<TimetableLectures>

suspend fun deleteTimetableFrame(frameId: Int): Result<Unit>
suspend fun deleteTimetableLecture(id: Int): Result<Unit>
suspend fun deleteTimetableLectures(lectureIds: List<Int>): Result<Unit>
suspend fun deleteTimetableFrameLecture(frameId: Int, lectureId: Int): Result<Unit>

suspend fun deleteAllTimetableFrame(semester: String): Result<Unit>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package `in`.koreatech.koin.domain.usecase.timetable

import `in`.koreatech.koin.domain.model.timetable.response.TimetableFrame
import `in`.koreatech.koin.domain.repository.TimetableRepository
import kotlinx.coroutines.flow.Flow
import javax.inject.Inject

class GetAllFramesUseCase @Inject constructor(
private val timetableRepository: TimetableRepository
) {
suspend operator fun invoke(): Flow<Map<String, List<TimetableFrame>>> =
timetableRepository.getAllFrames()
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package `in`.koreatech.koin.domain.usecase.timetable

import `in`.koreatech.koin.domain.model.timetable.response.TimetableLectures
import `in`.koreatech.koin.domain.repository.TimetableRepository
import javax.inject.Inject

/**
* 시간표 프레임과 담긴 강의들을 복구하는 유즈케이스
* 학기가 함께 삭제된 경우, 학기도 같이 추가한다
*/
class RollbackFrameUseCase @Inject constructor(
private val timetableRepository: TimetableRepository
) {

suspend operator fun invoke(frameId: Int): Result<TimetableLectures> {
return timetableRepository.postRollbackFrame(frameId)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -49,26 +49,28 @@ import java.time.LocalDate
fun EditSemesterDialogImpl(
years: List<Int>,
userSemesters: List<SemesterModel>,
isSelectYearDialogVisible: Boolean,
modifier: Modifier = Modifier,
onConfirmSelectYear: () -> Unit = {},
onDismissSelectYear: () -> Unit = {},
onClickSelectYear: () -> Unit = {},
onConfirm: (List<SemesterModel>) -> Unit = {},
onDismiss: () -> Unit = {},
) {
var currentYear by remember { mutableStateOf(LocalDate.now().year) }
var selectedSemesters by remember(currentYear, userSemesters) { mutableStateOf(listOf<SemesterType>()) }

var isShowingSelectYearDialog by remember { mutableStateOf(false) }

Box(
modifier = modifier
) {
if (isShowingSelectYearDialog) {
if (isSelectYearDialogVisible) {
SelectYearDialog(
currentYear = currentYear,
yearList = years,
onDismiss = { isShowingSelectYearDialog = false },
onDismiss = onDismissSelectYear,
onSelectYear = {
currentYear = it
isShowingSelectYearDialog = false
onConfirmSelectYear()
}
)
} else {
Expand All @@ -83,7 +85,7 @@ fun EditSemesterDialogImpl(
else
selectedSemesters = selectedSemesters + clickedSemester
},
onClickYear = { isShowingSelectYearDialog = true },
onClickYear = onClickSelectYear,
onConfirm = { onConfirm(selectedSemesters.map { SemesterModel(currentYear, it) }) },
onDismiss = onDismiss
)
Expand Down Expand Up @@ -280,6 +282,7 @@ private fun EditSemesterDialogImplPreview() {
EditSemesterDialogImpl(
years = listOf(2019, 2020, 2021, 2022, 2023, 2024),
userSemesters = userSemesters,
isSelectYearDialogVisible = false,
onConfirm = { selectedSemester ->
userSemesters = userSemesters.toMutableList().apply {
selectedSemester.forEach {
Expand Down
Loading

0 comments on commit b470c69

Please sign in to comment.