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.middleware.cors import CORSMiddleware
from pydantic import BaseModel
from pydantic import BaseModel, Field
from typing import List, Optional
from datetime import datetime
from sqlalchemy.orm import Session
@ -40,9 +40,12 @@ class UserRegister(BaseModel):
password: str
class UserLogin(BaseModel):
email: str
username_or_email: str = Field(..., alias='usernameOrEmail')
password: str
class Config:
populate_by_name = True
class AuthResponse(BaseModel):
user: UserResponse
token: str
@ -172,16 +175,18 @@ def register(user_data: UserRegister, db: Session = Depends(get_db)):
@app.post("/login", response_model=AuthResponse)
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)
# Try to find user by email or username
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
).first()
if not user:
raise HTTPException(status_code=401, detail="Invalid email or password")
raise HTTPException(status_code=401, detail="Invalid credentials")
# Create new token
token_str = str(uuid.uuid4())

View File

@ -250,7 +250,7 @@ function App() {
<div className="sidebar-header">
<h2 className="sidebar-title"> Tasko</h2>
<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>

View File

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