diff --git a/app-android/app/src/main/java/com/huaga/life_echo/data/database/AppDatabase.kt b/app-android/app/src/main/java/com/huaga/life_echo/data/database/AppDatabase.kt index 2519f62..aa632b2 100644 --- a/app-android/app/src/main/java/com/huaga/life_echo/data/database/AppDatabase.kt +++ b/app-android/app/src/main/java/com/huaga/life_echo/data/database/AppDatabase.kt @@ -11,15 +11,17 @@ import androidx.room.RoomDatabase Conversation::class, ConversationSegment::class, Chapter::class, - Book::class + Book::class, + Message::class ], - version = 1, + version = 2, exportSchema = false ) abstract class AppDatabase : RoomDatabase() { abstract fun conversationDao(): ConversationDao abstract fun conversationSegmentDao(): ConversationSegmentDao abstract fun chapterDao(): ChapterDao + abstract fun messageDao(): MessageDao companion object { @Volatile diff --git a/app-android/app/src/main/java/com/huaga/life_echo/data/database/Book.kt b/app-android/app/src/main/java/com/huaga/life_echo/data/database/Book.kt index 9a40d08..18c29e0 100644 --- a/app-android/app/src/main/java/com/huaga/life_echo/data/database/Book.kt +++ b/app-android/app/src/main/java/com/huaga/life_echo/data/database/Book.kt @@ -8,8 +8,10 @@ data class Book( @PrimaryKey val id: String, val userId: String, val title: String, + val subtitle: String? = null, val totalPages: Int, val totalWords: Int, - val updatedAt: Long + val updatedAt: Long, + val lastUpdatedAt: Long? = null ) diff --git a/app-android/app/src/main/java/com/huaga/life_echo/data/database/Chapter.kt b/app-android/app/src/main/java/com/huaga/life_echo/data/database/Chapter.kt index 2a2d6d5..f29ef6c 100644 --- a/app-android/app/src/main/java/com/huaga/life_echo/data/database/Chapter.kt +++ b/app-android/app/src/main/java/com/huaga/life_echo/data/database/Chapter.kt @@ -9,8 +9,9 @@ data class Chapter( val title: String, val content: String, val orderIndex: Int, - val status: String, // draft, completed + val status: String, // draft, partial, completed val updatedAt: Long, - val category: String + val category: String, + val pageCount: Int? = null ) diff --git a/app-android/app/src/main/java/com/huaga/life_echo/data/database/Conversation.kt b/app-android/app/src/main/java/com/huaga/life_echo/data/database/Conversation.kt index d84e9e0..4d1bb71 100644 --- a/app-android/app/src/main/java/com/huaga/life_echo/data/database/Conversation.kt +++ b/app-android/app/src/main/java/com/huaga/life_echo/data/database/Conversation.kt @@ -12,6 +12,10 @@ data class Conversation( val durationSeconds: Int, val summary: String?, val currentTopic: String?, - val conversationStage: String? // CHILDHOOD, EDUCATION, CAREER, FAMILY, BELIEFS, SUMMARY + val conversationStage: String?, // CHILDHOOD, EDUCATION, CAREER, FAMILY, BELIEFS, SUMMARY + val avatarUrl: String? = null, + val title: String? = null, + val latestMessagePreview: String? = null, + val latestMessageTime: Long? = null ) diff --git a/app-android/app/src/main/java/com/huaga/life_echo/data/database/Message.kt b/app-android/app/src/main/java/com/huaga/life_echo/data/database/Message.kt new file mode 100644 index 0000000..dc83b8f --- /dev/null +++ b/app-android/app/src/main/java/com/huaga/life_echo/data/database/Message.kt @@ -0,0 +1,14 @@ +package com.huaga.life_echo.data.database + +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity(tableName = "messages") +data class Message( + @PrimaryKey val id: String, + val conversationId: String, + val content: String, + val senderType: String, // "user" or "assistant" + val timestamp: Long, + val messageType: String = "text" // "text", "audio", "image" +) diff --git a/app-android/app/src/main/java/com/huaga/life_echo/data/database/MessageDao.kt b/app-android/app/src/main/java/com/huaga/life_echo/data/database/MessageDao.kt new file mode 100644 index 0000000..2c85efc --- /dev/null +++ b/app-android/app/src/main/java/com/huaga/life_echo/data/database/MessageDao.kt @@ -0,0 +1,28 @@ +package com.huaga.life_echo.data.database + +import androidx.room.* +import kotlinx.coroutines.flow.Flow + +@Dao +interface MessageDao { + @Query("SELECT * FROM messages WHERE conversationId = :conversationId ORDER BY timestamp ASC") + fun getMessagesByConversationId(conversationId: String): Flow> + + @Query("SELECT * FROM messages WHERE id = :id") + suspend fun getMessageById(id: String): Message? + + @Insert(onConflict = OnConflictStrategy.REPLACE) + suspend fun insertMessage(message: Message) + + @Insert(onConflict = OnConflictStrategy.REPLACE) + suspend fun insertMessages(messages: List) + + @Update + suspend fun updateMessage(message: Message) + + @Delete + suspend fun deleteMessage(message: Message) + + @Query("DELETE FROM messages WHERE conversationId = :conversationId") + suspend fun deleteMessagesByConversationId(conversationId: String) +} diff --git a/app-android/app/src/main/java/com/huaga/life_echo/data/database/Order.kt b/app-android/app/src/main/java/com/huaga/life_echo/data/database/Order.kt new file mode 100644 index 0000000..c94837a --- /dev/null +++ b/app-android/app/src/main/java/com/huaga/life_echo/data/database/Order.kt @@ -0,0 +1,19 @@ +package com.huaga.life_echo.data.database + +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity(tableName = "orders") +data class Order( + @PrimaryKey val id: String, + val userId: String, + val planId: String, + val planName: String, + val amount: Double, + val currency: String = "CNY", + val status: String, // "pending", "paid", "failed", "cancelled" + val paymentMethod: String? = null, // "wechat", "alipay" + val createdAt: Long, + val paidAt: Long? = null, + val expiresAt: Long? = null +) diff --git a/app-android/app/src/main/java/com/huaga/life_echo/data/database/Plan.kt b/app-android/app/src/main/java/com/huaga/life_echo/data/database/Plan.kt new file mode 100644 index 0000000..29b80cf --- /dev/null +++ b/app-android/app/src/main/java/com/huaga/life_echo/data/database/Plan.kt @@ -0,0 +1,18 @@ +package com.huaga.life_echo.data.database + +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity(tableName = "plans") +data class Plan( + @PrimaryKey val id: String, + val name: String, + val displayName: String, + val price: Double, + val currency: String = "CNY", + val billingCycle: String, // "monthly", "yearly" + val features: String, // JSON string of features list + val isActive: Boolean = true, + val isCurrentPlan: Boolean = false, + val cachedAt: Long = System.currentTimeMillis() +)