Initial Commit
This commit is contained in:
commit
811d0da4fc
8
.gitignore
vendored
Normal file
8
.gitignore
vendored
Normal file
|
@ -0,0 +1,8 @@
|
|||
# Database
|
||||
database.db
|
||||
|
||||
# Environments
|
||||
venv/
|
||||
|
||||
# Jetbrains stuff
|
||||
.idea/
|
133
app.py
Normal file
133
app.py
Normal file
|
@ -0,0 +1,133 @@
|
|||
from flask import Flask, request, jsonify, make_response
|
||||
from flask_httpauth import HTTPBasicAuth
|
||||
from sqlite3 import connect, OperationalError
|
||||
import bcrypt
|
||||
|
||||
app = Flask(__name__)
|
||||
auth = HTTPBasicAuth()
|
||||
db = connect("database.db", check_same_thread=False)
|
||||
|
||||
try:
|
||||
cursor = db.cursor()
|
||||
cursor.execute('''create table tickets (
|
||||
username text not null, number text, date timestamp default current_timestamp, inside boolean default 0
|
||||
);''')
|
||||
cursor.execute('''create table users (
|
||||
username text not null, password text not null
|
||||
);''')
|
||||
cursor.close()
|
||||
db.commit()
|
||||
except OperationalError:
|
||||
pass
|
||||
|
||||
|
||||
@auth.verify_password
|
||||
def verpass(username, password):
|
||||
# return True
|
||||
cur = db.cursor()
|
||||
ret = cur.execute('''select password from users where username = ?''', (username,)).fetchone()
|
||||
if ret is None:
|
||||
salt = bcrypt.gensalt()
|
||||
cur.execute('''insert into users (username, password) values (?,?);''',
|
||||
(username, bcrypt.hashpw(password.encode('utf-8'), salt),))
|
||||
cur.close()
|
||||
db.commit()
|
||||
return True
|
||||
else:
|
||||
(pw) = ret[0]
|
||||
try:
|
||||
red = bcrypt.checkpw(password.encode('utf-8'), pw)
|
||||
except ValueError:
|
||||
return False
|
||||
return red
|
||||
|
||||
|
||||
def checknum(username, number, checked=0):
|
||||
cur = db.cursor()
|
||||
if checked != -1:
|
||||
res = cur.execute('''select * from tickets where username = ? and number = ? and inside = ?;''',
|
||||
(username, number, checked,)).fetchone()
|
||||
else:
|
||||
res = cur.execute('''select * from tickets where username = ? and number = ?;''',
|
||||
(username, number,)).fetchone()
|
||||
if res is None:
|
||||
return False
|
||||
return len(res) >= 1
|
||||
|
||||
|
||||
@app.route("/ticket", methods=["POST"])
|
||||
@auth.login_required
|
||||
def addticket():
|
||||
if not request.json or "number" not in request.json or "function" not in request.json:
|
||||
return make_response(jsonify({"msg": "missing/faulty request body?"}), 400)
|
||||
fun = request.json["function"]
|
||||
if fun not in ("add", "check", "uncheck", "del"):
|
||||
return make_response(jsonify({"msg": "invalid function"}), 501)
|
||||
num = str(request.json["number"])
|
||||
if fun == "add":
|
||||
if checknum(auth.username(), num):
|
||||
return make_response(jsonify({"msg": "Ticket already payed!"}), 409)
|
||||
cur = db.cursor()
|
||||
cur.execute("insert into tickets (username,number) values (?,?);", (auth.username(), num,))
|
||||
cur.close()
|
||||
db.commit()
|
||||
return make_response(jsonify({"msg": "Added user"}), 200)
|
||||
elif fun == "check":
|
||||
cr = db.cursor()
|
||||
cr.execute("select number from tickets where number = ?", (num,))
|
||||
lis = cr.fetchall()
|
||||
if len(lis) < 1:
|
||||
return make_response(jsonify({"msg": "Ticket not payed!"}), 409)
|
||||
if checknum(auth.username(), num, 1):
|
||||
return make_response(jsonify({"msg": "Ticket already inside!"}), 417)
|
||||
cur = db.cursor()
|
||||
cur.execute("update tickets set inside = 1 where username = ? and number = ?;", (auth.username(), num))
|
||||
cur.close()
|
||||
db.commit()
|
||||
return make_response(jsonify({"msg": "Payed!"}), 200)
|
||||
elif fun == "uncheck":
|
||||
if checknum(auth.username(), num, 0):
|
||||
return make_response(jsonify({"msg": "Ticket hasn't entered yet!"}), 409)
|
||||
cur = db.cursor()
|
||||
cur.execute("update tickets set inside = 0 where username = ? and number = ?;", (auth.username(), num))
|
||||
cur.close()
|
||||
db.commit()
|
||||
return make_response(jsonify({"msg": "Unpayed!!"}), 200)
|
||||
elif fun == "del":
|
||||
if not checknum(auth.username(), num, -1):
|
||||
return make_response(jsonify({"msg": "Ticket does not exist!"}), 409)
|
||||
cur = db.cursor()
|
||||
cur.execute("delete from tickets where username = ? and number = ?", (auth.username(), num,))
|
||||
cur.close()
|
||||
db.commit()
|
||||
return make_response(jsonify({"msg": "Removed!"}), 200)
|
||||
|
||||
|
||||
@app.route("/control", methods=["POST"])
|
||||
@auth.login_required
|
||||
def control():
|
||||
if not request.json or "function" not in request.json:
|
||||
return make_response(jsonify({"msg": "missing/faulty request body?"}), 400)
|
||||
fun = request.json["function"]
|
||||
if fun not in ("remove_all",):
|
||||
return make_response(jsonify({"msg": "invalid function"}), 405)
|
||||
if fun == "remove_all":
|
||||
cur = db.cursor()
|
||||
cur.execute("delete from tickets where username = ?", (auth.username(),))
|
||||
cur.close()
|
||||
db.commit()
|
||||
return make_response(jsonify({"msg": "Removed!"}), 200)
|
||||
|
||||
|
||||
@app.route("/check")
|
||||
@auth.login_required
|
||||
def check():
|
||||
cur = db.cursor()
|
||||
num1 = cur.execute('''select * from tickets where username = ?;''', (auth.username(),)).fetchall()
|
||||
num2 = cur.execute('''select * from tickets where username = ? and inside = 1;''', (auth.username(),)).fetchall()
|
||||
cur.close()
|
||||
return "%d/%d" % (len(num2), len(num1))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
app.run("0.0.0.0", 5000)
|
3
install.txt
Normal file
3
install.txt
Normal file
|
@ -0,0 +1,3 @@
|
|||
flask
|
||||
flask-httpauth
|
||||
bcrypt
|
Loading…
Reference in a new issue