From b6c7dc1a710e5fa7b11836bac633513469f76585 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Urgo=C5=A1?= Date: Mon, 22 Jun 2020 20:24:18 +0200 Subject: [PATCH] Revert "Remove views" --- src/api/__init__.py | 1 - src/api/controllers/__init__.py | 4 +- src/api/controllers/projectController.py | 632 ++++++----------------- src/api/controllers/userController.py | 621 +++++----------------- src/api/views/__init__.py | 2 +- src/api/views/projectView.py | 434 ++++++++++++++++ src/api/views/userView.py | 447 ++++++++++++++++ tests/api/__init__.py | 2 +- tests/api/views/test_projectView.py | 35 +- tests/api/views/test_userView.py | 33 +- tests/runtests.py | 2 +- 11 files changed, 1197 insertions(+), 1016 deletions(-) create mode 100644 src/api/views/projectView.py create mode 100644 src/api/views/userView.py diff --git a/src/api/__init__.py b/src/api/__init__.py index e6d40b6..10ff23f 100644 --- a/src/api/__init__.py +++ b/src/api/__init__.py @@ -14,5 +14,4 @@ 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 74e0e5a..bda456e 100644 --- a/src/api/controllers/__init__.py +++ b/src/api/controllers/__init__.py @@ -2,5 +2,5 @@ The controller package """ -import api.controllers.userController -import api.controllers.projectController +from api.controllers.userController import userController +from api.controllers.projectController import projectController \ No newline at end of file diff --git a/src/api/controllers/projectController.py b/src/api/controllers/projectController.py index 8f841be..c8d69f9 100644 --- a/src/api/controllers/projectController.py +++ b/src/api/controllers/projectController.py @@ -1,491 +1,149 @@ from api.models import db, Project, UserHasProject, ProjectLink, ProjectFeedback -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 - 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 - - project = Project.query.filter_by(id=id).first() - - if project == None: - return "", 404 - - 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: - 204: - description: Project deleted successfully - 404: - description: Project not found - """ - # 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(): +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 + + 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 - project = Project.query.filter_by(id=id).first() - - if project == None: - return "", 404 - - db.session.delete(project) - db.session.commit() - - return "", 204 - -# 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 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 - - 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 - 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(): - 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 "", 404 - - 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: - 204: - 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 "", 204 - -# 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 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 - - 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: - 204: - 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 "", 204 +projectController = ProjectController() diff --git a/src/api/controllers/userController.py b/src/api/controllers/userController.py index 8900a33..ee6aebc 100644 --- a/src/api/controllers/userController.py +++ b/src/api/controllers/userController.py @@ -1,207 +1,62 @@ from api.models import db, User, UserHasProject, UserLink, UserFeedback -from flask import request, jsonify, session, Flask, redirect, session, url_for from api import app -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 - 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 - - user = User.query.filter_by(id=id).first() - if user == None: - return "", 404 - - 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 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: - 204: - 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): + +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(): + 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): # Remove all user's links for link in UserLink.query.filter_by(user_id=id).all(): db.session.delete(link) @@ -213,292 +68,84 @@ def delete_user(id): user = User.query.filter_by(id=id).first() if user == None: - return "", 404 + return None db.session.delete(user) db.session.commit() - return "", 204 - 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 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 - - try: - link = UserLink(user_id=user_id, **request.get_json()) - 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 - 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(): - 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 "", 404 - - for key, value in request.get_json().items(): - if not hasattr(link, key): - return "Failed to update user 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("/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: - 204: - 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 "", 204 - -# 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 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 - - 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: - 204: - 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 "", 204 + 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() diff --git a/src/api/views/__init__.py b/src/api/views/__init__.py index 5070b5a..8820895 100644 --- a/src/api/views/__init__.py +++ b/src/api/views/__init__.py @@ -1,4 +1,4 @@ """ The views package """ -from api.views import oauthView +from api.views import userView, projectView, oauthView diff --git a/src/api/views/projectView.py b/src/api/views/projectView.py new file mode 100644 index 0000000..587a6f4 --- /dev/null +++ b/src/api/views/projectView.py @@ -0,0 +1,434 @@ +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 diff --git a/src/api/views/userView.py b/src/api/views/userView.py new file mode 100644 index 0000000..db662af --- /dev/null +++ b/src/api/views/userView.py @@ -0,0 +1,447 @@ +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 diff --git a/tests/api/__init__.py b/tests/api/__init__.py index 230ec35..a15adcc 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 from any test case. + - call these functions form any test case. """ diff --git a/tests/api/views/test_projectView.py b/tests/api/views/test_projectView.py index 7199f73..eb328d4 100644 --- a/tests/api/views/test_projectView.py +++ b/tests/api/views/test_projectView.py @@ -17,18 +17,19 @@ 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): # project id doesn't exist - response = client.put('/projects/0', json={'name': 'Updated PB'}) + response = client.post('/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)['id'] - response = client.put('/projects/{}'.format(project_id), json={'description': 'updated desc'}) - assert response.status_code == 200 + project_id = create_project_for_test_cases(self.valid_data) + response = client.post('/projects/{}'.format(project_id), json={'description': 'updated desc'}) project = Project.query.filter_by(id=project_id).first() assert project.description == 'updated desc' @@ -42,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 == 204 + assert response.status_code == 202 def test_get_project(self, client): response = client.get('/projects/{}'.format(0)) @@ -85,19 +86,15 @@ def test_update_project_link(self, client): url = '/projects/{0}/links/{1}' - 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(p1["id"], 0)) + # assert response.status_code == 404 - response = client.put(url.format(0, p1_link["id"]), json={"name": "NLink"}) - assert response.status_code == 404 + # 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"])) - assert response.status_code == 400 - - response = client.put(url.format(p1["id"], p1_link["id"]), json={"name": "Nlink"}) + response = client.post(url.format(p1["id"], p1_link["id"]), json={"name": "Nlink"}) assert response.status_code == 200 assert response.get_json()["name"] == "Nlink" @@ -142,7 +139,7 @@ def test_delete_project_link(self, client): response = client.delete(url.format(p1["id"], p_link1["id"])) - assert response.status_code == 204 + assert response.status_code == 200 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 e1214ef..c4df5f9 100644 --- a/tests/api/views/test_userView.py +++ b/tests/api/views/test_userView.py @@ -24,16 +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={"name": "Updated name"}) - assert response.status_code == 404 - - response = client.put('/users/1', json={}) + response = client.post('/users/1', json={}) assert response.status_code == 400 - response = client.put('/users/{}'.format(user_id), 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.put('/users/{}'.format(user_id), json={"name": "Updated Name"}) + response = client.post('/users/{}'.format(user_id), json={"name": "Updated Name"}) assert response.status_code == 200 assert response.get_json()['name'] == "Updated Name" @@ -45,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 == 204 + assert response.status_code == 200 def test_get_user(self, client): user_id = None @@ -108,21 +106,22 @@ 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 == 404 + response = client.post(url, json={"name": "Portfolio"}) + assert response.status_code == 400 url = "/users/{0}/links/{1}".format(user["id"], link["id"]) - response = client.put(url, json={"user_id": 0}) + response = client.post(url, json={"user_id": 0}) assert response.status_code == 400 - response = client.put(url, json={"link_id": 1}) + response = client.post(url, json={"link_id": 1}) assert response.status_code == 400 - response = client.put(url, json={}) - 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={"name": "New Name"}) + response = client.post(url, json={"name": "New Name"}) assert response.status_code == 200 assert response.get_json()["name"] == "New Name" @@ -151,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 == 204 + assert response.status_code == 200 recorded_links = UserLink.query.all() assert len(recorded_links) == 1 @@ -220,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 == 204 + assert response.status_code == 200 assert UserFeedback.query.filter_by(user_id=user2["id"]).count() == 1 diff --git a/tests/runtests.py b/tests/runtests.py index 63bf5f7..82a6c8b 100644 --- a/tests/runtests.py +++ b/tests/runtests.py @@ -1,6 +1,6 @@ response = """ -Use: pipenv run pytest tests/ +Use: pipenv run pytest src/tests/ """