Strategická: Odpověď na /api je vždy JSON
This commit is contained in:
parent
d206db8597
commit
8dfb39f996
3 changed files with 43 additions and 13 deletions
server/hra/web
|
@ -19,6 +19,8 @@ import hra.config as config
|
||||||
import hra.web.html as html
|
import hra.web.html as html
|
||||||
import hra.db as db
|
import hra.db as db
|
||||||
|
|
||||||
|
import json
|
||||||
|
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
logging.basicConfig()
|
logging.basicConfig()
|
||||||
|
@ -89,7 +91,21 @@ def init_request():
|
||||||
app.before_request(init_request)
|
app.before_request(init_request)
|
||||||
|
|
||||||
|
|
||||||
|
@app.errorhandler(werkzeug.exceptions.HTTPException)
|
||||||
|
def handle_exception(e):
|
||||||
|
path = request.path
|
||||||
|
if path.startswith('/api/'):
|
||||||
|
response = e.get_response()
|
||||||
|
response.data = json.dumps({
|
||||||
|
"status": "error",
|
||||||
|
"description": e.description,
|
||||||
|
"http-code": e.code,
|
||||||
|
"http-name": e.name,
|
||||||
|
})
|
||||||
|
response.content_type = "application/json"
|
||||||
|
return response
|
||||||
|
else:
|
||||||
|
return e
|
||||||
|
|
||||||
import hra.web.pages as pages
|
import hra.web.pages as pages
|
||||||
import hra.web.api
|
import hra.web.api
|
||||||
|
|
|
@ -9,6 +9,17 @@ from hra.web import app, NeedLoginError
|
||||||
import hra.web.jinja_mac as jinja_mac
|
import hra.web.jinja_mac as jinja_mac
|
||||||
import hra.lib as lib
|
import hra.lib as lib
|
||||||
|
|
||||||
|
def json_endpoint(f):
|
||||||
|
def l(*arg, **kvarg):
|
||||||
|
x = f(*arg, **kvarg)
|
||||||
|
response = e.get_response()
|
||||||
|
response.content_type = "application/json"
|
||||||
|
response.data = json.dumps(x)
|
||||||
|
return response
|
||||||
|
l.__name__ = f.__name__
|
||||||
|
return l
|
||||||
|
|
||||||
|
|
||||||
def args_get(name, type, optional=False, default=None):
|
def args_get(name, type, optional=False, default=None):
|
||||||
v = request.args.get(name)
|
v = request.args.get(name)
|
||||||
if v is None:
|
if v is None:
|
||||||
|
@ -33,6 +44,7 @@ def get_context():
|
||||||
|
|
||||||
|
|
||||||
@app.route("/api/state", methods=['GET'])
|
@app.route("/api/state", methods=['GET'])
|
||||||
|
@json_endpoint
|
||||||
def api_state():
|
def api_state():
|
||||||
team = get_context()
|
team = get_context()
|
||||||
game = team.game
|
game = team.game
|
||||||
|
@ -54,15 +66,16 @@ def api_state():
|
||||||
"status": "too_early",
|
"status": "too_early",
|
||||||
"wait": time_to_end + 1.0 if time_to_end is not None else 3.0,
|
"wait": time_to_end + 1.0 if time_to_end is not None else 3.0,
|
||||||
})
|
})
|
||||||
return json.dumps({
|
return {
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"round": state.round,
|
"round": state.round,
|
||||||
"team_id": team_id,
|
"team_id": team_id,
|
||||||
"time_to_response": time_to_end,
|
"time_to_response": time_to_end,
|
||||||
"state": game.get_logic().personalize_state(state.get_state(), team_id, state.round),
|
"state": game.get_logic().personalize_state(state.get_state(), team_id, state.round),
|
||||||
})
|
}
|
||||||
|
|
||||||
@app.route("/api/action", methods=['POST'])
|
@app.route("/api/action", methods=['POST'])
|
||||||
|
@json_endpoint
|
||||||
def api_action():
|
def api_action():
|
||||||
def to_late():
|
def to_late():
|
||||||
return json.dumps({
|
return json.dumps({
|
||||||
|
@ -82,10 +95,10 @@ def api_action():
|
||||||
try:
|
try:
|
||||||
warnings = game.get_logic().validate_move(state.get_state(), team_id, j, round_id)
|
warnings = game.get_logic().validate_move(state.get_state(), team_id, j, round_id)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
return json.dumps({
|
return {
|
||||||
"status": "error",
|
"status": "error",
|
||||||
"description": f"{type(e).__name__}: {e}"
|
"description": f"{type(e).__name__}: {e}"
|
||||||
})
|
}
|
||||||
|
|
||||||
db.get_session().expire_all()
|
db.get_session().expire_all()
|
||||||
game = game.lock()
|
game = game.lock()
|
||||||
|
@ -104,13 +117,14 @@ def api_action():
|
||||||
db.get_session().commit()
|
db.get_session().commit()
|
||||||
|
|
||||||
if warnings is not None:
|
if warnings is not None:
|
||||||
return json.dumps(warnings)
|
return warnings
|
||||||
return json.dumps({
|
return {
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
})
|
}
|
||||||
|
|
||||||
|
|
||||||
@app.route("/api/step", methods=['POST'])
|
@app.route("/api/step", methods=['POST'])
|
||||||
|
@json_endpoint
|
||||||
def api_step():
|
def api_step():
|
||||||
team = get_context()
|
team = get_context()
|
||||||
game = team.game
|
game = team.game
|
||||||
|
@ -119,6 +133,6 @@ def api_step():
|
||||||
|
|
||||||
lib.game_step(game.game_id)
|
lib.game_step(game.game_id)
|
||||||
|
|
||||||
return json.dumps({
|
return {
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
})
|
}
|
||||||
|
|
|
@ -326,9 +326,9 @@ def web_org_games():
|
||||||
b.h2("Hry")
|
b.h2("Hry")
|
||||||
with b.p().table(_class="data full"):
|
with b.p().table(_class="data full"):
|
||||||
with b.thead():
|
with b.thead():
|
||||||
b.line().th()("Id: Jméno")
|
b.line().th("Id: Jméno")
|
||||||
b.line().th()("Kolo")
|
b.line().th("Kolo")
|
||||||
b.line().th()("Akce")
|
b.line().th("Akce")
|
||||||
for g in games:
|
for g in games:
|
||||||
with b.tr():
|
with b.tr():
|
||||||
b.line().td()(g.print())
|
b.line().td()(g.print())
|
||||||
|
|
Loading…
Reference in a new issue