Skip to content

Instantly share code, notes, and snippets.

@dbousamra
Created January 7, 2016 23:03
Show Gist options
  • Select an option

  • Save dbousamra/beea763c85d13d430d42 to your computer and use it in GitHub Desktop.

Select an option

Save dbousamra/beea763c85d13d430d42 to your computer and use it in GitHub Desktop.
package com.cammy.nvr.repository.device
import com.cammy.nvr.domain.camera.{CameraId, CameraConfiguration}
import com.cammy.nvr.domain.device._
import doobie.imports._
trait DeviceRepository {
def addDevice(device: Device): ConnectionIO[Device] = {
DeviceQueries.insertDevice(device)
}
def getDeviceById(deviceId: DeviceId): ConnectionIO[Option[Device]] = {
DeviceQueries.queryDeviceByDeviceId(deviceId).option
}
def updateDevice(deviceId: DeviceId, device: Device): ConnectionIO[Device] = {
DeviceQueries.updateDevice(deviceId, device)
}
def getDevices: ConnectionIO[List[Device]] = {
DeviceQueries.queryAllDevices.list
}
def updateConfigurationForDeviceId(deviceId: DeviceId, configuration: DeviceConfiguration): ConnectionIO[DeviceConfiguration] = {
DeviceQueries.updateConfigurationDevice(deviceId, configuration)
}
def upsertCameraConfigurationForDevice(deviceId: DeviceId, cameraConfiguration: CameraConfiguration): ConnectionIO[CameraConfiguration] = {
for {
device <- DeviceQueries.queryDeviceByDeviceId(deviceId).unique
updatedConf <- updateConfigurationForDeviceId(deviceId, device.configuration.copy(cameras = device.configuration.cameras :+ cameraConfiguration))
queriedCamera <- DeviceQueries.queryCameraConfigurationForDevice(deviceId, cameraConfiguration.id)
} yield queriedCamera
}
}
object DeviceQueries {
import doobie.contrib.postgresql.pgtypes._
// So we know how to deal with Postgres native types
def insertDevice(device: Device): ConnectionIO[Device] =
sql"""
INSERT INTO devices
VALUES (${device.id}, ${device.name}, ${device.macAddress}, ${device.serial}, ${device.configuration})
""".update.withUniqueGeneratedKeys("id", "name", "mac_address", "serial", "configuration")
def updateDevice(deviceId: DeviceId, device: Device): ConnectionIO[Device] =
sql"""
UPDATE devices
SET mac_address=${device.macAddress}, name=${device.name} serial=${device.serial} configuration=${device.configuration}
WHERE id = $deviceId
""".update.withUniqueGeneratedKeys("id", "name", "mac_address", "serial", "configuration")
def queryDeviceByMacAddress(macAddress: MacAddress): Query0[Device] =
sql"""
SELECT id, name, mac_address, serial, configuration
FROM devices
WHERE mac_address = $macAddress
""".query[Device]
def queryDeviceByDeviceId(deviceId: DeviceId): Query0[Device] =
sql"""
SELECT id, name, mac_address, serial, configuration
FROM devices
WHERE id = $deviceId
""".query[Device]
def queryAllDevices: Query0[Device] =
sql"""
SELECT id, name, mac_address, serial, configuration
FROM devices
""".query[Device]
def updateConfigurationDevice(deviceId: DeviceId, configuration: DeviceConfiguration): ConnectionIO[DeviceConfiguration] = {
sql"""
UPDATE devices
SET configuration=${configuration}
WHERE id = $deviceId
""".update.withUniqueGeneratedKeys("configuration")
}
def queryCameraConfigurationForDevice(deviceId: DeviceId, cameraId: CameraId): ConnectionIO[CameraConfiguration] = {
???
}
}
case object DeviceRepository extends DeviceRepository
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment