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 bda456e..74e0e5a 100644 --- a/src/api/controllers/__init__.py +++ b/src/api/controllers/__init__.py @@ -2,5 +2,5 @@ The controller package """ -from api.controllers.userController import userController -from api.controllers.projectController import projectController \ No newline at end of file +import api.controllers.userController +import api.controllers.projectController diff --git a/src/api/controllers/projectController.py b/src/api/controllers/projectController.py index c8d69f9..8f841be 100644 --- a/src/api/controllers/projectController.py +++ b/src/api/controllers/projectController.py @@ -1,149 +1,491 @@ 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 + 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) - 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 "", 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 diff --git a/src/api/controllers/userController.py b/src/api/controllers/userController.py index ee6aebc..8900a33 100644 --- a/src/api/controllers/userController.py +++ b/src/api/controllers/userController.py @@ -1,62 +1,207 @@ 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(): - 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): +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): # Remove all user's links for link in UserLink.query.filter_by(user_id=id).all(): db.session.delete(link) @@ -68,84 +213,292 @@ 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 "", 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 diff --git a/src/api/views/__init__.py b/src/api/views/__init__.py index 8820895..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 userView, 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 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 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. """ diff --git a/tests/api/views/test_projectView.py b/tests/api/views/test_projectView.py index eb328d4..7199f73 100644 --- a/tests/api/views/test_projectView.py +++ b/tests/api/views/test_projectView.py @@ -17,19 +17,18 @@ 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.post('/projects/0', json={'name': 'Updated PB'}) - - # notice: should return 404 when doesen't exist insted of 400 + 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' @@ -43,7 +42,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)) @@ -86,15 +85,19 @@ 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.post(url.format(p1["id"], p1_link["id"]), json={"name": "Nlink"}) + 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 assert response.get_json()["name"] == "Nlink" @@ -139,7 +142,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..e1214ef 100644 --- a/tests/api/views/test_userView.py +++ b/tests/api/views/test_userView.py @@ -24,14 +24,16 @@ 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={"name": "Updated name"}) + assert response.status_code == 404 + + 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.put('/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" @@ -43,7 +45,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 @@ -106,22 +108,21 @@ def test_update_user_link(self, client): url = "/users/{0}/links/{1}".format(0, link["id"]) - response = client.post(url, json={"name": "Portfolio"}) - assert response.status_code == 400 + response = client.put(url, json={"name": "Portfolio"}) + assert response.status_code == 404 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.put(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" @@ -150,7 +151,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 +220,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 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/ """