improve error handling, add route for getting list of all passes

This commit is contained in:
ІО-23 Шмуляр Олег 2025-05-19 19:02:53 +03:00
parent 28d7c46eec
commit ff7653b3fe
1 changed files with 69 additions and 23 deletions

View File

@ -1,6 +1,7 @@
from flask import Flask from flask import Flask
import psycopg2 as psql import psycopg2 as psql
from os import environ as env from os import environ as env
import datetime
app = Flask(__name__) app = Flask(__name__)
@ -14,13 +15,22 @@ db_params = {
db = psql.connect(**db_params) db = psql.connect(**db_params)
@app.route("/movies") @app.route("/movies", methods = ['GET'])
def movies(): def movies():
c = db.cursor() c = db.cursor()
fields = ['uuid',
'name',
'scheduled_datetime',
'movie_details',
'image_url',
'max_passes']
try: try:
c.execute('SELECT uuid, name, scheduled_datetime, movie_details, image_url, max_passes FROM movies') c.execute(f"SELECT {','.join(fields)} FROM public.movie")
except Exception: except Exception as e:
c.close()
print(e)
return { return {
"error": "Failed to list movies", "error": "Failed to list movies",
"result": None "result": None
@ -31,25 +41,28 @@ def movies():
return { return {
"error": "", "error": "",
"result": [ "result": [{fields[i]: v
{ if type(v) != datetime.datetime
"uuid": i[0], else v.strftime("%Y-%m-%d %H:%M:%S")
"name": i[1], for i, v in enumerate(r)}
"scheduled_datetime": i[2].strftime("%Y-%m-%d %H:%M:%S"), for r in res]
"movie_details": i[3],
"image_url": i[4],
"max_passes": i[5]
} for i in res
]
} }
@app.route("/movie/<movie_uuid>") @app.route("/movie/<movie_uuid>", methods = ['GET'])
def movie_byid(movie_uuid): def movie_byid(movie_uuid):
c = db.cursor() c = db.cursor()
fields = ['name',
'scheduled_datetime',
'movie_details',
'image_url',
'max_passes']
try: try:
c.execute(f"SELECT name, scheduled_datetime, movie_details, image_url, max_passes FROM movies WHERE uuid='{movie_uuid}'") c.execute(f"SELECT {','.join(fields)} FROM public.movie WHERE uuid='{movie_uuid}'")
except Exception: except Exception as e:
c.close()
print(e)
return { return {
"error": "Failed to search for a movie", "error": "Failed to search for a movie",
"result": None "result": None
@ -61,16 +74,49 @@ def movie_byid(movie_uuid):
if res: if res:
return { return {
"error": "", "error": "",
"result": { "result": {fields[i]: v
"name": res[0], if type(v) != datetime.datetime
"scheduled_datetime": res[1].strftime("%Y-%m-%d %H:%M:%S"), else v.strftime("%Y-%m-%d %H:%M:%S")
"movie_details": res[2], for i, v in enumerate(res)}
"image_url": res[3],
"max_passes": res[4]
}
} }
else: else:
return { return {
"error": f"No movie with uuid={movie_uuid} has been found", "error": f"No movie with uuid={movie_uuid} has been found",
"result": None "result": None
}, 404 }, 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]}