124 lines
3.4 KiB
Python
Raw Normal View History

2023-10-15 13:05:44 +05:30
from os import mkdir, path
2023-10-15 12:33:48 +05:30
from flask import Flask, request, send_file, abort, Response
from werkzeug.datastructures import ImmutableMultiDict
2023-10-15 13:05:44 +05:30
import appdirs
2023-10-15 14:38:32 +05:30
import json
from data_handler import DataHandler
app: Flask = Flask(__name__)
2023-10-15 13:05:44 +05:30
def handle_first_launched():
"""
Makes sure everything is initialized correctly
"""
folder_path: str = appdirs.user_data_dir()
folder_path = path.join(folder_path, "Unnamed_Password_Manager")
2023-10-15 13:05:44 +05:30
if not path.exists(folder_path):
mkdir(folder_path)
@app.get("/")
@app.get("/<url_path>")
def handle_get(url_path: str = "index.html") -> Response:
"""
Handle all get requests that are made.
"""
2023-10-15 13:05:44 +05:30
handle_first_launched()
requested_file_path: str = \
path.abspath(path.join(path.curdir, "..", "frontend", url_path))
response: Response = send_file(requested_file_path)
response.status = 200
if path.isfile(requested_file_path):
return send_file(requested_file_path)
abort(404)
2023-10-15 12:33:48 +05:30
class QueryHandler:
"""
This is the bridge between the frontend and DataHandler class
"""
2023-10-15 14:38:32 +05:30
__data_handler: DataHandler| None = None
2023-10-15 12:33:48 +05:30
@staticmethod
@app.post("/login")
def login() -> Response:
"""
Logs the user in
"""
data: ImmutableMultiDict[str, str] = request.form
if "user_name" not in data:
return Response(
"user_name not given",
400,
content_type="text/plain"
)
if "password" not in data:
return Response(
"password is not given",
400,
content_type="text/plain"
)
try:
QueryHandler.__data_handler = \
DataHandler(data["user_name"], data["password"])
except ValueError as value_error:
return Response(
str(value_error),
403,
content_type="text/plain"
)
return Response(status=200)
2023-10-15 13:17:00 +05:30
@staticmethod
@app.post("/add_user")
def add_user() -> Response:
"""
Adds a new user
"""
data: ImmutableMultiDict[str, str] = request.form
if "user_name" not in data:
return Response(
"user_name not given",
400,
content_type="text/plain"
)
if "password" not in data:
return Response(
"password is not given",
400,
content_type="text/plain"
)
try:
DataHandler.create_user(data["user_name"], data["password"])
except ValueError as value_error:
return Response(
str(value_error),
403,
content_type="text/plain"
)
return Response(status=200)
2023-10-15 14:38:32 +05:30
@staticmethod
@app.post("/get_data")
def get_data() -> Response:
"""
Return all user data
"""
if QueryHandler.__data_handler is None:
return Response(
"Not logged in",
403,
content_type="text/plain"
)
return Response(
json.dumps(QueryHandler.__data_handler.get_data()),
200,
content_type="application/json"
)