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
49 changes: 49 additions & 0 deletions dexcom-library/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@

group = 'org.radarbase'
version = '0.0.1'

apply plugin: 'maven-publish'

repositories {
// Use jcenter for resolving dependencies.
// You can declare any Maven/Ivy/file repository here.
mavenCentral()
}

dependencies {
// Use the Kotlin JDK 8 standard library.
implementation libs.kotlin.stdlib

implementation libs.okhttp

implementation libs.radar.schemas.commons

implementation libs.jackson.annotations

implementation libs.jackson.databind

implementation libs.avro

implementation libs.jackson.datatype.jsr310

implementation libs.slf4j.api

// Use the Kotlin test library.
testImplementation libs.kotlin.test

// Use the Kotlin JUnit integration.
testImplementation libs.kotlin.test.junit
}

project.afterEvaluate {
publishing {
publications {
library(MavenPublication) {
setGroupId "$group"
setArtifactId "dexcom-library"
version "$version"
from components.java
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package org.radarbase.dexcom.converter

import com.fasterxml.jackson.databind.JsonNode
import okhttp3.Headers
import org.radarbase.dexcom.request.DexcomRequestGenerator.Companion.JSON_READER
import org.radarbase.dexcom.request.RestRequest
import org.radarbase.dexcom.user.User
import java.time.Instant

interface DexcomDataConverter : RecordConverter {
fun processRecords(
root: JsonNode,
user: User,
): Sequence<Result<TopicData>>

override fun convert(
request: RestRequest,
headers: Headers,
data: ByteArray,
): List<TopicData> {
val node = JSON_READER.readTree(data)

return processRecords(node, request.user)
.mapNotNull { result ->
result.fold(
{ it },
{
RecordConverter.logger.error("Data conversion failed: ${it.message}")
null
},
)
}
.toList()
}

fun Instant.toEpoch(): Long = toEpochMilli() / 1000
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package org.radarbase.dexcom.converter

import com.fasterxml.jackson.databind.JsonNode
import org.radarbase.dexcom.user.User

class DexcomEGVConverter : DexcomDataConverter {
override fun processRecords(
root: JsonNode,
user: User,
): Sequence<Result<TopicData>> = emptySequence()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package org.radarbase.dexcom.converter

import okhttp3.Headers
import org.radarbase.dexcom.request.RestRequest
import org.slf4j.LoggerFactory
import java.io.IOException

interface RecordConverter {
@Throws(IOException::class)
fun convert(
request: RestRequest,
headers: Headers,
data: ByteArray,
): List<TopicData>

companion object {
var logger = LoggerFactory.getLogger(RecordConverter::class.java)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package org.radarbase.dexcom.converter

import org.apache.avro.specific.SpecificRecord

/** Single value for a topic. */
data class TopicData(
val topic: String,
val key: SpecificRecord,
val value: SpecificRecord,
val offset: Long,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package org.radarbase.dexcom.offset

import org.radarbase.dexcom.route.Route
import org.radarbase.dexcom.user.User
import java.time.Instant

data class Offset(
val user: User,
val route: Route,
val offset: Instant,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package org.radarbase.dexcom.offset

import org.radarbase.dexcom.request.Offset

data class Offsets(
val offsets: List<Offset>,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package org.radarbase.dexcom.request

import org.radarbase.dexcom.route.Route
import org.radarbase.dexcom.user.User
import java.time.Instant

data class Offset(
val user: User,
val route: Route,
val offset: Instant,
)

interface DexcomOffsetManager {

fun getOffset(route: Route, user: User): Offset?

fun updateOffsets(route: Route, user: User, offset: Instant)
}
Loading