Skip to content

Commit

Permalink
feat: implement history storage on database of room environmental data
Browse files Browse the repository at this point in the history
  • Loading branch information
AndreaGiulianelli committed Mar 11, 2023
1 parent b435283 commit e5bc54d
Show file tree
Hide file tree
Showing 2 changed files with 75 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,16 @@ package application.presenter.database.serialization

import application.presenter.database.model.TimeSeriesDataType
import application.presenter.database.model.TimeSeriesRoomEnvironmentalData
import application.presenter.database.model.TimeSeriesRoomMetadata
import entity.environment.Humidity
import entity.environment.LightUnit
import entity.environment.Luminosity
import entity.environment.Presence
import entity.environment.Temperature
import entity.environment.TemperatureUnit
import entity.zone.RoomEnvironmentalData
import entity.zone.RoomID
import java.time.Instant

/**
* Extension method that allows to convert a map of [TimeSeriesDataType] -> [TimeSeriesRoomEnvironmentalData]
Expand All @@ -40,3 +43,45 @@ fun Map<TimeSeriesDataType, TimeSeriesRoomEnvironmentalData?>.toRoomEnvironmenta
},
presence = this[TimeSeriesDataType.PRESENCE]?.let { Presence(it.value > 0) }
)

/**
* Extension method that allows to convert [RoomEnvironmentalData] in a map of [TimeSeriesRoomEnvironmentalData].
*/
fun RoomEnvironmentalData.toTimeSeries(dateTime: Instant, roomId: RoomID) = mapOf(
TimeSeriesDataType.TEMPERATURE to this.temperature?.let {
TimeSeriesRoomEnvironmentalData(
dateTime,
TimeSeriesRoomMetadata(
roomId,
TimeSeriesDataType.TEMPERATURE,
it.unit.toString()
),
it.value
)
},
TimeSeriesDataType.HUMIDITY to this.humidity?.let {
TimeSeriesRoomEnvironmentalData(
dateTime,
TimeSeriesRoomMetadata(roomId, TimeSeriesDataType.HUMIDITY),
it.percentage
)
},
TimeSeriesDataType.LUMINOSITY to this.luminosity?.let {
TimeSeriesRoomEnvironmentalData(
dateTime,
TimeSeriesRoomMetadata(
roomId,
TimeSeriesDataType.LUMINOSITY,
it.unit.toString()
),
it.value
)
},
TimeSeriesDataType.PRESENCE to this.presence?.let {
TimeSeriesRoomEnvironmentalData(
dateTime,
TimeSeriesRoomMetadata(roomId, TimeSeriesDataType.PRESENCE),
it.presenceDetected.let { p -> if (p) 1.0 else 0.0 }
)
}
).filter { it.value != null }
36 changes: 30 additions & 6 deletions src/main/kotlin/infrastructure/database/DatabaseManager.kt
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import application.presenter.database.model.TimeSeriesMedicalTechnologyUsage
import application.presenter.database.model.TimeSeriesRoomEnvironmentalData
import application.presenter.database.model.TimeSeriesRoomMetadata
import application.presenter.database.serialization.toRoomEnvironmentalData
import application.presenter.database.serialization.toTimeSeries
import com.mongodb.MongoException
import com.mongodb.client.MongoCollection
import entity.medicaltechnology.MedicalTechnology
Expand Down Expand Up @@ -82,12 +83,35 @@ class DatabaseManager(customConnectionString: String? = null) : RoomDatabaseMana
roomId: RoomID,
environmentalData: RoomEnvironmentalData,
dateTime: Instant
): Boolean {
// insert new data to the room_environmental_data collection
// update environmental data to the room document inside the room collection
// the environmental data collection has the room ID associated to the environmental data and a timestamp
// this data model must be created within this package because it is used only here.
TODO("Not yet implemented")
): Boolean = this.roomTimeSeriesCollection.safeMongoDbWrite(mapOf()) {
// update time series
val updatesMap = environmentalData.toTimeSeries(dateTime, roomId)
insertMany(updatesMap.values.map { it })
updatesMap
}.let {
// update room info with the latest values
this@DatabaseManager.roomCollection.safeMongoDbWrite(false) {
updateOne(
Room::id eq roomId,
it.toRoomEnvironmentalData().let { roomEnvData ->
listOfNotNull(
roomEnvData.temperature?.let { t ->
setValue(Room::environmentalData / RoomEnvironmentalData::temperature, t)
},
roomEnvData.humidity?.let { t ->
setValue(Room::environmentalData / RoomEnvironmentalData::humidity, t)
},
roomEnvData.luminosity?.let { t ->
setValue(Room::environmentalData / RoomEnvironmentalData::luminosity, t)
},
roomEnvData.presence?.let { t ->
setValue(Room::environmentalData / RoomEnvironmentalData::presence, t)
}
)
}
)
true
}
}

override fun saveMedicalTechnology(medicalTechnology: MedicalTechnology): Boolean =
Expand Down

0 comments on commit e5bc54d

Please sign in to comment.