import uuid from flask import Blueprint, request, jsonify from flask_login import login_required, current_user from server.models import Tokens, Scores from server.extensions import db from server.config import BEARER_TOKEN blueprint = Blueprint('api', __name__, url_prefix='/api') @blueprint.route('/tokens', methods=['DELETE', 'POST']) @login_required def tokens(): if request.method == 'DELETE': token_id = request.form['token_id'] if not token_id: return jsonify({"error": "No token ID provided!"}), 400 token = Tokens.query.filter_by(id=token_id).first() if not token: return jsonify({"error": "Token not found!"}), 404 if token.holder != current_user.id: return jsonify({"error": "You do not own this token!"}), 403 db.session.delete(token) db.session.commit() return jsonify({"success": "Token deleted!"}), 200 elif request.method == 'POST': if len(Tokens.query.filter_by(holder=current_user.id).all()) >= 5: return jsonify({"error": "You already have 5 tokens!"}), 403 token = Tokens(token=str(uuid.uuid4()), holder=current_user.id) db.session.add(token) db.session.commit() return jsonify({"success": "Token added!"}), 200 @blueprint.route('/post', methods=['POST']) def post(): form = request.form if not form: return "Invalid form", 400 if not request.headers.get('Authentication'): return "Invalid authentication", 401 if not isinstance(form['score'], int): return "Score must be an integer", 400 if int(form['score']) < 0: return "Score must be greater than 0", 400 if form['difficulty'] not in [0, 1, 2, 3, 4]: # 0 = Easy, Level 1 # 1 = Easy, Level 2 # 2 = Easy, Level 3 # 3 = Normal # 4 = Hard return "Invalid difficulty", 400 if token_data := Tokens.query.filter_by(token=request.headers.get('Authentication')).first(): # User is authenticated # This is a registered user score = Scores( score=form['score'], difficulty=form['difficulty'], achievements=form['achievements'], user_id=token_data.holder, ) db.session.add(score) db.session.commit() return "Success!", 200 elif request.headers.get('Authentication') == BEARER_TOKEN: # User is not authenticated, but has the correct token # This is an anonymous user if not form['playerName'] or len(form['playerId']) != 4: return "Invalid player name", 400 score = Scores( anonymous=True, username=form['playerName'], score=form['score'], difficulty=form['difficulty'], ) db.session.add(score) db.session.commit() return "Success!", 200 return "Authentication failed", 401