From ff7653b3fe4b3e95826a6d8391e3012171472e22 Mon Sep 17 00:00:00 2001 From: hasslesstech Date: Mon, 19 May 2025 19:02:53 +0300 Subject: [PATCH] improve error handling, add route for getting list of all passes --- backend/src/main.py | 92 +++++++++++++++++++++++++++++++++------------ 1 file changed, 69 insertions(+), 23 deletions(-) diff --git a/backend/src/main.py b/backend/src/main.py index 450dc85..1a4ad87 100644 --- a/backend/src/main.py +++ b/backend/src/main.py @@ -1,6 +1,7 @@ from flask import Flask import psycopg2 as psql from os import environ as env +import datetime app = Flask(__name__) @@ -14,13 +15,22 @@ db_params = { db = psql.connect(**db_params) -@app.route("/movies") +@app.route("/movies", methods = ['GET']) def movies(): c = db.cursor() + fields = ['uuid', + 'name', + 'scheduled_datetime', + 'movie_details', + 'image_url', + 'max_passes'] + try: - c.execute('SELECT uuid, name, scheduled_datetime, movie_details, image_url, max_passes FROM movies') - except Exception: + c.execute(f"SELECT {','.join(fields)} FROM public.movie") + except Exception as e: + c.close() + print(e) return { "error": "Failed to list movies", "result": None @@ -31,25 +41,28 @@ def movies(): return { "error": "", - "result": [ - { - "uuid": i[0], - "name": i[1], - "scheduled_datetime": i[2].strftime("%Y-%m-%d %H:%M:%S"), - "movie_details": i[3], - "image_url": i[4], - "max_passes": i[5] - } for i in res - ] + "result": [{fields[i]: v + if type(v) != datetime.datetime + else v.strftime("%Y-%m-%d %H:%M:%S") + for i, v in enumerate(r)} + for r in res] } -@app.route("/movie/") +@app.route("/movie/", methods = ['GET']) def movie_byid(movie_uuid): c = db.cursor() + fields = ['name', + 'scheduled_datetime', + 'movie_details', + 'image_url', + 'max_passes'] + try: - c.execute(f"SELECT name, scheduled_datetime, movie_details, image_url, max_passes FROM movies WHERE uuid='{movie_uuid}'") - except Exception: + c.execute(f"SELECT {','.join(fields)} FROM public.movie WHERE uuid='{movie_uuid}'") + except Exception as e: + c.close() + print(e) return { "error": "Failed to search for a movie", "result": None @@ -61,16 +74,49 @@ def movie_byid(movie_uuid): if res: return { "error": "", - "result": { - "name": res[0], - "scheduled_datetime": res[1].strftime("%Y-%m-%d %H:%M:%S"), - "movie_details": res[2], - "image_url": res[3], - "max_passes": res[4] - } + "result": {fields[i]: v + if type(v) != datetime.datetime + else v.strftime("%Y-%m-%d %H:%M:%S") + for i, v in enumerate(res)} } else: return { "error": f"No movie with uuid={movie_uuid} has been found", "result": None }, 404 + +@app.route("/passes", methods = ['GET']) +def passes(): + c = db.cursor() + + fields = ["uuid", + "movie_uuid", + "user_first", + "user_last", + "user_email", + "pass_type", + "pass_price", + "pass_requested_at", + "payment_received", + "payment_received_at"] + + try: + c.execute(f"SELECT {','.join(fields)} FROM public.pass") + except Exception as e: + c.close() + print(e) + return { + "error": "Failed to list out passes", + "result": None + } + + res = c.fetchall() + c.close() + + return { + "error": "", + "result": [{fields[i]: v + if type(v) != datetime.datetime + else v.strftime("%Y-%m-%d %H:%M:%S") + for i, v in enumerate(r)} + for r in res]}