diff --git a/app/src/main/java/com/hotdeal/alarm/data/local/db/AppDatabase.kt b/app/src/main/java/com/hotdeal/alarm/data/local/db/AppDatabase.kt index ebcfad3..e6f9de4 100644 --- a/app/src/main/java/com/hotdeal/alarm/data/local/db/AppDatabase.kt +++ b/app/src/main/java/com/hotdeal/alarm/data/local/db/AppDatabase.kt @@ -21,7 +21,7 @@ import com.hotdeal.alarm.data.local.db.entity.SiteConfigEntity SiteConfigEntity::class, KeywordEntity::class ], - version = 4, + version = 5, exportSchema = false ) @TypeConverters(Converters::class) @@ -61,5 +61,14 @@ abstract class AppDatabase : RoomDatabase() { db.execSQL("ALTER TABLE hot_deals ADD COLUMN isFavorite INTEGER NOT NULL DEFAULT 0") } } + + /** + * Migration 4 -> 5: 인기 게시물 필드 추가 + */ + val MIGRATION_4_5 = object : Migration(4, 5) { + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL("ALTER TABLE hot_deals ADD COLUMN isPopular INTEGER NOT NULL DEFAULT 0") + } + } } } diff --git a/app/src/main/java/com/hotdeal/alarm/data/local/db/entity/HotDealEntity.kt b/app/src/main/java/com/hotdeal/alarm/data/local/db/entity/HotDealEntity.kt index a68a7b3..bddc19b 100644 --- a/app/src/main/java/com/hotdeal/alarm/data/local/db/entity/HotDealEntity.kt +++ b/app/src/main/java/com/hotdeal/alarm/data/local/db/entity/HotDealEntity.kt @@ -16,6 +16,19 @@ import com.hotdeal.alarm.domain.model.HotDeal ] ) data class HotDealEntity( + @PrimaryKey + val id: String, + val siteName: String, + val boardName: String, + val title: String, + val url: String, + val mallUrl: String?, + val createdAt: Long, + val isNotified: Boolean = false, + val isKeywordMatch: Boolean = false, + val isFavorite: Boolean = false, // 즐겨찾기 여부 + val isPopular: Boolean = false // 인기/핫 게시물 여부 +) { @PrimaryKey val id: String, val siteName: String, @@ -31,7 +44,21 @@ data class HotDealEntity( /** * Domain 모델로 변환 */ - fun toDomain(): HotDeal { + fun toDomain(): HotDeal { + return HotDeal( + id = id, + siteName = siteName, + boardName = boardName, + title = title, + url = url, + mallUrl = mallUrl, + createdAt = createdAt, + isNotified = isNotified, + isKeywordMatch = isKeywordMatch, + isFavorite = isFavorite, + isPopular = isPopular + ) + } return HotDeal( id = id, siteName = siteName, @@ -50,7 +77,21 @@ data class HotDealEntity( /** * Domain 모델에서 Entity 생성 */ - fun fromDomain(domain: HotDeal): HotDealEntity { + fun fromDomain(domain: HotDeal): HotDealEntity { + return HotDealEntity( + id = domain.id, + siteName = domain.siteName, + boardName = domain.boardName, + title = domain.title, + url = domain.url, + mallUrl = domain.mallUrl, + createdAt = domain.createdAt, + isNotified = domain.isNotified, + isKeywordMatch = domain.isKeywordMatch, + isFavorite = domain.isFavorite, + isPopular = domain.isPopular + ) + } return HotDealEntity( id = domain.id, siteName = domain.siteName, diff --git a/app/src/main/java/com/hotdeal/alarm/di/DatabaseModule.kt b/app/src/main/java/com/hotdeal/alarm/di/DatabaseModule.kt index 116eccf..24d7b75 100644 --- a/app/src/main/java/com/hotdeal/alarm/di/DatabaseModule.kt +++ b/app/src/main/java/com/hotdeal/alarm/di/DatabaseModule.kt @@ -34,6 +34,11 @@ object DatabaseModule { .addMigrations( AppDatabase.MIGRATION_1_2, AppDatabase.MIGRATION_2_3, + AppDatabase.MIGRATION_3_4, + AppDatabase.MIGRATION_4_5 + ) + AppDatabase.MIGRATION_1_2, + AppDatabase.MIGRATION_2_3, AppDatabase.MIGRATION_3_4 ) .fallbackToDestructiveMigration() diff --git a/app/src/main/java/com/hotdeal/alarm/domain/model/HotDeal.kt b/app/src/main/java/com/hotdeal/alarm/domain/model/HotDeal.kt index f5385b0..8b801a5 100644 --- a/app/src/main/java/com/hotdeal/alarm/domain/model/HotDeal.kt +++ b/app/src/main/java/com/hotdeal/alarm/domain/model/HotDeal.kt @@ -4,6 +4,18 @@ package com.hotdeal.alarm.domain.model * 핫딜 도메인 모델 */ data class HotDeal( + val id: String, // siteName + "_" + postId + val siteName: String, // ppomppu, clien, ruriweb, coolenjoy, quasarzone + val boardName: String, // ppomppu, ppomppu4, allsell, jirum, etc. + val title: String, // 게시글 제목 + val url: String, // 게시글 URL + val mallUrl: String? = null, // 쇼핑몰 URL (추출된 경우) + val createdAt: Long, // 수집 시간 (timestamp) + val isNotified: Boolean = false, + val isKeywordMatch: Boolean = false, + val isFavorite: Boolean = false, // 즐겨찾기 여부 + val isPopular: Boolean = false // 인기/핫 게시물 여부 +) { val id: String, // siteName + "_" + postId val siteName: String, // ppomppu, clien, ruriweb, coolenjoy, quasarzone val boardName: String, // ppomppu, ppomppu4, allsell, jirum, etc.