Update users
This commit is contained in:
parent
7ed3a4730a
commit
821cd9282a
@ -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())
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user