|
| 1 | +package no.nav.mulighetsrommet.kafka |
| 2 | + |
| 3 | +import kotliquery.Row |
| 4 | +import kotliquery.queryOf |
| 5 | +import no.nav.common.kafka.producer.feilhandtering.KafkaProducerRepository |
| 6 | +import no.nav.common.kafka.producer.feilhandtering.StoredProducerRecord |
| 7 | +import no.nav.mulighetsrommet.database.Database |
| 8 | +import no.nav.mulighetsrommet.database.createTextArray |
| 9 | +import org.intellij.lang.annotations.Language |
| 10 | + |
| 11 | +class KafkaProducerRepositoryImpl(private val db: Database) : KafkaProducerRepository { |
| 12 | + override fun storeRecord(record: StoredProducerRecord): Long = db.session { session -> |
| 13 | + @Language("PostgreSQL") |
| 14 | + val sql = """ |
| 15 | + insert into kafka_producer_record (topic, key, value, headers_json) values (?, ?, ?, ?) |
| 16 | + returning id |
| 17 | + """.trimIndent() |
| 18 | + |
| 19 | + val query = queryOf(sql, record.topic, record.key, record.value, record.headersJson) |
| 20 | + |
| 21 | + session.single(query) { it.long("id") }!! |
| 22 | + } |
| 23 | + |
| 24 | + override fun deleteRecords(ids: List<Long>): Unit = db.session { session -> |
| 25 | + @Language("PostgreSQL") |
| 26 | + val sql = """ |
| 27 | + delete from kafka_producer_record where id = any(?::bigint[]) |
| 28 | + """.trimIndent() |
| 29 | + |
| 30 | + session.update(queryOf(sql, session.createArrayOf("bigint", ids))) |
| 31 | + } |
| 32 | + |
| 33 | + override fun getRecords(maxMessages: Int): List<StoredProducerRecord> = db.session { session -> |
| 34 | + @Language("PostgreSQL") |
| 35 | + val sql = """ |
| 36 | + select * from kafka_producer_record order by id limit ? |
| 37 | + """.trimIndent() |
| 38 | + |
| 39 | + val query = queryOf(sql, maxMessages) |
| 40 | + |
| 41 | + session.list(query) { toStoredProducerRecord(it) } |
| 42 | + } |
| 43 | + |
| 44 | + override fun getRecords(maxMessages: Int, topics: List<String>): List<StoredProducerRecord> = db.session { session -> |
| 45 | + @Language("PostgreSQL") |
| 46 | + val sql = """ |
| 47 | + select * from kafka_producer_record where topic = any(?::text[]) order by id limit ? |
| 48 | + """.trimIndent() |
| 49 | + |
| 50 | + val query = queryOf(sql, session.createTextArray(topics), maxMessages) |
| 51 | + |
| 52 | + session.list(query) { toStoredProducerRecord(it) } |
| 53 | + } |
| 54 | +} |
| 55 | + |
| 56 | +private fun toStoredProducerRecord(row: Row) = StoredProducerRecord( |
| 57 | + row.long("id"), |
| 58 | + row.string("topic"), |
| 59 | + row.bytes("key"), |
| 60 | + row.bytes("value"), |
| 61 | + row.string("headers_json"), |
| 62 | +) |
0 commit comments