diff --git a/messenger_gui/app/http/__init__.py b/messenger_gui/app/http/__init__.py new file mode 100644 index 0000000..a8938f4 --- /dev/null +++ b/messenger_gui/app/http/__init__.py @@ -0,0 +1,3 @@ +from .request_builder import RequestBuilder + +request_builder = RequestBuilder() diff --git a/messenger_gui/app/http/request_builder.py b/messenger_gui/app/http/request_builder.py new file mode 100644 index 0000000..ad68895 --- /dev/null +++ b/messenger_gui/app/http/request_builder.py @@ -0,0 +1,28 @@ +from .request_handler import _HttpRequestHandler + + +class RequestBuilder: + def __init__(self): + self.url = "" + self.headers = {} + self.body = None + self.method = "GET" + + def set_url(self, url): + self.url = url + return self + + def set_headers(self, headers): + self.headers = headers + return self + + def set_body(self, body): + self.body = body + return self + + def set_method(self, method): + self.method = method + return self + + def build(self): + return _HttpRequestHandler(self.url) diff --git a/messenger_gui/app/http/request_handler.py b/messenger_gui/app/http/request_handler.py new file mode 100644 index 0000000..d1a4876 --- /dev/null +++ b/messenger_gui/app/http/request_handler.py @@ -0,0 +1,11 @@ +import requests + + +class _HttpRequestHandler: + def __init__(self, base_url): + self.base_url = base_url + + def make_request(self, method, endpoint, params=None, data=None, headers=None): + url = f"{self.base_url}/{endpoint}" + response = requests.request(method, url, params=params, data=data, headers=headers) + return response diff --git a/messenger_gui/app/models/login.py b/messenger_gui/app/models/http_models/__init__.py similarity index 100% rename from messenger_gui/app/models/login.py rename to messenger_gui/app/models/http_models/__init__.py diff --git a/messenger_gui/app/models/signup.py b/messenger_gui/app/models/view_models/__init__.py similarity index 100% rename from messenger_gui/app/models/signup.py rename to messenger_gui/app/models/view_models/__init__.py diff --git a/messenger_gui/app/models/view_models/login.py b/messenger_gui/app/models/view_models/login.py new file mode 100644 index 0000000..e69de29 diff --git a/messenger_gui/app/models/view_models/signup.py b/messenger_gui/app/models/view_models/signup.py new file mode 100644 index 0000000..7ef7530 --- /dev/null +++ b/messenger_gui/app/models/view_models/signup.py @@ -0,0 +1,33 @@ +import re + + +class SignupModel: + def __init__(self, username:str, password:str, email:str): + self.username = username + self.password = password + self.email = email + + def validate(self): + errors = [] + + # Check if username, password, and email are provided + if not self.username: + errors.append("Username is required.") + if len(self.username) < 8: + errors.append("Username must be at least 8 characters.") + if not self.password: + errors.append("Password is required.") + if len(self.password) < 8: + errors.append("Password must be at least 8 characters.") + if not self.email: + errors.append("Email is required.") + + email_pattern = re.compile(r"[^@]+@[^@]+\.[^@]+") + if not email_pattern.match(self.email): + errors.append("Invalid email format.") + + if errors: + return False, errors + + # If all validations pass, return True + return True, [] diff --git a/messenger_gui/app/views/signup.py b/messenger_gui/app/views/signup.py index 87658ac..7a73b37 100644 --- a/messenger_gui/app/views/signup.py +++ b/messenger_gui/app/views/signup.py @@ -1,6 +1,6 @@ -import tkinter import tkinter as tk -import re +from app.models.view_models.signup import SignupModel + class SignupView(tk.Frame): def __init__(self, master=None): @@ -11,68 +11,58 @@ class SignupView(tk.Frame): # Create a frame to hold the entry fields and labels form_frame = tk.Frame(self) + # Error label + self.error_var = tk.StringVar() # Variable to store error message + self.error_label = tk.Label(form_frame, textvariable=self.error_var, fg="red") + self.error_label.grid(row=0, column=0, pady=5, columnspan=2) # Span columns for full width + + # Left frame for labels + label_frame = tk.Frame(form_frame) + label_frame.grid(row=1, column=0, pady=5, padx=5, sticky="w") + + # Right frame for entry widgets + entry_frame = tk.Frame(form_frame) + entry_frame.grid(row=1, column=1, pady=5, padx=5, sticky="e") + # Username Label and Entry - self.username_label = tk.Label(form_frame, text="Username:") - self.username_label.grid(row=0, column=0, pady=5) - self.username_entry = tk.Entry(form_frame) - self.username_entry.grid(row=0, column=1, pady=5) - self.username_error_var = tk.StringVar() # Variable to store error message - self.username_error_label = tk.Label(form_frame, textvariable=self.username_error_var, fg="red") + self.username_label = tk.Label(label_frame, text="Username:") + self.username_label.grid(row=0, column=0, pady=5, sticky="w") + + self.username_entry = tk.Entry(entry_frame) + self.username_entry.grid(row=0, column=0, pady=5, sticky="e") # Email Label and Entry - self.email_label = tk.Label(form_frame, text="Email:") - self.email_label.grid(row=1, column=0, pady=5) - self.email_entry = tk.Entry(form_frame) - self.email_entry.grid(row=1, column=1, pady=5) - self.email_error_var = tk.StringVar() # Variable to store error message - self.email_error_label = tk.Label(form_frame, textvariable=self.email_error_var, fg="red") + self.email_label = tk.Label(label_frame, text="Email:") + self.email_label.grid(row=1, column=0, pady=5, sticky="w") + + self.email_entry = tk.Entry(entry_frame) + self.email_entry.grid(row=1, column=0, pady=5, sticky="e") # Password Label and Entry - self.password_label = tk.Label(form_frame, text="Password:") - self.password_label.grid(row=2, column=0, pady=5) - self.password_entry = tk.Entry(form_frame, show="*") # Use show="*" to hide password characters - self.password_entry.grid(row=2, column=1, pady=5) - self.password_error_var = tk.StringVar() # Variable to store error message - self.password_error_label = tk.Label(form_frame, textvariable=self.password_error_var, fg="red") + self.password_label = tk.Label(label_frame, text="Password:") + self.password_label.grid(row=2, column=0, pady=5, sticky="w") + + self.password_entry = tk.Entry(entry_frame, show="*") + self.password_entry.grid(row=2, column=0, pady=5, sticky="e") # Signup Button self.signup_button = tk.Button(form_frame, text="Signup", command=self.on_signup) - self.signup_button.grid(row=3, column=1, pady=10) - self.clear_errors() + self.signup_button.grid(row=2, column=0, columnspan=2, pady=10) # Span columns for full width form_frame.pack() - def on_signup(self): - self.clear_errors() + def on_signup(self): # Retrieve values from entry fields username = self.username_entry.get() email = self.email_entry.get() password = self.password_entry.get() - # Validate username length - if len(username) < 8: - self.username_error_var.set("Username must be at least 8 characters.") - self.username_error_label.grid(row=0, column=3, pady=5, sticky='w') + model = SignupModel(username=username, email=email, password=password) + validation, errors = model.validate() - # Validate email format using a simple regex - email_pattern = re.compile(r"[^@]+@[^@]+\.[^@]+") - if not email_pattern.match(email): - self.email_error_var.set("Invalid email format.") - self.email_error_label.grid(row=1, column=3, pady=5, sticky='w') - - # Validate password length and presence of numbers - if len(password) < 8: - self.password_error_var.set("Password must be at least 8 characters") - self.password_error_label.grid(row=2, column=3, pady=5, sticky='w') + if not validation: + self.error_var.set(errors[0]) + self.error_label.grid(row=0, column=0, pady=5) # Print or handle the values as needed print(f"Username: {username}, Email: {email}, Password: {password}") - - def clear_errors(self): - # Clear all error messages - self.username_error_var.set("") - self.username_error_label.grid_forget() - self.email_error_var.set("") - self.email_error_label.grid_forget() - self.password_error_var.set("") - self.password_error_label.grid_forget()