Skip to content

Instantly share code, notes, and snippets.

@JaniKibichi
Created June 18, 2021 13:03
Show Gist options
  • Save JaniKibichi/03aecc018bfa082c9e275db62d123d06 to your computer and use it in GitHub Desktop.
Save JaniKibichi/03aecc018bfa082c9e275db62d123d06 to your computer and use it in GitHub Desktop.
package com.jakibichi.firestore
import akka.actor._
import co.uk.bboxx.firestore.UserProfileProtocol._
import co.uk.bboxx.utils.FireStoreConfig
import com.google.api.core.ApiFuture
import com.google.cloud.firestore._
import scala.collection.mutable
import scala.jdk.CollectionConverters._
object UserProfileProtocol{
def props(randomId:String):Props = Props(new UserProfileActor(randomId:String))
final case class GetUserProfile(phoneOne:String)
final case class UserProfile(
fullName:String,
idNumber:String,
idType:String,
acc:String,
phone:String,
language:String
)
final case class StoreUserProfile(user:UserProfile)
}
class UserProfileActor(randomId:String) extends Actor with ActorLogging{
def receive: Receive = {
case GetUserProfile(phoneOne:String) =>
// CREATE A REFERENCE
val usersCollRef: CollectionReference = FireStoreConfig.database.collection("UserProfile")
// CREATE A QUERY AGAINST THE COLLECTION
val query: Query = usersCollRef.whereEqualTo("phoneOne", phoneOne)
// RETRIEVE QUERY RESULTS ASYNCHRONOUSLY USING QUERY.GET
val querySnapshot: ApiFuture[QuerySnapshot] = query.get()
// GET DOCUMENT LIST
val documents: java.util.List[QueryDocumentSnapshot] = querySnapshot.get().getDocuments
val usersList: mutable.Buffer[UserProfile] = for (document <- documents.asScala) yield {
UserProfile(
fullName= document.getString("fullName"),
idNumber= document.getString("idNumber"),
idType= document.getString("idType"),
acc= document.getString("acc"),
phone= document.getString("phone")
language= document.getString("language")
)
}
log.info(
s"Received Request for ${phoneOne} UserProfile from FireStore DB as: ${usersList.toList}"
)
// RETURN DATA
sender() ! usersList.toList
case StoreUserProfile(user:UserProfile) =>
val userDocRef: DocumentReference = FireStoreConfig.database.collection("UserProfile").document(user.phoneOne)
val userMap = Map(
"fullName"->user.fullName,
"idNumber"->user.idNumber,
"idType"->user.idType,
"acc"->user.acc,
"phone"->user.phone,
"language"->user.language
)
// ASYNCHRONOUSLY WRITE DATA
val writtenResult: ApiFuture[WriteResult] = userDocRef.set(userMap.asJava, SetOptions.merge())
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment