All Downloads are FREE. Search and download functionalities are using the official Maven repository.

uk.gov.nationalarchives.DAEventBridgeClient.scala Maven / Gradle / Ivy

package uk.gov.nationalarchives

import cats.effect.Async
import io.circe.syntax.EncoderOps
import io.circe.{Encoder, Printer}
import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider
import software.amazon.awssdk.http.async.SdkAsyncHttpClient
import software.amazon.awssdk.http.nio.netty.NettyNioAsyncHttpClient
import software.amazon.awssdk.regions.Region
import software.amazon.awssdk.services.eventbridge.EventBridgeAsyncClient
import software.amazon.awssdk.services.eventbridge.model.{PutEventsRequest, PutEventsRequestEntry, PutEventsResponse}

/** An EventBridgeAsyncClient client. It is written generically so can be used for any effect which has an Async
  * instance. Requires an implicit instance of cats Async which is used to convert CompletableFuture to F
  *
  * @param asyncClient
  *   An AWS EventBridge Async client
  * @tparam F
  *   Type of the effect
  */
class DAEventBridgeClient[F[_]: Async](asyncClient: EventBridgeAsyncClient):

  /** Sends an event to EventBridge. detail will be serialised to a json string.
    * @param sourceId
    *   The source ID to send to EventBridge
    * @param detailType
    *   The detail type to send to EventBridge
    * @param detail
    *   A Serializable class of type T. This will be serialised to a json string
    * @param enc
    *   The circe encoder to do the serialisation
    * @tparam U
    *   The type of the detailType (it's preferable to use an enum/sealed trait as the `toString` method will be used)
    * @tparam T
    *   The type of the detail class
    * @return
    */
  def publishEventToEventBridge[T, U](sourceId: String, detailType: U, detail: T)(using
      enc: Encoder[T]
  ): F[PutEventsResponse] =
    val detailAsString = detail.asJson.printWith(Printer.noSpaces)
    val requestEntry: PutEventsRequestEntry = PutEventsRequestEntry.builder
      .detail(detailAsString)
      .source(sourceId)
      .detailType(detailType.toString)
      .build()
    val putEventsRequest = PutEventsRequest.builder
      .entries(requestEntry)
      .build()

    Async[F].fromCompletableFuture(Async[F].pure(asyncClient.putEvents(putEventsRequest)))

object DAEventBridgeClient:

  private lazy val httpClient: SdkAsyncHttpClient = NettyNioAsyncHttpClient.builder.build
  private lazy val asyncClient: EventBridgeAsyncClient = EventBridgeAsyncClient.builder
    .httpClient(httpClient)
    .region(Region.EU_WEST_2)
    .credentialsProvider(DefaultCredentialsProvider.create())
    .build()

  def apply[F[_]: Async](eventBridgeAsyncClient: EventBridgeAsyncClient) =
    new DAEventBridgeClient[F](eventBridgeAsyncClient)

  def apply[F[_]: Async]() = new DAEventBridgeClient[F](asyncClient)




© 2015 - 2024 Weber Informatics LLC | Privacy Policy