Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Refactor] 시간표 학기 API 마이그레이션 #557

Open
wants to merge 8 commits into
base: develop
Choose a base branch
from
Open
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
5 changes: 5 additions & 0 deletions .github/workflows/pr_labeler.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,11 @@ jobs:
distribution: 'zulu'
java-version: '17'

- name: Create local.properties
env:
PROPERTIES: ${{ secrets.PROPERTIES }}
run: echo $PROPERTIES | base64 -di > ./local.properties

- name: Grant execute permission for gradlew
run: chmod +x gradlew

Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
package `in`.koreatech.koin.data.api

import `in`.koreatech.koin.data.response.timetable.LectureResponse
import `in`.koreatech.koin.data.response.timetable.SemesterResponse
import `in`.koreatech.koin.data.response.timetable.v3.SemesterResponse
import retrofit2.http.GET
import retrofit2.http.Query

interface TimetableApi {
@GET("/semesters")
suspend fun getSemesters(): List<SemesterResponse>
@GET("/v3/semesters")
suspend fun getSemestersV3(): List<SemesterResponse>

@GET("/lectures")
suspend fun getLectures(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ import `in`.koreatech.koin.data.request.timetable.LecturesQueryRequest
import `in`.koreatech.koin.data.request.timetable.TimetableFrameCreateQueryRequest
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 `in`.koreatech.koin.data.response.timetable.v3.UserSemestersResponse
import retrofit2.Response
import retrofit2.http.Body
import retrofit2.http.DELETE
Expand All @@ -18,8 +18,8 @@ import retrofit2.http.Path
import retrofit2.http.Query

interface TimetableAuthApi {
@GET("/semesters/check")
suspend fun getSemestersCheck(): SemesterCheckResponse
@GET("/v3/semesters/check")
suspend fun getUserSemesters(): UserSemestersResponse

@GET("/v2/timetables/lecture")
suspend fun getTimetableLectures(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,12 @@ import `in`.koreatech.koin.data.request.timetable.TimetableLectureClassInfoReque
import `in`.koreatech.koin.data.request.timetable.toCustomLectureQueryRequest
import `in`.koreatech.koin.data.request.timetable.toLectureQueryRequest
import `in`.koreatech.koin.data.request.timetable.toTimetableLecturesQueryRequest
import `in`.koreatech.koin.data.response.timetable.v3.toSemester
import `in`.koreatech.koin.data.response.timetable.v3.toSemesters
import `in`.koreatech.koin.data.source.datastore.TimetableDataStore
import `in`.koreatech.koin.data.source.remote.TimetableRemoteDataSource
import `in`.koreatech.koin.data.util.getErrorResponse
import `in`.koreatech.koin.domain.model.timetable.Semester
import `in`.koreatech.koin.domain.model.timetable.request.TimetableFrameCreateQuery
import `in`.koreatech.koin.domain.model.timetable.request.TimetableFrameQuery
import `in`.koreatech.koin.domain.model.timetable.request.TimetableLecturesQuery
Expand All @@ -35,14 +38,14 @@ class TimetableRepositoryImpl
) : TimetableRepository {
private val gson = Gson()

override fun getSemesters(): Flow<List<String>> =
override fun getSemesters(): Flow<List<Semester>> =
flow {
emit(timetableRemoteDataSource.getSemesters().map { it.toSemester().semester })
emit(timetableRemoteDataSource.getSemestersV3().map { it.toSemester() })
}

override fun getSemesterCheck(): Flow<List<String>> =
override fun getUserSemesters(): Flow<List<Semester>> =
flow {
emit(timetableRemoteDataSource.getSemesterCheck().toSemesterCheck().semesters)
emit(timetableRemoteDataSource.getUserSemesters().toSemesters())
}

override fun getLectures(semesterDate: String): Flow<List<Lecture>> =
Expand Down Expand Up @@ -87,38 +90,41 @@ class TimetableRepositoryImpl
): Result<TimetableLectures> =
runCatching {
timetableDataStore.putString(key, gson.toJson(value))
return getTimetableLectures(semester = key).onSuccess {
Result.success(it)
}.onFailure {
Result.failure<TimetableLectures>(it)
}
return getTimetableLectures(semester = key)
.onSuccess {
Result.success(it)
}.onFailure {
Result.failure<TimetableLectures>(it)
}
}

override suspend fun putTimetableFrame(
id: Int,
frame: TimetableFrameQuery,
): Result<TimetableFrame> =
runCatching {
timetableRemoteDataSource.putTimetableFrame(
id,
TimetableFrameQueryRequest(
frame.timetableName,
frame.isMain,
),
).toTimetableFrame()
timetableRemoteDataSource
.putTimetableFrame(
id,
TimetableFrameQueryRequest(
frame.timetableName,
frame.isMain,
),
).toTimetableFrame()
}

override suspend fun postTimetableLectures(
frameId: Int,
lectures: List<Lecture>,
): Result<TimetableLectures> =
runCatching {
timetableRemoteDataSource.postTimetableLectures(
LecturesQueryRequest(
timetableFrameId = frameId,
timetableLecture = lectures.map { it.toLectureQueryRequest() },
),
).toTimetableLectures()
timetableRemoteDataSource
.postTimetableLectures(
LecturesQueryRequest(
timetableFrameId = frameId,
timetableLecture = lectures.map { it.toLectureQueryRequest() },
),
).toTimetableLectures()
}

override suspend fun postTimetableCustomLectures(
Expand All @@ -141,12 +147,13 @@ class TimetableRepositoryImpl
memo = "",
)

timetableRemoteDataSource.postTimetableLectures(
LecturesQueryRequest(
timetableFrameId = frameId,
timetableLecture = listOf(query),
),
).toTimetableLectures()
timetableRemoteDataSource
.postTimetableLectures(
LecturesQueryRequest(
timetableFrameId = frameId,
timetableLecture = listOf(query),
),
).toTimetableLectures()
}

override suspend fun postTimetableBasicLectures(
Expand All @@ -163,22 +170,24 @@ class TimetableRepositoryImpl
}
}

timetableRemoteDataSource.postTimetableLectures(
LecturesQueryRequest(
timetableFrameId = frameId,
timetableLecture = queryLectures,
),
).toTimetableLectures()
timetableRemoteDataSource
.postTimetableLectures(
LecturesQueryRequest(
timetableFrameId = frameId,
timetableLecture = queryLectures,
),
).toTimetableLectures()
}

override suspend fun postTimetableFrame(frame: TimetableFrameCreateQuery): Result<TimetableFrame> =
runCatching {
timetableRemoteDataSource.postTimetableFrame(
TimetableFrameCreateQueryRequest(
semester = frame.semester,
timetableName = frame.timetableName,
),
).toTimetableFrame()
timetableRemoteDataSource
.postTimetableFrame(
TimetableFrameCreateQueryRequest(
semester = frame.semester,
timetableName = frame.timetableName,
),
).toTimetableFrame()
}.recoverCatching {
if (it is HttpException) {
throw Exception(it.getErrorResponse().message ?: "")
Expand Down

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package `in`.koreatech.koin.data.response.timetable.v3

import com.google.gson.annotations.SerializedName
import `in`.koreatech.koin.domain.model.timetable.Season
import `in`.koreatech.koin.domain.model.timetable.Semester
import timber.log.Timber

data class SemesterResponse(
@SerializedName("year")
val year: Int,
@SerializedName("term")
val term: String,
)

internal fun SemesterResponse.toSemester(): Semester =
Semester(
year = this.year,
season =
when (this.term) {
"1학기" -> Season.Spring
"여름학기" -> Season.Summer
"2학기" -> Season.Fall
"겨울학기" -> Season.Winter
Comment on lines +20 to +23
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

enum class Season(val value: String) {
    Spring("1학기"),
    Summer("여름학기")
    ...
}

Semester(
    year = this.year,
    season = Season.entries.find { it.value == this.term } ?: // find 실패
)

요런 느낌으로 줄여서 사용할 수도 있을거같아용

else -> {
Timber.e("알 수 없는 학기 응답 : $term")
Season.Spring
}
},
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package `in`.koreatech.koin.data.response.timetable.v3

import com.google.gson.annotations.SerializedName
import `in`.koreatech.koin.domain.model.timetable.Semester

data class UserSemestersResponse(
@SerializedName("semesters")
val semesters: List<SemesterResponse>,
)

internal fun UserSemestersResponse.toSemesters(): List<Semester> = this.semesters.map { it.toSemester() }
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@ import `in`.koreatech.koin.data.request.timetable.TimetableFrameCreateQueryReque
import `in`.koreatech.koin.data.request.timetable.TimetableFrameQueryRequest
import `in`.koreatech.koin.data.request.timetable.TimetableLecturesQueryRequest
import `in`.koreatech.koin.data.response.timetable.LectureResponse
import `in`.koreatech.koin.data.response.timetable.SemesterCheckResponse
import `in`.koreatech.koin.data.response.timetable.SemesterResponse
import `in`.koreatech.koin.data.response.timetable.TimetableFrameResponse
import `in`.koreatech.koin.data.response.timetable.TimetableLecturesResponse
import `in`.koreatech.koin.data.response.timetable.v3.SemesterResponse
import `in`.koreatech.koin.data.response.timetable.v3.UserSemestersResponse
import javax.inject.Inject

class TimetableRemoteDataSource
Expand All @@ -19,32 +19,28 @@ class TimetableRemoteDataSource
private val timetableApi: TimetableApi,
private val timetableAuthApi: TimetableAuthApi,
) {
suspend fun getSemesters(): List<SemesterResponse> = timetableApi.getSemesters()
suspend fun getSemestersV3(): List<SemesterResponse> = timetableApi.getSemestersV3()

suspend fun getSemesterCheck(): SemesterCheckResponse = timetableAuthApi.getSemestersCheck()
suspend fun getUserSemesters(): UserSemestersResponse = timetableAuthApi.getUserSemesters()

suspend fun getLectures(semesterDate: String): List<LectureResponse> = timetableApi.getLectures(semesterDate)

suspend fun getTimetableLectures(timetableFrameId: Int): TimetableLecturesResponse =
timetableAuthApi.getTimetableLectures(timetableFrameId)
suspend fun getTimetableLectures(timetableFrameId: Int): TimetableLecturesResponse = timetableAuthApi.getTimetableLectures(timetableFrameId)

suspend fun getTimetableFrames(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)
suspend fun putTimetableLectures(lectures: TimetableLecturesQueryRequest): TimetableLecturesResponse = timetableAuthApi.putTimetableLectures(lectures)

suspend fun putTimetableFrame(
id: Int,
frame: TimetableFrameQueryRequest,
): TimetableFrameResponse = timetableAuthApi.putTimetableFrame(id, frame)

suspend fun postTimetableLectures(lectures: LecturesQueryRequest): TimetableLecturesResponse =
timetableAuthApi.postTimetableLectures(lectures)
suspend fun postTimetableLectures(lectures: LecturesQueryRequest): TimetableLecturesResponse = timetableAuthApi.postTimetableLectures(lectures)

suspend fun postTimetableFrame(frame: TimetableFrameCreateQueryRequest): TimetableFrameResponse =
timetableAuthApi.postTimetableFrame(frame)
suspend fun postTimetableFrame(frame: TimetableFrameCreateQueryRequest): TimetableFrameResponse = timetableAuthApi.postTimetableFrame(frame)

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

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package `in`.koreatech.koin.domain.model.timetable

enum class Season {
Spring,
Summer,
Fall,
Winter
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package `in`.koreatech.koin.domain.model.timetable

data class Semester(
val year: Int,
val season: Season,
)

internal fun Semester.toLegacySemester(): String =
when (this.season) {
Season.Spring -> "${this.year}1"
Season.Summer -> "${this.year}-여름"
Season.Fall -> "${this.year}2"
Season.Winter -> "${this.year}-겨울"
}

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package `in`.koreatech.koin.domain.repository

import `in`.koreatech.koin.domain.model.timetable.Semester
import `in`.koreatech.koin.domain.model.timetable.request.TimetableFrameCreateQuery
import `in`.koreatech.koin.domain.model.timetable.request.TimetableFrameQuery
import `in`.koreatech.koin.domain.model.timetable.request.TimetableLecturesQuery
Expand All @@ -10,9 +11,9 @@ import `in`.koreatech.koin.domain.model.timetable.response.TimetableLectures
import kotlinx.coroutines.flow.Flow

interface TimetableRepository {
fun getSemesters(): Flow<List<String>>
fun getSemesters(): Flow<List<Semester>>

fun getSemesterCheck(): Flow<List<String>>
fun getUserSemesters(): Flow<List<Semester>>

fun getLectures(semesterDate: String): Flow<List<Lecture>>

Expand Down
Loading