Skip to content

Instantly share code, notes, and snippets.

package com.janikibichi.api
object RestAPI{
// 1. STORE MENU
def storeMenu(languageMenu:LanguageMenu):Future[MenuUpdate]={
val languageMenuActor = actorSystem.actorOf(LanguageMenuProtocol.props(languageMenu.language))
(languageMenuActor ? languageMenu).mapTo[MenuUpdate]
}

UTILITY USSD APP

INTRODUCTION

Expected Feature Set

The brand expected their user to dial into a quick code e.g. *483# and receive their service menu. The menu would be different depending on:

  • Country - so language
  • Whether the user is registered to the brand's services

The admin user would expect the following:

package co.uk.bboxx.firestore
import akka.actor._
import co.uk.bboxx.firestore.MenuOptionsProtocol._
import co.uk.bboxx.firestore.SessionStatesProtocol._
import co.uk.bboxx.utils.FireStoreConfig
import com.google.api.core.ApiFuture
import com.google.cloud.firestore._
import scala.jdk.CollectionConverters._
package com.janikibichi.firestore
import akka.actor.{Actor, ActorLogging, Props}
import co.uk.bboxx.firestore.MenuContentProtocol._
import co.uk.bboxx.utils.FireStoreConfig
import com.google.api.core.ApiFuture
import com.google.cloud.firestore._
import scala.jdk.CollectionConverters._
import scala.collection.mutable
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._
package com.janikibichi.firestore
import akka.actor._
import com.janikibichi.firestore.USSDSessionsProtocol._
import com.janikibichi.utils.FireStoreConfig
import com.google.api.core.ApiFuture
import com.google.cloud.firestore._
import scala.jdk.CollectionConverters._
import scala.collection.mutable
import scala.concurrent.duration._
package co.uk.bboxx.utils
import java.io.InputStream
import com.google.auth.oauth2.GoogleCredentials
import com.google.cloud.firestore.Firestore
import com.google.cloud.storage.{Bucket, Storage, StorageOptions}
import com.google.firebase.{FirebaseApp, FirebaseOptions}
import com.google.firebase.cloud.{FirestoreClient, StorageClient}
import com.typesafe.config.ConfigFactory
package com.janikibichi.utils
import akka.actor.ActorSystem
import akka.util.Timeout
import scala.concurrent.ExecutionContextExecutor
import scala.concurrent.duration._
object AppUtils{
implicit val requestTimeout: Timeout = 15.seconds
implicit val actorSystem: ActorSystem = ActorSystem("UTILITY-USSD-API")
package com.janikibichi.models.africastalking.ussd
object USSDFSMProtocol {
def props(sessionId: String): Props = Props(new USSDFSMActor(sessionId: String))
final case class USSDRequest(sessionId: String, phoneNumber: String, networkCode: String, serviceCode: String, text: String)
final case class USSDMenu(title: String, body: String, options: String)
//FSM STATE
sealed trait USSDState
package com.janikibichi.routes.cors
import akka.http.scaladsl.model.HttpMethods._
import akka.http.scaladsl.model._
import akka.http.scaladsl.model.headers._
import akka.http.scaladsl.server.Directives._
import akka.http.scaladsl.server._
import scala.concurrent.duration._
trait CORSHandler{