From a73d91274d7e1a5e69b6ff6f2e5ba4547faf25a0 Mon Sep 17 00:00:00 2001 From: petak5 Date: Fri, 19 Jun 2020 13:17:20 +0200 Subject: [PATCH 01/13] Remove user view --- src/api/controllers/__init__.py | 3 +- src/api/controllers/userController.py | 601 ++++++++++++++++++++------ src/api/views/__init__.py | 2 +- src/api/views/userView.py | 447 ------------------- 4 files changed, 473 insertions(+), 580 deletions(-) delete mode 100644 src/api/views/userView.py diff --git a/src/api/controllers/__init__.py b/src/api/controllers/__init__.py index bda456e..17d53b0 100644 --- a/src/api/controllers/__init__.py +++ b/src/api/controllers/__init__.py @@ -2,5 +2,4 @@ The controller package """ -from api.controllers.userController import userController -from api.controllers.projectController import projectController \ No newline at end of file +from api.controllers.projectController import projectController diff --git a/src/api/controllers/userController.py b/src/api/controllers/userController.py index ee6aebc..f0d7229 100644 --- a/src/api/controllers/userController.py +++ b/src/api/controllers/userController.py @@ -1,62 +1,203 @@ from api.models import db, User, UserHasProject, UserLink, UserFeedback +from flask import request, jsonify, session, Flask, redirect, session, url_for from api import app - -class UserController: - session = db.session() - - # User - def create_user(self, **kwargs): - try: - user = User(**kwargs) - self.session.add(user) - self.session.commit() - - return user - except: - self.session.rollback() - return None - - def update_user(self, id, **kwargs): - user = User.query.filter_by(id=id).first() - - if user == None: - return None - - for key, value in kwargs.items(): - if not hasattr(user, key): - return None - - for key, value in kwargs.items(): +from os import environ + +session = db.session() + +# User +@app.route("/users", methods=['POST']) +def create_user(): + """ + Create user + --- + tags: + - User + parameters: + - in: body + name: User + required: true + description: User object containing data for creation + schema: + $ref: "#/definitions/User" + definitions: + - schema: + id: User + properties: + id: + type: integer + description: Id of the user. This property will be assigned a value returned by the database + name: + type: string + description: Name of the user + bio: + type: string + description: Biography of the user + languages: + type: string + description: List of programming languages the user uses + interests: + type: string + description: Interests of the user + location: + type: string + description: Location of the user + occupation: + type: string + description: Formal occupation, eg. student at X or works at Y + projects: + type: array + description: List of projects + items: + $ref: "#/definitions/Project" + links: + type: array + description: List of links + items: + $ref: "#/definitions/UserLink" + project_feedbacks: + type: array + description: List of feedbacks given to projects + items: + $ref: "#/definitions/ProjectFeedback" + user_feedbacks: + type: array + description: List of feedbacks given to users + items: + $ref: "#/definitions/UserFeedback" + received_feedbacks: + type: array + description: List of received feedbacks from users + items: + $ref: "#/definitions/UserFeedback" + responses: + 201: + description: User created successfully + 400: + description: Failed to create user + """ + try: + user = User(**request.get_json()) + session.add(user) + session.commit() + + return jsonify(user.as_dict()), 201 + except: + session.rollback() + return "Failed to create user.", 400 + +@app.route("/users/", methods=['PUT']) +def update_user(id): + """ + Update user + Updates user with `id` using the data in request body + --- + tags: + - User + parameters: + - in: path + name: id + type: integer + required: true + description: Id of user to update + - in: body + name: User + required: true + description: User object containing data to update + schema: + $ref: "#/definitions/User" + responses: + 200: + description: User updated successfully + 400: + description: Failed to update user + """ + if 'id' in request.get_json(): + return "Failed to update user. Request body can not specify user's id.", 501 + + user = User.query.filter_by(id=id).first() + if user == None: + return "Failed to update user.", 400 + + for key, value in request.get_json().items(): + if not hasattr(user, key): + return "Failed to update user.", 400 + + for key, value in request.get_json().items(): setattr(user, key, value) db.session.commit() - return user - - def update_user(self, id, **kwargs): - user = User.query.filter_by(id=id).first() - - if user == None: - return user - - for key, value in kwargs.items(): - setattr(user, key, value) - - db.session.commit() - - return user - - def get_user(self, **kwargs): - user = User.query.filter_by(**kwargs).first() - - return user - - def get_all_users(self, **kwargs): - all_users = User.query.all() - - return all_users - - def delete_user(self, id): + return jsonify(user.as_dict()), 200 + +@app.route("/users/", methods=['GET']) +def get_user(id): + """ + Get user + Retreives user with `id` + --- + tags: + - User + parameters: + - in: path + name: id + type: integer + required: true + description: Id of the user to retrieve + responses: + 200: + description: User object + 404: + description: User not found + """ + user = User.query.filter_by(id=id).first() + + if user: + return jsonify(user.as_dict()), 200 + else: + return "", 404 + +@app.route("/users", methods=['GET']) +def get_all_users(): + """ + Get all users + Retreives all users + --- + tags: + - User + responses: + 200: + description: List of users + """ + all_users = User.query.all() + + users = [ user.as_dict() for user in all_users ] + + return jsonify(users), 200 + +@app.route("/users/", methods=['DELETE']) +def delete_user(id): + """ + Delete user + Deletes user with `id` + --- + tags: + - User + parameters: + - in: path + name: id + type: integer + required: true + description: Id of the user to delete + responses: + 200: + description: User deleted successfully + 401: + description: Not allowed to delete the specified user + 404: + description: User not found + """ + if int(current_user.id) == int(id): # Remove all user's links for link in UserLink.query.filter_by(user_id=id).all(): db.session.delete(link) @@ -68,84 +209,284 @@ def delete_user(self, id): user = User.query.filter_by(id=id).first() if user == None: - return None + return "", 404 db.session.delete(user) db.session.commit() - return user - - # User Link - def create_link(self, user_id, **kwargs): - try: - link = UserLink(user_id=user_id, **kwargs) - self.session.add(link) - self.session.commit() - - return link - except: - self.session.rollback() - return None - - def update_link(self, user_id, link_id, **kwargs): - link = UserLink.query.filter_by(user_id=user_id, id=link_id).first() - - if link == None: - return None - - for key, value in kwargs.items(): - if not hasattr(link, key): - return None - - for key, value in kwargs.items(): - setattr(link, key, value) - - db.session.commit() - - return link - - def get_all_links(self, user_id): - all_links = UserLink.query.filter_by(user_id=user_id).all() - - return all_links - - def delete_link(self, user_id, link_id): - link = UserLink.query.filter_by(user_id=user_id, id=link_id).first() - - if link == None: - return None - - db.session.delete(link) - db.session.commit() - - return link - - # User Feedback - def create_feedback(self, user_id, **kwargs): - try: - feedback = UserFeedback(user_id=user_id, **kwargs) - self.session.add(feedback) - self.session.commit() - - return feedback - except: - self.session.rollback() - return None - - def get_all_feedbacks(self, user_id): - all_feedbacks = UserFeedback.query.filter_by(user_id=user_id).all() - - return all_feedbacks - - def delete_feedback(self, user_id, feedback_id): - feedback = UserFeedback.query.filter_by(user_id=user_id, id=feedback_id).first() - - if feedback == None: - return None - - db.session.delete(feedback) - db.session.commit() - - return feedback - -userController = UserController() + return "", 200 + else: + return "You cannot delete an other user", 401 + +# User Link +@app.route("/users//links", methods=['POST']) +def create_user_link(user_id): + """ + Create user link + --- + tags: + - UserLink + parameters: + - in: body + name: UserLink + required: true + description: User link object containing data to update + schema: + $ref: "#/definitions/UserLink" + definitions: + - schema: + id: UserLink + properties: + id: + type: integer + description: Id of the user link. This property will be assigned a value returned by the database + name: + type: string + description: Name of the user link + url: + type: string + description: Url of the user link + user_id: + type: integer + description: Id of the user + responses: + 201: + description: User link created successfully + 400: + description: Failed to create user link + """ + if 'user_id' in request.get_json(): + return "Failed to create user link. Request body can not specify link's user_id.", 400 + + try: + link = UserLink(user_id=user_id, **kwargs) + session.add(link) + session.commit() + + return jsonify(link.as_dict()), 201 + except: + session.rollback() + return "Failed to create user link.", 400 + +@app.route("/users//links/", methods=['PUT']) +def update_user_link(user_id, link_id): + """ + Update user link + Updates user link with `user_id` and `link_id` using the data in request body + --- + tags: + - UserLink + parameters: + - in: path + name: user_id + type: integer + required: true + description: Id of the user + - in: path + name: link_id + type: integer + required: true + description: Id of the user link to update + - in: body + name: UserLink + required: true + description: User link object containing data to update + schema: + $ref: "#/definitions/UserLink" + responses: + 200: + description: User link updated successfully + 400: + description: Failed to update user link + """ + if 'user_id' in request.get_json(): + return "Failed to update user link. Request body can not specify link's user_id.", 400 + elif 'link_id' in request.get_json(): + return "Failed to update user link. Request body can not specify link's link_id.", 400 + + link = UserLink.query.filter_by(user_id=user_id, id=link_id).first() + + if link == None: + return "Failed to update user link.", 400 + + for key, value in kwargs.items(): + if not hasattr(link, key): + return "Failed to update user link.", 400 + + for key, value in kwargs.items(): + setattr(link, key, value) + + db.session.commit() + + return jsonify(link.as_dict()), 200 + +@app.route("/users//links", methods=['GET']) +def get_all_user_links(user_id): + """ + Get all user links + Retreives all user links with `user_id` + --- + tags: + - UserLink + parameters: + - in: path + name: user_id + type: integer + required: true + description: Id of the user + responses: + 200: + description: List of user links + """ + all_links = UserLink.query.filter_by(user_id=user_id).all() + + links = [ link.as_dict() for link in all_links ] + + return jsonify(links), 200 + +@app.route("/users//links/", methods=['DELETE']) +def delete_user_link(user_id, link_id): + """ + Delete user link + Deletes user link with `user_id` and `link_id` + --- + tags: + - UserLink + parameters: + - in: path + name: user_id + type: integer + required: true + description: Id of the user + - in: path + name: link_id + type: integer + required: true + description: Id of the user link to delete + responses: + 200: + description: User link deleted successfully + 404: + description: User link not found + """ + link = UserLink.query.filter_by(user_id=user_id, id=link_id).first() + + if link == None: + return "", 404 + + db.session.delete(link) + db.session.commit() + + return "", 200 + +# User Feedback +@app.route("/users//feedbacks", methods=['POST']) +def create_user_feedback(user_id): + """ + Create user feedback + --- + tags: + - UserFeedback + parameters: + - in: body + name: UserFeedback + required: true + description: User feedback object containing data to update + schema: + $ref: "#/definitions/UserFeedback" + definitions: + - schema: + id: UserFeedback + properties: + id: + type: integer + description: Id of the user feedback. This property will be assigned a value returned by the database + author_id: + type: integer + description: Id of the author + user_id: + type: integer + description: Id of the user + rating: + type: string + description: The rating of the user feedback + description: + type: string + description: The body of the user feedback + responses: + 201: + description: User feedback created successfully + 400: + description: Failed to create user feedback + """ + if 'user_id' in request.get_json(): + return "Failed to create feedback. Request body can not specify feedback's user_id.", 400 + + try: + feedback = UserFeedback(user_id=user_id, **request.get_json()) + session.add(feedback) + session.commit() + + return jsonify(feedback.as_dict()), 201 + except: + session.rollback() + return "Failed to create feedback.", 400 + +@app.route("/users//feedbacks", methods=['GET']) +def get_all_user_feedbacks(user_id): + """ + Get all user feedbacks + Retreives all user feedbacks with `user_id` + --- + tags: + - UserFeedback + parameters: + - in: path + name: user_id + type: integer + required: true + description: Id of the user + responses: + 200: + description: List of user feedbacks + """ + all_feedbacks = UserFeedback.query.filter_by(user_id=user_id).all() + + feedbacks = [ feedback.as_dict() for feedback in all_feedbacks ] + + return jsonify(feedbacks), 200 + +@app.route("/users//feedbacks/", methods=['DELETE']) +def delete_user_feedback(user_id, feedback_id): + """ + Delete user feedback + Deletes user feedback with `user_id` and `feedback_id` + --- + tags: + - UserFeedback + parameters: + - in: path + name: user_id + type: integer + required: true + description: Id of the user + - in: path + name: feedback_id + type: integer + required: true + description: Id of the user feedback to delete + responses: + 200: + description: User feedback deleted successfully + 404: + description: User feedback not found + """ + feedback = UserFeedback.query.filter_by(user_id=user_id, id=feedback_id).first() + + if feedback == None: + return "", 404 + + db.session.delete(feedback) + db.session.commit() + + return "", 200 diff --git a/src/api/views/__init__.py b/src/api/views/__init__.py index 8820895..55d1bb5 100644 --- a/src/api/views/__init__.py +++ b/src/api/views/__init__.py @@ -1,4 +1,4 @@ """ The views package """ -from api.views import userView, projectView, oauthView +from api.views import projectView, oauthView diff --git a/src/api/views/userView.py b/src/api/views/userView.py deleted file mode 100644 index db662af..0000000 --- a/src/api/views/userView.py +++ /dev/null @@ -1,447 +0,0 @@ -from flask import request, jsonify, session, Flask, redirect, session, url_for -from api import app -from api.controllers import userController -from os import environ - -# User -@app.route("/users", methods=['POST']) -def create_user(): - """ - Create user - --- - tags: - - User - parameters: - - in: body - name: User - required: true - description: User object containing data for creation - schema: - $ref: "#/definitions/User" - definitions: - - schema: - id: User - properties: - id: - type: integer - description: Id of the user. This property will be assigned a value returned by the database - name: - type: string - description: Name of the user - bio: - type: string - description: Biography of the user - languages: - type: string - description: List of programming languages the user uses - interests: - type: string - description: Interests of the user - location: - type: string - description: Location of the user - occupation: - type: string - description: Formal occupation, eg. student at X or works at Y - projects: - type: array - description: List of projects - items: - $ref: "#/definitions/Project" - links: - type: array - description: List of links - items: - $ref: "#/definitions/UserLink" - project_feedbacks: - type: array - description: List of feedbacks given to projects - items: - $ref: "#/definitions/ProjectFeedback" - user_feedbacks: - type: array - description: List of feedbacks given to users - items: - $ref: "#/definitions/UserFeedback" - received_feedbacks: - type: array - description: List of received feedbacks from users - items: - $ref: "#/definitions/UserFeedback" - responses: - 201: - description: User created successfully - 400: - description: Failed to create user - """ - user = userController.create_user(**request.get_json()) - - if user == None: - return "Failed to create user.", 400 - else: - return jsonify(user.as_dict()), 201 - -@app.route("/users/", methods=['PUT']) -def update_user(id): - """ - Update user - Updates user with `id` using the data in request body - --- - tags: - - User - parameters: - - in: path - name: id - type: integer - required: true - description: Id of user to update - - in: body - name: User - required: true - description: User object containing data to update - schema: - $ref: "#/definitions/User" - responses: - 200: - description: User updated successfully - 400: - description: Failed to update user - """ - if 'id' in request.get_json(): - return "Failed to update user. Request body can not specify user's id.", 501 - - user = userController.update_user(id, **request.get_json()) - - if user == None: - return "Failed to update user.", 400 - else: - return jsonify(user.as_dict()), 200 - -@app.route("/users/", methods=['GET']) -def get_user(id): - """ - Get user - Retreives user with `id` - --- - tags: - - User - parameters: - - in: path - name: id - type: integer - required: true - description: Id of the user to retrieve - responses: - 200: - description: User object - 404: - description: User not found - """ - user = userController.get_user(id=id) - - if user: - return jsonify(user.as_dict()), 200 - else: - return "", 404 - -@app.route("/users", methods=['GET']) -def get_all_users(): - """ - Get all users - Retreives all users - --- - tags: - - User - responses: - 200: - description: List of users - """ - all_users = userController.get_all_users() - - users = [ user.as_dict() for user in all_users ] - - return jsonify(users), 200 - -@app.route("/users/", methods=['DELETE']) -def delete_user(id): - """ - Delete user - Deletes user with `id` - --- - tags: - - User - parameters: - - in: path - name: id - type: integer - required: true - description: Id of the user to delete - responses: - 200: - description: User deleted successfully - 401: - description: Not allowed to delete the specified user - 404: - description: User not found - """ - if int(current_user.id) == int(id): - user = userController.delete_user(id) - - if user: - return "", 200 - else: - return "", 404 - else: - return "You cannot delete an other user", 401 - -# User Link -@app.route("/users//links", methods=['POST']) -def create_user_link(user_id): - """ - Create user link - --- - tags: - - UserLink - parameters: - - in: body - name: UserLink - required: true - description: User link object containing data to update - schema: - $ref: "#/definitions/UserLink" - definitions: - - schema: - id: UserLink - properties: - id: - type: integer - description: Id of the user link. This property will be assigned a value returned by the database - name: - type: string - description: Name of the user link - url: - type: string - description: Url of the user link - user_id: - type: integer - description: Id of the user - responses: - 201: - description: User link created successfully - 400: - description: Failed to create user link - """ - if 'user_id' in request.get_json(): - return "Failed to create user link. Request body can not specify link's user_id.", 400 - - link = userController.create_link(user_id, **request.get_json()) - - if link == None: - return "Failed to create user link.", 400 - else: - return jsonify(link.as_dict()), 201 - -@app.route("/users//links/", methods=['PUT']) -def update_user_link(user_id, link_id): - """ - Update user link - Updates user link with `user_id` and `link_id` using the data in request body - --- - tags: - - UserLink - parameters: - - in: path - name: user_id - type: integer - required: true - description: Id of the user - - in: path - name: link_id - type: integer - required: true - description: Id of the user link to update - - in: body - name: UserLink - required: true - description: User link object containing data to update - schema: - $ref: "#/definitions/UserLink" - responses: - 200: - description: User link updated successfully - 400: - description: Failed to update user link - """ - if 'user_id' in request.get_json(): - return "Failed to update user link. Request body can not specify link's user_id.", 400 - elif 'link_id' in request.get_json(): - return "Failed to update user link. Request body can not specify link's link_id.", 400 - - link = userController.update_link(user_id, link_id, **request.get_json()) - - if link == None: - return "Failed to update user link.", 400 - else: - return jsonify(link.as_dict()), 200 - -@app.route("/users//links", methods=['GET']) -def get_all_user_links(user_id): - """ - Get all user links - Retreives all user links with `user_id` - --- - tags: - - UserLink - parameters: - - in: path - name: user_id - type: integer - required: true - description: Id of the user - responses: - 200: - description: List of user links - """ - all_links = userController.get_all_links(user_id) - - links = [ link.as_dict() for link in all_links ] - - return jsonify(links), 200 - -@app.route("/users//links/", methods=['DELETE']) -def delete_user_link(user_id, link_id): - """ - Delete user link - Deletes user link with `user_id` and `link_id` - --- - tags: - - UserLink - parameters: - - in: path - name: user_id - type: integer - required: true - description: Id of the user - - in: path - name: link_id - type: integer - required: true - description: Id of the user link to delete - responses: - 200: - description: User link deleted successfully - 404: - description: User link not found - """ - link = userController.delete_link(user_id, link_id) - - if link == None: - return "", 404 - else: - return "", 200 - -# User Feedback -@app.route("/users//feedbacks", methods=['POST']) -def create_user_feedback(user_id): - """ - Create user feedback - --- - tags: - - UserFeedback - parameters: - - in: body - name: UserFeedback - required: true - description: User feedback object containing data to update - schema: - $ref: "#/definitions/UserFeedback" - definitions: - - schema: - id: UserFeedback - properties: - id: - type: integer - description: Id of the user feedback. This property will be assigned a value returned by the database - author_id: - type: integer - description: Id of the author - user_id: - type: integer - description: Id of the user - rating: - type: string - description: The rating of the user feedback - description: - type: string - description: The body of the user feedback - responses: - 201: - description: User feedback created successfully - 400: - description: Failed to create user feedback - """ - if 'user_id' in request.get_json(): - return "Failed to create feedback. Request body can not specify feedback's user_id.", 400 - - feedback = userController.create_feedback(user_id, **request.get_json()) - - if feedback == None: - return "Failed to create feedback.", 400 - else: - return jsonify(feedback.as_dict()), 201 - -@app.route("/users//feedbacks", methods=['GET']) -def get_all_user_feedbacks(user_id): - """ - Get all user feedbacks - Retreives all user feedbacks with `user_id` - --- - tags: - - UserFeedback - parameters: - - in: path - name: user_id - type: integer - required: true - description: Id of the user - responses: - 200: - description: List of user feedbacks - """ - all_feedbacks = userController.get_all_feedbacks(user_id) - - feedbacks = [ feedback.as_dict() for feedback in all_feedbacks ] - - return jsonify(feedbacks), 200 - -@app.route("/users//feedbacks/", methods=['DELETE']) -def delete_user_feedback(user_id, feedback_id): - """ - Delete user feedback - Deletes user feedback with `user_id` and `feedback_id` - --- - tags: - - UserFeedback - parameters: - - in: path - name: user_id - type: integer - required: true - description: Id of the user - - in: path - name: feedback_id - type: integer - required: true - description: Id of the user feedback to delete - responses: - 200: - description: User feedback deleted successfully - 404: - description: User feedback not found - """ - feedback = userController.delete_feedback(user_id, feedback_id) - - if feedback == None: - return "", 404 - else: - return "", 200 From b880eeb599552d92a59bddad0872bb02901e7ccf Mon Sep 17 00:00:00 2001 From: petak5 Date: Fri, 19 Jun 2020 14:03:55 +0200 Subject: [PATCH 02/13] Remove project view --- src/api/__init__.py | 1 + src/api/controllers/__init__.py | 3 +- src/api/controllers/projectController.py | 620 +++++++++++++++++------ src/api/views/__init__.py | 2 +- src/api/views/projectView.py | 434 ---------------- 5 files changed, 479 insertions(+), 581 deletions(-) delete mode 100644 src/api/views/projectView.py diff --git a/src/api/__init__.py b/src/api/__init__.py index 10ff23f..e6d40b6 100644 --- a/src/api/__init__.py +++ b/src/api/__init__.py @@ -14,4 +14,5 @@ from api.models import db import api.models import api.endpoints +import api.controllers import api.views diff --git a/src/api/controllers/__init__.py b/src/api/controllers/__init__.py index 17d53b0..74e0e5a 100644 --- a/src/api/controllers/__init__.py +++ b/src/api/controllers/__init__.py @@ -2,4 +2,5 @@ The controller package """ -from api.controllers.projectController import projectController +import api.controllers.userController +import api.controllers.projectController diff --git a/src/api/controllers/projectController.py b/src/api/controllers/projectController.py index c8d69f9..b071d1a 100644 --- a/src/api/controllers/projectController.py +++ b/src/api/controllers/projectController.py @@ -1,149 +1,479 @@ from api.models import db, Project, UserHasProject, ProjectLink, ProjectFeedback - -class ProjectController: - session = db.session() - - # Project - def create_project(self, **kwargs): - try: - project = Project(**kwargs) - self.session.add(project) - self.session.commit() - - return project - except: - return None - - def update_project(self, id, **kwargs): - project = Project.query.filter_by(id=id).first() - - if project == None: - return None - - for key, value in kwargs.items(): - if not hasattr(project, key): - return None - - for key, value in kwargs.items(): - setattr(project, key, value) - - db.session.commit() - - return project - - def update_project(self, id, **kwargs): - project = Project.query.filter_by(id=id).first() - - if project == None: - return project - - for key, value in kwargs.items(): - setattr(project, key, value) - - db.session.commit() - - return project - - def get_project(self, **kwargs): - project = Project.query.filter_by(**kwargs).first() - - return project - - def get_all_projects(self, **kwargs): - all_projects = Project.query.all() - - return all_projects - - def delete_project(self, id): - # Remove all project's links - for link in ProjectLink.query.filter_by(project_id=id).all(): - db.session.delete(link) - - # Remove project from all users - for project in UserHasProject.query.filter_by(project_id=id).all(): - db.session.delete(project) - - project = Project.query.filter_by(id=id).first() - - if project == None: - return project - - db.session.delete(project) - db.session.commit() - - return project - - # Project Link - def create_link(self, project_id, **kwargs): - try: - link = ProjectLink(project_id=project_id, **kwargs) - self.session.add(link) - self.session.commit() - - return link - except: - self.session.rollback() - return None - - def update_link(self, project_id, link_id, **kwargs): - link = ProjectLink.query.filter_by(project_id=project_id, id=link_id).first() - - if link == None: - return None - - for key, value in kwargs.items(): - if not hasattr(link, key): - return None - - for key, value in kwargs.items(): - setattr(link, key, value) - - db.session.commit() - - return link - - def get_all_links(self, project_id): - all_links = ProjectLink.query.filter_by(project_id=project_id).all() - - return all_links - - def delete_link(self, project_id, link_id): - link = ProjectLink.query.filter_by(project_id=project_id, id=link_id).first() - - if link == None: - return None - +from flask import request, jsonify +from api import app + +session = db.session() + +@app.route("/projects", methods=['POST']) +def create_project(): + """ + Create project + --- + tags: + - Project + parameters: + - in: body + name: Project + required: true + description: Project object containing data for creation + schema: + $ref: "#/definitions/Project" + definitions: + - schema: + id: Project + properties: + id: + type: integer + description: Id of the project. This property will be assigned a value returned by the database + name: + type: string + description: Name of the project + description: + type: string + description: Description of the project + languages: + type: string + description: List of programming languages the project uses + development_status: + type: integer + description: Development status of the project + creation_date: + type: string + description: Creation date of the project + release_date: + type: string + description: Release date of the project + repository: + type: string + description: Url of the project's repository + users: + type: array + description: List of members of the project + items: + $ref: "#/definitions/User" + links: + type: array + description: List of links + items: + $ref: "#/definitions/ProjectLink" + feedbacks: + type: array + description: List of feedbacks given to the project + items: + $ref: "#/definitions/ProjectFeedback" + responses: + 201: + description: Project created successfully + 400: + description: Failed to create project + """ + try: + project = Project(**request.get_json()) + session.add(project) + session.commit() + + return jsonify(project.as_dict()), 201 + except: + session.rollback() + return "Failed to create project.", 400 + +@app.route("/projects/", methods=['PUT']) +def update_project(id): + """ + Update project + Updates project with `id` using the data in request body + --- + tags: + - Project + parameters: + - in: path + name: id + type: integer + required: true + description: Id of project to update + - in: body + name: Project + required: true + description: Project object containing data to update + schema: + $ref: "#/definitions/Project" + responses: + 200: + description: Project updated successfully + 400: + description: Failed to update project + """ + if 'id' in request.get_json(): + return "Failed to update project. Request body can not specify project's id.", 501 + + project = Project.query.filter_by(id=id).first() + + if project == None: + return "Failed to update project.", 400 + + for key, value in request.get_json().items(): + if not hasattr(project, key): + return "Failed to update project.", 400 + + for key, value in request.get_json().items(): + setattr(project, key, value) + + db.session.commit() + + return jsonify(project.as_dict()), 200 + +@app.route("/projects/", methods=['GET']) +def get_project(id): + """ + Get project + Retreives project with `id` + --- + tags: + - Project + parameters: + - in: path + name: id + type: integer + required: true + description: Id of the project to retrieve + responses: + 200: + description: Project object + 404: + description: Project not found + """ + project = Project.query.filter_by(id=id).first() + + if project: + return jsonify(project.as_dict()), 200 + else: + return "", 404 + +@app.route("/projects", methods=['GET']) +def get_all_projects(): + """ + Get all projects + Retreives all projects + --- + tags: + - Project + responses: + 200: + description: List of projects + """ + all_projects = Project.query.all() + + projects = [ project.as_dict() for project in all_projects ] + + return jsonify(projects), 200 + +@app.route("/projects/", methods=['DELETE']) +def delete_project(id): + """ + Delete project + Deletes project with `id` + --- + tags: + - Project + parameters: + - in: path + name: id + type: integer + required: true + description: Id of the project to delete + responses: + 200: + description: Project deleted successfully + 400: + description: Project not found + """ + # Remove all project's links + for link in ProjectLink.query.filter_by(project_id=id).all(): db.session.delete(link) - db.session.commit() - - return link - - # Project Feedback - def create_feedback(self, project_id, **kwargs): - try: - feedback = ProjectFeedback(project_id=project_id, **kwargs) - self.session.add(feedback) - self.session.commit() - - return feedback - except: - self.session.rollback() - return None - - def get_all_feedbacks(self, project_id): - all_feedbacks = ProjectFeedback.query.filter_by(project_id=project_id).all() - return all_feedbacks - - def delete_feedback(self, project_id, feedback_id): - feedback = ProjectFeedback.query.filter_by(project_id=project_id, id=feedback_id).first() - - if feedback == None: - return None - - db.session.delete(feedback) - db.session.commit() - - return feedback + # Remove project from all users + for project in UserHasProject.query.filter_by(project_id=id).all(): + db.session.delete(project) -projectController = ProjectController() + project = Project.query.filter_by(id=id).first() + + if project == None: + return "", 404 + + db.session.delete(project) + db.session.commit() + + return "", 200 + +# Project Link +@app.route("/projects//links", methods=['POST']) +def create_project_link(project_id): + """ + Create project link + --- + tags: + - ProjectLink + parameters: + - in: body + name: ProjectLink + required: true + description: Project link object containing data to update + schema: + $ref: "#/definitions/ProjectLink" + definitions: + - schema: + id: ProjectLink + properties: + id: + type: integer + description: Id of the project link. This property will be assigned a value returned by the database + name: + type: string + description: Name of the project link + url: + type: string + description: Url of the project link + project_id: + type: integer + description: Id of the project + responses: + 201: + description: Project link created successfully + 400: + description: Failed to create project link + """ + if 'project_id' in request.get_json(): + return "Failed to create project link. Request body can not specify link's project_id.", 400 + + try: + link = ProjectLink(project_id=project_id, **request.get_json()) + session.add(link) + session.commit() + + return jsonify(link.as_dict()), 201 + except: + session.rollback() + return "Failed to create project link.", 400 + +@app.route("/projects//links/", methods=['PUT']) +def update_project_link(project_id, link_id): + """ + Update project link + Updates project link with `project_id` and `link_id` using the data in request body + --- + tags: + - ProjectLink + parameters: + - in: path + name: project_id + type: integer + required: true + description: Id of the project + - in: path + name: link_id + type: integer + required: true + description: Id of the project link to update + - in: body + name: ProjectLink + required: true + description: Project link object containing data to update + schema: + $ref: "#/definitions/ProjectLink" + responses: + 200: + description: Project link updated successfully + 400: + description: Failed to update project link + """ + if 'project_id' in request.get_json(): + return "Failed to update project link. Request body can not specify link's project_id.", 400 + elif 'link_id' in request.get_json(): + return "Failed to update project link. Request body can not specify link's link_id.", 400 + + link = ProjectLink.query.filter_by(project_id=project_id, id=link_id).first() + + if link == None: + return "Failed to update project link.", 400 + + for key, value in request.get_json().items(): + if not hasattr(link, key): + return "Failed to update project link.", 400 + + for key, value in request.get_json().items(): + setattr(link, key, value) + + db.session.commit() + + return jsonify(link.as_dict()), 200 + +@app.route("/projects//links", methods=['GET']) +def get_all_project_links(project_id): + """ + Get all project links + Retreives all project links with `project_id` + --- + tags: + - ProjectLink + parameters: + - in: path + name: project_id + type: integer + required: true + description: Id of the project + responses: + 200: + description: List of project links + """ + all_links = ProjectLink.query.filter_by(project_id=project_id).all() + + links = [ link.as_dict() for link in all_links ] + + return jsonify(links), 200 + +@app.route("/projects//links/", methods=['DELETE']) +def delete_project_link(project_id, link_id): + """ + Delete project link + Deletes project link with `project_id` and `link_id` + --- + tags: + - ProjectLink + parameters: + - in: path + name: project_id + type: integer + required: true + description: Id of the project + - in: path + name: link_id + type: integer + required: true + description: Id of the project link to delete + responses: + 200: + description: Project link deleted successfully + 404: + description: Project link not found + """ + link = ProjectLink.query.filter_by(project_id=project_id, id=link_id).first() + + if link == None: + return "", 404 + + db.session.delete(link) + db.session.commit() + + return "", 200 + +# Project Feedback +@app.route("/projects//feedbacks", methods=['POST']) +def create_project_feedback(project_id): + """ + Create project feedback + --- + tags: + - ProjectFeedback + parameters: + - in: body + name: ProjectFeedback + required: true + description: Project feedback object containing data to update + schema: + $ref: "#/definitions/ProjectFeedback" + definitions: + - schema: + id: ProjectFeedback + properties: + id: + type: integer + description: Id of the project feedback. This property will be assigned a value returned by the database + user_id: + type: integer + description: Id of the user + project_id: + type: integer + description: Id of the project + rating: + type: string + description: The rating of the project feedback + description: + type: string + description: The body of the project feedback + responses: + 201: + description: Project feedback created successfully + 400: + description: Failed to create project feedback + """ + if 'project_id' in request.get_json(): + return "Failed to create feedback. Request body can not specify feedback's project_id.", 400 + + try: + feedback = ProjectFeedback(project_id=project_id, **request.get_json()) + session.add(feedback) + session.commit() + + return jsonify(feedback.as_dict()), 201 + except: + session.rollback() + return "Failed to create feedback.", 400 + +@app.route("/projects//feedbacks", methods=['GET']) +def get_all_project_feedbacks(project_id): + """ + Get all project feedbacks + Retreives all project feedbacks with `project_id` + --- + tags: + - ProjectFeedback + parameters: + - in: path + name: project_id + type: integer + required: true + description: Id of the project + responses: + 200: + description: List of project feedbacks + """ + all_feedbacks = ProjectFeedback.query.filter_by(project_id=project_id).all() + + feedbacks = [ feedback.as_dict() for feedback in all_feedbacks ] + + return jsonify(feedbacks), 200 + +@app.route("/projects//feedbacks/", methods=['DELETE']) +def delete_project_feedback(project_id, feedback_id): + """ + Delete project feedback + Deletes project feedback with `project_id` and `feedback_id` + --- + tags: + - ProjectFeedback + parameters: + - in: path + name: project_id + type: integer + required: true + description: Id of the project + - in: path + name: feedback_id + type: integer + required: true + description: Id of the project feedback to delete + responses: + 200: + description: Project feedback deleted successfully + 404: + description: Project feedback not found + """ + feedback = ProjectFeedback.query.filter_by(project_id=project_id, id=feedback_id).first() + + if feedback == None: + return "", 404 + + db.session.delete(feedback) + db.session.commit() + + return "", 200 diff --git a/src/api/views/__init__.py b/src/api/views/__init__.py index 55d1bb5..5070b5a 100644 --- a/src/api/views/__init__.py +++ b/src/api/views/__init__.py @@ -1,4 +1,4 @@ """ The views package """ -from api.views import projectView, oauthView +from api.views import oauthView diff --git a/src/api/views/projectView.py b/src/api/views/projectView.py deleted file mode 100644 index 587a6f4..0000000 --- a/src/api/views/projectView.py +++ /dev/null @@ -1,434 +0,0 @@ -from flask import request, jsonify -from api import app -from api.controllers import projectController - -# Project -@app.route("/projects", methods=['POST']) -def create_project(): - """ - Create project - --- - tags: - - Project - parameters: - - in: body - name: Project - required: true - description: Project object containing data for creation - schema: - $ref: "#/definitions/Project" - definitions: - - schema: - id: Project - properties: - id: - type: integer - description: Id of the project. This property will be assigned a value returned by the database - name: - type: string - description: Name of the project - description: - type: string - description: Description of the project - languages: - type: string - description: List of programming languages the project uses - development_status: - type: integer - description: Development status of the project - creation_date: - type: string - description: Creation date of the project - release_date: - type: string - description: Release date of the project - repository: - type: string - description: Url of the project's repository - users: - type: array - description: List of members of the project - items: - $ref: "#/definitions/User" - links: - type: array - description: List of links - items: - $ref: "#/definitions/ProjectLink" - feedbacks: - type: array - description: List of feedbacks given to the project - items: - $ref: "#/definitions/ProjectFeedback" - responses: - 201: - description: Project created successfully - 400: - description: Failed to create project - """ - project = projectController.create_project(**request.get_json()) - - if project == None: - return "Failed to create project.", 400 - else: - return jsonify(project.as_dict()), 201 - -@app.route("/projects/", methods=['PUT']) -def update_project(id): - """ - Update project - Updates project with `id` using the data in request body - --- - tags: - - Project - parameters: - - in: path - name: id - type: integer - required: true - description: Id of project to update - - in: body - name: Project - required: true - description: Project object containing data to update - schema: - $ref: "#/definitions/Project" - responses: - 200: - description: Project updated successfully - 400: - description: Failed to update project - """ - if 'id' in request.get_json(): - return "Failed to update project. Request body can not specify project's id.", 501 - - project = projectController.update_project(id, **request.get_json()) - - if project == None: - return "Failed to update project.", 400 - else: - return jsonify(project.as_dict()), 200 - -@app.route("/projects/", methods=['GET']) -def get_project(id): - """ - Get project - Retreives project with `id` - --- - tags: - - Project - parameters: - - in: path - name: id - type: integer - required: true - description: Id of the project to retrieve - responses: - 200: - description: Project object - 404: - description: Project not found - """ - project = projectController.get_project(id=id) - - if project: - return jsonify(project.as_dict()), 200 - else: - return "", 404 - -@app.route("/projects", methods=['GET']) -def get_all_projects(): - """ - Get all projects - Retreives all projects - --- - tags: - - Project - responses: - 200: - description: List of projects - """ - all_projects = projectController.get_all_projects() - - projects = [ project.as_dict() for project in all_projects ] - - return jsonify(projects), 200 - -@app.route("/projects/", methods=['DELETE']) -def delete_project(id): - """ - Delete project - Deletes project with `id` - --- - tags: - - Project - parameters: - - in: path - name: id - type: integer - required: true - description: Id of the project to delete - responses: - 200: - description: Project deleted successfully - 400: - description: Project not found - """ - project = projectController.delete_project(id) - - if project: - return "", 202 - else: - return "", 404 - -# Project Link -@app.route("/projects//links", methods=['POST']) -def create_project_link(project_id): - """ - Create project link - --- - tags: - - ProjectLink - parameters: - - in: body - name: ProjectLink - required: true - description: Project link object containing data to update - schema: - $ref: "#/definitions/ProjectLink" - definitions: - - schema: - id: ProjectLink - properties: - id: - type: integer - description: Id of the project link. This property will be assigned a value returned by the database - name: - type: string - description: Name of the project link - url: - type: string - description: Url of the project link - project_id: - type: integer - description: Id of the project - responses: - 201: - description: Project link created successfully - 400: - description: Failed to create project link - """ - if 'project_id' in request.get_json(): - return "Failed to create project link. Request body can not specify link's project_id.", 400 - - link = projectController.create_link(project_id, **request.get_json()) - - if link == None: - return "Failed to create project link.", 400 - else: - return jsonify(link.as_dict()), 201 - -@app.route("/projects//links/", methods=['PUT']) -def update_project_link(project_id, link_id): - """ - Update project link - Updates project link with `project_id` and `link_id` using the data in request body - --- - tags: - - ProjectLink - parameters: - - in: path - name: project_id - type: integer - required: true - description: Id of the project - - in: path - name: link_id - type: integer - required: true - description: Id of the project link to update - - in: body - name: ProjectLink - required: true - description: Project link object containing data to update - schema: - $ref: "#/definitions/ProjectLink" - responses: - 200: - description: Project link updated successfully - 400: - description: Failed to update project link - """ - if 'project_id' in request.get_json(): - return "Failed to update project link. Request body can not specify link's project_id.", 400 - elif 'link_id' in request.get_json(): - return "Failed to update project link. Request body can not specify link's link_id.", 400 - - link = projectController.update_link(project_id, link_id, **request.get_json()) - - if link == None: - return "Failed to update project link.", 400 - else: - return jsonify(link.as_dict()), 200 - -@app.route("/projects//links", methods=['GET']) -def get_all_project_links(project_id): - """ - Get all project links - Retreives all project links with `project_id` - --- - tags: - - ProjectLink - parameters: - - in: path - name: project_id - type: integer - required: true - description: Id of the project - responses: - 200: - description: List of project links - """ - all_links = projectController.get_all_links(project_id) - - links = [ link.as_dict() for link in all_links ] - - return jsonify(links), 200 - -@app.route("/projects//links/", methods=['DELETE']) -def delete_project_link(project_id, link_id): - """ - Delete project link - Deletes project link with `project_id` and `link_id` - --- - tags: - - ProjectLink - parameters: - - in: path - name: project_id - type: integer - required: true - description: Id of the project - - in: path - name: link_id - type: integer - required: true - description: Id of the project link to delete - responses: - 200: - description: Project link deleted successfully - 404: - description: Project link not found - """ - link = projectController.delete_link(project_id, link_id) - - if link == None: - return "", 404 - else: - return "", 200 - -# Project Feedback -@app.route("/projects//feedbacks", methods=['POST']) -def create_project_feedback(project_id): - """ - Create project feedback - --- - tags: - - ProjectFeedback - parameters: - - in: body - name: ProjectFeedback - required: true - description: Project feedback object containing data to update - schema: - $ref: "#/definitions/ProjectFeedback" - definitions: - - schema: - id: ProjectFeedback - properties: - id: - type: integer - description: Id of the project feedback. This property will be assigned a value returned by the database - user_id: - type: integer - description: Id of the user - project_id: - type: integer - description: Id of the project - rating: - type: string - description: The rating of the project feedback - description: - type: string - description: The body of the project feedback - responses: - 201: - description: Project feedback created successfully - 400: - description: Failed to create project feedback - """ - if 'project_id' in request.get_json(): - return "Failed to create feedback. Request body can not specify feedback's project_id.", 400 - - feedback = projectController.create_feedback(project_id, **request.get_json()) - - if feedback == None: - return "Failed to create feedback.", 400 - else: - return jsonify(feedback.as_dict()), 201 - -@app.route("/projects//feedbacks", methods=['GET']) -def get_all_project_feedbacks(project_id): - """ - Get all project feedbacks - Retreives all project feedbacks with `project_id` - --- - tags: - - ProjectFeedback - parameters: - - in: path - name: project_id - type: integer - required: true - description: Id of the project - responses: - 200: - description: List of project feedbacks - """ - all_feedbacks = projectController.get_all_feedbacks(project_id) - - feedbacks = [ feedback.as_dict() for feedback in all_feedbacks ] - - return jsonify(feedbacks), 200 - -@app.route("/projects//feedbacks/", methods=['DELETE']) -def delete_project_feedback(project_id, feedback_id): - """ - Delete project feedback - Deletes project feedback with `project_id` and `feedback_id` - --- - tags: - - ProjectFeedback - parameters: - - in: path - name: project_id - type: integer - required: true - description: Id of the project - - in: path - name: feedback_id - type: integer - required: true - description: Id of the project feedback to delete - responses: - 200: - description: Project feedback deleted successfully - 404: - description: Project feedback not found - """ - feedback = projectController.delete_feedback(project_id, feedback_id) - - if feedback == None: - return "", 404 - else: - return "", 200 From afd1d9a23e258f356f8ed5d2f578255b3c8baeef Mon Sep 17 00:00:00 2001 From: petak5 Date: Fri, 19 Jun 2020 14:07:46 +0200 Subject: [PATCH 03/13] Typo --- tests/api/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/api/__init__.py b/tests/api/__init__.py index a15adcc..230ec35 100644 --- a/tests/api/__init__.py +++ b/tests/api/__init__.py @@ -7,7 +7,7 @@ - these functions will give back the created objects in dict format which is hardcoded at every model's as_dict instance method - - call these functions form any test case. + - call these functions from any test case. """ From ec64d55bbda7598d4ce871d61cd7f9f41139f73b Mon Sep 17 00:00:00 2001 From: petak5 Date: Fri, 19 Jun 2020 14:11:51 +0200 Subject: [PATCH 04/13] Fix path to tests in `runtests.py`'s info message --- tests/runtests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/runtests.py b/tests/runtests.py index 82a6c8b..63bf5f7 100644 --- a/tests/runtests.py +++ b/tests/runtests.py @@ -1,6 +1,6 @@ response = """ -Use: pipenv run pytest src/tests/ +Use: pipenv run pytest tests/ """ From 0b39917e263da446bbce5d2b511d95b749743257 Mon Sep 17 00:00:00 2001 From: petak5 Date: Sat, 20 Jun 2020 07:40:06 +0200 Subject: [PATCH 05/13] Change delete HTTP code to 204 and add HTTP code 404 to some routes --- src/api/controllers/projectController.py | 22 +++++++++++++--------- src/api/controllers/userController.py | 20 ++++++++++++-------- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/src/api/controllers/projectController.py b/src/api/controllers/projectController.py index b071d1a..0c69c78 100644 --- a/src/api/controllers/projectController.py +++ b/src/api/controllers/projectController.py @@ -102,6 +102,8 @@ def update_project(id): description: Project updated successfully 400: description: Failed to update project + 404: + description: Project not found """ if 'id' in request.get_json(): return "Failed to update project. Request body can not specify project's id.", 501 @@ -109,7 +111,7 @@ def update_project(id): project = Project.query.filter_by(id=id).first() if project == None: - return "Failed to update project.", 400 + return "", 404 for key, value in request.get_json().items(): if not hasattr(project, key): @@ -182,9 +184,9 @@ def delete_project(id): required: true description: Id of the project to delete responses: - 200: + 204: description: Project deleted successfully - 400: + 404: description: Project not found """ # Remove all project's links @@ -203,7 +205,7 @@ def delete_project(id): db.session.delete(project) db.session.commit() - return "", 200 + return "", 204 # Project Link @app.route("/projects//links", methods=['POST']) @@ -285,6 +287,8 @@ def update_project_link(project_id, link_id): description: Project link updated successfully 400: description: Failed to update project link + 404 + description: Project link not found """ if 'project_id' in request.get_json(): return "Failed to update project link. Request body can not specify link's project_id.", 400 @@ -294,7 +298,7 @@ def update_project_link(project_id, link_id): link = ProjectLink.query.filter_by(project_id=project_id, id=link_id).first() if link == None: - return "Failed to update project link.", 400 + return "", 404 for key, value in request.get_json().items(): if not hasattr(link, key): @@ -351,7 +355,7 @@ def delete_project_link(project_id, link_id): required: true description: Id of the project link to delete responses: - 200: + 204: description: Project link deleted successfully 404: description: Project link not found @@ -364,7 +368,7 @@ def delete_project_link(project_id, link_id): db.session.delete(link) db.session.commit() - return "", 200 + return "", 204 # Project Feedback @app.route("/projects//feedbacks", methods=['POST']) @@ -463,7 +467,7 @@ def delete_project_feedback(project_id, feedback_id): required: true description: Id of the project feedback to delete responses: - 200: + 204: description: Project feedback deleted successfully 404: description: Project feedback not found @@ -476,4 +480,4 @@ def delete_project_feedback(project_id, feedback_id): db.session.delete(feedback) db.session.commit() - return "", 200 + return "", 204 diff --git a/src/api/controllers/userController.py b/src/api/controllers/userController.py index f0d7229..eb3ecc1 100644 --- a/src/api/controllers/userController.py +++ b/src/api/controllers/userController.py @@ -111,13 +111,15 @@ def update_user(id): description: User updated successfully 400: description: Failed to update user + 404 + description: User not found """ if 'id' in request.get_json(): return "Failed to update user. Request body can not specify user's id.", 501 user = User.query.filter_by(id=id).first() if user == None: - return "Failed to update user.", 400 + return "", 404 for key, value in request.get_json().items(): if not hasattr(user, key): @@ -190,7 +192,7 @@ def delete_user(id): required: true description: Id of the user to delete responses: - 200: + 204: description: User deleted successfully 401: description: Not allowed to delete the specified user @@ -214,7 +216,7 @@ def delete_user(id): db.session.delete(user) db.session.commit() - return "", 200 + return "", 204 else: return "You cannot delete an other user", 401 @@ -298,6 +300,8 @@ def update_user_link(user_id, link_id): description: User link updated successfully 400: description: Failed to update user link + 404 + description: User link not found """ if 'user_id' in request.get_json(): return "Failed to update user link. Request body can not specify link's user_id.", 400 @@ -307,7 +311,7 @@ def update_user_link(user_id, link_id): link = UserLink.query.filter_by(user_id=user_id, id=link_id).first() if link == None: - return "Failed to update user link.", 400 + return "Failed to update user link.", 404 for key, value in kwargs.items(): if not hasattr(link, key): @@ -364,7 +368,7 @@ def delete_user_link(user_id, link_id): required: true description: Id of the user link to delete responses: - 200: + 204: description: User link deleted successfully 404: description: User link not found @@ -377,7 +381,7 @@ def delete_user_link(user_id, link_id): db.session.delete(link) db.session.commit() - return "", 200 + return "", 204 # User Feedback @app.route("/users//feedbacks", methods=['POST']) @@ -476,7 +480,7 @@ def delete_user_feedback(user_id, feedback_id): required: true description: Id of the user feedback to delete responses: - 200: + 204: description: User feedback deleted successfully 404: description: User feedback not found @@ -489,4 +493,4 @@ def delete_user_feedback(user_id, feedback_id): db.session.delete(feedback) db.session.commit() - return "", 200 + return "", 204 From e06f63847d85187113a67a60cb1ba6c25cf4d33c Mon Sep 17 00:00:00 2001 From: petak5 Date: Sat, 20 Jun 2020 07:44:09 +0200 Subject: [PATCH 06/13] Change DELETE HTTP code to 204 in tests --- tests/api/views/test_projectView.py | 4 ++-- tests/api/views/test_userView.py | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/api/views/test_projectView.py b/tests/api/views/test_projectView.py index eb328d4..177b8b4 100644 --- a/tests/api/views/test_projectView.py +++ b/tests/api/views/test_projectView.py @@ -43,7 +43,7 @@ def test_delete_project(self, client): project2 = create_project_for_test_cases(self.valid_data) response = client.delete('/projects/{}'.format(project1["id"])) - assert response.status_code == 202 + assert response.status_code == 204 def test_get_project(self, client): response = client.get('/projects/{}'.format(0)) @@ -139,7 +139,7 @@ def test_delete_project_link(self, client): response = client.delete(url.format(p1["id"], p_link1["id"])) - assert response.status_code == 200 + assert response.status_code == 204 items = ProjectLink.query.all() assert len(items) == 1 assert items[0].name == "Other" diff --git a/tests/api/views/test_userView.py b/tests/api/views/test_userView.py index c4df5f9..e0653a2 100644 --- a/tests/api/views/test_userView.py +++ b/tests/api/views/test_userView.py @@ -43,7 +43,7 @@ def test_delete_user(self, client): user_id = create_user_for_test_cases(self.valid_data)["id"] response = client.delete('/users/{}'.format(user_id)) - assert response.status_code == 200 + assert response.status_code == 204 def test_get_user(self, client): user_id = None @@ -150,7 +150,7 @@ def test_delete_user_link(self, client): assert response.status_code == 404 response = client.delete("/users/{0}/links/{1}".format(user["id"], link1.id)) - assert response.status_code == 200 + assert response.status_code == 204 recorded_links = UserLink.query.all() assert len(recorded_links) == 1 @@ -219,5 +219,5 @@ def test_delete_user_feedback(self, client): assert response.status_code == 404 response = client.delete(url.format(user2["id"], fb1["id"])) - assert response.status_code == 200 + assert response.status_code == 204 assert UserFeedback.query.filter_by(user_id=user2["id"]).count() == 1 From 5c68f56b528ee3129640e87b47599dd7768fb7f7 Mon Sep 17 00:00:00 2001 From: petak5 Date: Sat, 20 Jun 2020 07:57:28 +0200 Subject: [PATCH 07/13] Fix unnoticed broken code from view to controller migration --- src/api/controllers/userController.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/api/controllers/userController.py b/src/api/controllers/userController.py index eb3ecc1..f7f2c04 100644 --- a/src/api/controllers/userController.py +++ b/src/api/controllers/userController.py @@ -261,7 +261,7 @@ def create_user_link(user_id): return "Failed to create user link. Request body can not specify link's user_id.", 400 try: - link = UserLink(user_id=user_id, **kwargs) + link = UserLink(user_id=user_id, **request.get_json()) session.add(link) session.commit() @@ -313,11 +313,11 @@ def update_user_link(user_id, link_id): if link == None: return "Failed to update user link.", 404 - for key, value in kwargs.items(): + for key, value in request.get_json().items(): if not hasattr(link, key): return "Failed to update user link.", 400 - for key, value in kwargs.items(): + for key, value in request.get_json().items(): setattr(link, key, value) db.session.commit() From 9e17c093820715e801c3f665134d0e6e71e51098 Mon Sep 17 00:00:00 2001 From: petak5 Date: Sat, 20 Jun 2020 07:58:21 +0200 Subject: [PATCH 08/13] Change update method to PUT in tests --- tests/api/views/test_projectView.py | 4 ++-- tests/api/views/test_userView.py | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/tests/api/views/test_projectView.py b/tests/api/views/test_projectView.py index 177b8b4..ed61d29 100644 --- a/tests/api/views/test_projectView.py +++ b/tests/api/views/test_projectView.py @@ -23,7 +23,7 @@ def test_create_project(self, client): def test_update_project(self, client): # project id doesn't exist - response = client.post('/projects/0', json={'name': 'Updated PB'}) + response = client.put('/projects/0', json={'name': 'Updated PB'}) # notice: should return 404 when doesen't exist insted of 400 assert response.status_code == 404 @@ -94,7 +94,7 @@ def test_update_project_link(self, client): # response = client.post(url.format(0, p1_link["id"])) # assert response.status_code == 404 - response = client.post(url.format(p1["id"], p1_link["id"]), json={"name": "Nlink"}) + response = client.put(url.format(p1["id"], p1_link["id"]), json={"name": "Nlink"}) assert response.status_code == 200 assert response.get_json()["name"] == "Nlink" diff --git a/tests/api/views/test_userView.py b/tests/api/views/test_userView.py index e0653a2..35ad28a 100644 --- a/tests/api/views/test_userView.py +++ b/tests/api/views/test_userView.py @@ -24,14 +24,14 @@ def test_create_user(self, client): def test_update_user(self, client): user_id = create_user_for_test_cases(self.valid_data)["id"] - response = client.post('/users/1', json={}) + response = client.put('/users/1', json={}) assert response.status_code == 400 # notice: Should we respond to update_user request without json data with status code 200? # response = client.post('/users/{}'.format(user_id), json={}) # assert response.status_code == 400 - response = client.post('/users/{}'.format(user_id), json={"name": "Updated Name"}) + response = client.put('/users/{}'.format(user_id), json={"name": "Updated Name"}) assert response.status_code == 200 assert response.get_json()['name'] == "Updated Name" @@ -106,22 +106,22 @@ def test_update_user_link(self, client): url = "/users/{0}/links/{1}".format(0, link["id"]) - response = client.post(url, json={"name": "Portfolio"}) + response = client.put(url, json={"name": "Portfolio"}) assert response.status_code == 400 url = "/users/{0}/links/{1}".format(user["id"], link["id"]) - response = client.post(url, json={"user_id": 0}) + response = client.put(url, json={"user_id": 0}) assert response.status_code == 400 - response = client.post(url, json={"link_id": 1}) + response = client.put(url, json={"link_id": 1}) assert response.status_code == 400 # notice: Should we respond to update_user request without json data with status code 200? # response = client.post(url, json={}) # assert response.status_code == 400 - response = client.post(url, json={"name": "New Name"}) + response = client.put(url, json={"name": "New Name"}) assert response.status_code == 200 assert response.get_json()["name"] == "New Name" From 386da0e65eacb4bf6ac626cc15901b839f9b6a7a Mon Sep 17 00:00:00 2001 From: petak5 Date: Sat, 20 Jun 2020 08:04:51 +0200 Subject: [PATCH 09/13] Change HTTP return code to 404 in some tests --- src/api/controllers/userController.py | 2 +- tests/api/views/test_projectView.py | 2 -- tests/api/views/test_userView.py | 4 ++-- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/api/controllers/userController.py b/src/api/controllers/userController.py index f7f2c04..4f7e473 100644 --- a/src/api/controllers/userController.py +++ b/src/api/controllers/userController.py @@ -311,7 +311,7 @@ def update_user_link(user_id, link_id): link = UserLink.query.filter_by(user_id=user_id, id=link_id).first() if link == None: - return "Failed to update user link.", 404 + return "", 404 for key, value in request.get_json().items(): if not hasattr(link, key): diff --git a/tests/api/views/test_projectView.py b/tests/api/views/test_projectView.py index ed61d29..3789bd8 100644 --- a/tests/api/views/test_projectView.py +++ b/tests/api/views/test_projectView.py @@ -24,8 +24,6 @@ def test_update_project(self, client): # project id doesn't exist response = client.put('/projects/0', json={'name': 'Updated PB'}) - - # notice: should return 404 when doesen't exist insted of 400 assert response.status_code == 404 project_id = create_project_for_test_cases(self.valid_data) diff --git a/tests/api/views/test_userView.py b/tests/api/views/test_userView.py index 35ad28a..1f44eb1 100644 --- a/tests/api/views/test_userView.py +++ b/tests/api/views/test_userView.py @@ -25,7 +25,7 @@ def test_update_user(self, client): user_id = create_user_for_test_cases(self.valid_data)["id"] response = client.put('/users/1', json={}) - assert response.status_code == 400 + assert response.status_code == 404 # notice: Should we respond to update_user request without json data with status code 200? # response = client.post('/users/{}'.format(user_id), json={}) @@ -107,7 +107,7 @@ def test_update_user_link(self, client): url = "/users/{0}/links/{1}".format(0, link["id"]) response = client.put(url, json={"name": "Portfolio"}) - assert response.status_code == 400 + assert response.status_code == 404 url = "/users/{0}/links/{1}".format(user["id"], link["id"]) From 56919cc19ed6661b24fe31da755225e0bd264c2c Mon Sep 17 00:00:00 2001 From: petak5 Date: Sat, 20 Jun 2020 08:25:28 +0200 Subject: [PATCH 10/13] Fix typos in Swagger documentation --- src/api/controllers/projectController.py | 2 +- src/api/controllers/userController.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/api/controllers/projectController.py b/src/api/controllers/projectController.py index 0c69c78..5743ffe 100644 --- a/src/api/controllers/projectController.py +++ b/src/api/controllers/projectController.py @@ -287,7 +287,7 @@ def update_project_link(project_id, link_id): description: Project link updated successfully 400: description: Failed to update project link - 404 + 404: description: Project link not found """ if 'project_id' in request.get_json(): diff --git a/src/api/controllers/userController.py b/src/api/controllers/userController.py index 4f7e473..70cf906 100644 --- a/src/api/controllers/userController.py +++ b/src/api/controllers/userController.py @@ -111,7 +111,7 @@ def update_user(id): description: User updated successfully 400: description: Failed to update user - 404 + 404: description: User not found """ if 'id' in request.get_json(): @@ -300,7 +300,7 @@ def update_user_link(user_id, link_id): description: User link updated successfully 400: description: Failed to update user link - 404 + 404: description: User link not found """ if 'user_id' in request.get_json(): From a2fc0ceb098f38caa05ea926dbdffa86073ae0ed Mon Sep 17 00:00:00 2001 From: petak5 Date: Sat, 20 Jun 2020 08:34:16 +0200 Subject: [PATCH 11/13] Fix update project test --- tests/api/views/test_projectView.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/api/views/test_projectView.py b/tests/api/views/test_projectView.py index 3789bd8..4f7fdfa 100644 --- a/tests/api/views/test_projectView.py +++ b/tests/api/views/test_projectView.py @@ -26,8 +26,9 @@ def test_update_project(self, client): response = client.put('/projects/0', json={'name': 'Updated PB'}) assert response.status_code == 404 - project_id = create_project_for_test_cases(self.valid_data) - response = client.post('/projects/{}'.format(project_id), json={'description': 'updated desc'}) + project_id = create_project_for_test_cases(self.valid_data)['id'] + response = client.put('/projects/{}'.format(project_id), json={'description': 'updated desc'}) + assert response.status_code == 200 project = Project.query.filter_by(id=project_id).first() assert project.description == 'updated desc' From 8c2f4cbd7580ea7fee1a50a00fb357b7acbe138f Mon Sep 17 00:00:00 2001 From: petak5 Date: Sat, 20 Jun 2020 08:55:27 +0200 Subject: [PATCH 12/13] Return HTTP code 400 if body is required but not provided --- src/api/controllers/projectController.py | 8 ++++++++ src/api/controllers/userController.py | 16 ++++++++++++---- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/api/controllers/projectController.py b/src/api/controllers/projectController.py index 5743ffe..8f841be 100644 --- a/src/api/controllers/projectController.py +++ b/src/api/controllers/projectController.py @@ -105,6 +105,8 @@ def update_project(id): 404: description: Project not found """ + if not request.get_json(): + return "Failed to update project.", 400 if 'id' in request.get_json(): return "Failed to update project. Request body can not specify project's id.", 501 @@ -244,6 +246,8 @@ def create_project_link(project_id): 400: description: Failed to create project link """ + if not request.get_json(): + return "Failed to create project link.", 400 if 'project_id' in request.get_json(): return "Failed to create project link. Request body can not specify link's project_id.", 400 @@ -290,6 +294,8 @@ def update_project_link(project_id, link_id): 404: description: Project link not found """ + if not request.get_json(): + return "Failed to update project link.", 400 if 'project_id' in request.get_json(): return "Failed to update project link. Request body can not specify link's project_id.", 400 elif 'link_id' in request.get_json(): @@ -410,6 +416,8 @@ def create_project_feedback(project_id): 400: description: Failed to create project feedback """ + if not request.get_json(): + return "Failed to create project feedback.", 400 if 'project_id' in request.get_json(): return "Failed to create feedback. Request body can not specify feedback's project_id.", 400 diff --git a/src/api/controllers/userController.py b/src/api/controllers/userController.py index 70cf906..8900a33 100644 --- a/src/api/controllers/userController.py +++ b/src/api/controllers/userController.py @@ -114,6 +114,8 @@ def update_user(id): 404: description: User not found """ + if not request.get_json(): + return "Failed to update user.", 400 if 'id' in request.get_json(): return "Failed to update user. Request body can not specify user's id.", 501 @@ -125,12 +127,12 @@ def update_user(id): if not hasattr(user, key): return "Failed to update user.", 400 - for key, value in request.get_json().items(): - setattr(user, key, value) + for key, value in request.get_json().items(): + setattr(user, key, value) - db.session.commit() + db.session.commit() - return jsonify(user.as_dict()), 200 + return jsonify(user.as_dict()), 200 @app.route("/users/", methods=['GET']) def get_user(id): @@ -257,6 +259,8 @@ def create_user_link(user_id): 400: description: Failed to create user link """ + if not request.get_json(): + return "Failed to create user link.", 400 if 'user_id' in request.get_json(): return "Failed to create user link. Request body can not specify link's user_id.", 400 @@ -303,6 +307,8 @@ def update_user_link(user_id, link_id): 404: description: User link not found """ + if not request.get_json(): + return "Failed to update user link.", 400 if 'user_id' in request.get_json(): return "Failed to update user link. Request body can not specify link's user_id.", 400 elif 'link_id' in request.get_json(): @@ -423,6 +429,8 @@ def create_user_feedback(user_id): 400: description: Failed to create user feedback """ + if not request.get_json(): + return "Failed to create user feedback.", 400 if 'user_id' in request.get_json(): return "Failed to create feedback. Request body can not specify feedback's user_id.", 400 From 2c4afa6fed13a545ca6f97558868b0661f545571 Mon Sep 17 00:00:00 2001 From: petak5 Date: Sat, 20 Jun 2020 09:08:23 +0200 Subject: [PATCH 13/13] Uncommented and modified remaining tests --- tests/api/views/test_projectView.py | 20 ++++++++++++-------- tests/api/views/test_userView.py | 15 ++++++++------- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/tests/api/views/test_projectView.py b/tests/api/views/test_projectView.py index 4f7fdfa..7199f73 100644 --- a/tests/api/views/test_projectView.py +++ b/tests/api/views/test_projectView.py @@ -17,8 +17,8 @@ def test_create_project(self, client): response = client.post('/projects', json=self.valid_data) assert response.status_code == 201 - # response = client.post('/projects') - # assert response.status_code == 400 + response = client.post('/projects') + assert response.status_code == 400 def test_update_project(self, client): @@ -85,13 +85,17 @@ def test_update_project_link(self, client): url = '/projects/{0}/links/{1}' - # notice: this shouldn't give 500 error - # response = client.post(url.format(p1["id"], 0)) - # assert response.status_code == 404 + response = client.put(url.format(p1["id"], 0), json={"name": "NLink"}) + assert response.status_code == 404 + + response = client.put(url.format(p1["id"], 0)) + assert response.status_code == 400 - # notice: this shouldn't give 500 error - # response = client.post(url.format(0, p1_link["id"])) - # assert response.status_code == 404 + response = client.put(url.format(0, p1_link["id"]), json={"name": "NLink"}) + assert response.status_code == 404 + + response = client.put(url.format(0, p1_link["id"])) + assert response.status_code == 400 response = client.put(url.format(p1["id"], p1_link["id"]), json={"name": "Nlink"}) assert response.status_code == 200 diff --git a/tests/api/views/test_userView.py b/tests/api/views/test_userView.py index 1f44eb1..e1214ef 100644 --- a/tests/api/views/test_userView.py +++ b/tests/api/views/test_userView.py @@ -24,12 +24,14 @@ def test_create_user(self, client): def test_update_user(self, client): user_id = create_user_for_test_cases(self.valid_data)["id"] - response = client.put('/users/1', json={}) + response = client.put('/users/1', json={"name": "Updated name"}) assert response.status_code == 404 - # notice: Should we respond to update_user request without json data with status code 200? - # response = client.post('/users/{}'.format(user_id), json={}) - # assert response.status_code == 400 + response = client.put('/users/1', json={}) + assert response.status_code == 400 + + response = client.put('/users/{}'.format(user_id), json={}) + assert response.status_code == 400 response = client.put('/users/{}'.format(user_id), json={"name": "Updated Name"}) assert response.status_code == 200 @@ -117,9 +119,8 @@ def test_update_user_link(self, client): response = client.put(url, json={"link_id": 1}) assert response.status_code == 400 - # notice: Should we respond to update_user request without json data with status code 200? - # response = client.post(url, json={}) - # assert response.status_code == 400 + response = client.put(url, json={}) + assert response.status_code == 400 response = client.put(url, json={"name": "New Name"}) assert response.status_code == 200