Searching...
domingo, 11 de junio de 2023

Procesamiento de peticiones GraphQL en Datahub

A continuación se implementa un código en Scala con 2 objetos singleton. El primero de ellos se llamará DatahubExportRunner que recibe en el constructor la configuración de la aplicacion y se encarga de llamar a otro objeto singleton DatahubGraphqlProcessor pasando un prefijo de clave S3 en el constructor. En función del estado obtenido en la respuesta, que debe ser una instancia de case class con el estado del procesamiento de la petición y un mapa con clave correspondiente a la clave S3 y el valor con una lista de String con el contenido a guardar para ese objeto S3, el objeto DatahubExportRunner escribe el contenido en S3 o lanza una excepción indicando que no se ha podido realizar la exportación por estado incorrecto devuelto al hacer la petición al endpoint graphql de datahub. El objeto DatahubGraphqlProcessor se encarga de hacer una petición http al api rest de Datahub usando el endpoint de graphql, procesar la respuesta y devolver una instancia indicando el resultado.

El método runExport del objeto DatahubExportRunner recibe la configuración como parámetro y obtiene el s3KeyPrefix a partir de dicha configuración. Luego se pasa el prefijo de clave S3 al método que procesa la respuesta, ya que se usa para generar el mapa con el contenido a guardar en S3.

import scala.collection.mutable.ListBuffer import scala.util.{Failure, Success, Try} import scalaj.http.{Http, HttpResponse} // Case class para representar el resultado de la petición graphql case class DatahubGraphqlResponse(status: String, s3Data: Map[String, List[String]]) // Objeto singleton DatahubGraphqlProcessor para hacer la petición graphql y procesar la respuesta object DatahubGraphqlProcessor { def processGraphqlRequest(endpoint: String): DatahubGraphqlResponse = { // Realizar la petición HTTP al endpoint de graphql de Datahub val response: HttpResponse[String] = Http(endpoint).asString // Procesar la respuesta y devolver una instancia de DatahubGraphqlResponse if (response.is2xx) { // Parsear la respuesta y obtener los datos de S3 val s3Data: Map[String, List[String]] = parseResponse(response.body) // Crear la instancia de DatahubGraphqlResponse con el estado "Success" y los datos de S3 DatahubGraphqlResponse("Success", s3Data) } else { // Devolver una instancia de DatahubGraphqlResponse con el estado "Failure" y un mapa vacío DatahubGraphqlResponse("Failure", Map.empty) } } private def parseResponse(responseBody: String): Map[String, List[String]] = { // Implementar el parsing de la respuesta y devolver los datos de S3 en un mapa // ... Map.empty[String, List[String]] } } // Objeto singleton DatahubExportRunner para ejecutar la exportación de datos object DatahubExportRunner { def runExport(configuration: AppConfig): Unit = { // Construir el endpoint de graphql usando la configuración val endpoint: String = buildGraphqlEndpoint(configuration) // Llamar a DatahubGraphqlProcessor para obtener el resultado de la petición graphql val response: DatahubGraphqlResponse = DatahubGraphqlProcessor.processGraphqlRequest(endpoint) // Comprobar el estado de la respuesta y escribir el contenido en S3 o lanzar una excepción response.status match { case "Success" => val s3KeyPrefix = configuration.s3KeyPrefix writeContentToS3(response.s3Data, s3KeyPrefix) println("Data export successful.") case "Failure" => throw new RuntimeException("Data export failed.") } } private def buildGraphqlEndpoint(configuration: AppConfig): String = { // Implementar la construcción del endpoint de graphql usando la configuración // ... "" } private def writeContentToS3(s3Data: Map[String, List[String]], s3KeyPrefix: String): Unit = { // Implementar la lógica para escribir el contenido en S3 usando el prefijo de clave // ... } } // Case class para la configuración de la aplicación case class AppConfig(apiEndpoint: String, apiKey: String, s3KeyPrefix: String /* Otros parámetros */) // Ejemplo de uso val configuration = AppConfig("https://api.datahub.com/graphql", "API_KEY", "my-bucket/data/") DatahubExportRunner.runExport(configuration)


0 comentarios:

Publicar un comentario

Gracias por participar en esta página.

 
Back to top!