Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/api/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,4 @@
import api.models
import api.endpoints
import api.views
import api.utils
38 changes: 16 additions & 22 deletions src/api/controllers/userController.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
from api.models import db, User, UserHasProject, UserLink, UserFeedback
from api import app
from flask_jwt_extended import get_jwt_identity
from flask import jsonify

class UserController:
session = db.session()
Expand All @@ -11,45 +13,35 @@ def create_user(self, **kwargs):
self.session.add(user)
self.session.commit()

return user
return user, "OK", 200
except:
self.session.rollback()
return None
return None, "Forbidden Attributes", 400

def update_user(self, id, **kwargs):
user = User.query.filter_by(id=id).first()

if user == None:
return None
return None, "user not found", 404

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
return None, "forbidden attribute", 400

for key, value in kwargs.items():
setattr(user, key, value)

db.session.commit()

return user
return user, "OK", 200

def get_user(self, **kwargs):
user = User.query.filter_by(**kwargs).first()

return user
if user is None:
return None, "User Not Found", 404

return user, "OK", 200

def get_all_users(self, **kwargs):
all_users = User.query.all()
Expand All @@ -68,13 +60,12 @@ def delete_user(self, id):
user = User.query.filter_by(id=id).first()

if user == None:
return None
return None, "user not found", 404

db.session.delete(user)
db.session.commit()

return user

return user, "OK", 200
# User Link
def create_link(self, user_id, **kwargs):
try:
Expand Down Expand Up @@ -148,4 +139,7 @@ def delete_feedback(self, user_id, feedback_id):

return feedback

def get_user_from_jwt(self):
return self.get_user(id=get_jwt_identity())

userController = UserController()
8 changes: 8 additions & 0 deletions src/api/utils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from flask import jsonify

def wrap_response(data, msg, code):
obj = {"msg": msg}
if not data is None:
obj["data"] = data.as_dict()
return jsonify(obj), code

25 changes: 13 additions & 12 deletions src/api/views/oauthView.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,29 +62,30 @@ def login_callback(blueprint):
if blueprint.name == "github":
resp = github.get("/user").json()
id = resp["id"]
user = userController.get_user(github_id=id)
user, msg, code = userController.get_user(github_id=id)
redirect_token = f"?state={session.pop('state', '{}')}"
if user:
access_token = create_access_token(identity=user)
redirect_token += f"&token={access_token}"
else:
redirect_token += f"&msg={msg}&code={code}"

return redirect(session.pop("redirect") + redirect_token)

def register_callback(blueprint):
if blueprint.name == "github":
resp = github.get("/user").json()
id = resp["id"]
user = userController.get_user(github_id=id)
if not user:
user = userController.create_user(github_id=id, name=session.pop('username', "Anton"))
user, msg, code = userController.get_user(github_id=id)
redirect_token = f"?state={session.pop('state')}"
if user is None:
user, msg, code = userController.create_user(github_id=id, name=session.pop('username', "Anton"))

if user is None:
redirect_token += f"&msg={msg}&code={code}"
else:
access_token = create_access_token(identity=user)
redirect_token = f"?state={session.pop('state')}&token={access_token}"
redirect_token += f"&token={access_token}"

return redirect(session.pop('redirect') + redirect_token)

# Actually deprecated
# should be /user in userview but I'll leave it until Routes branch adds and merges it
@app.route("/getcurrentuser", methods=["GET"])
@jwt_required
def getCurrentUser():
current_user = userController.get_user(id=get_jwt_identity())
return jsonify(current_user.as_dict()), 200
178 changes: 46 additions & 132 deletions src/api/views/userView.py
Original file line number Diff line number Diff line change
@@ -1,148 +1,76 @@
from flask import request, jsonify, session, Flask, redirect, session, url_for
from flask_jwt_extended import get_jwt_identity, jwt_required
from api import app
from api.utils import wrap_response
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/<id>", methods=['PUT'])
def update_user(id):
@app.route("/user", methods=['PUT'])
@jwt_required
def update_user():
"""
Update user
Updates user with `id` using the data in request body
Updates authenticated user with 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
description: User attributes to update. Any combination of attributes is valid
schema:
$ref: "#/definitions/User"
id: UserUpdate
properties:
name:
type: string
description: (Optional) Name of the user
bio:
type: string
description: (Optional) Biography of the user
languages:
type: string
description: (Optional) List of programming languages the user uses
interests:
type: string
description: (Optional) Interests of the user
location:
type: string
description: (Optional) Location of the user
occupation:
type: string
description: (Optional) Formal occupation, eg. student at X or works at Y
responses:
200:
description: User updated successfully
400:
description: Failed to update user
description: Bad Request. Forbidden Parameters used
404:
description: User the token belonged to doesn't exist anymore
"""
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 'id' in request.get_json():
return wrap_response(None, "Failed to update user. Request body can not specify user's id.", 400)

if user == None:
return "Failed to update user.", 400
else:
return jsonify(user.as_dict()), 200
return wrap_response(*userController.update_user(get_jwt_identity(), **request.get_json()))

@app.route("/users/<id>", methods=['GET'])
def get_user(id):
@app.route("/user", methods=['GET'])
@jwt_required
def get_user():
"""
Get user
Retreives user with `id`
Retreives authenticated user
---
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
description: User the token belonged to doesn't exist anymore
"""
user = userController.get_user(id=id)

if user:
return jsonify(user.as_dict()), 200
else:
return "", 404
return wrap_response(*userController.get_user_from_jwt())

@app.route("/users", methods=['GET'])
def get_all_users():
Expand All @@ -162,37 +90,23 @@ def get_all_users():

return jsonify(users), 200

@app.route("/users/<id>", methods=['DELETE'])
def delete_user(id):
@app.route("/user", methods=['DELETE'])
@jwt_required
def delete_user():
"""
Delete user
Deletes user with `id`
Deletes authenticated user
---
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
description: User the token belonged to doesn't exist anymore
"""
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

return wrap_response(*userController.delete_user(get_jwt_identity()))

# User Link
@app.route("/users/<user_id>/links", methods=['POST'])
Expand Down
Loading