API - separated different features of API
This commit is contained in:
parent
d9382e8fbe
commit
177292d7c8
4 changed files with 379 additions and 210 deletions
234
SE_API/API.py
234
SE_API/API.py
|
@ -6,6 +6,7 @@ from GithubAPI.GithubAPI import GitHubAPI_Keys
|
|||
from google.appengine.ext import db
|
||||
import requests
|
||||
import uuid
|
||||
import datetime
|
||||
|
||||
from flask import Flask, request, render_template, redirect, abort, Response
|
||||
|
||||
|
@ -23,11 +24,18 @@ from models.Campus import Campus
|
|||
from SE_API.Validation_Utils import *
|
||||
from SE_API.Respones_Utils import *
|
||||
|
||||
from SE_API.UserRoutes import user_routes
|
||||
from SE_API.CampusRoutes import campus_routes
|
||||
from SE_API.CourseRoutes import course_routes
|
||||
from SE_API.ProjectRoutes import project_routes
|
||||
|
||||
|
||||
|
||||
|
||||
app = Flask(__name__, static_folder='../templates')
|
||||
|
||||
|
||||
|
||||
githubKeys = GitHubAPI_Keys()
|
||||
|
||||
app.config['GITHUB_CLIENT_ID'] = githubKeys.getId()
|
||||
|
@ -35,6 +43,12 @@ app.config['GITHUB_CLIENT_SECRET'] = githubKeys.getSecret()
|
|||
|
||||
github = GitHub(app)
|
||||
cross = CORS(app)
|
||||
|
||||
app.register_blueprint(user_routes)
|
||||
app.register_blueprint(campus_routes)
|
||||
app.register_blueprint(course_routes)
|
||||
app.register_blueprint(project_routes)
|
||||
|
||||
auto = Autodoc(app)
|
||||
|
||||
@app.errorhandler(404)
|
||||
|
@ -108,23 +122,18 @@ def send_activation(token):
|
|||
403 - Invalid Token<br>
|
||||
"""
|
||||
if not request.data:
|
||||
return Response(response=json.dumps({'message': 'Bad Request'}),
|
||||
status=400,
|
||||
mimetype="application/json")
|
||||
return bad_request()
|
||||
payload = json.loads(request.data)
|
||||
if not is_user_token_valid(token):
|
||||
return Response(response=json.dumps({'message': 'Not A Valid Token!'}),
|
||||
status=403,
|
||||
mimetype="application/json")
|
||||
return forbidden("Not A Valid Token!")
|
||||
|
||||
query = User.all()
|
||||
query.filter('seToken =', token)
|
||||
for u in query.run(limit=1):
|
||||
try:
|
||||
send_validation_email(token=token, name=u.username, email=payload["email"])
|
||||
except Exception:
|
||||
return Response(response=json.dumps({'message': 'Bad Request'}),
|
||||
status=400,
|
||||
mimetype="application/json")
|
||||
return bad_request()
|
||||
|
||||
return Response(status=200)
|
||||
|
||||
|
@ -132,6 +141,10 @@ def send_activation(token):
|
|||
def documentation():
|
||||
return auto.html()
|
||||
|
||||
# @app.route('/api/help/campuses')
|
||||
# def documentation():
|
||||
# return auto.html()
|
||||
|
||||
@app.route('/home')
|
||||
def returnHome():
|
||||
try:
|
||||
|
@ -141,51 +154,6 @@ def returnHome():
|
|||
|
||||
|
||||
|
||||
@app.route('/api/getUserByToken/<string:token>', methods=["GET"])
|
||||
@auto.doc()
|
||||
def getUserByToken(token):
|
||||
'''
|
||||
<span class="card-title">This Function is will Activate a user and add tha campus to it</span>
|
||||
<br>
|
||||
<b>Route Parameters</b><br>
|
||||
- validation_token: 'seToken|email_suffix'
|
||||
<br>
|
||||
<br>
|
||||
<b>Payload</b><br>
|
||||
- NONE
|
||||
<br>
|
||||
<br>
|
||||
<b>Response</b>
|
||||
<br>
|
||||
200 - JSON Example:<br>
|
||||
<code>
|
||||
{<br>
|
||||
'username' : 'github_username',<br>
|
||||
'name' : 'Bob Dylan',<br>
|
||||
'email' : 'email@domain.com',<br>
|
||||
'isLecturer' : true,<br>
|
||||
'seToken' : 'dds2d-sfvvsf-qqq-fdf33-sfaa',<br>
|
||||
'avatar_url' : 'http://location.domain.com/image.jpg',<br>
|
||||
'isFirstLogin' : false,<br>
|
||||
'campuses_id_list': ['22314','243512',...,'356'],<br>
|
||||
'classes_id_list': ['22314','243512',...,'356']<br>
|
||||
}
|
||||
</code>
|
||||
<br>
|
||||
403 - Invalid Token
|
||||
'''
|
||||
query = User.all()
|
||||
query.filter("seToken = ", token)
|
||||
|
||||
for u in query.run(limit=5):
|
||||
return Response(response=u.to_JSON(),
|
||||
status=201,
|
||||
mimetype="application/json") # Real response!
|
||||
|
||||
return Response(response=json.dumps({'message' : 'No User Found'}),
|
||||
status=400,
|
||||
mimetype="application/json")
|
||||
|
||||
|
||||
|
||||
@app.route('/githubOAuth')
|
||||
|
@ -229,162 +197,6 @@ def oauth(oauth_token):
|
|||
return cookieMonster(user.seToken)
|
||||
|
||||
|
||||
@app.route('/api/Campuses/create/<string:token>', methods=['POST'])
|
||||
@auto.doc()
|
||||
def create_campus(token):
|
||||
"""
|
||||
<span class="card-title">This call will create a new campus in the DB</span>
|
||||
<br>
|
||||
<b>Route Parameters</b><br>
|
||||
- seToken: 'seToken'
|
||||
<br>
|
||||
<br>
|
||||
<b>Payload</b><br>
|
||||
- JSON Object, Example: <br>
|
||||
{<br>
|
||||
'title': 'Campus name',<br>
|
||||
'email_ending': '@campus.ac.com',<br>
|
||||
'avatar_url': 'http://location.domain.com/image.jpg'<br>
|
||||
}<br>
|
||||
<br>
|
||||
<br>
|
||||
<b>Response</b>
|
||||
<br>
|
||||
201 - Created
|
||||
<br>
|
||||
403 - Invalid Token/Forbidden
|
||||
"""
|
||||
if not request.data:
|
||||
return Response(response=json.dumps({'message': 'Bad Request'}),
|
||||
status=400,
|
||||
mimetype="application/json")
|
||||
payload = json.loads(request.data)
|
||||
if not is_lecturer(token): #todo: change to lecturer id
|
||||
return Response(response=json.dumps({'message': 'Invalid token or not a lecturer!'}),
|
||||
status=403,
|
||||
mimetype="application/json")
|
||||
|
||||
user = get_user_by_token(token)
|
||||
|
||||
#todo: check legality
|
||||
|
||||
try:
|
||||
campus = Campus(title=payload['title'], email_ending=payload['email_ending'], master_user_id=user.key().id(), avatar_url=payload['avatar_url'])
|
||||
except Exception:
|
||||
return Response(response=json.dumps({'message': 'Bad Request'}),
|
||||
status=400,
|
||||
mimetype="application/json")
|
||||
|
||||
db.put(campus)
|
||||
db.save
|
||||
return Response(response=json.dumps(campus.to_JSON()),
|
||||
status=201,
|
||||
mimetype="application/json")
|
||||
|
||||
|
||||
|
||||
# @app.route('/api/Courses/create/<string:token>', methods=['POST'])
|
||||
# @auto.doc()
|
||||
# def create_course(token):
|
||||
# """
|
||||
# This call will create a new campus in the DB
|
||||
# :param token: user seToken
|
||||
# Payload
|
||||
# {
|
||||
# 'courseName': self.courseName,
|
||||
# 'campusName': self.campusName,
|
||||
# 'projects': self.projects
|
||||
# 'startDate': self.startDate
|
||||
# 'endDate': self.endDate
|
||||
# 'taskFlag': self.taskFlag
|
||||
# }
|
||||
#
|
||||
# :return:
|
||||
# code 200
|
||||
# """
|
||||
# if not request.data:
|
||||
# return Response(response=json.dumps({'message': 'Bad Request'}),
|
||||
# status=400,
|
||||
# mimetype="application/json")
|
||||
# payload = json.loads(request.data)
|
||||
# if not is_lecturer(token): #todo: change to lecturer id
|
||||
# return Response(response=json.dumps({'message': 'Invalid token or not a lecturer!'}),
|
||||
# status=403,
|
||||
# mimetype="application/json")
|
||||
#
|
||||
# user = get_user_by_token(token)
|
||||
#
|
||||
# #todo: check legality
|
||||
#
|
||||
#
|
||||
# try:
|
||||
# course = Course(courseName=payload['courseName'], campusName=payload['campusName'], projects=payload['projects'], startDate=payload['startDate'], endDate=payload['endDate'], taskFlag=payload['taskFlag'])
|
||||
# except Exception:
|
||||
# return Response(response=json.dumps({'message': 'Bad Request'}),
|
||||
# status=400,
|
||||
# mimetype="application/json")
|
||||
#
|
||||
# db.put(course)
|
||||
# db.save
|
||||
# return Response(response=json.dumps(course.to_JSON()),
|
||||
# status=200,
|
||||
# mimetype="application/json")
|
||||
#
|
||||
#
|
||||
#
|
||||
|
||||
@app.route('/api/Campuses/<string:token>', methods=['GET'])
|
||||
@auto.doc()
|
||||
def get_campuses(token):
|
||||
"""
|
||||
<span class="card-title">This Call will return an array of all Campuses available</span>
|
||||
<br>
|
||||
<b>Route Parameters</b><br>
|
||||
- seToken: 'seToken'
|
||||
<br>
|
||||
<br>
|
||||
<b>Payload</b><br>
|
||||
- NONE <br>
|
||||
<br>
|
||||
<br>
|
||||
<b>Response</b>
|
||||
<br>
|
||||
200 - JSON Array, Example:<br>
|
||||
[<br>
|
||||
{
|
||||
'title': 'JCE',<br>
|
||||
'email_ending': '@post.jce.ac.il',<br>
|
||||
'master_user_id': 123453433341, (User that created the campus)<br>
|
||||
'avatar_url': 'http://some.domain.com/imagefile.jpg'<br>
|
||||
},<br>
|
||||
....<br>
|
||||
{<br>
|
||||
...<br>
|
||||
}req<br>
|
||||
]<br>
|
||||
<br>
|
||||
403 - Invalid Token<br>
|
||||
500 - Server Error
|
||||
"""
|
||||
if is_user_token_valid(token):
|
||||
arr = []
|
||||
query = Campus.all()
|
||||
for c in query.run():
|
||||
arr.append(dict(json.loads(c.to_JSON())))
|
||||
print arr
|
||||
if len(arr) != 0:
|
||||
return Response(response=json.dumps(arr),
|
||||
status=200,
|
||||
mimetype="application/json")
|
||||
else:
|
||||
return Response(response=[],
|
||||
status=200,
|
||||
mimetype="application/json")
|
||||
else:
|
||||
return Response(response=json.dumps({'message': 'Invalid Token'}),
|
||||
status=403,
|
||||
mimetype="application/json")
|
||||
|
||||
|
||||
|
||||
@app.route('/login')
|
||||
|
@ -433,3 +245,5 @@ def cookieMonster(uid):
|
|||
response = app.make_response(redirect_to_home )
|
||||
response.set_cookie('com.sehub.www',value=uid)
|
||||
return response
|
||||
|
||||
|
||||
|
|
135
SE_API/CampusRoutes.py
Normal file
135
SE_API/CampusRoutes.py
Normal file
|
@ -0,0 +1,135 @@
|
|||
__author__ = 'Aran'
|
||||
|
||||
from flask import Blueprint
|
||||
import json
|
||||
from GithubAPI.GithubAPI import GitHubAPI_Keys
|
||||
|
||||
from google.appengine.ext import db
|
||||
import requests
|
||||
import datetime
|
||||
|
||||
from flask import Flask, request, render_template, redirect, abort, Response
|
||||
|
||||
from flask.ext.github import GitHub
|
||||
from flask.ext.cors import CORS, cross_origin
|
||||
from flask.ext.autodoc import Autodoc
|
||||
|
||||
# DB Models
|
||||
from models.Campus import Campus
|
||||
|
||||
#Validation Utils Libs
|
||||
from SE_API.Validation_Utils import *
|
||||
from SE_API.Respones_Utils import *
|
||||
|
||||
|
||||
|
||||
campus_routes = Blueprint("campus_routes", __name__)
|
||||
auto = Autodoc()
|
||||
|
||||
@campus_routes.route('/api/campuses/create/<string:token>', methods=['POST'])
|
||||
@auto.doc()
|
||||
def create_campus(token):
|
||||
"""
|
||||
<span class="card-title">This call will create a new campus in the DB</span>
|
||||
<br>
|
||||
<b>Route Parameters</b><br>
|
||||
- seToken: 'seToken'
|
||||
<br>
|
||||
<br>
|
||||
<b>Payload</b><br>
|
||||
- JSON Object, Example: <br>
|
||||
{<br>
|
||||
'title': 'Campus name',<br>
|
||||
'email_ending': '@campus.ac.com',<br>
|
||||
'avatar_url': 'http://location.domain.com/image.jpg'<br>
|
||||
}<br>
|
||||
<br>
|
||||
<br>
|
||||
<b>Response</b>
|
||||
<br>
|
||||
201 - Created
|
||||
<br>
|
||||
403 - Invalid Token/Forbidden
|
||||
"""
|
||||
if not request.data:
|
||||
return bad_request()
|
||||
payload = json.loads(request.data)
|
||||
if not is_lecturer(token): #todo: change to lecturer id
|
||||
return forbidden("Invalid token or not a lecturer!")
|
||||
|
||||
user = get_user_by_token(token)
|
||||
|
||||
#todo: check legality
|
||||
|
||||
try:
|
||||
campus = Campus(title=payload['title'], email_ending=payload['email_ending'], master_user_id=user.key().id(), avatar_url=payload['avatar_url'])
|
||||
except Exception:
|
||||
return bad_request()
|
||||
|
||||
db.put(campus)
|
||||
db.save
|
||||
return Response(response=campus.to_JSON(),
|
||||
status=201,
|
||||
mimetype="application/json")
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@campus_routes.route('/api/campuses/<string:token>', methods=['GET'])
|
||||
@auto.doc()
|
||||
def get_campuses(token):
|
||||
"""
|
||||
<span class="card-title">This Call will return an array of all Campuses available</span>
|
||||
<br>
|
||||
<b>Route Parameters</b><br>
|
||||
- seToken: 'seToken'
|
||||
<br>
|
||||
<br>
|
||||
<b>Payload</b><br>
|
||||
- NONE <br>
|
||||
<br>
|
||||
<br>
|
||||
<b>Response</b>
|
||||
<br>
|
||||
200 - JSON Array, Example:<br>
|
||||
[<br>
|
||||
{
|
||||
'title': 'JCE',<br>
|
||||
'email_ending': '@post.jce.ac.il',<br>
|
||||
'master_user_id': 123453433341, (User that created the campus)<br>
|
||||
'avatar_url': 'http://some.domain.com/imagefile.jpg'<br>
|
||||
},<br>
|
||||
....<br>
|
||||
{<br>
|
||||
...<br>
|
||||
}req<br>
|
||||
]<br>
|
||||
<br>
|
||||
403 - Invalid Token<br>
|
||||
500 - Server Error
|
||||
"""
|
||||
|
||||
if is_user_token_valid(token):
|
||||
arr = []
|
||||
query = Campus.all()
|
||||
for c in query.run():
|
||||
arr.append(dict(json.loads(c.to_JSON())))
|
||||
print arr
|
||||
if len(arr) != 0:
|
||||
return Response(response=json.dumps(arr),
|
||||
status=200,
|
||||
mimetype="application/json")
|
||||
else:
|
||||
return Response(response=[],
|
||||
status=200,
|
||||
mimetype="application/json")
|
||||
else:
|
||||
return forbidden("Invalid Token")
|
||||
|
||||
|
||||
|
||||
|
||||
@campus_routes.route('/api/campuses/help')
|
||||
def documentation():
|
||||
return auto.html()
|
85
SE_API/CourseRoutes.py
Normal file
85
SE_API/CourseRoutes.py
Normal file
|
@ -0,0 +1,85 @@
|
|||
__author__ = 'Aran'
|
||||
|
||||
from flask import Blueprint
|
||||
import json
|
||||
from GithubAPI.GithubAPI import GitHubAPI_Keys
|
||||
|
||||
from google.appengine.ext import db
|
||||
import requests
|
||||
import datetime
|
||||
|
||||
from flask import Flask, request, render_template, redirect, abort, Response
|
||||
|
||||
from flask.ext.github import GitHub
|
||||
from flask.ext.cors import CORS, cross_origin
|
||||
from flask.ext.autodoc import Autodoc
|
||||
|
||||
# DB Models
|
||||
from models.Course import Course
|
||||
|
||||
#Validation Utils Libs
|
||||
from SE_API.Validation_Utils import *
|
||||
from SE_API.Respones_Utils import *
|
||||
|
||||
|
||||
|
||||
course_routes = Blueprint("course_routes", __name__)
|
||||
auto = Autodoc()
|
||||
|
||||
|
||||
@course_routes.route('/api/courses/create/<string:token>', methods=['POST'])
|
||||
@auto.doc()
|
||||
def create_course(token):
|
||||
"""
|
||||
This call will create a new campus in the DB
|
||||
:param token: user seToken
|
||||
Payload
|
||||
{
|
||||
'courseName': self.courseName,
|
||||
'campusName': self.campusName,
|
||||
'projects': self.projects
|
||||
'startDate': self.startDate
|
||||
'endDate': self.endDate
|
||||
'taskFlag': self.taskFlag
|
||||
}
|
||||
|
||||
:return:
|
||||
code 200
|
||||
"""
|
||||
if not request.data:
|
||||
return bad_request()
|
||||
payload = json.loads(request.data)
|
||||
if not is_lecturer(token): #todo: change to lecturer id
|
||||
return forbidden("Invalid token or not a lecturer!")
|
||||
|
||||
user = get_user_by_token(token)
|
||||
|
||||
#todo: check legality
|
||||
|
||||
|
||||
try:
|
||||
start_date = datetime.date(payload['startDate']['year'],payload['startDate']['month'],payload['startDate']['day'])
|
||||
end_date = datetime.date(payload['endDate']['year'],payload['endDate']['month'],payload['endDate']['day'])
|
||||
|
||||
course = Course(courseName=payload['courseName'], campusName=payload['campusName'],
|
||||
startDate=start_date, endDate=end_date)
|
||||
|
||||
try:
|
||||
course.projects=payload['projects']
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
|
||||
except Exception:
|
||||
return bad_request()
|
||||
|
||||
|
||||
|
||||
db.put(course)
|
||||
db.save
|
||||
return Response(response=course.to_JSON(),
|
||||
status=201,
|
||||
mimetype="application/json")
|
||||
|
||||
|
||||
|
135
SE_API/ProjectRoutes.py
Normal file
135
SE_API/ProjectRoutes.py
Normal file
|
@ -0,0 +1,135 @@
|
|||
__author__ = 'Aran'
|
||||
|
||||
from flask import Blueprint
|
||||
import json
|
||||
from GithubAPI.GithubAPI import GitHubAPI_Keys
|
||||
|
||||
from google.appengine.ext import db
|
||||
import requests
|
||||
import datetime
|
||||
|
||||
from flask import Flask, request, render_template, redirect, abort, Response
|
||||
|
||||
from flask.ext.github import GitHub
|
||||
from flask.ext.cors import CORS, cross_origin
|
||||
from flask.ext.autodoc import Autodoc
|
||||
|
||||
# DB Models
|
||||
from models.Project import Project
|
||||
|
||||
#Validation Utils Libs
|
||||
from SE_API.Validation_Utils import *
|
||||
from SE_API.Respones_Utils import *
|
||||
|
||||
|
||||
|
||||
project_routes = Blueprint("project_routes", __name__)
|
||||
auto = Autodoc()
|
||||
|
||||
@project_routes.route('/api/projects/Create/<string:token>/<string:id>', methods=['POST'])
|
||||
@auto.doc()
|
||||
def create_project(token,id):
|
||||
"""
|
||||
<span class="card-title">This call will create a new project in the DB</span>
|
||||
<br>
|
||||
<b>Route Parameters</b><br>
|
||||
- seToken: 'seToken'
|
||||
<br>
|
||||
<br>
|
||||
<b>Payload</b><br>
|
||||
- JSON Object, Example: <br>
|
||||
{<br>
|
||||
'title': 'Campus name',<br>
|
||||
'email_ending': '@campus.ac.com',<br>
|
||||
'avatar_url': 'http://location.domain.com/image.jpg'<br>
|
||||
}<br>
|
||||
<br>
|
||||
<br>
|
||||
<b>Response</b>
|
||||
<br>
|
||||
201 - Created
|
||||
<br>
|
||||
403 - Invalid Token/Forbidden
|
||||
"""
|
||||
if not request.data:
|
||||
return bad_request()
|
||||
payload = json.loads(request.data)
|
||||
if not is_lecturer(token): #todo: change to lecturer id
|
||||
return forbidden("Invalid token or not a lecturer!")
|
||||
|
||||
user = get_user_by_token(token)
|
||||
|
||||
#todo: check legality
|
||||
|
||||
try:
|
||||
project = Project(projectName=payload['projectName'], masterId=user.key().id(), gitRepository=payload['gitRepository'], membersId=[token])
|
||||
except Exception as e:
|
||||
print e
|
||||
return bad_request()
|
||||
|
||||
db.put(project)
|
||||
db.save
|
||||
return Response(response=project.to_JSON(),
|
||||
status=201,
|
||||
mimetype="application/json")
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@project_routes.route('/api/projects/get/<string:token>', methods=['GET'])
|
||||
@auto.doc()
|
||||
def get_projects(token):
|
||||
"""
|
||||
<span class="card-title">This Call will return an array of all projects available</span>
|
||||
<br>
|
||||
<b>Route Parameters</b><br>
|
||||
- seToken: 'seToken'
|
||||
<br>
|
||||
<br>
|
||||
<b>Payload</b><br>
|
||||
- NONE <br>
|
||||
<br>
|
||||
<br>
|
||||
<b>Response</b>
|
||||
<br>
|
||||
200 - JSON Array, Example:<br>
|
||||
[<br>
|
||||
{
|
||||
'title': 'JCE',<br>
|
||||
'email_ending': '@post.jce.ac.il',<br>
|
||||
'master_user_id': 123453433341, (User that created the campus)<br>
|
||||
'avatar_url': 'http://some.domain.com/imagefile.jpg'<br>
|
||||
},<br>
|
||||
....<br>
|
||||
{<br>
|
||||
...<br>
|
||||
}req<br>
|
||||
]<br>
|
||||
<br>
|
||||
403 - Invalid Token<br>
|
||||
500 - Server Error
|
||||
"""
|
||||
if is_user_token_valid(token):
|
||||
arr = []
|
||||
query = Campus.all()
|
||||
for c in query.run():
|
||||
arr.append(dict(json.loads(c.to_JSON())))
|
||||
print arr
|
||||
if len(arr) != 0:
|
||||
return Response(response=json.dumps(arr),
|
||||
status=200,
|
||||
mimetype="application/json")
|
||||
else:
|
||||
return Response(response=[],
|
||||
status=200,
|
||||
mimetype="application/json")
|
||||
else:
|
||||
return forbidden("Invalid Token")
|
||||
|
||||
|
||||
|
||||
@project_routes.route('/api/Projects/<string:token>', methods=['GET'])
|
||||
@auto.doc()
|
||||
def get_campuses(token):
|
||||
pass
|
Loading…
Reference in a new issue