From bdfe9ba0607e997352c5ffd160aba2969dee5ec0 Mon Sep 17 00:00:00 2001 From: danielmasegosa Date: Sat, 21 Sep 2024 00:36:36 +0200 Subject: [PATCH 1/2] Add tinybird event sender --- build.gradle.kts | 2 + .../service/CollectIncidenceHandler.kt | 5 +- .../out/http/HttpIncidenceExtractor.kt | 1 - .../out/http/HttpTinyBirdEventCreator.kt | 70 +++++++++++++++++++ .../infrastructure/config/BeanInitializr.kt | 5 +- 5 files changed, 79 insertions(+), 4 deletions(-) create mode 100644 src/main/kotlin/org/sqvobs/argos/infrastructure/adapter/out/http/HttpTinyBirdEventCreator.kt diff --git a/build.gradle.kts b/build.gradle.kts index c8a7588..9d1dfca 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -4,6 +4,7 @@ plugins { id("org.springframework.boot") version "3.3.3" id("io.spring.dependency-management") version "1.1.6" kotlin("plugin.jpa") version "1.9.25" + kotlin("plugin.serialization") version "2.0.20" } group = "org.sqvobs" @@ -29,6 +30,7 @@ dependencies { implementation("org.springframework.boot:spring-boot-starter-web") implementation("com.fasterxml.jackson.module:jackson-module-kotlin") implementation("org.jetbrains.kotlin:kotlin-reflect") + implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.1") developmentOnly("org.springframework.boot:spring-boot-docker-compose") runtimeOnly("org.postgresql:postgresql") testImplementation("org.springframework.boot:spring-boot-starter-test") diff --git a/src/main/kotlin/org/sqvobs/argos/application/service/CollectIncidenceHandler.kt b/src/main/kotlin/org/sqvobs/argos/application/service/CollectIncidenceHandler.kt index 7678bf0..04102c8 100644 --- a/src/main/kotlin/org/sqvobs/argos/application/service/CollectIncidenceHandler.kt +++ b/src/main/kotlin/org/sqvobs/argos/application/service/CollectIncidenceHandler.kt @@ -4,11 +4,13 @@ import org.slf4j.LoggerFactory import org.sqvobs.argos.application.port.`in`.CollectIncidence import org.sqvobs.argos.application.port.out.IncidenceExtractor import org.sqvobs.argos.application.port.out.Incidences +import org.sqvobs.argos.infrastructure.adapter.out.http.HttpTinyBirdEventCreator import java.util.* class CollectIncidenceHandler( private val incidenceExtractor: IncidenceExtractor, - private val repository: Incidences + private val repository: Incidences, + private val tinyBirdEventCreator: HttpTinyBirdEventCreator ) : CollectIncidence { companion object { @@ -27,6 +29,7 @@ class CollectIncidenceHandler( incidenceExtractor.extract(paging) } .onEach { incidences -> repository.saveAll(incidences) } + .onEach { incidences -> tinyBirdEventCreator.generateEvents(incidences) } .onEach { incidences -> log.info("Incidences collected $incidences") } .takeWhile { incidences -> incidences.isNotEmpty() } .toList() diff --git a/src/main/kotlin/org/sqvobs/argos/infrastructure/adapter/out/http/HttpIncidenceExtractor.kt b/src/main/kotlin/org/sqvobs/argos/infrastructure/adapter/out/http/HttpIncidenceExtractor.kt index f30c53a..85528f3 100644 --- a/src/main/kotlin/org/sqvobs/argos/infrastructure/adapter/out/http/HttpIncidenceExtractor.kt +++ b/src/main/kotlin/org/sqvobs/argos/infrastructure/adapter/out/http/HttpIncidenceExtractor.kt @@ -30,7 +30,6 @@ class HttpIncidenceExtractor(private val restTemplate: RestTemplate) : Incidence null, object : ParameterizedTypeReference>() {} ).body - return response?.map(::fromExternalIncidence) ?: emptyList() } diff --git a/src/main/kotlin/org/sqvobs/argos/infrastructure/adapter/out/http/HttpTinyBirdEventCreator.kt b/src/main/kotlin/org/sqvobs/argos/infrastructure/adapter/out/http/HttpTinyBirdEventCreator.kt new file mode 100644 index 0000000..1cdf81e --- /dev/null +++ b/src/main/kotlin/org/sqvobs/argos/infrastructure/adapter/out/http/HttpTinyBirdEventCreator.kt @@ -0,0 +1,70 @@ +package org.sqvobs.argos.infrastructure.adapter.out.http + +import com.fasterxml.jackson.annotation.JsonProperty +import kotlinx.serialization.Serializable +import kotlinx.serialization.encodeToString +import kotlinx.serialization.json.Json +import org.slf4j.LoggerFactory +import org.springframework.stereotype.Component +import org.springframework.web.client.RestTemplate +import org.sqvobs.argos.domain.* +import java.net.HttpURLConnection +import java.net.URL +import java.nio.charset.StandardCharsets +import java.time.Clock +import java.time.Instant +import java.time.LocalDateTime + +@Component +class HttpTinyBirdEventCreator() { + + companion object { + private val log = LoggerFactory.getLogger(HttpTinyBirdEventCreator::class.java) + private const val INDICENCE_URL = "https://api-pgics.sevilla.org/requests" + } + + fun generateEvents(incidences: List) { + + val url = "https://api.eu-central-1.aws.tinybird.co/v0/events?name=incidences" + val auth = "TBD" + + if (auth == "TBD"){ + throw RuntimeException("Define bearer token from tinybird") + } + + incidences + .map { + IncidenceEvent(Instant.now().toString(), it.id.value, it.type.value, it.description?.value ?:"null", it.requestedDate.value.toString(), it.address?.value ?:"null", it.coordinates.latitude, it.coordinates.longitude, ) + }.map { + Json.encodeToString(it) + } + .onEach { + postEvent(url, auth, it) + } + + + } + + private fun postEvent(url: String, auth: String, data: String) { + val con = URL(url).openConnection() as HttpURLConnection + con.requestMethod = "POST" + con.setRequestProperty("Authorization", auth) + con.setRequestProperty("Content-Type", "application/json") + con.doOutput = true + con.outputStream.write(data.toByteArray(StandardCharsets.UTF_8)) + + println(String(con.inputStream.readAllBytes(), StandardCharsets.UTF_8)) + } + + @Serializable + data class IncidenceEvent( + val timestamp: String, + val id: String, + val type: String, + val description: String?, + val requestedDate: String, + val address: String?, + val latitude: Double, + val longitude: Double + ) +} diff --git a/src/main/kotlin/org/sqvobs/argos/infrastructure/config/BeanInitializr.kt b/src/main/kotlin/org/sqvobs/argos/infrastructure/config/BeanInitializr.kt index 24d7ee0..1242d74 100644 --- a/src/main/kotlin/org/sqvobs/argos/infrastructure/config/BeanInitializr.kt +++ b/src/main/kotlin/org/sqvobs/argos/infrastructure/config/BeanInitializr.kt @@ -7,6 +7,7 @@ import org.sqvobs.argos.application.port.out.IncidenceExtractor import org.sqvobs.argos.application.port.out.Incidences import org.sqvobs.argos.application.service.CollectIncidenceHandler import org.sqvobs.argos.infrastructure.adapter.out.http.HttpIncidenceExtractor +import org.sqvobs.argos.infrastructure.adapter.out.http.HttpTinyBirdEventCreator import org.sqvobs.argos.infrastructure.adapter.out.persistence.JpaIncidenceRepository import org.sqvobs.argos.infrastructure.adapter.out.persistence.JpaIncidences @@ -23,6 +24,6 @@ class BeanInitializr { fun incidenceExtractor(restTemplate: RestTemplate): IncidenceExtractor = HttpIncidenceExtractor(restTemplate) @Bean - fun collectIncidence(incidenceExtractor: IncidenceExtractor, repository: Incidences): CollectIncidenceHandler = - CollectIncidenceHandler(incidenceExtractor, repository) + fun collectIncidence(incidenceExtractor: IncidenceExtractor, repository: Incidences, tinyBirdEventCreator: HttpTinyBirdEventCreator): CollectIncidenceHandler = + CollectIncidenceHandler(incidenceExtractor, repository, tinyBirdEventCreator) } \ No newline at end of file From 4e9989ccef696a4f1148508e0f9404304bd9be4c Mon Sep 17 00:00:00 2001 From: danielmasegosa Date: Sun, 22 Sep 2024 00:33:08 +0200 Subject: [PATCH 2/2] Renamed event name datasource --- .../infrastructure/adapter/out/http/HttpTinyBirdEventCreator.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/org/sqvobs/argos/infrastructure/adapter/out/http/HttpTinyBirdEventCreator.kt b/src/main/kotlin/org/sqvobs/argos/infrastructure/adapter/out/http/HttpTinyBirdEventCreator.kt index 1cdf81e..4fa1be8 100644 --- a/src/main/kotlin/org/sqvobs/argos/infrastructure/adapter/out/http/HttpTinyBirdEventCreator.kt +++ b/src/main/kotlin/org/sqvobs/argos/infrastructure/adapter/out/http/HttpTinyBirdEventCreator.kt @@ -25,7 +25,7 @@ class HttpTinyBirdEventCreator() { fun generateEvents(incidences: List) { - val url = "https://api.eu-central-1.aws.tinybird.co/v0/events?name=incidences" + val url = "https://api.eu-central-1.aws.tinybird.co/v0/events?name=incidences2" val auth = "TBD" if (auth == "TBD"){