Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ class HttpIncidenceExtractor(private val restTemplate: RestTemplate) : Incidence
null,
object : ParameterizedTypeReference<List<ExternalIncidence>>() {}
).body

return response?.map(::fromExternalIncidence) ?: emptyList()
}

Expand Down
Original file line number Diff line number Diff line change
@@ -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<Incidence>) {

val url = "https://api.eu-central-1.aws.tinybird.co/v0/events?name=incidences2"
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
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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)
}