File size: 6,233 Bytes
763951b
 
872fbd3
325f578
3e96dce
325f578
 
dc39372
325f578
f5ffa3e
9731a64
 
afd16c0
10b597c
afd16c0
10b597c
46a06f8
325f578
10b597c
625461f
e3afd2e
625461f
 
46a06f8
10b597c
625461f
 
 
 
 
10511db
 
 
 
 
 
325f578
44372ef
 
 
c5c4c92
8268a41
c5c4c92
8268a41
c5c4c92
fab519b
 
b7beb58
28838c2
c5c4c92
28838c2
b7beb58
28838c2
cb6494b
8268a41
 
 
 
cb6494b
8268a41
cb6494b
bda9eb4
8268a41
bda9eb4
0e0e35e
bda9eb4
316bb4c
bda9eb4
cb6494b
 
fc5cc3c
cb6494b
 
171c2ad
cb6494b
 
 
8268a41
 
bda9eb4
cb6494b
c5c4c92
e3afd2e
 
 
 
cb6494b
a3ea3d6
4da28a8
 
dcdcf2f
 
 
 
4da28a8
 
2a3fa0d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
dcdcf2f
4da28a8
6856caa
473df3a
 
 
44372ef
8417e1a
dc39372
 
44372ef
8338c06
e007f86
dc39372
 
e007f86
dc39372
8338c06
e007f86
dc39372
e007f86
 
 
bbe5c13
e007f86
 
 
dc39372
e007f86
c209774
325f578
c02b541
325f578
c209774
673cb74
c209774
 
 
 
 
 
 
 
 
 
30c22df
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
#main.py

from fastapi import FastAPI, Form, Depends, HTTPException
from fastapi.requests import Request
from fastapi.responses import HTMLResponse, RedirectResponse
from fastapi.templating import Jinja2Templates
from sqlalchemy.orm import Session
from auth import verify_token, oauth2_scheme, auth_views, register, UserCreate, authenticate_user, get_user_by_verification_token
from database import get_db, get_user_by_email
from datetime import timedelta
#import auth
#import tts
import os

my_secret_key = os.environ['my_secret_key']
app = FastAPI()
#router = APIRouter()
templates = Jinja2Templates(directory="templates")

# Include the authentication router with the prefix '/auth'
#app.include_router(auth.router, prefix="")

# Include the TTS router with the prefix '/tts'
#app.include_router(tts.router, prefix="/tts")

# Dependency for verifying the user's token
def get_current_user(token: str = Depends(verify_token)):
    if not token:
        raise HTTPException(status_code=401, detail="Token not valid")
    return token
# Route for the landing page
@app.get("/", response_class=HTMLResponse)
async def landing(request: Request):
    return templates.TemplateResponse("landing.html", {"request": request})

# Your other routes and app configuration go here

@app.get("/login", response_class=HTMLResponse)
async def login(request: Request):
    return templates.TemplateResponse("login.html", {"request": request})


@app.post("/login", response_class=HTMLResponse)
async def login_post(
    request: Request,
    email: str = Form(...),
    password: str = Form(...),
    db: Session = Depends(get_db),
 #   token: str = Depends(oauth2_scheme)  # Check if the user has a valid token
):
 #   if token:
        # If the user already has a valid token, redirect to protected.html
 #       return templates.TemplateResponse("protected.html", {"request": request, "user": token})

    # Validate the email and password
    if not email or not password:
        raise HTTPException(status_code=400, detail="Invalid email or password")

    # Check user authentication using the provided email and password
    user = authenticate_user(db, email, password)

    if user is not None:
        # Authentication succeeded
        # Create an access token and handle login success
        access_token = auth_views.create_access_token(
            data={"sub": user.email},
            expires_delta=timedelta(minutes=auth_views.ACCESS_TOKEN_EXPIRE_MINUTES),
        )

        # Set the access_token (if desired)
        user.token = access_token

        # Commit the changes to the database
        db.commit()

        # Handle the login success as needed
        return templates.TemplateResponse("protected.html", {"request": request, "user": user.username})
    else:
        # Authentication failed
        # Handle login failure, e.g., display an error message
        return templates.TemplateResponse("login.html", {"request": request, "error_message": "Invalid email or password"})

@app.get("/register", response_class=HTMLResponse)
async def register_get(request: Request):
    return templates.TemplateResponse("register.html", {"request": request})


@app.post("/register", response_class=HTMLResponse)
async def register_post(
    request: Request,
    username: str = Form(...),
    email: str = Form(...),
    password: str = Form(...),
    confirm_password: str = Form(...),
    db: Session = Depends(get_db)
):
    if password != confirm_password:
        # Return to the registration page with an error
        return templates.TemplateResponse("register.html", {
            "request": request,
            "error_message": "Passwords do not match."
        })

    try:
        user = UserCreate(username=username, email=email, password=password, confirm_password=confirm_password)
        register(user, db)  # If this function raises an HTTPException, it should be handled
    except HTTPException as e:
        # Return to the registration page with the error detail
        return templates.TemplateResponse("register.html", {
            "request": request,
            "error_message": e.detail
        })

    # Redirect to the successful registration page
    response = RedirectResponse("/registration_successful", status_code=status.HTTP_302_FOUND)
    return response
    
    
@app.post("/registration_successful", response_class=HTMLResponse)
async def registration_successful(request: Request):
    return templates.TemplateResponse("registration_successful.html", {"request": request})





@app.get("/verify/{verification_token}", response_class=HTMLResponse)
async def verify_email(verification_token: str, request: Request, db: Session = Depends(get_db)):
    # Verify the email using the token
    user = get_user_by_verification_token(db, verification_token)
    
    if not user:
        raise HTTPException(status_code=400, detail="Invalid verification token")

    if user.is_verified:
        raise HTTPException(status_code=400, detail="Email already verified")

    # Mark the email as verified in the database
    user.is_verified = True
    #user.email_verification_token = None  # Optionally clear the verification token
    db.commit()

    # Handle a successful verification
  #  return templates.TemplateResponse("verification_successful.html", {"request": request})
    return RedirectResponse("/protected")

# User authentication (protected route)
@app.post("/protected", response_class=HTMLResponse)  # Specify response_class as HTMLResponse
async def protected_route(request: Request, token: str = Depends(oauth2_scheme), db: Session = Depends(get_db)):
    # Verify the access token
    user = verify_token(token, my_secret_key, "HS256")
    if user is None:
        raise HTTPException(status_code=401, detail="Invalid or expired token")

    # Check if the user exists in the database
    db_user = get_user_by_email(db, user)  # Modify this to match your database query

    if db_user is None:
        raise HTTPException(status_code=401, detail="User not found in the database")

    # The user exists in the database, and you can render the protected route template
    return templates.TemplateResponse("protected.html", {"request": request, "user": user.email})