Closed vmkmym closed 8 months ago
오늘 작업했는데 구분은 잘되는 상태, 근데 로드를 못해옴 (저장은 잘됨) 이것만 고치면 될 듯
class GeminiChatModel {
fun saveChatMessage(geminiChatMessage: GeminiChatMessage, title: String, uuid: String) {
val database = Firebase.database
val chatRef = database.getReference("final/$title")
val newMessageRef = chatRef.push()
newMessageRef.setValue(geminiChatMessage)
newMessageRef.child("uuid").setValue(uuid)
}
fun saveChatbotMessage(geminiChatbotMessage: GeminiChatMessage, title: String, uuid: String) {
val database = Firebase.database
val chatRef = database.getReference("final/$title")
val newMessageRef = chatRef.push()
newMessageRef.setValue(geminiChatbotMessage)
newMessageRef.child("uuid").setValue(uuid)
}
fun loadChatMessages(listener: (List<GeminiChatMessage>) -> Unit, title: String, uuid: String) {
val database = Firebase.database
val chatRef = database.getReference("final/$title")
val query = chatRef.orderByChild("uuid").equalTo(uuid)
query.addValueEventListener(object : ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
val messages = mutableListOf<GeminiChatMessage>()
for (childSnapshot in snapshot.children) {
val chatMessage = childSnapshot.getValue(GeminiChatMessage::class.java)
chatMessage?.let {
messages.add(it)
}
}
listener(messages)
}
override fun onCancelled(error: DatabaseError) {
// Failed to read value
Log.w("GeminiChatModel, loadChatMessages", "fail load message", error.toException())
}
})
}
fun loadChatbotMessages(listener: (List<GeminiChatMessage>) -> Unit, title: String, uuid: String) {
val database = Firebase.database
val chatRef = database.getReference("final/$title")
val query = chatRef.orderByChild("uuid").equalTo(uuid)
query.addValueEventListener(object : ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
val messages = mutableListOf<GeminiChatMessage>()
for (childSnapshot in snapshot.children) {
val chatMessage = childSnapshot.getValue(GeminiChatMessage::class.java)
chatMessage?.let {
messages.add(it)
}
}
listener(messages)
}
override fun onCancelled(error: DatabaseError) {
Log.w("GeminiChatModel, loadChatBotMessages", "fail load message", error.toException())
}
})
}
}
uuid 값이 다름 , 채팅을 보낼 때도 문장마다 다름
================================================================================
uuid 값이 다름 , 채팅을 보낼 때도 문장마다 다름 -> 왜 다른지 확인 -> Realtime DB에 보낼때? == uuid값을 매개변수로 받아옴(어디서?) -> ChatListScreen에서 받아옴 -> $novelInfo.uuid로 받아옴(novelInfo에 uuid를 어디서 만들지?) -> val uuid: String = UUID.randomUUID().toString() 기본값으로 생성해줌(값을 지정 안해주면 랜덤 생성이 됨) -> 값이 지정 안됐을 것 같음(어디서?) -> 불러올 때 어떻게 불러오는지 확인 -> documentId값을 넣어주려고 novelInfo값을 전부 대입시켰음(지금 보면 db에 올릴때 documentID값을 만들어줘서 필요없는 로직) -> 이때 uuid값을 대입 시켜주지 않음(uuid가 랜덤으로 생성됨) -> 로직 변경(user_id만 같다면 data를 그냥 불러옴) -> uuid값을 db에 올린 값을 계속 사용
변경전 코드(Firebase Tool 위치)
suspend fun fetchNovelInfoDataFromFirestore(userId: String): List<NovelInfo> =
suspendCoroutine { continuation ->
val db = FirebaseFirestore.getInstance()
val result = mutableListOf<NovelInfo>()
db.collection("NovelInfo")
.orderBy("createdDate", Query.Direction.DESCENDING)
.get().addOnSuccessListener { querySnapshot ->
for (document in querySnapshot) {
val novelInfoId = document.id
val novelInfo = document.toObject(NovelInfo::class.java)
if (novelInfo.userID == userId) {
val bookWithId = NovelInfo(
novelInfo.title,
novelInfo.assistId,
novelInfo.threadId,
novelInfo.userID,
novelInfo.createdDate,
novelInfoId
)
result.add(bookWithId)
}
}
continuation.resume(result)
}.addOnFailureListener { exception ->
println("Error getting documents: $exception")
continuation.resumeWithException(exception)
}
}
변경 후 코드
suspend fun fetchNovelInfoDataFromFirestore(userId: String): List<NovelInfo> = coroutineScope {
val db = FirebaseFirestore.getInstance()
try {
db.collection("NovelInfo")
.orderBy("createdDate", Query.Direction.DESCENDING)
.get().await().documents.mapNotNull { document ->
val novelInfo = document.toObject(NovelInfo::class.java)
if (novelInfo?.userID == userId) {
novelInfo
} else {
null
}
}
} catch (e: Exception) {
println("Error getting documents: $e")
emptyList()
}
}
================================================================================
uuid 값이 같아짐
data class NovelInfo(
val title: String = "",
val assistId: String = "",
val threadId: String = "",
val userID: String = "",
val createdDate: String = "",
val documentID: String? = null,
val uuid: String = ""
)
데이터 클래스를 호출할 때 랜덤값 생성이 아니라 assistId, threadId, createdDate처럼 값이 생성되어야 할 때 만들어주고 할당된 값을 재사용하는 방식으로 로직을 짜보려고 함
data class NovelInfo
에 uuid
필드를 String으로 선언해준다.Create Ground.kt
에서 showGeminiDialog
일 때 confirmButton
을 누를 때 val currentUUID = UUID.randomUUID().toString()
를 선언해줘서 채팅방을 만들 때 고유값을 랜덤 생성해준다. 그 값을 NovelInfo
객체에 uuid = currentUUID
로 할당해준다.saveNovelInfo
에 NovelInfo.uuid
를 추가해준다.GeminiChatScreen.kt
, ChatListScreen.kt
, GeminiChatModel.kt
, GeminiChatViewModel.kt
에서 uuid매개변수를 추가해준다.
db 규칙 변경