From 218eb0e394605d1ba8e152a30fe6c389da60ad44 Mon Sep 17 00:00:00 2001 From: rrr-marble Date: Fri, 2 Jul 2021 17:59:40 +0300 Subject: [PATCH] add: meaningful error responses --- main.py | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/main.py b/main.py index be12b54..9079922 100644 --- a/main.py +++ b/main.py @@ -1,9 +1,11 @@ from fastapi import FastAPI +from fastapi.responses import JSONResponse from datetime import datetime from uuid import uuid4 import sqlite3 + # use database residing here DB_LOCATION = ( "../testbox/photovoter.dblite" # Q: any allowances for this being not OUR database? @@ -15,7 +17,7 @@ con.row_factory = sqlite3.Row cur = con.cursor() # NB! single is enough for now, we might require multiple later -@app.get("/new_session") +@app.get("/new_session", responses={503: {"description": "Unable to initiate session"}}) async def new_session(): """Start a new session""" # add session to the database @@ -36,7 +38,7 @@ async def new_session(): if i < tries - 1 and str(e) == "UNIQUE constraint failed: sessions.cookie": continue elif str(e) == "UNIQUE constraint failed: sessions.cookie": - return {"cookie": "error"} + return JSONResponse(status_code=503) else: raise break @@ -45,7 +47,13 @@ async def new_session(): return {"cookie": cookie} -@app.get("/next_picture/{cookie}") +@app.get( + "/next_picture/{cookie}", + responses={ + 204: {"description": "All available images have been appraised"}, + 409: {"description": "Uninitiated session"}, + }, +) async def next_picture(cookie: str): """Request new picture to rate.""" # check if the cookie is valid @@ -58,10 +66,7 @@ async def next_picture(cookie: str): ) sessionid = cur.fetchone() if sessionid is None: - return { - "picture_id": -2, - "picture_uri": "/path/to/new/session/placeholder", # FIXME[2] - } # Q: do we return something specific, or just use convention here? + return JSONResponse(status_code=409) # take not rated picture from the database # do not insert anything in the database yet @@ -88,13 +93,16 @@ async def next_picture(cookie: str): return {"picture_id": r["imgid"], "picture_uri": r["resizedpath"]} else: # All available pics have been voted for by this sessionid - return { - "picture_id": -1, - "picture_uri": "/path/to/you/are/done/placeholder", # FIXME[1] - } # Q: do we return something specific, or just use a convention here? + return JSONResponse(status_code=204) -@app.get("/rate_picture/{cookie}/{picture_id}/{mark}") +@app.get( + "/rate_picture/{cookie}/{picture_id}/{mark}", + responses={ + 406: {"description": "Already appraised"}, + 409: {"description": "Uninitiated session"}, + }, +) async def rate_picture(cookie: str, picture_id: int, mark: int): """Submit a rating for the picture""" # check if the cookie is valid @@ -107,9 +115,7 @@ async def rate_picture(cookie: str, picture_id: int, mark: int): ) sessionid = cur.fetchone() if sessionid is None: - return { - "status": "failure" # FIXME[2] - } # Q: do we return something specific, or just use convention here? + return JSONResponse(status_code=409) # add new mark to the session table try: @@ -122,6 +128,6 @@ async def rate_picture(cookie: str, picture_id: int, mark: int): con.commit() except sqlite3.IntegrityError as e: if str(e) == "UNIQUE constraint failed: marks.imgid, marks.sessionid": - return {"status": "already rated"} + return JSONResponse(status_code=406) return {"status": "success"}