diff --git a/app/core/config.py b/app/core/config.py index 6aed5e95bbf84aa6033c1e13f1693d42f3f566b5..c448ac0d11c7588e6421b0b0f788f1834e39e6d8 100644 --- a/app/core/config.py +++ b/app/core/config.py @@ -9,11 +9,7 @@ class Settings(BaseSettings): database_host: str database_name: str secret_key: str - debug: bool = True - - @property - def database_url(self) -> str: - return f"mysql+pymysql://{self.database_username}:{self.database_password}@{self.database_host}/{self.database_name}" + debug: bool = True # Lowercase to match Python conventions model_config = SettingsConfigDict( env_file=str(Path(__file__).resolve().parent.parent / ".env"), diff --git a/app/frontend/components/login.py b/app/frontend/components/login.py index a52331bec7f4d148e3da874287a4492f4e2e5c80..02f559e0b3036b8e1a11763e16482d88688c43a6 100644 --- a/app/frontend/components/login.py +++ b/app/frontend/components/login.py @@ -3,9 +3,14 @@ from ttkbootstrap.constants import * from tkinter import messagebox import requests # Import requests for API communication + def login_frame(parent, switch_func, api_url): # Added api_url parameter frame = tb.Frame(parent) + def login(): + email = entry_email.get() + password = entry_password.get() + def login(): email = entry_email.get() password = entry_password.get() @@ -15,10 +20,9 @@ def login_frame(parent, switch_func, api_url): # Added api_url parameter return # Sending login request to backend - response = requests.post(f"{api_url}/auth/login", json={ - "email": email, - "password": password - }) + response = requests.post( + f"{api_url}/auth/login", json={"email": email, "password": password} + ) try: response_data = response.json() @@ -26,24 +30,38 @@ def login_frame(parent, switch_func, api_url): # Added api_url parameter messagebox.showinfo("Login Successful", f"Welcome back, {email}!") # TODO: Implement navigation after login (e.g., open dashboard) else: - messagebox.showerror("Login Failed", response_data.get("detail", "Invalid credentials")) + messagebox.showerror( + "Login Failed", response_data.get("detail", "Invalid credentials") + ) except requests.exceptions.JSONDecodeError: messagebox.showerror("Login Failed", "Server returned an invalid response.") tb.Label(frame, text="Login", font=("Helvetica", 18, "bold")).pack(pady=10) + tb.Label(frame, text="Email:").pack(pady=5) + entry_email = tb.Entry(frame, bootstyle="info") + entry_email.pack(pady=5) tb.Label(frame, text="Email:").pack(pady=5) entry_email = tb.Entry(frame, bootstyle="info") entry_email.pack(pady=5) + tb.Label(frame, text="Password:").pack(pady=5) + entry_password = tb.Entry(frame, bootstyle="info", show="*") + entry_password.pack(pady=5) tb.Label(frame, text="Password:").pack(pady=5) entry_password = tb.Entry(frame, bootstyle="info", show="*") entry_password.pack(pady=5) + btn_login = tb.Button(frame, text="Login", bootstyle="primary", command=login) + btn_login.pack(pady=15) btn_login = tb.Button(frame, text="Login", bootstyle="primary", command=login) btn_login.pack(pady=15) - tb.Button(frame, text="Don't have an account? Register", bootstyle="link", - command=lambda: switch_func("register")).pack() + tb.Button( + frame, + text="Don't have an account? Register", + bootstyle="link", + command=lambda: switch_func("register"), + ).pack() return frame diff --git a/app/frontend/components/register.py b/app/frontend/components/register.py index 4f0b034660827e3892cdb629a70afac4467639d3..eda5e9db03519b539c97d59e9615ab5e131d42a8 100644 --- a/app/frontend/components/register.py +++ b/app/frontend/components/register.py @@ -3,6 +3,7 @@ from ttkbootstrap.constants import * from tkinter import messagebox import requests # Import requests for API communication +<<<<<<< HEAD def register_frame(parent, switch_func, api_url): # Added api_url parameter frame = tb.Frame(parent) @@ -66,5 +67,90 @@ def register_frame(parent, switch_func, api_url): # Added api_url parameter tb.Button(frame, text="Already have an account? Login", bootstyle="link", command=lambda: switch_func("login")).pack() +======= + +def register_frame(parent, switch_func, api_url): # Added api_url parameter + frame = tb.Frame(parent) + + def register(): + username = entry_username.get() + email = entry_email.get() + phone_number = entry_phone.get() + password = entry_password.get() + confirm_password = entry_confirm_password.get() + + if ( + not username + or not email + or not phone_number + or not password + or not confirm_password + ): + messagebox.showwarning("Input Error", "All fields are required!") + return + + if password != confirm_password: + messagebox.showerror("Password Error", "Passwords do not match!") + return + + # Sending registration data to backend + response = requests.post( + f"{api_url}/auth/signup", + json={ + "username": username, + "email": email, + "phone_number": phone_number, + "password": password, + }, + ) + + try: + response_data = response.json() + if response.status_code == 200: + messagebox.showinfo("Registration Successful", f"Welcome, {username}!") + switch_func("login") # Switch to login after successful registration + else: + messagebox.showerror( + "Registration Failed", response_data.get("detail", "Unknown error") + ) + except requests.exceptions.JSONDecodeError: + messagebox.showerror( + "Registration Failed", f"Server returned an invalid response." + ) + + tb.Label(frame, text="Register", font=("Helvetica", 18, "bold")).pack(pady=10) + + tb.Label(frame, text="Username:").pack(pady=5) + entry_username = tb.Entry(frame, bootstyle="info") + entry_username.pack(pady=5) + + tb.Label(frame, text="Email:").pack(pady=5) + entry_email = tb.Entry(frame, bootstyle="info") + entry_email.pack(pady=5) + + tb.Label(frame, text="Phone Number:").pack(pady=5) + entry_phone = tb.Entry(frame, bootstyle="info") + entry_phone.pack(pady=5) + + tb.Label(frame, text="Password:").pack(pady=5) + entry_password = tb.Entry(frame, bootstyle="info", show="*") + entry_password.pack(pady=5) + + tb.Label(frame, text="Confirm Password:").pack(pady=5) + entry_confirm_password = tb.Entry(frame, bootstyle="info", show="*") + entry_confirm_password.pack(pady=5) + + btn_register = tb.Button( + frame, text="Register", bootstyle="success", command=register + ) + btn_register.pack(pady=15) + + tb.Button( + frame, + text="Already have an account? Login", + bootstyle="link", + command=lambda: switch_func("login"), + ).pack() +>>>>>>> 510d2b0 (resolve merge) return frame diff --git a/app/frontend/main.py b/app/frontend/main.py index 680f7df1c8f7f934d62dd2a665599829479cf1b5..eb1b435db1c7121097478cba72550a1bfc204745 100644 --- a/app/frontend/main.py +++ b/app/frontend/main.py @@ -1,10 +1,13 @@ import ttkbootstrap as tb from components.login import login_frame from components.register import register_frame +from components.login import login_frame +from components.register import register_frame # Backend API URL API_URL = "http://127.0.0.1:8000" + # Function to switch between login and register def switch_frame(frame_name): if frame_name == "login": @@ -12,8 +15,10 @@ def switch_frame(frame_name): elif frame_name == "register": register.tkraise() + # Create main window root = tb.Window(themename="superhero") +root = tb.Window(themename="superhero") root.title("Shopping App") root.geometry("900x800") @@ -21,11 +26,19 @@ root.geometry("900x800") login = login_frame(root, switch_frame, API_URL) register = register_frame(root, switch_frame, API_URL) +for frame in (login, register): + frame.place(relx=0, rely=0.2, relwidth=1, relheight=1) +# Create Frames +login = login_frame(root, switch_frame, API_URL) +register = register_frame(root, switch_frame, API_URL) + for frame in (login, register): frame.place(relx=0, rely=0.2, relwidth=1, relheight=1) # Show Login Frame First switch_frame("login") +# Show Login Frame First +switch_frame("login") # Run the GUI root.mainloop()