From d9c66ed0ab72aa45fe5a88ba4fa0e50d079c1976 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ensar=20Saraj=C4=8Di=C4=87?= Date: Tue, 11 Dec 2018 20:15:34 +0100 Subject: [PATCH] Add latest device recording route --- app/api/blueprint.py | 3 +++ app/api/resources/device.py | 8 +++++++ .../get_latest_device_recording_spec.yaml | 21 +++++++++++++++++++ app/devices/api.py | 17 +++++++++++++++ app/devices/models.py | 7 +++++++ 5 files changed, 56 insertions(+) create mode 100644 app/api/resources/swagger/get_latest_device_recording_spec.yaml diff --git a/app/api/blueprint.py b/app/api/blueprint.py index 43bdbb8..8ceacfa 100644 --- a/app/api/blueprint.py +++ b/app/api/blueprint.py @@ -19,6 +19,7 @@ def add_resources(): from .resources.token import TokenResource, ValidateTokenResource from .resources.device import (DeviceResource, DeviceRecordingResource, + DeviceLatestRecordingResource, DeviceRecordingQueryResource, DeviceListResource, DeviceTypeResource, @@ -49,6 +50,8 @@ def add_resources(): api.add_resource(DeviceResource, '/v1/devices/') api.add_resource(DeviceRecordingResource, '/v1/devices//recordings') + api.add_resource(DeviceLatestRecordingResource, + '/v1/devices//recordings/latest') api.add_resource(DeviceRecordingQueryResource, '/v1/devices//recordings/jsonql') api.add_resource(DeviceListResource, '/v1/devices') diff --git a/app/api/resources/device.py b/app/api/resources/device.py index 499fd9a..9420a5e 100644 --- a/app/api/resources/device.py +++ b/app/api/resources/device.py @@ -129,6 +129,14 @@ class DeviceRecordingResource(ProtectedResource): return RecordingsSchema().dump(created_recording), 201 +class DeviceLatestRecordingResource(ProtectedResource): + @swag_from('swagger/get_latest_device_recording_spec.yaml') + def get(self, device_id): + validate_device_ownership(device_id) + return RecordingsSchema().dump( + devices.get_latest_device_recording(device_id)), 200 + + class DeviceRecordingQueryResource(ProtectedResource): @use_args(RecordingsQuerySchema(), locations=('json',)) @swag_from('swagger/create_device_recording_query_spec.yaml') diff --git a/app/api/resources/swagger/get_latest_device_recording_spec.yaml b/app/api/resources/swagger/get_latest_device_recording_spec.yaml new file mode 100644 index 0000000..33c013e --- /dev/null +++ b/app/api/resources/swagger/get_latest_device_recording_spec.yaml @@ -0,0 +1,21 @@ +Gets latest recording for given device +--- +tags: + - Device + - Recording +parameters: + - in: path + name: device_id + required: true + type: integer + description: Id of the device +responses: + 200: + description: Success + schema: + type: object + required: + - content + properties: + content: + $ref: '#/definitions/Recording' diff --git a/app/devices/api.py b/app/devices/api.py index 8a0530c..b62c2b0 100644 --- a/app/devices/api.py +++ b/app/devices/api.py @@ -142,6 +142,23 @@ def get_device_recordings_filtered(device_id, record_type=None, start_date, end_date) +def get_latest_device_recording(device_id): + """ + Tries to get most recent recording for device with given parameters. Raises + error on failure + + :param device_id: Id of device + :type device_id: int + :returns: Single recording (last recording) + :rtpe: Recording + :raises: ValueError if device does not exist + """ + if not Device.exists(id=device_id): + raise NotPresentError("Device with id %s does not exist" % device_id) + + return Recording.get_latest(device_id) + + def get_device(device_id): """ Tries to get device with given parameters. Raises error on failure diff --git a/app/devices/models.py b/app/devices/models.py index 17c4539..8011e2e 100644 --- a/app/devices/models.py +++ b/app/devices/models.py @@ -108,6 +108,13 @@ class Recording(db.Model): """ return Recording.query.filter_by(**kwargs).first_or_404() + @staticmethod + def get_latest(device_id): + """ + Get latest recording for device with id device_id + """ + return Recording.query.order_by('recorded_at desc').first_or_404() + def __repr__(self): return '' % ( self.record_value, self.recorded_at)