From dca25472473793b9a09818c34167e5e70f502dad Mon Sep 17 00:00:00 2001 From: David Trattnig <david.trattnig@o94.at> Date: Tue, 10 Mar 2020 15:08:23 +0100 Subject: [PATCH] Improved API response code handling. --- api.py | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/api.py b/api.py index 712f4f70..597540dc 100644 --- a/api.py +++ b/api.py @@ -35,10 +35,12 @@ from flask_cors import CORS from flask_sqlalchemy import SQLAlchemy from flask_marshmallow import Marshmallow from marshmallow import Schema, fields, post_dump -from flask_restful import Api, Resource +from flask_restful import Api, Resource, abort from apispec import APISpec from apispec.ext.marshmallow import MarshmallowPlugin from apispec_webframeworks.flask import FlaskPlugin +# import werkzeug +from werkzeug.exceptions import HTTPException, default_exceptions, Aborter from libraries.base.logger import AuraLogger from libraries.base.config import AuraConfig @@ -62,12 +64,21 @@ app.config["CACHE_TYPE"] = "simple" app.config["CACHE_DEFAULT_TIMEOUT"] = 0 app.config['SEND_FILE_MAX_AGE_DEFAULT'] = 0 cache = Cache(app) -cors = CORS(app, resources={r"/*": {"origins": "*"}}) +cors = CORS(app, resources={r"/*": {"origins": "*"}}) # FIXME Update CORS for production use db = SQLAlchemy(app) ma = Marshmallow(app) api = Api(app) +# +# Werkzeug HTTP code mappings +# +class NoDataAvailable(HTTPException): + code = 204 + description = "There is currently no content available." +default_exceptions[204] = NoDataAvailable +abort = Aborter() + class EngineApi: """ @@ -95,6 +106,7 @@ class EngineApi: spec.components.schema("TrackService", schema=TrackServiceSchema) + # Schema instances EngineApi.trackservice_schema = TrackServiceSchema(many=True) EngineApi.track_schema = TrackServiceSchema() @@ -265,6 +277,8 @@ class CurrentTrackResource(Resource): def get(self): track = TrackService.select_current() + if not track: + return abort(204) # No content available return EngineApi.track_schema.dump(track) @@ -278,6 +292,8 @@ class TracksByDayResource(Resource): date = datetime.strptime(date_string, "%Y-%m-%d") self.logger.debug("Query track-service by day: %s" % str(date)) tracks = TrackService.select_by_day(date) + if not tracks: + return abort(204) # No content available return EngineApi.trackservice_schema.dump(tracks) @@ -291,6 +307,8 @@ class UpcomingSchedulesResource(Resource): now = datetime.now() self.logger.debug("Query upcoming schedules after %s" % str(now)) schedules = Schedule.select_upcoming(3) + if not schedules: + return abort(204) # No content available return EngineApi.schedule_schema.dump(schedules) @@ -310,6 +328,8 @@ class ReportResource(Resource): self.logger.debug("Query report for month: %s - %s" % (str(first_day), str(next_month))) report = TrackService.select_by_range(first_day, next_month) + if not report: + return abort(204) # No content available return EngineApi.report_schema.dump(report) -- GitLab