aboutsummaryrefslogblamecommitdiff
path: root/core-testkit/src/main/scala/xyz/driver/core/testkit/RestDatabaseResetService.scala
blob: db02bbbb8899a4b1fb64c84e984b940896f2f308 (plain) (tree)





































































                                                                                                                 
package xyz.driver.core.testkit

import akka.actor.ActorSystem
import akka.http.scaladsl.model._
import akka.stream.ActorMaterializer
import spray.json._
import xyz.driver.core.Name
import xyz.driver.core.rest.{RestService, ServiceRequestContext, ServiceTransport}

import scala.concurrent.{ExecutionContext, Future}
import scalaz.{ListT, OptionT}

object RestDatabaseResetService {
  import DefaultJsonProtocol._
  import xyz.driver.core.json._

  final case class Application(name: Name[Application], tag: String)

  final case class Environment(name: Name[Environment], applications: Seq[Application], status: String)

  implicit val applicationJsonFormat = jsonFormat2(Application)

  implicit val environmentJsonFormat = jsonFormat3(Environment)
}

class RestDatabaseResetService(
    transport: ServiceTransport,
    baseUri: Uri,
    actorSystem: ActorSystem,
    executionContext: ExecutionContext)
    extends RestService {

  import DefaultJsonProtocol._
  import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport._
  import RestDatabaseResetService._

  protected implicit val exec         = executionContext
  protected implicit val materializer = ActorMaterializer()(actorSystem)

  def getAvailableEnvironments(): ListT[Future, String] = {
    val request = get(baseUri, s"/v1/environment")
    listResponse[String](transport.sendRequest(new ServiceRequestContext())(request))
  }

  def getEnvironmentDetails(envName: Name[Environment]): ListT[Future, Environment] = {
    val requestStub = get(baseUri, s"/v1/environment/$envName")
    listResponse[Environment](transport.sendRequest(new ServiceRequestContext())(requestStub))
  }

  def getEnvironmentStatus(envName: Name[Environment]): OptionT[Future, String] = {
    val requestStub = get(baseUri, s"/v1/environment/$envName/status")
    optionalResponse[String](transport.sendRequest(new ServiceRequestContext())(requestStub))
  }

  def resetEnvironmentStatus(envName: Name[Environment], newStatus: String): OptionT[Future, String] = {
    val requestStub = HttpRequest(HttpMethods.POST, endpointUri(baseUri, s"/v1/environment/$envName/status"))
    optionalResponse[String](transport.sendRequest(new ServiceRequestContext())(requestStub))
  }

  def resetEnvironmentApplicationsData(envName: Name[Environment]): OptionT[Future, Unit] = {
    val requestStub = HttpRequest(HttpMethods.POST, endpointUri(baseUri, s"/v1/environment/$envName/reset"))
    unitResponse(transport.sendRequest(new ServiceRequestContext())(requestStub))
  }

  def updateEnvironmentState(updatedEnvironment: Environment)(
      implicit ctx: ServiceRequestContext): OptionT[Future, Environment] = {
    val requestStub = postJson(baseUri, s"/v1/environment/${updatedEnvironment.name}", updatedEnvironment.toJson)
    optionalResponse[Environment](transport.sendRequest(ctx)(requestStub))
  }
}