Skip to content

Instantly share code, notes, and snippets.

@thenerdsuperuser
Created April 27, 2019 08:40
Show Gist options
  • Save thenerdsuperuser/dce9f5dca051ce8e3055f8d1d38c89a0 to your computer and use it in GitHub Desktop.
Save thenerdsuperuser/dce9f5dca051ce8e3055f8d1d38c89a0 to your computer and use it in GitHub Desktop.
from flask import Flask, jsonify, request, abort
from flask import Response
import requests
import sqlite3
#import make_response
import hashlib
import json
from flask_cors import CORS
import base64
import datetime
import string
import re
app = Flask(__name__)
CORS(app)
app.config["CORS_SUPPORTS_CREDENTIALS"] = True
count=0
def checkUserNameInDb(username):
connectionState = sqlite3.connect("acts_databs.db")
cursor = connectionState.cursor()
cursor.execute("SELECT * from User WHERE username = ?",(username,))
userData = cursor.fetchall()
connectionState.close()
if (len(userData) == 0):
return 1
return 0
def checkCategoryInDb(categoryname):
connectionState = sqlite3.connect("acts_databs.db")
cursor = connectionState.cursor()
cursor.execute("SELECT * from Category WHERE categoryname = ?",(categoryname,))
categoryData = cursor.fetchall()
connectionState.close()
if (len(categoryData) == 0):
return 1
return 0
def getcategory(categorydic):
connectionState = sqlite3.connect("acts_databs.db")
cursor = connectionState.cursor()
cursor.execute("SELECT * from Category")
data=cursor.fetchall()
for i in data:
categorydic[i[0]]=i[1]
connectionState.commit()
connectionState.close()
return categorydic
def checkactid(actid):
connectionState = sqlite3.connect("acts_databs.db")
cursor = connectionState.cursor()
cursor.execute("SELECT * from Acts WHERE actId = ?",(actid,))
actData = cursor.fetchall()
connectionState.close()
if len(actData) == 0:
return 1
return 0
def checkusername(user):
connectionState=sqlite3.connect("acts_databs.db")
cursor=connectionState.cursor()
cursor.execute("SELECT username FROM User WHERE username=?",(user,))
userdata=cursor.fetchall()
connectionState.close()
if(len(userdata) == 0):
return 0
return 1
def checkcategoryname(category):
connectionState=sqlite3.connect("acts_databs.db")
cursor=connectionState.cursor()
cursor.execute("SELECT categoryname from Category where categoryname=?",(category,))
catdata=cursor.fetchall()
connectionState.close()
if(len(catdata) == 0):
return 0
return 1
def imgB64decode(imgB64):
try:
base64.b64encode(base64.b64decode(imgB64)) == imgB64
except Exception as e:
return 0
else:
return 1
def imgB64decodes(category):
try:
connectionState=sqlite3.connect('acts_databs.db')
cursor=connectionState.cursor()
cursor.execute('SELECT imgB64 from Acts where categoryname=?',(category,))
img=cursor.fetchall()
connectionState.close()
img.decode('base64','strict')
except Exception as e:
return 1
else:
return 0
def timecheck(timeformat):
try:
datetime.datetime.strptime(timeformat, '%d-%m-%Y:%S-%M-%H')
except:
return 0
else:
return 1
def timechecks(category):
try:
connectionState=sqlite3.connect('acts_databs.db')
cursor=connectionState.cursor()
cursor.execute('SELECT timestamp from Acts where categoryname=?',(category,))
time=cursor.fetchall()
connectionState.close()
datetime.datetime .strptime(time, '%d-%m-%Y')
except:
return 0
else:
return 1
def checkCategory(category):
connectionState=sqlite3.connect('acts_databs.db')
cursor=connectionState.cursor()
cursor.execute('SELECT * FROM Category where categoryname=?',(category,))
categorydata=cursor.fetchall()
connectionState.close()
if(len(categorydata) == 0):
return 1
return 0
def checknoofacts(category):
connectionState=sqlite3.connect('acts_databs.db')
cursor=connectionState.cursor()
cursor.execute("SELECT * FROM Category WHERE categoryname=?",(category,))
actdata=cursor.fetchall()
connectionState.close()
if(len(actdata)<100):
return 0
return 1
def checkacts(category,end):
connectionState=sqlite3.connect('acts_databs.db')
cursor=connectionState.cursor()
cursor.execute('SELECT * from Acts where categoryname=?',(category,))
actno=cursor.fetchall()
if(len(actno)>=end):
return 0
return 1
def checkacts1(category,end):
connectionState=sqlite3.connect('acts_databs.db')
cursor=connectionState.cursor()
cursor.execute('SELECT * FROM Acts where categoryname=?',(category,))
actno=cursor.fetchall()
if(len(actno)>=end):
return 1
return 0
def checkUserPwd(username,password):
connectionState=sqlite3.connect('acts_databs.db')
cursor=connectionState.cursor()
cursor.execute('SELECT username,password from Users where username=? and password=?',(username,password,))
userpwd=cursor.fetchall()
if(len(userpwd)==0):
return 1
return 0
def checkforimg(imgB64):
connectionState=sqlite3.connect('acts_databs.db')
cursor=connectionState.cursor()
cursor.execute('SELECT * from Acts where imgB64=?',(imgB64,))
imgdata=cursor.fetchall()
if(len(imgdata)==0):
return 1
return 0
def checkforhash(maybe_sha):
connectionState=sqlite3.connect('acts_databs.db')
cursor=connectionState.cursor()
if len(maybe_sha) != 40:
return False
try:
sha_int = int(maybe_sha, 16)
except ValueError:
return False
return True
#3,4.ADD CATEGORY AND LIST CATEGORY
@app.route("/api/v1/categories", methods = ['POST', 'GET','DELETE','PUT'])
def addcategory():
global count
if request.method == "GET":
count=count+1;
categories = {}
getcategory(categories)
if len(categories):
#print(categories)
return jsonify(categories),200
else:
return jsonify({}),204
elif request.method == "POST":
count=count+1;
category_data = request.get_json()
#print(category_data)
#cat_data=[]
#cat_data.append(str(category_data['categoryname']))
numberofacts=0
#print(cat_data)
if category_data[0]=="":
return jsonify({}),400
if checkCategoryInDb(category_data[0]):
connectionState = sqlite3.connect("acts_databs.db")
cursor = connectionState.cursor()
#category_data['numberofacts']=0
cursor.execute("INSERT INTO Category(categoryname, numberofacts) VALUES(?, ?)", (category_data[0],numberofacts,))
connectionState.commit()
connectionState.close()
return jsonify({}), 201
else:
#Bad request
return jsonify({}), 400
else:
count=count+1
#Method not allowed
return jsonify({}), 405
#5.REMOVE CATEGORY
@app.route("/api/v1/categories/<categoryname>", methods = ['POST', 'GET', 'DELETE', 'PUT'])
def removeCategory(categoryname):
global count
if request.method == 'DELETE':
count=count+1;
if checkCategoryInDb(categoryname):
return jsonify({}), 400
else:
connectionState = sqlite3.connect("acts_databs.db")
cursor = connectionState.cursor()
cursor.execute("DELETE FROM Category where categoryname IS ?",(categoryname,))
cursor.execute("DELETE FROM Acts where categoryname is ?",(categoryname,))
connectionState.commit()
connectionState.close()
return jsonify({}), 200
else:
count=count+1
return jsonify({}), 405
#6.LIST ACTS FOR A GIVEN CATEGORY
@app.route('/api/v1/categories/<category>/acts' , methods=['GET','POST','DELETE','PUT'])
def actsforcategory(category):
#print("ACTS FOR CATEGORIES")
#print("ARGS ", request.args)
start = request.args.get("start")
end = request.args.get("end")
#if start:
# print("START: ", start, "END: ", end)
global count
if start==None and end==None:
print("ACTS FOR CATEGORIES")
if request.method=='GET':
count=count+1;
mydic={}
actlist=[]
if checkCategory(category): #or checkUserNameInDb(category): #or imgB64decodes(category) or timechecks(category):
return jsonify({}),204
elif checknoofacts(category):
return jsonify({}),413
else:
connectionState=sqlite3.connect('acts_databs.db')
cursor=connectionState.cursor()
#r=requests.get(url="http://localhost:5656/api/v1/users")
#user=r.json()
#cursor.execute("INSERT INTO User(username,password) VALUES (?,NULL)",(user,))
#for i in user:
# print(i)
cursor.execute('SELECT actId,username,timestamp,caption,imgB64,upvotes from Acts where categoryname=?',(category,))
act=cursor.fetchall()
j=len(act)
for k in act:
mydic={"actId":k[0],"Username":k[1],"timestamp":k[2],"Caption":k[3],"imgB64":k[4],"Upvotes":k[5]}
#return ({'actId':k[0],'Username':k[1],'timestamp':k[2],'Caption':k[3],'imgB64':k[4],'Upvotes':k[5]}),200
actlist.append(mydic)
#finaldic.update(mydic)
return jsonify(actlist),200
#return jsonify(mydic),200
#return jsonify(k[0]),200
connectionState.commit()
connectionState.close()
else:
count=count+1
return jsonify({}),405
elif start!= None and end==None:
count=count+1
return jsonify({}),204
elif start==None and end!=None:
count=count+1
return jsonify({}),204
elif start!=None and end!=None:
value=categoryrange(category,start,end)
return value
#7.LIST NUMBER OF ACTS FOR A CATEGORY
@app.route('/api/v1/categories/<category>/acts/size' ,methods=['GET','PUT','POST','DELETE'])
def acts(category):
global count
if request.method =='GET':
count=count+1;
if checkCategory(category):
return jsonify({}),204
else:
connectionState=sqlite3.connect("acts_databs.db")
cursor=connectionState.cursor()
cursor.execute('SELECT numberofacts FROM Category WHERE categoryname=?',(category,))
data=cursor.fetchall()
print(data)
return jsonify(data[0]),200
else:
count=count+1
return jsonify({}),405
#8. LIST ACTS FOR A GIVEN CATEGORY WITHIN A RANGE
#@app.route('/api/v1/categories/<category>/acts?start=<int:start>&end=<int:end>' , methods=['GET','POST','DELETE','PUT'])
#app.route('/api/v1/categories/<category>/acts?start=<int:start>/<int:end>' , methods=['GET','POST','DELETE','PUT'])
def categoryrange(category,start,end):
print("TESTTTTTTT")
#print("REQUEST ", request.method)
global count
if request.method=='GET':
count=count+1;
if category=="":
return jsonify({}),400
mydic={}
actrangelist=[]
diff = int(end)-int(start)+1
#print("diff ",diff)
# print(diff)
if checkCategory(category):
#print("WRONG CATEGORY")
return jsonify({}),204
if diff > 100:
print("Difference greater than 100")
return jsonify({}),413
elif int(start) < 1 or checkacts(category,int(end)):
#print("WRECKED")
return jsonify({}),204
elif int(start)>=1 and checkacts1(category,int(end)):
#print("HELLO WORLD")
connectionState=sqlite3.connect('acts_databs.db')
cursor=connectionState.cursor()
cursor.execute('SELECT actId,username,timestamp,caption,imgB64,upvotes from Acts where categoryname=? order by date(timestamp) DESC limit ? offset ? ',(category,diff,int(start)-1,))
actdesc=cursor.fetchall()
j=len(actdesc)
for k in actdesc:
mydic={"actId":k[0],"Username":k[1],"timestamp":k[2],"Caption":k[3],"imgB64":k[4],"Upvotes":k[5]}
actrangelist.append(mydic)
print("HERE1")
print(actrangelist)
return jsonify(actrangelist),200
connectionState.commit()
connectionState.close()
else:
count=count+1
return jsonify({}),405
#9. UPVOTE AN ACT
@app.route('/api/v1/acts/upvote' , methods=['GET','POST','DELETE','PUT'])
def upvote():
global count
if request.method =='POST':
count=count+1;
upvote_data=request.get_json();
if checkactid(upvote_data[0]):
return jsonify({}),400
else:
connectionState=sqlite3.connect('acts_databs.db')
cursor=connectionState.cursor()
cursor.execute('UPDATE Acts SET upvotes=upvotes+1 WHERE actId=?',(upvote_data[0 ],))
connectionState.commit()
connectionState.close()
return jsonify({}),200
else:
count=count+1
jsonify({}),405
#10.REMOVE AN ACT
@app.route('/api/v1/acts/<actid>' ,methods=['GET','POST','DELETE','PUT'])
def removeact(actid):
global count
if request.method == 'DELETE':
count=count+1;
#print("1")
if checkactid(int(actid)):
return jsonify({}),400
else:
connectionState=sqlite3.connect('acts_databs.db')
cursor=connectionState.cursor()
cursor.execute('UPDATE Category SET numberofacts=numberofacts-1 WHERE categoryname=(SELECT categoryname from Acts WHERE actId IS ?)',(int(actid),))
cursor.execute('DELETE FROM Acts WHERE actId IS ?',(int(actid),))
connectionState.commit()
connectionState.close()
return jsonify({}),200
else:
count=count+1
jsonify({}),405
#11. UPLOAD AN ACT
@app.route('/api/v1/acts' , methods=['GET','POST','DELETE','PUT'])
def upload():
global count
if request.method == 'POST':
count=count+1;
currtime=datetime.datetime.now()
act_data=request.get_json()
#print("Hello")
connectionState=sqlite3.connect('acts_databs.db')
cursor = connectionState.cursor()
r=requests.get(url="http://34.233.40.25:80/api/v1/users")
users=r.json()
print(users)
#for i in users:
# if i==
#j=0
#for i in users:
# usernm=users[j][0]
# print(usernm)
# passwrd=users[j][1]
# print(passwrd)
# j=j+1
#cursor.execute("INSERT INTO User(username,password) VALUES (?,?)",(usernm,passwrd))
#cursor.execute("SELECT username from User")
#user=cursor.fetchall()
for i in users:
if(i==act_data['username']):
if checkactid(act_data['actId']) and checkcategoryname(act_data['categoryName']) and timecheck(act_data['timestamp']) and imgB64decode(act_data['imgB64']):
act_data['upvotes']=0
cursor.execute('INSERT INTO Acts(categoryname,actId,username,timestamp,caption,imgB64,upvotes) VALUES (?,?,?,?,?,?,?)', \
(act_data['categoryName'],act_data['actId'],act_data['username'],act_data['timestamp'],act_data['caption'],act_data['imgB64'],act_data['upvotes']))
cursor.execute('UPDATE Category SET numberofacts=numberofacts+1 WHERE categoryname=?',(act_data['categoryName'],))
connectionState.commit()
connectionState.close()
return jsonify({}),201
else:
return jsonify({}),400
else:
continue;
else:
count=count+1
return jsonify({}),405
#12. Number of acts across all categories
@app.route('/api/v1/acts/count' , methods=['GET','DELETE','POST','PUT'])
def countact():
global count
if request.method=="GET":
count=count+1
#print(count)
connectionState=sqlite3.connect('acts_databs.db')
cursor=connectionState.cursor()
cursor.execute('SELECT count(*) from Acts')
cnt=cursor.fetchall()
lst=[]
for i in cnt:
lst.append(i[0])
connectionState.commit()
connectionState.close()
return jsonify(lst),200
else:
count=count+1
return jsonify({}),405
#13. Number of HTTP requests and reset
@app.route('/api/v1/_count' , methods=['GET','DELETE','POST','PUT'])
def regcount():
global count
if request.method=='GET':
connectionState=sqlite3.connect('acts_databs.db')
cursor=connectionState.cursor()
cntlst=[]
cntlst.append(count)
connectionState.commit()
connectionState.close()
#print(count)
return jsonify(cntlst),200
elif request.method=='DELETE':
connectionState=sqlite3.connect('acts_databs.db')
cursor=connectionState.cursor()
count=0
connectionState.commit()
connectionState.close()
return jsonify({}),200
else:
return jsonify({}),405
#Route for generating act id
@app.route('/api/v1/actid' , methods=['GET','POST','DELETE','PUT'])
def getactid():
if request.method=='GET':
connectionState=sqlite3.connect('acts_databs.db')
cursor = connectionState.cursor()
cursor.execute('SELECT actId from Acts order by actId')
aid=cursor.fetchall()
if len(aid)==0:
actId=0
else:
cursor.execute('Select MAX(actId) from Acts')
maxid=cursor.fetchall()
print(maxid[0][0])
actId=maxid[0][0]+1
return jsonify([actId]),201
else:
return jsonify({}),405
#LOGIN
@app.route('/api/v1/login' , methods=['GET','POST','DELETE','PUT'])
def login():
if request.method=='POST':
user_datalogin = request.get_json()
connectionState=sqlite3.connect('acts_databs.db')
cursor=connectionState.cursor()
user_data['password'] = (hashlib.sha1(user_data['password'].encode())).hexdigest()
if checkNamePwd(user_datalogin['username'],user_datalogin['password']):
return jsonify({"WRONG CREDENTIALS"}),400
else:
return jsonify({}),200
else:
return jsonify({}),405
#To get actid using imgB64
@app.route('/api/v1/img' , methods=['GET','POST','DELETE','PUT'])
def imgactid():
if request.method=='GET':
img_data=request.get_json()
if checkforimg(img_data['imgB64']):
return jsonify({}),400
else:
connectionState=sqlite3.connect('acts_databs.db')
cursor=connectionState.cursor()
cursor.execute('SELECT actId from Acts where imgB64=?',(img_data['imgB64'],))
idact=cursor.fetchall()
connectionState.commit()
connectionState.close()
return jsonify([idact]),200
else:
return jsonify({}),405
if __name__ == '__main__':
app.run(host='0.0.0.0',port =80, debug = True)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment