/magda-registry-api/src/main/scala/au/csiro/data61/magda/registry/RegistryApp.scala

https://github.com/magda-io/magda · Scala · 128 lines · 106 code · 22 blank · 0 comment · 7 complexity · 926fd56ac7bfdafd62b6c08cc26f1ef7 MD5 · raw file

  1. package au.csiro.data61.magda.registry
  2. import akka.actor.Actor
  3. import akka.actor.ActorLogging
  4. import akka.actor.ActorSystem
  5. import akka.actor.DeadLetter
  6. import akka.actor.Props
  7. import akka.event.Logging
  8. import akka.http.scaladsl.Http
  9. import akka.http.scaladsl.model.HttpResponse
  10. import akka.http.scaladsl.model.StatusCodes
  11. import akka.http.scaladsl.server.Directives.complete
  12. import akka.http.scaladsl.server.{
  13. MalformedQueryParamRejection,
  14. RejectionHandler
  15. }
  16. import akka.stream.ActorMaterializer
  17. import au.csiro.data61.magda.AppConfig
  18. import au.csiro.data61.magda.client.AuthApiClient
  19. import scalikejdbc.GlobalSettings
  20. import scalikejdbc.config.TypesafeConfig
  21. import scalikejdbc.config.TypesafeConfigReader
  22. import scalikejdbc.config.EnvPrefix
  23. import scalikejdbc.config.DBs
  24. import com.typesafe.config.Config
  25. import scalikejdbc.LoggingSQLAndTimeSettings
  26. import scala.concurrent.ExecutionContextExecutor
  27. import scala.util.{Try, Success, Failure}
  28. object RegistryApp extends App {
  29. implicit val config: Config = AppConfig.conf()
  30. implicit val system: ActorSystem = ActorSystem("registry-api", config)
  31. implicit val executor: ExecutionContextExecutor = system.dispatcher
  32. implicit val materializer: ActorMaterializer = ActorMaterializer()
  33. implicit def myRejectionHandler: RejectionHandler =
  34. RejectionHandler
  35. .newBuilder()
  36. .handle {
  37. case MalformedQueryParamRejection(parameterName, errorMsg, cause) =>
  38. complete(
  39. HttpResponse(
  40. StatusCodes.BadRequest,
  41. entity =
  42. s"The query parameter `$parameterName` was malformed. Details:\n$errorMsg \n$cause"
  43. )
  44. )
  45. }
  46. .result()
  47. class Listener extends Actor with ActorLogging {
  48. def receive: PartialFunction[Any, Unit] = {
  49. case d: DeadLetter => log.info(d.message.toString)
  50. }
  51. }
  52. val logger = Logging(system, getClass)
  53. logger.info("Starting MAGDA Registry")
  54. logger.info("akka.http.server.request-timeout: {}", Try {
  55. config.getString("akka.http.server.request-timeout")
  56. } match {
  57. case Success(v) => v
  58. case Failure(e) => "None"
  59. })
  60. logger.info("akka.http.server.idle-timeout: {}", Try {
  61. config.getString("akka.http.server.idle-timeout")
  62. } match {
  63. case Success(v) => v
  64. case Failure(e) => "None"
  65. })
  66. case class DBsWithEnvSpecificConfig(configToUse: Config)
  67. extends DBs
  68. with TypesafeConfigReader
  69. with TypesafeConfig
  70. with EnvPrefix {
  71. override val config: Config = configToUse
  72. }
  73. DBsWithEnvSpecificConfig(config).setupAll()
  74. val listener = system.actorOf(Props(classOf[Listener]))
  75. system.eventStream.subscribe(listener, classOf[DeadLetter])
  76. val role =
  77. if (config.hasPath("role") && config.getString("role") == "readonly")
  78. ReadOnly
  79. else Full
  80. val webHookActorOpt = if (role == Full) {
  81. val actor = system.actorOf(
  82. WebHookActor.props(config.getString("http.externalUrl.v0")),
  83. name = "WebHookActor"
  84. )
  85. actor ! WebHookActor.Process(ignoreWaitingForResponse = true)
  86. Some(actor)
  87. } else None
  88. val recordPersistence = new DefaultRecordPersistence(config)
  89. val eventPersistence = new DefaultEventPersistence(recordPersistence)
  90. val api = new Api(
  91. webHookActorOpt,
  92. new RegistryAuthApiClient(),
  93. config,
  94. system,
  95. executor,
  96. materializer
  97. )
  98. val interface = Option(System.getenv("npm_package_config_interface"))
  99. .orElse(Option(config.getString("http.interface")))
  100. .getOrElse("127.0.0.1")
  101. val port = Option(System.getenv("npm_package_config_port"))
  102. .map(_.toInt)
  103. .orElse(Option(config.getInt("http.port")))
  104. .getOrElse(6101)
  105. Http().bindAndHandle(api.routes, interface, port)
  106. }