add endpoint for queueing passes, add PassValidator and PassQueue

This commit is contained in:
ІО-23 Шмуляр Олег 2025-05-19 20:17:55 +03:00
parent ff7653b3fe
commit 2c9ebaa1cc
1 changed files with 91 additions and 1 deletions

View File

@ -1,7 +1,10 @@
from flask import Flask
from flask import Flask, request
import psycopg2 as psql
from os import environ as env
import datetime
import time
import threading
import uuid
app = Flask(__name__)
@ -15,6 +18,34 @@ db_params = {
db = psql.connect(**db_params)
class PassQueue:
def __init__(self):
self.queue = []
def start(self):
while True:
if not self.queue:
time.sleep(1)
continue
p = self.queue.pop(0)
c = db.cursor()
try:
c.execute("BEGIN")
c.execute(f"INSERT INTO public.pass (uuid, movie_uuid, user_first, user_last, user_email, pass_type, pass_price)"
f"VALUES ('{uuid.uuid4().hex}', '{p.movie_uuid}', '{p.first}', '{p.last}', '{p.email}', {p.type}, {p.price})")
c.execute("COMMIT")
db.commit()
except Exception as e:
print(e)
c.execute("ROLLBACK")
db.rollback()
pq = PassQueue()
pq_thread = threading.Thread(target = pq.start, args = [])
pq_thread.start()
@app.route("/movies", methods = ['GET'])
def movies():
c = db.cursor()
@ -120,3 +151,62 @@ def passes():
else v.strftime("%Y-%m-%d %H:%M:%S")
for i, v in enumerate(r)}
for r in res]}
class PassValidator:
def __init__(self):
self.first = None
self.last = None
self.email = None
self.type = None
self.price = None
self.movie_uuid = None
def validate(self):
if not self.first:
return "First name missing"
elif not self.last:
return "Last name missing"
elif not self.email:
return "Email missing"
elif not self.type:
return "Pass type missing"
elif not self.price:
return "Pass price missing"
elif not self.movie_uuid:
return "Movie uuid missing"
def queue(self):
pq.queue.append(self)
def fill_pass_from_form(p, f):
print(f)
def fill_pass_from_json(p, j):
fields = ("first",
"last",
"email",
"type",
"price",
"movie_uuid")
for i in fields:
exec(f"p.{i} = j.get('{i}')")
@app.route("/apply_for_pass", methods = ['POST'])
def apply_for_pass():
p = PassValidator()
if request.form:
fill_pass_from_form(p, request.form)
elif request.is_json:
fill_pass_from_json(p, request.json)
else:
return {"error": "only form and json interfaces are supported", "result": None}, 403
v = p.validate()
if not v:
p.queue()
return {"error": None, "result": "OK"}
else:
return {"error": v, "result": None}