Skip to content

[feat] [#69] [#35] 관심 학교/축제 를 저장하는 로컬 데이터 베이스 환경 구축, 홈 화면 Api 연결 #88

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

Merged
merged 29 commits into from
Apr 19, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
fc00cdd
[feat] 홈 다가오는 축제일정 api 연결
wjdtkdgns777 Apr 17, 2024
b804af5
[refactor] 오늘의 축제 관련 Model festivalTodayModel로 변경
wjdtkdgns777 Apr 17, 2024
d7c1be7
[refactor] 홈화면 변수명을 api schema에 맞춰 수정
wjdtkdgns777 Apr 17, 2024
3f24f18
[feat] 오늘의 축제일정 api 연결
wjdtkdgns777 Apr 17, 2024
a606523
[feat] 홈화면 관심축제 Local Database 연동
wjdtkdgns777 Apr 17, 2024
ac6028e
[fix] 관심학교 로컬 저장 데이터 중 StarList 컨버터 추가
wjdtkdgns777 Apr 18, 2024
001a0bc
[feat] Festival Response에 schoolId,festivalId 추가
wjdtkdgns777 Apr 18, 2024
4b411c9
[refactor] festivalSearchModel을 festivalModel로 변경
wjdtkdgns777 Apr 18, 2024
54d25f8
[refactor] 높이 설정 로직 정리
wjdtkdgns777 Apr 18, 2024
3e22e27
[feat] 관심축제 Entity 설정 추가
wjdtkdgns777 Apr 18, 2024
c5a2644
[feat] bottomsheet에 관심 축제 Local Database 연결
wjdtkdgns777 Apr 18, 2024
754f718
[feat] 홈화면과 메뉴화면의 bottom sheet에 관심 축제 Local Database 연결
wjdtkdgns777 Apr 18, 2024
9834cfa
[feat] 메뉴 화면의 나의 관심학교 연동
wjdtkdgns777 Apr 18, 2024
0c83fef
[feat] 메뉴화면 동시 데이터 처리를 위한 상태 업데이트 로직 개선
wjdtkdgns777 Apr 18, 2024
87ff83a
[feat] BottomSheetSearch 화면에서 관심 축제 추가기능 뷰모델 작성
wjdtkdgns777 Apr 19, 2024
0b74a60
[feat] 관심 축제 Entity 관련 null 설정
wjdtkdgns777 Apr 19, 2024
35d4023
[feat] 바텀 시트 검색화면의 관심 축제 Local Databe 저장 기능 연결
wjdtkdgns777 Apr 19, 2024
1198825
[feat] 현재 존재하는 관심 축제는 저장 하지 않는 로직 추가
wjdtkdgns777 Apr 19, 2024
9e02d41
[feat] 오늘의 축제 일정에 썸네일 추가
wjdtkdgns777 Apr 19, 2024
85295e1
[feat] 인트로 화면 관심축제 추가 Local Databe 연동
wjdtkdgns777 Apr 19, 2024
2ede49e
[chore] style check success
wjdtkdgns777 Apr 19, 2024
33b34d5
[chore] festivalId, schoolId Long으로 변경, StarList StarInfo로 변경
wjdtkdgns777 Apr 19, 2024
cfbf217
[refactor] 관심 축제 관련 LazyColumn들의 key를 schoolName에서 festivalId 로 변경
wjdtkdgns777 Apr 19, 2024
cdad109
[chore] StarListConverter에서 StarInfoConverter로 변경
wjdtkdgns777 Apr 19, 2024
dc07f58
[delete] 관심 축제 존재 여부 로직 삭제
wjdtkdgns777 Apr 19, 2024
11fbf54
[feat] LazyColumn key추가, 메뉴 뷰모델 관심 축제,관심 부스 불러오는 로직 분리
wjdtkdgns777 Apr 19, 2024
09fc226
[chore] style check success
wjdtkdgns777 Apr 19, 2024
b5cc0d3
[feat] 오늘의 축제 연예인 사진 부분 구현
wjdtkdgns777 Apr 19, 2024
d3eeefc
[chore] style check success
wjdtkdgns777 Apr 19, 2024
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
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package com.unifest.android.core.data.mapper

import com.unifest.android.core.database.entity.LikedFestivalEntity
import com.unifest.android.core.database.entity.StarInfoEntity
import com.unifest.android.core.model.FestivalModel
import com.unifest.android.core.model.FestivalTodayModel
import com.unifest.android.core.model.StarInfoModel

internal fun LikedFestivalEntity.toModel(): FestivalModel {
return FestivalModel(
festivalId = festivalId,
schoolId = schoolId,
thumbnail = thumbnail ?: "",
schoolName = schoolName,
festivalName = festivalName,
beginDate = beginDate ?: "",
endDate = endDate ?: "",
latitude = latitude ?: 0f,
longitude = longitude ?: 0f,
)
}

internal fun FestivalTodayModel.toEntity(): LikedFestivalEntity {
return LikedFestivalEntity(
festivalId = festivalId,
schoolName = schoolName,
festivalName = festivalName,
date = date,
starInfo = starInfo.map { it.toEntity() },
schoolId = schoolId,
thumbnail = thumbnail,
)
}

internal fun StarInfoModel.toEntity(): StarInfoEntity {
return StarInfoEntity(
name = name,
img = img,
)
}

internal fun FestivalModel.toEntity(): LikedFestivalEntity {
return LikedFestivalEntity(
festivalId = festivalId,
schoolName = schoolName,
festivalName = festivalName,
schoolId = schoolId,
thumbnail = thumbnail,
beginDate = beginDate,
endDate = endDate,
latitude = latitude,
longitude = longitude,
)
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,16 @@
package com.unifest.android.core.data.mapper

import com.unifest.android.core.model.FestivalSearchModel
import com.unifest.android.core.model.StarInfoModel
import com.unifest.android.core.model.FestivalModel
import com.unifest.android.core.model.FestivalTodayModel
import com.unifest.android.core.network.response.StarInfo
import com.unifest.android.core.network.response.FestivalSearch
import com.unifest.android.core.network.response.FestivalToday

internal fun FestivalSearch.toModel(): FestivalSearchModel {
return FestivalSearchModel(
internal fun FestivalSearch.toModel(): FestivalModel {
return FestivalModel(
festivalId = festivalId,
schoolId = schoolId,
thumbnail = thumbnail,
schoolName = schoolName,
festivalName = festivalName,
Expand All @@ -14,3 +20,22 @@ internal fun FestivalSearch.toModel(): FestivalSearchModel {
longitude = longitude,
)
}

internal fun FestivalToday.toModel(): FestivalTodayModel {
return FestivalTodayModel(
schoolName = schoolName,
festivalName = festivalName,
festivalId = festivalId,
date = date,
starInfo = starInfo.map { it.toModel() },
schoolId = schoolId,
thumbnail = thumbnail,
)
}

internal fun StarInfo.toModel(): StarInfoModel {
return StarInfoModel(
name = name,
img = img,
)
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,16 @@
package com.unifest.android.core.data.repository

import com.unifest.android.core.model.FestivalSearchModel
import com.unifest.android.core.model.FestivalModel
import com.unifest.android.core.model.FestivalTodayModel
import kotlinx.coroutines.flow.Flow

interface FestivalRepository {
suspend fun getAllFestivals(): Result<List<FestivalSearchModel>>
suspend fun searchFestival(name: String): Result<List<FestivalSearchModel>>
suspend fun getAllFestivals(): Result<List<FestivalModel>>
suspend fun searchFestival(name: String): Result<List<FestivalModel>>
suspend fun getIncomingFestivals(): Result<List<FestivalModel>>
suspend fun getTodayFestivals(date: String): Result<List<FestivalTodayModel>>
fun getLikedFestivals(): Flow<List<FestivalModel>>
suspend fun insertLikedFestivalAtHome(festival: FestivalTodayModel)
suspend fun insertLikedFestivalAtSearch(festival: FestivalModel)
suspend fun deleteLikedFestivalAtHome(festival: FestivalTodayModel)
}
Original file line number Diff line number Diff line change
@@ -1,18 +1,52 @@
package com.unifest.android.core.data.repository

import com.unifest.android.core.data.mapper.toEntity
import com.unifest.android.core.data.mapper.toModel
import com.unifest.android.core.data.util.runSuspendCatching
import com.unifest.android.core.database.LikedFestivalDao
import com.unifest.android.core.model.FestivalModel
import com.unifest.android.core.model.FestivalTodayModel
import com.unifest.android.core.network.service.UnifestService
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
import javax.inject.Inject

class FestivalRepositoryImpl @Inject constructor(
private val service: UnifestService,
private val likedFestivalDao: LikedFestivalDao,
) : FestivalRepository {

override fun getLikedFestivals(): Flow<List<FestivalModel>> {
return likedFestivalDao.getLikedFestivalList().map { likedFestivals ->
likedFestivals.map { likedFestival ->
likedFestival.toModel()
}
}
}
override suspend fun getAllFestivals() = runSuspendCatching {
service.getAllFestivals().data.map { it.toModel() }
}

override suspend fun searchFestival(name: String) = runSuspendCatching {
service.searchFestival(name).data.map { it.toModel() }
}

override suspend fun getIncomingFestivals() = runSuspendCatching {
service.getIncomingFestivals().data.map { it.toModel() }
}

override suspend fun getTodayFestivals(date: String) = runSuspendCatching {
service.getTodayFestivals(date).data.map { it.toModel() }
}

override suspend fun insertLikedFestivalAtHome(festival: FestivalTodayModel) {
likedFestivalDao.insertLikedFestival(festival.toEntity())
}

override suspend fun insertLikedFestivalAtSearch(festival: FestivalModel) {
likedFestivalDao.insertLikedFestival(festival.toEntity())
}
override suspend fun deleteLikedFestivalAtHome(festival: FestivalTodayModel) {
likedFestivalDao.deleteLikedFestival(festival.toEntity())
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.unifest.android.core.database

import androidx.room.Dao
import androidx.room.Delete
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
import com.unifest.android.core.database.entity.LikedFestivalEntity
import kotlinx.coroutines.flow.Flow

@Dao
interface LikedFestivalDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertLikedFestival(userInfo: LikedFestivalEntity)

@Delete
suspend fun deleteLikedFestival(userInfo: LikedFestivalEntity)

@Query("SELECT * FROM liked_festival")
fun getLikedFestivalList(): Flow<List<LikedFestivalEntity>>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.unifest.android.core.database

import androidx.room.Database
import androidx.room.RoomDatabase
import androidx.room.TypeConverters
import com.unifest.android.core.database.entity.LikedFestivalEntity

@Database(
entities = [LikedFestivalEntity::class],
version = 1,
exportSchema = true,
)
@TypeConverters(StarInfoConverter::class)
abstract class LikedFestivalDatabase : RoomDatabase() {
abstract fun likedFestivalDao(): LikedFestivalDao
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.unifest.android.core.database

import androidx.room.TypeConverter
import com.unifest.android.core.database.entity.StarInfoEntity
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json

class StarInfoConverter {
private val json = Json

@TypeConverter
fun fromStarInfo(starInfo: List<StarInfoEntity>): String {
return json.encodeToString(starInfo)
}

@TypeConverter
fun toStarInfo(starInfoString: String): List<StarInfoEntity> {
return json.decodeFromString(starInfoString)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ package com.unifest.android.core.database.di

import com.unifest.android.core.database.LikedBoothDao
import com.unifest.android.core.database.LikedBoothDatabase
import com.unifest.android.core.database.LikedFestivalDao
import com.unifest.android.core.database.LikedFestivalDatabase
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
Expand All @@ -14,4 +16,9 @@ object DaoModule {
fun provideLikedBoothDao(
database: LikedBoothDatabase,
): LikedBoothDao = database.likedBoothDao()

@Provides
fun provideLikedFestivalDao(
database: LikedFestivalDatabase,
): LikedFestivalDao = database.likedFestivalDao()
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.unifest.android.core.database.di
import android.content.Context
import androidx.room.Room
import com.unifest.android.core.database.LikedBoothDatabase
import com.unifest.android.core.database.LikedFestivalDatabase
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
Expand All @@ -22,4 +23,13 @@ object DatabaseModule {
LikedBoothDatabase::class.java,
"liked_booth_database",
).build()

@Singleton
@Provides
fun provideLikedFestivalDatabase(@ApplicationContext context: Context): LikedFestivalDatabase =
Room.databaseBuilder(
context.applicationContext,
LikedFestivalDatabase::class.java,
"liked_festival_database",
).build()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package com.unifest.android.core.database.entity

import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey
import kotlinx.serialization.Serializable

@Serializable
@Entity(tableName = "liked_festival")
data class LikedFestivalEntity(
@PrimaryKey
@ColumnInfo(name = "festival_id")
val festivalId: Long,

@ColumnInfo(name = "school_id")
val schoolId: Long,

@ColumnInfo(name = "school_name")
val schoolName: String,

@ColumnInfo(name = "festival_name")
val festivalName: String,

@ColumnInfo(name = "date")
val date: String? = null,

@ColumnInfo(name = "thumbnail")
val thumbnail: String? = null,

@ColumnInfo(name = "begin_date")
val beginDate: String? = null,

@ColumnInfo(name = "end_date")
val endDate: String? = null,

@ColumnInfo(name = "star_list")
val starInfo: List<StarInfoEntity>? = null,

@ColumnInfo(name = "latitude")
val latitude: Float? = null,

@ColumnInfo(name = "longitude")
val longitude: Float? = null,
)

@Serializable
data class StarInfoEntity(
val name: String = "",
val img: String = "",
)

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,13 @@ import androidx.compose.runtime.Stable

@Stable
data class FestivalModel(
val imgUrl: String,
val festivalId: Long,
val schoolId: Long,
val thumbnail: String,
val schoolName: String,
val festivalName: String,
val festivalDate: String,
val beginDate: String,
val endDate: String,
val latitude: Float,
val longitude: Float,
)

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.unifest.android.core.model

import androidx.compose.runtime.Stable

@Stable
data class FestivalTodayModel(
val thumbnail: String,
val schoolId: Long,
val festivalId: Long,
val date: String,
val festivalName: String,
val schoolName: String,
val starInfo: List<StarInfoModel>,
)

@Stable
data class StarInfoModel(
val name: String,
val img: String,
)

This file was deleted.

Loading
Loading