Skip to content

Instantly share code, notes, and snippets.

@a914-gowtham
Last active September 25, 2021 06:15
Show Gist options
  • Save a914-gowtham/7905ea1c509e2b01d29c4f5eef21d237 to your computer and use it in GitHub Desktop.
Save a914-gowtham/7905ea1c509e2b01d29c4f5eef21d237 to your computer and use it in GitHub Desktop.
interface MessageSenderCallback{
fun onSuccess(message: Message)
fun onFailed(message: Message)
}
class MessageSender(private val msgCollection: CollectionReference,
private val dbRepo: DbRepository, private val chatUser: ChatUser,
private val listener: MessageSenderCallback) {
fun send(fromUser: String, toUser: String, message: Message) {
val docId = chatUser.documentId
if (!docId.isNullOrEmpty()){
Timber.v("Case 0 ${chatUser.documentId}")
send(docId, message)
} else {
//so we don't create multiple nodes for same chat
msgCollection.document("${fromUser}_${toUser}").get()
.addOnSuccessListener { documentSnapshot ->
if (documentSnapshot.exists()) {
//this node exists send your message
Timber.v("Case 1")
send("${fromUser}_${toUser}", message)
} else {
//senderId_receiverId node doesn't exist check receiverId_senderId
msgCollection.document("${toUser}_${fromUser}").get()
.addOnSuccessListener { documentSnapshot2 ->
if (documentSnapshot2.exists()) {
Timber.v("Case 2")
send("${toUser}_${fromUser}", message)
} else {
//no previous chat history(senderId_receiverId & receiverId_senderId both don't exist)
//so we create document senderId_receiverId then messages array then add messageMap to messages
//this node exists send your message
//add ids of chat members
Timber.v("Case 3")
msgCollection.document("${fromUser}_${toUser}")
.set(mapOf("chat_members" to FieldValue.arrayUnion(fromUser, toUser)),
SetOptions.merge()
).addOnSuccessListener {
LogMessage.v("chat member update successfully")
send("${fromUser}_${toUser}", message)
}.addOnFailureListener {
LogMessage.v("chat member update failed ${it.message}")
}
}
}
}
}
}
}
private fun send(doc: String, message: Message){
try {
chatUser.documentId=doc
dbRepo.insertUser(chatUser)
val chatUserId=message.chatUserId
message.chatUserId=null //chatUserId field is being used only for relation query,changing to null will ignore this field
message.status=1
message.chatUsers= arrayListOf(message.from,message.to)
msgCollection.document(doc).collection("messages").document(message.id).set(
message,
SetOptions.merge()
).addOnSuccessListener {
LogMessage.v("Message sender Sucesss ${message.createdAt}")
message.chatUserId=chatUserId
listener.onSuccess(message)
}.addOnFailureListener {
message.chatUserId=chatUserId
message.status=4
LogMessage.v("Message sender Failed ${it.message}")
listener.onFailed(message)
}
} catch (e: Exception) {
e.printStackTrace()
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment