From b107add5afb23a710e3297249e314eeee6bf0563 Mon Sep 17 00:00:00 2001 From: altaf-creator Date: Sat, 29 Nov 2025 12:48:14 +0700 Subject: a lot of progress, frontend, a lot of new backend methods --- backend/main.py | 142 ++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 127 insertions(+), 15 deletions(-) (limited to 'backend/main.py') diff --git a/backend/main.py b/backend/main.py index 8b8a3d1..7593f23 100644 --- a/backend/main.py +++ b/backend/main.py @@ -5,8 +5,9 @@ from typing import Annotated import datetime from pydantic import BaseModel from apscheduler.schedulers.background import BackgroundScheduler -import firebase_admin -from firebase_admin import credentials +import secrets +from enum import Enum +from fastapi.responses import PlainTextResponse app = fastapi.FastAPI(title="Victoria Hall LaundryWeb", description="LaundryWeb Backend API", version="0.1") conn = sqlite3.connect("db.db", check_same_thread=False) @@ -15,8 +16,6 @@ cursor = conn.cursor() scheduler = BackgroundScheduler() scheduler.start() -firebase_app = firebase_admin.initialize_app(credentials.Certificate("serviceAccountKey.json")) - origins = [ "http://localhost", "http://localhost:998", @@ -24,6 +23,7 @@ origins = [ "http://127.0.0.1", "http://127.0.0.1:998", "http://127.0.0.1:5173", + "https://laundryweb.altafcreator.com" ] app.add_middleware( @@ -37,12 +37,12 @@ app.add_middleware( cursor.execute(""" CREATE TABLE IF NOT EXISTS timers ( timer_id INTEGER PRIMARY KEY, - user_id VARCHAR(16) NOT NULL, + user_id VARCHAR(64) NOT NULL, start_time TEXT NOT NULL, duration INT NOT NULL, block INT NOT NULL, machine INT NOT NULL, - status TEXT NOT NULL CHECK(status IN ('Running', 'Finished')) + status TEXT NOT NULL CHECK(status IN ('RUNNING', 'FINISHED')) ); """) # block is either 1 or 2, machine (1-4), odd is dryer, even is machine. @@ -53,33 +53,145 @@ class RequestData(BaseModel): machine: int +class BlockRequestData(BaseModel): + block: int + + +class Status(Enum): + EMPTY = 0, + FINISHED = 1, + RUNNING = 2, + OUTOFSERVICE = 3, + + +machine_status = [[Status.EMPTY.name, Status.EMPTY.name, Status.EMPTY.name, Status.EMPTY.name], + [Status.EMPTY.name, Status.EMPTY.name, Status.EMPTY.name, Status.EMPTY.name]] +machine_times = [[None, None, None, None], + [None, None, None, None]] +machine_durations = [[None, None, None, None], + [None, None, None, None]] + + def reminder_timer_finished(timer_id): + print("timer almost finished", timer_id) + end_date = datetime.datetime.now() + datetime.timedelta(seconds=5) + scheduler.add_job(final_timer_finished, 'date', run_date=end_date, id=timer_id, args=[timer_id]) + cursor.execute(f"SELECT * FROM timers WHERE timer_id = '{timer_id}'") + out = cursor.fetchall() + for row in out: + machine_status[row[3] - 1][row[4] - 1] = Status.FINISHED.name + + +def final_timer_finished(timer_id): print("timer finished!1", timer_id) + cursor.execute(f"SELECT * FROM timers WHERE timer_id = '{timer_id}'") + out = cursor.fetchall() + for row in out: + machine_status[row[3] - 1][row[4] - 1] = Status.EMPTY.name + machine_times[row[3] - 1][row[4] - 1] = None + machine_durations[row[3] - 1][row[4] - 1] = None cursor.execute(f"DELETE FROM timers WHERE timer_id = {timer_id}") + conn.commit() -def final_timer_finished(): - pass +def create_session(response: fastapi.Response): + cookie = secrets.token_hex(32) + response.set_cookie(key="session_key", value=cookie) + return cookie -@app.post("/start") -def start_new_timer(data: RequestData, session_key: Annotated[str | None, fastapi.Cookie()] = None): - if session_key: + +# --- starting new timer +@app.post("/start", response_class=PlainTextResponse) +async def start_new_timer(data: RequestData, response: fastapi.Response, session_key: Annotated[str | None, fastapi.Cookie()] = None): + now = datetime.datetime.now() + try: + if not session_key: + print("no session key, creating.") + session_key = create_session(response) + except Exception as exception: + print("err @ key creation //", exception) + return "something went wrong during session key creation" + + try: print("session key valid", session_key) cursor.execute(f""" INSERT INTO timers (user_id, start_time, duration, block, machine, status) - VALUES ('{session_key}', '{datetime.datetime.now().isoformat()}', {data.block}, {data.machine}, {data.duration}, 'Running') + VALUES ('{session_key}', '{now.isoformat()}', {data.block}, {data.machine}, {data.duration * 30}, 'RUNNING') """) conn.commit() - cursor.execute(f"SELECT * FROM timers WHERE user_id = {session_key}") + cursor.execute("SELECT * FROM timers;") out = cursor.fetchall() for row in out: print(row) - end_date = datetime.datetime.now() + datetime.timedelta(seconds=data.duration) + end_date = now + datetime.timedelta(minutes=(data.duration * 30) - 5) timer_id = str(out[len(out) - 1][0]) print("timer id", timer_id) + except Exception as exception: + print("err @ sql stuff //", exception) + return "something went wrong during sql stuff" + try: scheduler.add_job(reminder_timer_finished, 'date', run_date=end_date, id=timer_id, args=[timer_id]) + except Exception as exception: + print("err @ scheduler //", exception) + return "something went wrong during scheduler stuff" + + try: + machine_status[data.block - 1][data.machine - 1] = Status.RUNNING.name + machine_times[data.block - 1][data.machine - 1] = now.isoformat() + machine_durations[data.block - 1][data.machine - 1] = data.duration * 30 + except Exception as exception: + print("err @ machine_status //", exception) + return "something went wrong during machine_status setting somehow" + + return "all good bro timer started" + + +# --- check whether user has laundry or not +@app.post("/check", response_class=PlainTextResponse) +def check_status(session_key: Annotated[str | None, fastapi.Cookie()] = None): + cursor.execute(f"SELECT * FROM timers WHERE user_id = '{session_key}'") + out = cursor.fetchall() + for row in out: + print(row) + + if len(out) > 0: + return "you got laundry" + else: + return "no got laundry" + + +# --- fetch machine status for block +@app.post("/status") +def get_machine_status(data: BlockRequestData): + block_idx = data.block - 1 + return [machine_status[block_idx], machine_times[block_idx], machine_durations[block_idx]] + + +# --- get laundr(y/ies) information of user +@app.post("/laundry") +def get_laundry_info(session_key: Annotated[str | None, fastapi.Cookie()] = None): + if session_key: + result = [] + + cursor.execute(f"SELECT * FROM timers WHERE user_id = '{session_key}'") + out = cursor.fetchall() + for row in out: + curr_timer = { + "duration": 0, + "start_time": 0, + "machine": 0, + "status": "RUNNING", + } + curr_timer["duration"] = row[5] + curr_timer["start_time"] = row[2] + curr_timer["machine"] = row[4] + curr_timer["status"] = row[6] + + result.append(curr_timer) + + return result else: - print("no session key") + return "you got no session key cookie how am i supposed to identify you" -- cgit v1.2.3