Skip to content

Commit

Permalink
Merge branch 'dev' into glen/test1
Browse files Browse the repository at this point in the history
  • Loading branch information
seokjin8678 committed May 6, 2024
2 parents f02296a + ead933c commit 9af234f
Show file tree
Hide file tree
Showing 156 changed files with 1,814 additions and 1,232 deletions.
4 changes: 2 additions & 2 deletions android/festago/app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@ android {
applicationId = "com.festago.festago"
minSdk = 28
targetSdk = 34
versionCode = 7
versionName = "1.2.0"
versionCode = 10
versionName = "2.0.1"

testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
Expand Down
5 changes: 5 additions & 0 deletions android/festago/app/proguard-rules.pro
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,11 @@

# https://developers.kakao.com/docs/latest/en/getting-started/sdk-android#configure-for-shrinking-and-obfuscation-(optional)
-keep class com.kakao.sdk.**.model.* { <fields>; }
-keep class * extends com.google.gson.TypeAdapter
-keep interface com.kakao.sdk.**.*Api

#---------------------------------------- Parcelize
-keep @kotlinx.parcelize.Parcelize public class *

#---------------------------------------- Retrofit
# Retrofit does reflection on generic parameters. InnerClasses is required to use Signature and
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.festago.festago.data.datasource.bookmark

import com.festago.festago.domain.model.bookmark.BookmarkType

interface BookmarkDataSource {
fun addBookmark(id: Long, type: BookmarkType)
fun isBookmarked(id: Long, type: BookmarkType): Boolean
fun deleteBookmark(id: Long, type: BookmarkType)
fun getBookmarks(type: BookmarkType): List<Long>
fun setBookmarks(type: BookmarkType, ids: List<Long>)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.festago.festago.data.datasource.bookmark

import com.festago.festago.domain.model.bookmark.BookmarkType
import javax.inject.Inject

class DefaultBookMarkDataSource @Inject constructor() : BookmarkDataSource {
private val bookmarkStore = mutableMapOf<BookmarkType, List<Long>>()

override fun addBookmark(id: Long, type: BookmarkType) {
bookmarkStore[type] = (bookmarkStore[type] ?: listOf()) + id
}

override fun isBookmarked(id: Long, type: BookmarkType): Boolean {
bookmarkStore[type]?.let { return it.contains(id) }
return false
}

override fun deleteBookmark(id: Long, type: BookmarkType) {
val bookmarks = bookmarkStore[type] ?: return
bookmarkStore[type] = bookmarks - id
}

override fun getBookmarks(type: BookmarkType): List<Long> {
return bookmarkStore[type] ?: listOf()
}

override fun setBookmarks(type: BookmarkType, ids: List<Long>) {
bookmarkStore[type] = ids
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.festago.festago.data.di.singletonscope

import com.festago.festago.data.datasource.bookmark.BookmarkDataSource
import com.festago.festago.data.datasource.bookmark.DefaultBookMarkDataSource
import com.festago.festago.data.datasource.token.TokenDataSource
import com.festago.festago.data.datasource.token.TokenLocalDataSource
import com.festago.festago.data.datasource.userinfo.UserInfoDataSource
Expand All @@ -8,14 +10,21 @@ import dagger.Binds
import dagger.Module
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import javax.inject.Singleton

@Module
@InstallIn(SingletonComponent::class)
interface DataSourceModule {

@Binds
@Singleton
fun bindsTokenDataSource(tokenDataSource: TokenLocalDataSource): TokenDataSource

@Binds
@Singleton
fun bindsUserInfoDataSource(userInfoDataSource: UserInfoLocalDataSource): UserInfoDataSource

@Binds
@Singleton
fun bindBookmarkDataSource(bookmarkDataSource: DefaultBookMarkDataSource): BookmarkDataSource
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.festago.festago.data.dto.user

import kotlinx.serialization.Serializable

@Serializable
data class SignOutRequest(
val refreshToken: String,
)
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,16 @@ import com.festago.festago.data.util.runCatchingResponse
import com.festago.festago.domain.model.artist.ArtistDetail
import com.festago.festago.domain.model.festival.FestivalsPage
import com.festago.festago.domain.repository.ArtistRepository
import kotlinx.coroutines.delay
import java.time.LocalDate
import javax.inject.Inject

class DefaultArtistRepository @Inject constructor(
private val artistRetrofitService: ArtistRetrofitService,
) : ArtistRepository {

override suspend fun loadArtistDetail(id: Long): Result<ArtistDetail> {
override suspend fun loadArtistDetail(id: Long, delayTimeMillis: Long): Result<ArtistDetail> {
delay(delayTimeMillis)
return runCatchingResponse { artistRetrofitService.getArtistDetail(id) }
.onSuccessOrCatch { it.toDomain() }
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.festago.festago.data.repository

import com.festago.festago.data.datasource.bookmark.BookmarkDataSource
import com.festago.festago.data.service.BookmarkRetrofitService
import com.festago.festago.data.util.onSuccessOrCatch
import com.festago.festago.data.util.runCatchingResponse
Expand All @@ -13,10 +14,13 @@ import javax.inject.Inject

class DefaultBookmarkRepository @Inject constructor(
private val bookmarkRetrofitService: BookmarkRetrofitService,
private val bookmarkDataSource: BookmarkDataSource,
) : BookmarkRepository {
override suspend fun addFestivalBookmark(festivalId: Long): Result<Unit> {
return runCatchingResponse {
bookmarkRetrofitService.addBookmark(festivalId, BookmarkType.FESTIVAL)
}.onSuccessOrCatch {
bookmarkDataSource.addBookmark(festivalId, BookmarkType.FESTIVAL)
}
}

Expand All @@ -29,56 +33,69 @@ class DefaultBookmarkRepository @Inject constructor(
festivalIds = festivalIds,
festivalBookmarkOrder = festivalBookmarkOrder,
)
}.onSuccessOrCatch { it.map { festival -> festival.toDomain() } }
}.onSuccessOrCatch { response ->
response.map { festival -> festival.toDomain() }.also { festivalBookmarks ->
bookmarkDataSource.setBookmarks(
BookmarkType.FESTIVAL,
festivalBookmarks.map { it.festival.id },
)
}
}
}

override suspend fun getFestivalBookmarkIds(): Result<List<Long>> {
return runCatchingResponse {
bookmarkRetrofitService.getFestivalBookmarkIds()
}
}.onSuccessOrCatch { it.also { festivalIds -> storeFestivalBookmarks(festivalIds) } }
}

override suspend fun deleteFestivalBookmark(festivalId: Long): Result<Unit> {
val result = runCatchingResponse {
bookmarkRetrofitService.deleteBookmark(festivalId, BookmarkType.FESTIVAL)
}
result.onSuccess { bookmarkDataSource.deleteBookmark(festivalId, BookmarkType.FESTIVAL) }
result.onFailure { if (it.message?.contains("204") == true) return Result.success(Unit) }
return result
}

override suspend fun addSchoolBookmark(schoolId: Long): Result<Unit> {
return runCatchingResponse {
bookmarkRetrofitService.addBookmark(schoolId, BookmarkType.SCHOOL)
}.onSuccessOrCatch {
bookmarkDataSource.addBookmark(schoolId, BookmarkType.SCHOOL)
}
}

override suspend fun getSchoolBookmarks(): Result<List<SchoolBookmark>> {
return runCatchingResponse {
bookmarkRetrofitService.getSchoolBookmarks()
}.onSuccessOrCatch {
it.map { school -> school.toDomain() }
}.onSuccessOrCatch { response ->
response.map { schools -> schools.toDomain() }
.also { schoolBookmarks -> storeSchoolBookmarks(schoolBookmarks) }
}
}

override suspend fun deleteSchoolBookmark(schoolId: Long): Result<Unit> {
val result = runCatchingResponse {
bookmarkRetrofitService.deleteBookmark(schoolId, BookmarkType.SCHOOL)
}
result.onSuccess { bookmarkDataSource.deleteBookmark(schoolId, BookmarkType.SCHOOL) }
result.onFailure { if (it.message?.contains("204") == true) return Result.success(Unit) }
return result
}

override suspend fun addArtistBookmark(artistId: Long): Result<Unit> {
return runCatchingResponse {
bookmarkRetrofitService.addBookmark(artistId, BookmarkType.ARTIST)
}
}.onSuccessOrCatch { bookmarkDataSource.addBookmark(artistId, BookmarkType.ARTIST) }
}

override suspend fun getArtistBookmarks(): Result<List<ArtistBookmark>> {
return runCatchingResponse {
bookmarkRetrofitService.getArtistBookmarks()
}.onSuccessOrCatch {
it.map { artist -> artist.toDomain() }
.also { artistBookmarks -> storeArtistBookmarks(artistBookmarks) }
}.onFailure {
it.printStackTrace()
}
Expand All @@ -88,7 +105,30 @@ class DefaultBookmarkRepository @Inject constructor(
val result = runCatchingResponse {
bookmarkRetrofitService.deleteBookmark(artistId, BookmarkType.ARTIST)
}
result.onSuccess { bookmarkDataSource.deleteBookmark(artistId, BookmarkType.ARTIST) }
result.onFailure { if (it.message?.contains("204") == true) return Result.success(Unit) }
return result
}

override fun isBookmarked(id: Long, type: BookmarkType): Boolean {
return bookmarkDataSource.isBookmarked(id, type)
}

private fun storeSchoolBookmarks(schoolBookmarks: List<SchoolBookmark>) {
bookmarkDataSource.setBookmarks(
BookmarkType.SCHOOL,
schoolBookmarks.map { it.school.id },
)
}

private fun storeArtistBookmarks(artistBookmarks: List<ArtistBookmark>) {
bookmarkDataSource.setBookmarks(
BookmarkType.ARTIST,
artistBookmarks.map { it.artist.id },
)
}

private fun storeFestivalBookmarks(festivalBookmarks: List<Long>) {
bookmarkDataSource.setBookmarks(BookmarkType.FESTIVAL, festivalBookmarks)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import com.festago.festago.domain.model.festival.FestivalsPage
import com.festago.festago.domain.model.festival.PopularFestivals
import com.festago.festago.domain.model.festival.SchoolRegion
import com.festago.festago.domain.repository.FestivalRepository
import kotlinx.coroutines.delay
import java.time.LocalDate
import javax.inject.Inject

Expand Down Expand Up @@ -40,7 +41,11 @@ class DefaultFestivalRepository @Inject constructor(
}.onSuccessOrCatch { it.toDomain() }
}

override suspend fun loadFestivalDetail(id: Long): Result<FestivalDetail> {
override suspend fun loadFestivalDetail(
id: Long,
delayTimeMillis: Long,
): Result<FestivalDetail> {
delay(delayTimeMillis)
return runCatchingResponse {
festivalRetrofitService.getFestivalDetail(id)
}.onSuccessOrCatch { it.toDomain() }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,15 @@ import com.festago.festago.data.util.runCatchingResponse
import com.festago.festago.domain.model.festival.FestivalsPage
import com.festago.festago.domain.model.school.SchoolInfo
import com.festago.festago.domain.repository.SchoolRepository
import kotlinx.coroutines.delay
import java.time.LocalDate
import javax.inject.Inject

class DefaultSchoolRepository @Inject constructor(
private val schoolRetrofitService: SchoolRetrofitService
private val schoolRetrofitService: SchoolRetrofitService,
) : SchoolRepository {
override suspend fun loadSchoolInfo(schoolId: Long): Result<SchoolInfo> {
override suspend fun loadSchoolInfo(schoolId: Long, delayTimeMillis: Long): Result<SchoolInfo> {
delay(delayTimeMillis)
return runCatchingResponse {
schoolRetrofitService.getSchool(schoolId)
}.onSuccessOrCatch { it.toDomain() }
Expand All @@ -23,7 +25,7 @@ class DefaultSchoolRepository @Inject constructor(
size: Int?,
isPast: Boolean?,
lastFestivalId: Int?,
lastStartDate: LocalDate?
lastStartDate: LocalDate?,
): Result<FestivalsPage> {
return runCatchingResponse {
schoolRetrofitService.getSchoolFestivals(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import com.festago.festago.data.datasource.token.TokenDataSource
import com.festago.festago.data.datasource.userinfo.UserInfoDataSource
import com.festago.festago.data.dto.user.RefreshRequest
import com.festago.festago.data.dto.user.SignInRequest
import com.festago.festago.data.dto.user.SignOutRequest
import com.festago.festago.data.model.UserInfoEntity
import com.festago.festago.data.service.AuthRetrofitService
import com.festago.festago.data.util.onSuccessOrCatch
Expand Down Expand Up @@ -80,7 +81,8 @@ class DefaultUserRepository @Inject constructor(
override suspend fun signOut(): Result<Unit> {
return runCatchingResponse {
authRetrofitService.signOut(
AUTHORIZATION_TOKEN_FORMAT.format(getAccessToken().getOrThrow()),
AUTHORIZATION_TOKEN_FORMAT.format(getAccessToken().getOrThrow().token),
SignOutRequest(getRefreshToken().getOrThrow().token),
)
}.onSuccessOrCatch {
kakaoAuthorization.signOut()
Expand All @@ -92,7 +94,7 @@ class DefaultUserRepository @Inject constructor(
override suspend fun deleteAccount(): Result<Unit> {
return runCatchingResponse {
authRetrofitService.deleteAccount(
AUTHORIZATION_TOKEN_FORMAT.format(getAccessToken().getOrThrow()),
AUTHORIZATION_TOKEN_FORMAT.format(getAccessToken().getOrThrow().token),
)
}.onSuccessOrCatch {
kakaoAuthorization.deleteAccount()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import javax.inject.Inject
class FakeArtistRepository @Inject constructor() : ArtistRepository {
var index = 0

override suspend fun loadArtistDetail(id: Long): Result<ArtistDetail> =
override suspend fun loadArtistDetail(id: Long, delayTimeMillis: Long): Result<ArtistDetail> =
Result.success(
ArtistDetail(
1,
Expand Down Expand Up @@ -63,7 +63,7 @@ class FakeArtistRepository @Inject constructor() : ArtistRepository {
listOf(
Artist(
101,
"뉴진스",
"뉴진스뉴진스",
"https://static.wikia.nocookie.net/witchers/images/d/d9/New_Jeans_Cover.png/revision/latest?cb=20220801091438",
),
Artist(
Expand All @@ -87,7 +87,7 @@ class FakeArtistRepository @Inject constructor() : ArtistRepository {
listOf(
Artist(
101,
"뉴진스",
"뉴진스뉴진스뉴진스뉴진스뉴진스",
"https://static.wikia.nocookie.net/witchers/images/d/d9/New_Jeans_Cover.png/revision/latest?cb=20220801091438",
),
Artist(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.festago.festago.data.repository

import com.festago.festago.domain.model.bookmark.ArtistBookmark
import com.festago.festago.domain.model.bookmark.ArtistBookmarkInfo
import com.festago.festago.domain.model.bookmark.BookmarkType
import com.festago.festago.domain.model.bookmark.FestivalBookmark
import com.festago.festago.domain.model.bookmark.FestivalBookmarkOrder
import com.festago.festago.domain.model.bookmark.SchoolBookmark
Expand Down Expand Up @@ -111,4 +112,8 @@ class FakeBookmarkRepository @Inject constructor() : BookmarkRepository {
override suspend fun deleteArtistBookmark(artistId: Long): Result<Unit> {
TODO("Not yet implemented")
}

override fun isBookmarked(id: Long, type: BookmarkType): Boolean {
return false
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,10 @@ class FakeFestivalRepository @Inject constructor() : FestivalRepository {
}
}

override suspend fun loadFestivalDetail(id: Long): Result<FestivalDetail> {
override suspend fun loadFestivalDetail(
id: Long,
delayTimeMillis: Long,
): Result<FestivalDetail> {
return Result.success(FakeFestivals.festivalDetail)
}

Expand Down
Loading

0 comments on commit 9af234f

Please sign in to comment.