From 3e14132a7cdeaa1807b4819187ffe33f7c1cb14b Mon Sep 17 00:00:00 2001
From: James2Tulloch <146088090+James2Tulloch@users.noreply.github.com>
Date: Fri, 21 Feb 2025 10:04:32 +0000
Subject: [PATCH] User account functionality

---
 django_project/myapp/account.html        |  14 +++
 django_project/myapp/delete_account.html |  16 ++++
 django_project/myapp/login.html          |  21 +++++
 django_project/myapp/logout.html         |  21 +++++
 django_project/myapp/register.html       |  21 +++++
 django_project/myapp/views.py            | 115 +++++++++++++++++++----
 6 files changed, 189 insertions(+), 19 deletions(-)
 create mode 100644 django_project/myapp/account.html
 create mode 100644 django_project/myapp/delete_account.html
 create mode 100644 django_project/myapp/login.html
 create mode 100644 django_project/myapp/logout.html
 create mode 100644 django_project/myapp/register.html

diff --git a/django_project/myapp/account.html b/django_project/myapp/account.html
new file mode 100644
index 0000000..df2a921
--- /dev/null
+++ b/django_project/myapp/account.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>Account</title>
+</head>
+<body>
+    <h1>Account Page</h1>
+    <p>Username: {{ user.username }}</p>
+    <p>Email: {{ user.email }}</p>
+    <p><a href="{% url 'delete_account' %}">Delete Account</a></p>
+    <p><a href="{% url 'logout' %}">Logout</a></p>
+</body>
+</html>
+
diff --git a/django_project/myapp/delete_account.html b/django_project/myapp/delete_account.html
new file mode 100644
index 0000000..2694df1
--- /dev/null
+++ b/django_project/myapp/delete_account.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>Delete Account</title>
+</head>
+<body>
+    <h1>Delete Account</h1>
+    <p>Are you sure you want to delete your account? This action cannot be undone.</p>
+    <form method="post">
+        {% csrf_token %}
+        <button type="submit">Yes, delete my account</button>
+    </form>
+    <p><a href="{% url 'account' %}">Cancel</a></p>
+</body>
+</html>
+
diff --git a/django_project/myapp/login.html b/django_project/myapp/login.html
new file mode 100644
index 0000000..36e1ee9
--- /dev/null
+++ b/django_project/myapp/login.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>Login</title>
+</head>
+<body>
+    <h1>Login</h1>
+    {% if messages %}
+        {% for message in messages %}
+            <p>{{ message }}</p>
+        {% endfor %}
+    {% endif %}
+    <form method="post">
+        {% csrf_token %}
+        {{ form.as_p }}
+        <button type="submit">Login</button>
+    </form>
+    <p>Don't have an account? <a href="{% url 'register' %}">Register here</a>.</p>
+</body>
+</html>
+
diff --git a/django_project/myapp/logout.html b/django_project/myapp/logout.html
new file mode 100644
index 0000000..1c67009
--- /dev/null
+++ b/django_project/myapp/logout.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Logged Out</title>
+    <style>
+        body { font-family: Arial, sans-serif; margin: 2em; }
+        a { color: blue; text-decoration: none; }
+        a:hover { text-decoration: underline; }
+    </style>
+</head>
+<body>
+    <h1>You have been logged out.</h1>
+    <p>
+        Thank you for using our service.
+        <br>
+        <a href="{% url 'login' %}">Click here to log in again</a>.
+    </p>
+</body>
+</html>
+
diff --git a/django_project/myapp/register.html b/django_project/myapp/register.html
new file mode 100644
index 0000000..35a9694
--- /dev/null
+++ b/django_project/myapp/register.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>Register</title>
+</head>
+<body>
+    <h1>Register</h1>
+    {% if messages %}
+        {% for message in messages %}
+            <p>{{ message }}</p>
+        {% endfor %}
+    {% endif %}
+    <form method="post">
+        {% csrf_token %}
+        {{ form.as_p }}
+        <button type="submit">Register</button>
+    </form>
+    <p>Already have an account? <a href="{% url 'login' %}">Login here</a>.</p>
+</body>
+</html>
+
diff --git a/django_project/myapp/views.py b/django_project/myapp/views.py
index c2bfafc..9981e44 100644
--- a/django_project/myapp/views.py
+++ b/django_project/myapp/views.py
@@ -1,5 +1,6 @@
-from django.shortcuts import render
+from django.shortcuts import render, redirect
 from django.http import JsonResponse
+from django.conf import settings
 import os
 import rust_crud_api  # This is the module we built
 
@@ -11,27 +12,103 @@ def init_db_view(request):
     except Exception as e:
         return JsonResponse({"error": str(e)}, status=500)
 
-def create_user_view(request):
-    db_url = os.environ.get("DATABASE_URL")
-    name = request.POST.get("name", "Alice")
-    email = request.POST.get("email", "alice@example.com")
-    try:
-        rust_crud_api.create_user(db_url, name, email)
-        return JsonResponse({"message": "User created"})
-    except Exception as e:
-        return JsonResponse({"error": str(e)}, status=500)
+def register_view(request):
+    """
+    Register a new user using the Rust extension.
+    Expects POST with 'name' and 'email'.
+    After registration, it simulates a login by storing the user's info in session.
+    """
+    db_url = settings.DATABASE_URL
+    if request.method == 'POST':
+        name = request.POST.get('name')
+        email = request.POST.get('email')
+        if not name or not email:
+            return JsonResponse({'error': 'Name and email are required.'}, status=400)
+        try:
+            # Create user in the database via the Rust extension.
+            rust_crud_api.create_user(db_url, name, email)
+            # Since our extension does not return the new user’s id directly,
+            # we retrieve all users and find the one with the matching email.
+            users = rust_crud_api.get_all_users(db_url)
+            user = next((u for u in users if u.email == email), None)
+            if user is None:
+                return JsonResponse({'error': 'Registration failed.'}, status=500)
+            # Simulate login by storing user info in session.
+            request.session['user_id'] = user.id
+            request.session['user_email'] = user.email
+            request.session['user_name'] = user.name
+            return redirect('account')
+        except Exception as e:
+            return JsonResponse({'error': str(e)}, status=500)
+    return render(request, 'myapp/register.html')
 
-def get_user_view(request, user_id):
-    db_url = os.environ.get("DATABASE_URL")
+
+def login_view(request):
+    """
+    Login a user by looking up their email in the database.
+    (Since our Rust extension doesn't handle passwords, we simply check if the email exists.)
+    """
+    db_url = settings.DATABASE_URL
+    if request.method == 'POST':
+        email = request.POST.get('email')
+        if not email:
+            return JsonResponse({'error': 'Email is required.'}, status=400)
+        try:
+            # Retrieve all users and try to find one with the given email.
+            users = rust_crud_api.get_all_users(db_url)
+            user = next((u for u in users if u.email == email), None)
+            if user is None:
+                return JsonResponse({'error': 'User not found.'}, status=404)
+            # Simulate login by storing user info in session.
+            request.session['user_id'] = user.id
+            request.session['user_email'] = user.email
+            request.session['user_name'] = user.name
+            return redirect('account')
+        except Exception as e:
+            return JsonResponse({'error': str(e)}, status=500)
+    return render(request, 'myapp/login.html')
+
+
+def account_view(request):
+    """
+    Display the account page for the logged-in user.
+    """
+    user_id = request.session.get('user_id')
+    if not user_id:
+        return redirect('login')
+    db_url = settings.DATABASE_URL
     try:
         user = rust_crud_api.get_user(db_url, int(user_id))
         if user is None:
-            return JsonResponse({"error": "User not found"}, status=404)
-        return JsonResponse({
-            "id": user.id,
-            "name": user.name,
-            "email": user.email
-        })
+            return JsonResponse({'error': 'User not found.'}, status=404)
+        return render(request, 'myapp/account.html', {'user': user})
     except Exception as e:
-        return JsonResponse({"error": str(e)}, status=500)
+        return JsonResponse({'error': str(e)}, status=500)
+
+
+def delete_account_view(request):
+    """
+    Delete the account of the logged-in user.
+    """
+    user_id = request.session.get('user_id')
+    if not user_id:
+        return redirect('login')
+    db_url = settings.DATABASE_URL
+    if request.method == 'POST':
+        try:
+            success = rust_crud_api.delete_user(db_url, int(user_id))
+            if success:
+                request.session.flush()  # Clear the session after deletion.
+                return redirect('register')
+            else:
+                return JsonResponse({'error': 'Account deletion failed.'}, status=500)
+        except Exception as e:
+            return JsonResponse({'error': str(e)}, status=500)
+    return render(request, 'myapp/delete_account.html')
+
+def logout_view(request):
+    # Clear all session data to log out the user.
+    request.session.flush()
+    # Optionally, render a confirmation page or redirect to login.
+    return render(request, 'myapp/logout.html')
 
-- 
GitLab