Update users

This commit is contained in:
dvirlabs 2025-12-10 18:11:56 +02:00
parent 7ed3a4730a
commit 821cd9282a
3 changed files with 37 additions and 18 deletions

View File

@ -1,6 +1,6 @@
from fastapi import FastAPI, HTTPException, Header, Depends from fastapi import FastAPI, HTTPException, Header, Depends
from fastapi.middleware.cors import CORSMiddleware from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel from pydantic import BaseModel, Field
from typing import List, Optional from typing import List, Optional
from datetime import datetime from datetime import datetime
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
@ -40,8 +40,11 @@ class UserRegister(BaseModel):
password: str password: str
class UserLogin(BaseModel): class UserLogin(BaseModel):
email: str username_or_email: str = Field(..., alias='usernameOrEmail')
password: str password: str
class Config:
populate_by_name = True
class AuthResponse(BaseModel): class AuthResponse(BaseModel):
user: UserResponse user: UserResponse
@ -172,16 +175,18 @@ def register(user_data: UserRegister, db: Session = Depends(get_db)):
@app.post("/login", response_model=AuthResponse) @app.post("/login", response_model=AuthResponse)
def login(user_data: UserLogin, db: Session = Depends(get_db)): def login(user_data: UserLogin, db: Session = Depends(get_db)):
"""Login a user""" """Login a user with username or email"""
password_hash = hash_password(user_data.password) password_hash = hash_password(user_data.password)
# Try to find user by email or username
user = db.query(db_models.User).filter( user = db.query(db_models.User).filter(
db_models.User.email == user_data.email, ((db_models.User.email == user_data.username_or_email) |
(db_models.User.username == user_data.username_or_email)),
db_models.User.password_hash == password_hash db_models.User.password_hash == password_hash
).first() ).first()
if not user: if not user:
raise HTTPException(status_code=401, detail="Invalid email or password") raise HTTPException(status_code=401, detail="Invalid credentials")
# Create new token # Create new token
token_str = str(uuid.uuid4()) token_str = str(uuid.uuid4())

View File

@ -250,7 +250,7 @@ function App() {
<div className="sidebar-header"> <div className="sidebar-header">
<h2 className="sidebar-title"> Tasko</h2> <h2 className="sidebar-title"> Tasko</h2>
<div className="user-info"> <div className="user-info">
<span className="username">{user.username}</span> <span className="username">Hello, {user.username}!</span>
<button onClick={handleLogout} className="logout-btn" title="Logout"> <button onClick={handleLogout} className="logout-btn" title="Logout">
🚪 🚪
</button> </button>

View File

@ -6,6 +6,7 @@ const API_URL = 'http://localhost:8001'
function Auth({ onLogin }) { function Auth({ onLogin }) {
const [isLogin, setIsLogin] = useState(true) const [isLogin, setIsLogin] = useState(true)
const [username, setUsername] = useState('') const [username, setUsername] = useState('')
const [usernameOrEmail, setUsernameOrEmail] = useState('')
const [email, setEmail] = useState('') const [email, setEmail] = useState('')
const [password, setPassword] = useState('') const [password, setPassword] = useState('')
const [error, setError] = useState('') const [error, setError] = useState('')
@ -16,7 +17,7 @@ function Auth({ onLogin }) {
setError('') setError('')
if (isLogin) { if (isLogin) {
if (!email.trim() || !password.trim()) { if (!usernameOrEmail.trim() || !password.trim()) {
setError('Please fill in all fields') setError('Please fill in all fields')
return return
} }
@ -32,7 +33,7 @@ function Auth({ onLogin }) {
try { try {
const endpoint = isLogin ? '/login' : '/register' const endpoint = isLogin ? '/login' : '/register'
const payload = isLogin const payload = isLogin
? { email, password } ? { usernameOrEmail: usernameOrEmail, password }
: { username, email, password } : { username, email, password }
const response = await fetch(`${API_URL}${endpoint}`, { const response = await fetch(`${API_URL}${endpoint}`, {
@ -104,16 +105,29 @@ function Auth({ onLogin }) {
</div> </div>
)} )}
<div className="form-group"> {isLogin ? (
<label>Email</label> <div className="form-group">
<input <label>Username or Email</label>
type="email" <input
value={email} type="text"
onChange={(e) => setEmail(e.target.value)} value={usernameOrEmail}
placeholder="Enter your email" onChange={(e) => setUsernameOrEmail(e.target.value)}
disabled={loading} placeholder="Enter your username or email"
/> disabled={loading}
</div> />
</div>
) : (
<div className="form-group">
<label>Email</label>
<input
type="email"
value={email}
onChange={(e) => setEmail(e.target.value)}
placeholder="Enter your email"
disabled={loading}
/>
</div>
)}
<div className="form-group"> <div className="form-group">
<label>Password</label> <label>Password</label>