From 0f04dcb5cc89a8e48541ad251bf6f4b22c52505d Mon Sep 17 00:00:00 2001 From: Jan Kaluža Date: Jul 16 2019 18:44:18 +0000 Subject: Merge #396 `Add option to show a shortened version of the JSON in the API to speed up loading times` --- diff --git a/freshmaker/views.py b/freshmaker/views.py index 30539ef..1e67220 100644 --- a/freshmaker/views.py +++ b/freshmaker/views.py @@ -256,19 +256,36 @@ class EventAPI(MethodView): :statuscode 200: Current events are returned. :statuscode 404: Freshmaker event not found. """ + # Boolean that is set to false if builds should not + # be displayed in order to increase api speed + # For API v1, this is true by default to not break the backward compatibility + # For API v2, this is false by default + value = request.args.getlist('show_full_json') + show_full_json = request.base_url.find("/api/1/") != -1 + if len(value) == 1 and value[0] == 'False': + show_full_json = False + elif len(value) == 1 and value[0] == 'True': + show_full_json = True + if id is None: p_query = filter_events(request) json_data = { 'meta': pagination_metadata(p_query) } - json_data['items'] = [item.json() for item in p_query.items] + + if not show_full_json: + json_data['items'] = [item.json_min() for item in p_query.items] + else: + json_data['items'] = [item.json() for item in p_query.items] return jsonify(json_data), 200 else: event = models.Event.query.filter_by(id=id).first() if event: + if not show_full_json: + return jsonify(event.json_min()), 200 return jsonify(event.json()), 200 else: return json_error(404, "Not Found", "No such event found.") @@ -591,7 +608,7 @@ API_V1_MAPPING = { def register_api_v1(): - """ Registers version 1 of MBS API. """ + """ Registers version 1 of Freshmaker API. """ for k, v in API_V1_MAPPING.items(): view = v.as_view(k) for key, val in api_v1.get(k, {}).items(): @@ -603,4 +620,20 @@ def register_api_v1(): app.register_blueprint(monitor_api) +def register_api_v2(): + """ Registers version 2 of Freshmaker API. """ + + # The API v2 has the same URL schema as v1, only semantic is different. + for k, v in API_V1_MAPPING.items(): + view = v.as_view(k + "_v2") + for key, val in api_v1.get(k, {}).items(): + app.add_url_rule(val['url'].replace("/api/1/", "/api/2/"), + endpoint=key + "_v2", + view_func=view, + **val['options']) + + app.register_blueprint(monitor_api) + + register_api_v1() +register_api_v2() diff --git a/tests/test_views.py b/tests/test_views.py index 5e9c354..d791e3b 100644 --- a/tests/test_views.py +++ b/tests/test_views.py @@ -317,6 +317,30 @@ class TestViews(helpers.ModelsTestCase): self.assertEqual(data['event_type_id'], models.EVENT_TYPES[events.TestingEvent]) self.assertEqual(len(data['builds']), 3) + def test_query_event_without_builds(self): + resp = self.client.get('/api/1/events/?show_full_json=False') + data = json.loads(resp.get_data(as_text=True)) + self.assertEqual(data['items'][0]['id'], 2) + self.assertRaises(KeyError, lambda: data['items'][0]['builds']) + + def test_query_event_id_without_builds(self): + resp = self.client.get('/api/1/events/2?show_full_json=False') + data = json.loads(resp.get_data(as_text=True)) + self.assertEqual(data['id'], 2) + self.assertRaises(KeyError, lambda: data['builds']) + + def test_query_event_without_builds_v2(self): + resp = self.client.get('/api/2/events/') + data = json.loads(resp.get_data(as_text=True)) + self.assertEqual(data['items'][0]['id'], 2) + self.assertRaises(KeyError, lambda: data['items'][0]['builds']) + + def test_query_event_id_without_builds_v2(self): + resp = self.client.get('/api/2/events/2') + data = json.loads(resp.get_data(as_text=True)) + self.assertEqual(data['id'], 2) + self.assertRaises(KeyError, lambda: data['builds']) + def test_query_events(self): resp = self.client.get('/api/1/events/') evs = json.loads(resp.get_data(as_text=True))['items']