From 3110c808b12ce31bdfea8268869a3305483e9f1e Mon Sep 17 00:00:00 2001 From: Michael Weimann Date: Mon, 5 Jul 2021 18:54:25 +0200 Subject: [PATCH] implement profile search --- ki/handlers/__init__.py | 1 + ki/handlers/find_profiles.py | 28 ++++++++++++++++++ ki/routes.py | 7 +++++ ki/test/test_find_profiles_endpoint.py | 39 ++++++++++++++++++++++++++ 4 files changed, 75 insertions(+) create mode 100644 ki/handlers/find_profiles.py create mode 100644 ki/test/test_find_profiles_endpoint.py diff --git a/ki/handlers/__init__.py b/ki/handlers/__init__.py index 58e71f0..1a5de95 100644 --- a/ki/handlers/__init__.py +++ b/ki/handlers/__init__.py @@ -1 +1,2 @@ +from ki.handlers.find_profiles import find_profiles # noqa from ki.handlers.update_profile import update_profile # noqa diff --git a/ki/handlers/find_profiles.py b/ki/handlers/find_profiles.py new file mode 100644 index 0000000..a6a015a --- /dev/null +++ b/ki/handlers/find_profiles.py @@ -0,0 +1,28 @@ +from flask import make_response, request + +from ki.models import Profile + + +def find_profiles(): + page = int(request.args.get("page", 1)) + + if page < 1: + return make_response({"messages": {"page": "Die angefragte Seite muss mindestens 1 sein"}}, 400) + + page_size = int(request.args.get("page_size", 20)) + + if page_size > 100: + return make_response({"messages": {"page_size": "Die maximale Anzahl Einträge pro Seite beträgt 100"}}, 400) + + offset = (page - 1) * page_size + + query = Profile.query.filter(Profile.visible is True) + count = query.count() + + db_profiles = query.limit(page_size).offset(offset).all() + api_profiles = [] + + for db_profile in db_profiles: + api_profiles.append(db_profile.to_dict()) + + return make_response({"total": count, "profiles": api_profiles}) diff --git a/ki/routes.py b/ki/routes.py index 51cec70..44121f5 100644 --- a/ki/routes.py +++ b/ki/routes.py @@ -3,6 +3,7 @@ from flask import g, make_response, request, send_file from functools import wraps from ki.auth import auth +from ki.handlers import find_profiles as find_profiles_handler from ki.handlers import update_profile as update_profile_handler from ki.models import ContactType, Language, Skill, Token, User from app import app @@ -139,6 +140,12 @@ def get_contacttypes(): return handle_completion_request(ContactType, "contacttypes") +@app.route("/users/profiles") +@token_auth +def find_profiles(): + return find_profiles_handler() + + @app.route("/skills") @token_auth def get_skills(): diff --git a/ki/test/test_find_profiles_endpoint.py b/ki/test/test_find_profiles_endpoint.py new file mode 100644 index 0000000..93fcc96 --- /dev/null +++ b/ki/test/test_find_profiles_endpoint.py @@ -0,0 +1,39 @@ +import unittest + +from ki.test.ApiTest import ApiTest + + +class TestSkillsEndpoint(ApiTest): + def test_skills_options(self): + response = self.client.options("/skills") + self.assertEqual(response.status_code, 200) + self.assertIn("Access-Control-Allow-Origin", response.headers) + self.assertEqual(response.headers["Access-Control-Allow-Origin"], "*") + + def test_get_skills1(self): + token = self.login("peter", "geheim")["token"] + + response = self.client.get("/skills?search=p", headers={"Authorization": "Bearer " + token}) + self.assertEqual(response.status_code, 200) + self.assertEqual( + { + "skills": [{ + "id": 1, + "name": "PHP", + "icon_url": "/skills/1/icon" + }, { + "id": 10, + "name": "PostgreSQL", + "icon_url": "/skills/10/icon" + }, { + "id": 3, + "name": "Python", + "icon_url": "/skills/3/icon" + }] + }, response.json) + self.assertIn("Access-Control-Allow-Origin", response.headers) + self.assertEqual(response.headers["Access-Control-Allow-Origin"], "*") + + +if __name__ == "main": + unittest.main()