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)) } }