Skip to content

Commit c2470fa

Browse files
authored
Merge pull request #88 from Project-Unifest/feature/home-api-connection
[feat] [#69] [#35] 관심 학교/축제 를 저장하는 로컬 데이터 베이스 환경 구축, 홈 화면 Api 연결
2 parents ac8105e + d3eeefc commit c2470fa

File tree

31 files changed

+1030
-287
lines changed

31 files changed

+1030
-287
lines changed
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package com.unifest.android.core.data.mapper
2+
3+
import com.unifest.android.core.database.entity.LikedFestivalEntity
4+
import com.unifest.android.core.database.entity.StarInfoEntity
5+
import com.unifest.android.core.model.FestivalModel
6+
import com.unifest.android.core.model.FestivalTodayModel
7+
import com.unifest.android.core.model.StarInfoModel
8+
9+
internal fun LikedFestivalEntity.toModel(): FestivalModel {
10+
return FestivalModel(
11+
festivalId = festivalId,
12+
schoolId = schoolId,
13+
thumbnail = thumbnail ?: "",
14+
schoolName = schoolName,
15+
festivalName = festivalName,
16+
beginDate = beginDate ?: "",
17+
endDate = endDate ?: "",
18+
latitude = latitude ?: 0f,
19+
longitude = longitude ?: 0f,
20+
)
21+
}
22+
23+
internal fun FestivalTodayModel.toEntity(): LikedFestivalEntity {
24+
return LikedFestivalEntity(
25+
festivalId = festivalId,
26+
schoolName = schoolName,
27+
festivalName = festivalName,
28+
date = date,
29+
starInfo = starInfo.map { it.toEntity() },
30+
schoolId = schoolId,
31+
thumbnail = thumbnail,
32+
)
33+
}
34+
35+
internal fun StarInfoModel.toEntity(): StarInfoEntity {
36+
return StarInfoEntity(
37+
name = name,
38+
img = img,
39+
)
40+
}
41+
42+
internal fun FestivalModel.toEntity(): LikedFestivalEntity {
43+
return LikedFestivalEntity(
44+
festivalId = festivalId,
45+
schoolName = schoolName,
46+
festivalName = festivalName,
47+
schoolId = schoolId,
48+
thumbnail = thumbnail,
49+
beginDate = beginDate,
50+
endDate = endDate,
51+
latitude = latitude,
52+
longitude = longitude,
53+
)
54+
}
Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
package com.unifest.android.core.data.mapper
22

3-
import com.unifest.android.core.model.FestivalSearchModel
3+
import com.unifest.android.core.model.StarInfoModel
4+
import com.unifest.android.core.model.FestivalModel
5+
import com.unifest.android.core.model.FestivalTodayModel
6+
import com.unifest.android.core.network.response.StarInfo
47
import com.unifest.android.core.network.response.FestivalSearch
8+
import com.unifest.android.core.network.response.FestivalToday
59

6-
internal fun FestivalSearch.toModel(): FestivalSearchModel {
7-
return FestivalSearchModel(
10+
internal fun FestivalSearch.toModel(): FestivalModel {
11+
return FestivalModel(
12+
festivalId = festivalId,
13+
schoolId = schoolId,
814
thumbnail = thumbnail,
915
schoolName = schoolName,
1016
festivalName = festivalName,
@@ -14,3 +20,22 @@ internal fun FestivalSearch.toModel(): FestivalSearchModel {
1420
longitude = longitude,
1521
)
1622
}
23+
24+
internal fun FestivalToday.toModel(): FestivalTodayModel {
25+
return FestivalTodayModel(
26+
schoolName = schoolName,
27+
festivalName = festivalName,
28+
festivalId = festivalId,
29+
date = date,
30+
starInfo = starInfo.map { it.toModel() },
31+
schoolId = schoolId,
32+
thumbnail = thumbnail,
33+
)
34+
}
35+
36+
internal fun StarInfo.toModel(): StarInfoModel {
37+
return StarInfoModel(
38+
name = name,
39+
img = img,
40+
)
41+
}
Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,16 @@
11
package com.unifest.android.core.data.repository
22

3-
import com.unifest.android.core.model.FestivalSearchModel
3+
import com.unifest.android.core.model.FestivalModel
4+
import com.unifest.android.core.model.FestivalTodayModel
5+
import kotlinx.coroutines.flow.Flow
46

57
interface FestivalRepository {
6-
suspend fun getAllFestivals(): Result<List<FestivalSearchModel>>
7-
suspend fun searchFestival(name: String): Result<List<FestivalSearchModel>>
8+
suspend fun getAllFestivals(): Result<List<FestivalModel>>
9+
suspend fun searchFestival(name: String): Result<List<FestivalModel>>
10+
suspend fun getIncomingFestivals(): Result<List<FestivalModel>>
11+
suspend fun getTodayFestivals(date: String): Result<List<FestivalTodayModel>>
12+
fun getLikedFestivals(): Flow<List<FestivalModel>>
13+
suspend fun insertLikedFestivalAtHome(festival: FestivalTodayModel)
14+
suspend fun insertLikedFestivalAtSearch(festival: FestivalModel)
15+
suspend fun deleteLikedFestivalAtHome(festival: FestivalTodayModel)
816
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,52 @@
11
package com.unifest.android.core.data.repository
22

3+
import com.unifest.android.core.data.mapper.toEntity
34
import com.unifest.android.core.data.mapper.toModel
45
import com.unifest.android.core.data.util.runSuspendCatching
6+
import com.unifest.android.core.database.LikedFestivalDao
7+
import com.unifest.android.core.model.FestivalModel
8+
import com.unifest.android.core.model.FestivalTodayModel
59
import com.unifest.android.core.network.service.UnifestService
10+
import kotlinx.coroutines.flow.Flow
11+
import kotlinx.coroutines.flow.map
612
import javax.inject.Inject
713

814
class FestivalRepositoryImpl @Inject constructor(
915
private val service: UnifestService,
16+
private val likedFestivalDao: LikedFestivalDao,
1017
) : FestivalRepository {
18+
19+
override fun getLikedFestivals(): Flow<List<FestivalModel>> {
20+
return likedFestivalDao.getLikedFestivalList().map { likedFestivals ->
21+
likedFestivals.map { likedFestival ->
22+
likedFestival.toModel()
23+
}
24+
}
25+
}
1126
override suspend fun getAllFestivals() = runSuspendCatching {
1227
service.getAllFestivals().data.map { it.toModel() }
1328
}
1429

1530
override suspend fun searchFestival(name: String) = runSuspendCatching {
1631
service.searchFestival(name).data.map { it.toModel() }
1732
}
33+
34+
override suspend fun getIncomingFestivals() = runSuspendCatching {
35+
service.getIncomingFestivals().data.map { it.toModel() }
36+
}
37+
38+
override suspend fun getTodayFestivals(date: String) = runSuspendCatching {
39+
service.getTodayFestivals(date).data.map { it.toModel() }
40+
}
41+
42+
override suspend fun insertLikedFestivalAtHome(festival: FestivalTodayModel) {
43+
likedFestivalDao.insertLikedFestival(festival.toEntity())
44+
}
45+
46+
override suspend fun insertLikedFestivalAtSearch(festival: FestivalModel) {
47+
likedFestivalDao.insertLikedFestival(festival.toEntity())
48+
}
49+
override suspend fun deleteLikedFestivalAtHome(festival: FestivalTodayModel) {
50+
likedFestivalDao.deleteLikedFestival(festival.toEntity())
51+
}
1852
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.unifest.android.core.database
2+
3+
import androidx.room.Dao
4+
import androidx.room.Delete
5+
import androidx.room.Insert
6+
import androidx.room.OnConflictStrategy
7+
import androidx.room.Query
8+
import com.unifest.android.core.database.entity.LikedFestivalEntity
9+
import kotlinx.coroutines.flow.Flow
10+
11+
@Dao
12+
interface LikedFestivalDao {
13+
@Insert(onConflict = OnConflictStrategy.REPLACE)
14+
suspend fun insertLikedFestival(userInfo: LikedFestivalEntity)
15+
16+
@Delete
17+
suspend fun deleteLikedFestival(userInfo: LikedFestivalEntity)
18+
19+
@Query("SELECT * FROM liked_festival")
20+
fun getLikedFestivalList(): Flow<List<LikedFestivalEntity>>
21+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.unifest.android.core.database
2+
3+
import androidx.room.Database
4+
import androidx.room.RoomDatabase
5+
import androidx.room.TypeConverters
6+
import com.unifest.android.core.database.entity.LikedFestivalEntity
7+
8+
@Database(
9+
entities = [LikedFestivalEntity::class],
10+
version = 1,
11+
exportSchema = true,
12+
)
13+
@TypeConverters(StarInfoConverter::class)
14+
abstract class LikedFestivalDatabase : RoomDatabase() {
15+
abstract fun likedFestivalDao(): LikedFestivalDao
16+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.unifest.android.core.database
2+
3+
import androidx.room.TypeConverter
4+
import com.unifest.android.core.database.entity.StarInfoEntity
5+
import kotlinx.serialization.encodeToString
6+
import kotlinx.serialization.json.Json
7+
8+
class StarInfoConverter {
9+
private val json = Json
10+
11+
@TypeConverter
12+
fun fromStarInfo(starInfo: List<StarInfoEntity>): String {
13+
return json.encodeToString(starInfo)
14+
}
15+
16+
@TypeConverter
17+
fun toStarInfo(starInfoString: String): List<StarInfoEntity> {
18+
return json.decodeFromString(starInfoString)
19+
}
20+
}

core/database/src/main/kotlin/com/unifest/android/core/database/di/DaoModule.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package com.unifest.android.core.database.di
22

33
import com.unifest.android.core.database.LikedBoothDao
44
import com.unifest.android.core.database.LikedBoothDatabase
5+
import com.unifest.android.core.database.LikedFestivalDao
6+
import com.unifest.android.core.database.LikedFestivalDatabase
57
import dagger.Module
68
import dagger.Provides
79
import dagger.hilt.InstallIn
@@ -14,4 +16,9 @@ object DaoModule {
1416
fun provideLikedBoothDao(
1517
database: LikedBoothDatabase,
1618
): LikedBoothDao = database.likedBoothDao()
19+
20+
@Provides
21+
fun provideLikedFestivalDao(
22+
database: LikedFestivalDatabase,
23+
): LikedFestivalDao = database.likedFestivalDao()
1724
}

core/database/src/main/kotlin/com/unifest/android/core/database/di/DatabaseModule.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.unifest.android.core.database.di
33
import android.content.Context
44
import androidx.room.Room
55
import com.unifest.android.core.database.LikedBoothDatabase
6+
import com.unifest.android.core.database.LikedFestivalDatabase
67
import dagger.Module
78
import dagger.Provides
89
import dagger.hilt.InstallIn
@@ -22,4 +23,13 @@ object DatabaseModule {
2223
LikedBoothDatabase::class.java,
2324
"liked_booth_database",
2425
).build()
26+
27+
@Singleton
28+
@Provides
29+
fun provideLikedFestivalDatabase(@ApplicationContext context: Context): LikedFestivalDatabase =
30+
Room.databaseBuilder(
31+
context.applicationContext,
32+
LikedFestivalDatabase::class.java,
33+
"liked_festival_database",
34+
).build()
2535
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package com.unifest.android.core.database.entity
2+
3+
import androidx.room.ColumnInfo
4+
import androidx.room.Entity
5+
import androidx.room.PrimaryKey
6+
import kotlinx.serialization.Serializable
7+
8+
@Serializable
9+
@Entity(tableName = "liked_festival")
10+
data class LikedFestivalEntity(
11+
@PrimaryKey
12+
@ColumnInfo(name = "festival_id")
13+
val festivalId: Long,
14+
15+
@ColumnInfo(name = "school_id")
16+
val schoolId: Long,
17+
18+
@ColumnInfo(name = "school_name")
19+
val schoolName: String,
20+
21+
@ColumnInfo(name = "festival_name")
22+
val festivalName: String,
23+
24+
@ColumnInfo(name = "date")
25+
val date: String? = null,
26+
27+
@ColumnInfo(name = "thumbnail")
28+
val thumbnail: String? = null,
29+
30+
@ColumnInfo(name = "begin_date")
31+
val beginDate: String? = null,
32+
33+
@ColumnInfo(name = "end_date")
34+
val endDate: String? = null,
35+
36+
@ColumnInfo(name = "star_list")
37+
val starInfo: List<StarInfoEntity>? = null,
38+
39+
@ColumnInfo(name = "latitude")
40+
val latitude: Float? = null,
41+
42+
@ColumnInfo(name = "longitude")
43+
val longitude: Float? = null,
44+
)
45+
46+
@Serializable
47+
data class StarInfoEntity(
48+
val name: String = "",
49+
val img: String = "",
50+
)

core/model/src/main/kotlin/com/unifest/android/core/model/FestivalEventModel.kt

Lines changed: 0 additions & 12 deletions
This file was deleted.

core/model/src/main/kotlin/com/unifest/android/core/model/FestivalModel.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,13 @@ import androidx.compose.runtime.Stable
44

55
@Stable
66
data class FestivalModel(
7-
val imgUrl: String,
7+
val festivalId: Long,
8+
val schoolId: Long,
9+
val thumbnail: String,
810
val schoolName: String,
911
val festivalName: String,
10-
val festivalDate: String,
12+
val beginDate: String,
13+
val endDate: String,
14+
val latitude: Float,
15+
val longitude: Float,
1116
)

core/model/src/main/kotlin/com/unifest/android/core/model/FestivalSearchModel.kt

Lines changed: 0 additions & 14 deletions
This file was deleted.
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.unifest.android.core.model
2+
3+
import androidx.compose.runtime.Stable
4+
5+
@Stable
6+
data class FestivalTodayModel(
7+
val thumbnail: String,
8+
val schoolId: Long,
9+
val festivalId: Long,
10+
val date: String,
11+
val festivalName: String,
12+
val schoolName: String,
13+
val starInfo: List<StarInfoModel>,
14+
)
15+
16+
@Stable
17+
data class StarInfoModel(
18+
val name: String,
19+
val img: String,
20+
)

core/model/src/main/kotlin/com/unifest/android/core/model/IncomingFestivalEventModel.kt

Lines changed: 0 additions & 11 deletions
This file was deleted.

0 commit comments

Comments
 (0)