From 9ec6c20c7b5ef58b070863aa9b697cf1c3f33226 Mon Sep 17 00:00:00 2001
From: robban64 <carl@schonfelder.se>
Date: Tue, 27 Apr 2021 15:12:49 +0200
Subject: [PATCH] fix: moved parsers to api

---
 server/app/apis/alternatives.py |  11 ++--
 server/app/apis/answers.py      |  14 +++--
 server/app/apis/auth.py         |  17 ++++--
 server/app/apis/codes.py        |   4 +-
 server/app/apis/competitions.py |  15 ++++-
 server/app/apis/components.py   |  19 ++++--
 server/app/apis/media.py        |  11 ++--
 server/app/apis/misc.py         |   4 +-
 server/app/apis/questions.py    |   9 ++-
 server/app/apis/slides.py       |   9 ++-
 server/app/apis/teams.py        |   9 +--
 server/app/apis/users.py        |  27 ++++++---
 server/app/core/parsers.py      | 101 --------------------------------
 13 files changed, 102 insertions(+), 148 deletions(-)

diff --git a/server/app/apis/alternatives.py b/server/app/apis/alternatives.py
index ce7b4e7d..2adad553 100644
--- a/server/app/apis/alternatives.py
+++ b/server/app/apis/alternatives.py
@@ -1,17 +1,18 @@
 import app.core.http_codes as codes
 import app.database.controller as dbc
 from app.apis import check_jwt, item_response, list_response
-from app.core.dto import QuestionAlternativeDTO, QuestionDTO
-from app.core.parsers import question_alternative_parser
-from app.core.schemas import QuestionAlternativeSchema
-from app.database.models import Question, QuestionAlternative
-from flask_jwt_extended import jwt_required
+from app.core.dto import QuestionAlternativeDTO
 from flask_restx import Resource
+from flask_restx import reqparse
 
 api = QuestionAlternativeDTO.api
 schema = QuestionAlternativeDTO.schema
 list_schema = QuestionAlternativeDTO.list_schema
 
+question_alternative_parser = reqparse.RequestParser()
+question_alternative_parser.add_argument("text", type=str, default=None, location="json")
+question_alternative_parser.add_argument("value", type=int, default=None, location="json")
+
 
 @api.route("")
 @api.param("competition_id, slide_id, question_id")
diff --git a/server/app/apis/answers.py b/server/app/apis/answers.py
index 0ef30039..6bb30ddb 100644
--- a/server/app/apis/answers.py
+++ b/server/app/apis/answers.py
@@ -2,16 +2,22 @@ import app.core.http_codes as codes
 import app.database.controller as dbc
 from app.apis import check_jwt, item_response, list_response
 from app.core.dto import QuestionAnswerDTO
-from app.core.parsers import question_answer_edit_parser, question_answer_parser
-from app.core.schemas import QuestionAlternativeSchema
-from app.database.models import Question, QuestionAlternative, QuestionAnswer
-from flask_jwt_extended import jwt_required
 from flask_restx import Resource
+from flask_restx import reqparse
 
 api = QuestionAnswerDTO.api
 schema = QuestionAnswerDTO.schema
 list_schema = QuestionAnswerDTO.list_schema
 
+question_answer_parser = reqparse.RequestParser()
+question_answer_parser.add_argument("data", type=dict, required=True, location="json")
+question_answer_parser.add_argument("score", type=int, required=True, location="json")
+question_answer_parser.add_argument("question_id", type=int, required=True, location="json")
+
+question_answer_edit_parser = reqparse.RequestParser()
+question_answer_edit_parser.add_argument("data", type=dict, default=None, location="json")
+question_answer_edit_parser.add_argument("score", type=int, default=None, location="json")
+
 
 @api.route("")
 @api.param("competition_id, team_id")
diff --git a/server/app/apis/auth.py b/server/app/apis/auth.py
index e043f1b1..37da9e98 100644
--- a/server/app/apis/auth.py
+++ b/server/app/apis/auth.py
@@ -3,22 +3,31 @@ import app.database.controller as dbc
 from app.apis import check_jwt, item_response, text_response
 from app.core.codes import verify_code
 from app.core.dto import AuthDTO, CodeDTO
-from app.core.parsers import create_user_parser, login_code_parser, login_parser
-from app.database.models import User
 from flask_jwt_extended import (
     create_access_token,
     create_refresh_token,
     get_jwt_identity,
     get_raw_jwt,
     jwt_refresh_token_required,
-    jwt_required,
 )
-from flask_restx import Namespace, Resource, cors
+from flask_restx import Resource
+from flask_restx import inputs, reqparse
 
 api = AuthDTO.api
 schema = AuthDTO.schema
 list_schema = AuthDTO.list_schema
 
+login_parser = reqparse.RequestParser()
+login_parser.add_argument("email", type=inputs.email(), required=True, location="json")
+login_parser.add_argument("password", required=True, location="json")
+
+create_user_parser = login_parser.copy()
+create_user_parser.add_argument("city_id", type=int, required=True, location="json")
+create_user_parser.add_argument("role_id", type=int, required=True, location="json")
+
+login_code_parser = reqparse.RequestParser()
+login_code_parser.add_argument("code", type=str, location="json")
+
 
 def get_user_claims(item_user):
     return {"role": item_user.role.name, "city_id": item_user.city_id}
diff --git a/server/app/apis/codes.py b/server/app/apis/codes.py
index 7d58aef0..8a4105d2 100644
--- a/server/app/apis/codes.py
+++ b/server/app/apis/codes.py
@@ -2,9 +2,7 @@ import app.database.controller as dbc
 from app.apis import check_jwt, item_response, list_response
 from app.core import http_codes as codes
 from app.core.dto import CodeDTO
-from app.core.parsers import code_parser
-from app.database.models import Code, Competition
-from flask_jwt_extended import jwt_required
+from app.database.models import Code
 from flask_restx import Resource
 
 api = CodeDTO.api
diff --git a/server/app/apis/competitions.py b/server/app/apis/competitions.py
index 6421ba34..e806f34a 100644
--- a/server/app/apis/competitions.py
+++ b/server/app/apis/competitions.py
@@ -2,18 +2,27 @@ import time
 
 import app.database.controller as dbc
 from app.apis import check_jwt, item_response, list_response
-from app.core import rich_schemas
 from app.core.dto import CompetitionDTO
-from app.core.parsers import competition_parser, competition_search_parser
 from app.database.models import Competition
-from flask_jwt_extended import jwt_required
 from flask_restx import Resource
+from flask_restx import reqparse
+from app.core.parsers import search_parser
 
 api = CompetitionDTO.api
 schema = CompetitionDTO.schema
 rich_schema = CompetitionDTO.rich_schema
 list_schema = CompetitionDTO.list_schema
 
+competition_parser = reqparse.RequestParser()
+competition_parser.add_argument("name", type=str, location="json")
+competition_parser.add_argument("year", type=int, location="json")
+competition_parser.add_argument("city_id", type=int, location="json")
+
+competition_search_parser = search_parser.copy()
+competition_search_parser.add_argument("name", type=str, default=None, location="args")
+competition_search_parser.add_argument("year", type=int, default=None, location="args")
+competition_search_parser.add_argument("city_id", type=int, default=None, location="args")
+
 
 @api.route("")
 class CompetitionsList(Resource):
diff --git a/server/app/apis/components.py b/server/app/apis/components.py
index 806e65e9..8ab67b8c 100644
--- a/server/app/apis/components.py
+++ b/server/app/apis/components.py
@@ -2,17 +2,28 @@ import app.core.http_codes as codes
 import app.database.controller as dbc
 from app.apis import check_jwt, item_response, list_response
 from app.core.dto import ComponentDTO
-from app.core.parsers import component_create_parser, component_edit_parser, component_parser
-from app.database.models import Competition, Component
-from flask.globals import request
-from flask_jwt_extended import jwt_required
 from flask_restx import Resource
+from flask_restx import reqparse
 
 api = ComponentDTO.api
 schema = ComponentDTO.schema
 list_schema = ComponentDTO.list_schema
 
 
+component_parser = reqparse.RequestParser()
+component_parser.add_argument("x", type=str, default=None, location="json")
+component_parser.add_argument("y", type=int, default=None, location="json")
+component_parser.add_argument("w", type=int, default=None, location="json")
+component_parser.add_argument("h", type=int, default=None, location="json")
+
+component_edit_parser = component_parser.copy()
+component_edit_parser.add_argument("text", type=str, location="json")
+component_edit_parser.add_argument("media_id", type=str, location="json")
+
+component_create_parser = component_edit_parser.copy()
+component_create_parser.add_argument("type_id", type=int, required=True, location="json")
+
+
 @api.route("/<component_id>")
 @api.param("competition_id, slide_id, component_id")
 class ComponentByID(Resource):
diff --git a/server/app/apis/media.py b/server/app/apis/media.py
index 8f0b28f7..5d89550a 100644
--- a/server/app/apis/media.py
+++ b/server/app/apis/media.py
@@ -2,11 +2,11 @@ import app.core.http_codes as codes
 import app.database.controller as dbc
 from app.apis import check_jwt, item_response, list_response
 from app.core.dto import MediaDTO
-from app.core.parsers import media_parser_search
-from app.database.models import City, Media, MediaType, QuestionType, Role
+from app.core.parsers import search_parser
+from app.database.models import Media
 from flask import request
-from flask_jwt_extended import get_jwt_identity, jwt_required
-from flask_restx import Resource, reqparse
+from flask_jwt_extended import get_jwt_identity
+from flask_restx import Resource
 from flask_uploads import UploadNotAllowed
 from sqlalchemy import exc
 import app.core.files as files
@@ -16,6 +16,9 @@ image_set = MediaDTO.image_set
 schema = MediaDTO.schema
 list_schema = MediaDTO.list_schema
 
+media_parser_search = search_parser.copy()
+media_parser_search.add_argument("filename", type=str, default=None, location="args")
+
 
 @api.route("/images")
 class ImageList(Resource):
diff --git a/server/app/apis/misc.py b/server/app/apis/misc.py
index 8b3bd5e5..ab52362d 100644
--- a/server/app/apis/misc.py
+++ b/server/app/apis/misc.py
@@ -1,10 +1,10 @@
 import app.database.controller as dbc
-from app.apis import check_jwt, item_response, list_response
+from app.apis import check_jwt, list_response
 from app.core import http_codes
 from app.core.dto import MiscDTO
 from app.database.models import City, Competition, ComponentType, MediaType, QuestionType, Role, User, ViewType
-from flask_jwt_extended import jwt_required
 from flask_restx import Resource, reqparse
+from flask_restx import reqparse
 
 api = MiscDTO.api
 
diff --git a/server/app/apis/questions.py b/server/app/apis/questions.py
index 5797872a..aaefafc4 100644
--- a/server/app/apis/questions.py
+++ b/server/app/apis/questions.py
@@ -2,15 +2,18 @@ import app.core.http_codes as codes
 import app.database.controller as dbc
 from app.apis import check_jwt, item_response, list_response
 from app.core.dto import QuestionDTO
-from app.core.parsers import question_parser
-from app.database.models import Question
-from flask_jwt_extended import jwt_required
 from flask_restx import Resource
+from flask_restx import reqparse
 
 api = QuestionDTO.api
 schema = QuestionDTO.schema
 list_schema = QuestionDTO.list_schema
 
+question_parser = reqparse.RequestParser()
+question_parser.add_argument("name", type=str, default=None, location="json")
+question_parser.add_argument("total_score", type=int, default=None, location="json")
+question_parser.add_argument("type_id", type=int, default=None, location="json")
+
 
 @api.route("/questions")
 @api.param("competition_id")
diff --git a/server/app/apis/slides.py b/server/app/apis/slides.py
index 9ca4a5f2..1823531e 100644
--- a/server/app/apis/slides.py
+++ b/server/app/apis/slides.py
@@ -2,15 +2,18 @@ import app.core.http_codes as codes
 import app.database.controller as dbc
 from app.apis import check_jwt, item_response, list_response
 from app.core.dto import SlideDTO
-from app.core.parsers import slide_parser
-from app.database.models import Competition, Slide
-from flask_jwt_extended import jwt_required
 from flask_restx import Resource
+from flask_restx import reqparse
 
 api = SlideDTO.api
 schema = SlideDTO.schema
 list_schema = SlideDTO.list_schema
 
+slide_parser = reqparse.RequestParser()
+slide_parser.add_argument("order", type=int, default=None, location="json")
+slide_parser.add_argument("title", type=str, default=None, location="json")
+slide_parser.add_argument("timer", type=int, default=None, location="json")
+
 
 @api.route("")
 @api.param("competition_id")
diff --git a/server/app/apis/teams.py b/server/app/apis/teams.py
index 514748ae..3fcb276c 100644
--- a/server/app/apis/teams.py
+++ b/server/app/apis/teams.py
@@ -2,15 +2,16 @@ import app.core.http_codes as codes
 import app.database.controller as dbc
 from app.apis import check_jwt, item_response, list_response
 from app.core.dto import TeamDTO
-from app.core.parsers import team_parser
-from app.database.models import Competition, Team
-from flask_jwt_extended import get_jwt_identity, jwt_required
-from flask_restx import Namespace, Resource, reqparse
+from flask_restx import Resource, reqparse
+from flask_restx import reqparse
 
 api = TeamDTO.api
 schema = TeamDTO.schema
 list_schema = TeamDTO.list_schema
 
+team_parser = reqparse.RequestParser()
+team_parser.add_argument("name", type=str, location="json")
+
 
 @api.route("")
 @api.param("competition_id")
diff --git a/server/app/apis/users.py b/server/app/apis/users.py
index 1bae000b..a5b2d58b 100644
--- a/server/app/apis/users.py
+++ b/server/app/apis/users.py
@@ -2,18 +2,29 @@ import app.core.http_codes as codes
 import app.database.controller as dbc
 from app.apis import check_jwt, item_response, list_response
 from app.core.dto import UserDTO
-from app.core.parsers import user_parser, user_search_parser
-from app.database.models import User
-from flask import request
-from flask_jwt_extended import get_jwt_identity, jwt_required
-from flask_restx import Namespace, Resource
+from flask_jwt_extended import get_jwt_identity
+from flask_restx import Resource
+from flask_restx import inputs, reqparse
+from app.core.parsers import search_parser
 
 api = UserDTO.api
 schema = UserDTO.schema
 list_schema = UserDTO.list_schema
 
+user_parser = reqparse.RequestParser()
+user_parser.add_argument("email", type=inputs.email(), location="json")
+user_parser.add_argument("name", type=str, location="json")
+user_parser.add_argument("city_id", type=int, location="json")
+user_parser.add_argument("role_id", type=int, location="json")
 
-def edit_user(item_user, args):
+user_search_parser = search_parser.copy()
+user_search_parser.add_argument("name", type=str, default=None, location="args")
+user_search_parser.add_argument("email", type=str, default=None, location="args")
+user_search_parser.add_argument("city_id", type=int, default=None, location="args")
+user_search_parser.add_argument("role_id", type=int, default=None, location="args")
+
+
+def _edit_user(item_user, args):
     email = args.get("email")
     name = args.get("name")
 
@@ -38,7 +49,7 @@ class UsersList(Resource):
     def put(self):
         args = user_parser.parse_args(strict=True)
         item = dbc.get.user(get_jwt_identity())
-        item = edit_user(item, args)
+        item = _edit_user(item, args)
         return item_response(schema.dump(item))
 
 
@@ -54,7 +65,7 @@ class Users(Resource):
     def put(self, ID):
         args = user_parser.parse_args(strict=True)
         item = dbc.get.user(ID)
-        item = edit_user(item, args)
+        item = _edit_user(item, args)
         return item_response(schema.dump(item))
 
 
diff --git a/server/app/core/parsers.py b/server/app/core/parsers.py
index 3420e99e..c695dd23 100644
--- a/server/app/core/parsers.py
+++ b/server/app/core/parsers.py
@@ -6,104 +6,3 @@ search_parser.add_argument("page", type=int, default=0, location="args")
 search_parser.add_argument("page_size", type=int, default=15, location="args")
 search_parser.add_argument("order", type=int, default=1, location="args")
 search_parser.add_argument("order_by", type=str, default=None, location="args")
-
-###LOGIN####
-login_parser = reqparse.RequestParser()
-login_parser.add_argument("email", type=inputs.email(), required=True, location="json")
-login_parser.add_argument("password", required=True, location="json")
-
-###CREATE_USER####
-create_user_parser = login_parser.copy()
-create_user_parser.add_argument("city_id", type=int, required=True, location="json")
-create_user_parser.add_argument("role_id", type=int, required=True, location="json")
-
-###USER####
-user_parser = reqparse.RequestParser()
-user_parser.add_argument("email", type=inputs.email(), location="json")
-user_parser.add_argument("name", type=str, location="json")
-user_parser.add_argument("city_id", type=int, location="json")
-user_parser.add_argument("role_id", type=int, location="json")
-
-###SEARCH_USER####
-user_search_parser = search_parser.copy()
-user_search_parser.add_argument("name", type=str, default=None, location="args")
-user_search_parser.add_argument("email", type=str, default=None, location="args")
-user_search_parser.add_argument("city_id", type=int, default=None, location="args")
-user_search_parser.add_argument("role_id", type=int, default=None, location="args")
-
-
-###COMPETITION####
-competition_parser = reqparse.RequestParser()
-competition_parser.add_argument("name", type=str, location="json")
-competition_parser.add_argument("year", type=int, location="json")
-competition_parser.add_argument("city_id", type=int, location="json")
-
-
-###SEARCH_COMPETITION####
-competition_search_parser = search_parser.copy()
-competition_search_parser.add_argument("name", type=str, default=None, location="args")
-competition_search_parser.add_argument("year", type=int, default=None, location="args")
-competition_search_parser.add_argument("city_id", type=int, default=None, location="args")
-
-
-###SLIDER_PARSER####
-slide_parser = reqparse.RequestParser()
-slide_parser.add_argument("order", type=int, default=None, location="json")
-slide_parser.add_argument("title", type=str, default=None, location="json")
-slide_parser.add_argument("timer", type=int, default=None, location="json")
-
-
-###QUESTION####
-question_parser = reqparse.RequestParser()
-question_parser.add_argument("name", type=str, default=None, location="json")
-question_parser.add_argument("total_score", type=int, default=None, location="json")
-question_parser.add_argument("type_id", type=int, default=None, location="json")
-
-
-###QUESTION ALTERNATIVES####
-question_alternative_parser = reqparse.RequestParser()
-question_alternative_parser.add_argument("text", type=str, default=None, location="json")
-question_alternative_parser.add_argument("value", type=int, default=None, location="json")
-
-###QUESTION ANSWERS####
-question_answer_parser = reqparse.RequestParser()
-question_answer_parser.add_argument("data", type=dict, required=True, location="json")
-question_answer_parser.add_argument("score", type=int, required=True, location="json")
-question_answer_parser.add_argument("question_id", type=int, required=True, location="json")
-
-###QUESTION ANSWERS EDIT####
-question_answer_edit_parser = reqparse.RequestParser()
-question_answer_edit_parser.add_argument("data", type=dict, default=None, location="json")
-question_answer_edit_parser.add_argument("score", type=int, default=None, location="json")
-
-###CODE####
-code_parser = reqparse.RequestParser()
-code_parser.add_argument("pointer", type=str, default=None, location="json")
-code_parser.add_argument("view_type_id", type=int, default=None, location="json")
-
-
-###TEAM####
-team_parser = reqparse.RequestParser()
-team_parser.add_argument("name", type=str, location="json")
-
-###SEARCH_COMPETITION####
-media_parser_search = search_parser.copy()
-media_parser_search.add_argument("filename", type=str, default=None, location="args")
-
-
-###COMPONENT###
-component_parser = reqparse.RequestParser()
-component_parser.add_argument("x", type=str, default=None, location="json")
-component_parser.add_argument("y", type=int, default=None, location="json")
-component_parser.add_argument("w", type=int, default=None, location="json")
-component_parser.add_argument("h", type=int, default=None, location="json")
-
-component_edit_parser = component_parser.copy()
-component_edit_parser.add_argument("text", type=str, location="json")
-component_edit_parser.add_argument("media_id", type=str, location="json")
-
-component_create_parser = component_edit_parser.copy()
-component_create_parser.add_argument("type_id", type=int, required=True, location="json")
-
-login_code_parser = reqparse.RequestParser()
-login_code_parser.add_argument("code", type=str, location="json")
-- 
GitLab