aboutsummaryrefslogtreecommitdiff
path: root/core-testkit/src/main/scala/xyz/driver/core/testkit/RestDatabaseResetService.scala
blob: db02bbbb8899a4b1fb64c84e984b940896f2f308 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
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))
  }
}