From d9237b2891ba20876661e2e3e5a1fdc60ac1f762 Mon Sep 17 00:00:00 2001 From: Greg Gauthier Date: Sat, 22 Jun 2024 01:05:00 +0100 Subject: [PATCH] completely refactored with proper models and a swagger ui --- app.py | 117 +++++++++++++++++++++++++++++++++------------------------ 1 file changed, 68 insertions(+), 49 deletions(-) diff --git a/app.py b/app.py index d17eac9..7ae7cd5 100644 --- a/app.py +++ b/app.py @@ -1,65 +1,84 @@ -from flask import Flask, request, jsonify +from flask import Flask +from flask_restx import Api, Resource, fields import random app = Flask(__name__) +app.config.SWAGGER_UI_JSONEDITOR = True +app.config['SWAGGER_UI_JSONEDITOR'] = True +api = Api(app, version='1.0', title='Gamma World Dice', description='Rolled Dice As A Service') + +dice = api.namespace('dice', description='Dice operations') +ability = api.namespace('ability', description='Ability operations') +hp = api.namespace('hp', description='HP operations') + +dice_model = dice.model('Dice', { + 'quantity': fields.Integer(required=True, description='The number of dice to roll'), + 'geometry': fields.Integer(required=True, description='The number of sides on each die'), + 'discard_lowest': fields.Boolean(required=False, default=False, description='Drop the lowest score') +}) + +ability_model = ability.model('Ability', { + 'chartype': fields.String(required=False, default="human", description='Character type') +}) + +hp_model = hp.model('HP', { + 'chartype': fields.String(required=False, default="human", description='Character type'), + 'conscore': fields.Integer(required=True, description='Conscore') +}) -@app.route('/') -def hello_world(): # put application's code here - return 'Hello World!' +@api.route('/roll/dice', methods=['POST']) +class RollDice(Resource): + @dice.expect(dice_model) + def post(self): + data = api.payload + quantity = data.get('quantity') + geometry = data.get('geometry') + discard_lowest = data.get('discard_lowest') + if quantity is None or geometry is None: + return {"message": "Required dice data not provided"}, 400 + return roll_dices(quantity, geometry, discard_lowest), 200 -@app.route('/roll/chance', methods=['GET']) -def roll_chance(): - result = roll_dices(1, 100, False) - return jsonify(result["sum"]) +@api.route('/roll/ability', methods=['POST']) +class RollAbility(Resource): + @ability.expect(ability_model) + def post(self): + data = api.payload + chartype = data.get('chartype') + if chartype == 'human': + geometry = 8 + else: + geometry = 6 + return roll_dices(4, geometry, True), 200 -@app.route('/roll/tohit', methods=['GET']) -def roll_tohit(): - result = roll_dices(1, 20, False) - return jsonify(result["sum"]) +@api.route('/roll/hp', methods=['POST']) +class RollHP(Resource): + @hp.expect(hp_model) + def post(self): + data = api.payload + chartype = data.get('chartype') + conscore = data.get('conscore') + if conscore is None: + return {"message": "A constitution score is required"}, 400 + if chartype == 'human': + geometry = 8 + else: + geometry = 6 + return roll_dices(conscore, geometry, False), 200 -@app.route('/roll/ability', methods=['POST', 'GET']) -def roll_ability(): - if request.json.get('chartype') is None: - chartype = 'human' - else: - chartype = request.json.get('chartype') - - if chartype == 'human': - geometry = 8 - else: - geometry = 6 - results = roll_dices(4, geometry, True) - - return jsonify(results) +@api.route('/roll/chance', methods=['GET']) +class RollChance(Resource): + def get(self): + return roll_dices(1, 100, False), 200 -@app.route('/roll/hp', methods=['POST', 'GET']) -def roll_sum(): - chartype = request.json.get('quantity') - if chartype is None: - chartype = 'human' - conscore = request.json.get('conscore') - if conscore is None: - return jsonify({"ERROR": "NO CONSTITUTION SCORE SUPPLIED"}) - if chartype == 'human': - geometry = 8 - else: - geometry = 6 - - return jsonify(roll_dices(conscore, geometry, False)) - - -@app.route('/roll/dice', methods=['POST']) -def rolldie(): - quantity = request.json.get('quantity') - geometry = request.json.get('geometry') - discard_lowest = request.json.get('discard_lowest', False) - - return jsonify(roll_dices(quantity, geometry, discard_lowest)) +@api.route('/roll/tohit', methods=['GET']) +class RollToHit(Resource): + def get(self): + return roll_dices(1, 20, False), 200 def roll_dices(dice_count, dice_sides, discard_lowest):