Spaces:
Sleeping
Sleeping
File size: 2,614 Bytes
6dd7eae | 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 | from fastapi import APIRouter, Depends, HTTPException, status
from fastapi.responses import JSONResponse
from sqlalchemy.orm import Session
from database import get_db
from models import User
from auth_utils import hash_password, verify_password, create_token, get_current_user
router = APIRouter(prefix="/auth", tags=["auth"])
@router.post("/signup")
def signup(request: dict, db: Session = Depends(get_db)):
email = request.get("email", "").strip().lower()
password = request.get("password", "")
name = request.get("name", "").strip()
if not email or not password or not name:
raise HTTPException(400, "Email, password and name are required")
if len(password) < 6:
raise HTTPException(400, "Password must be at least 6 characters")
if db.query(User).filter(User.email == email).first():
raise HTTPException(400, "Email already registered")
user = User(
email = email,
name = name,
password_hash = hash_password(password),
)
db.add(user)
db.commit()
db.refresh(user)
token = create_token(user.id, user.email)
return JSONResponse({
"token": token,
"user": {
"id": user.id,
"email": user.email,
"name": user.name,
}
})
@router.post("/login")
def login(request: dict, db: Session = Depends(get_db)):
email = request.get("email", "").strip().lower()
password = request.get("password", "")
if not email or not password:
raise HTTPException(400, "Email and password are required")
user = db.query(User).filter(User.email == email).first()
if not user or not verify_password(password, user.password_hash):
raise HTTPException(401, "Invalid email or password")
token = create_token(user.id, user.email)
return JSONResponse({
"token": token,
"user": {
"id": user.id,
"email": user.email,
"name": user.name,
}
})
@router.get("/me")
def get_me(
current_user: User = Depends(get_current_user),
db: Session = Depends(get_db),
):
from models import Project
from sqlalchemy import func as sqlfunc
project_count = db.query(sqlfunc.count(Project.id)).filter(
Project.user_id == current_user.id
).scalar()
return JSONResponse({
"id": current_user.id,
"email": current_user.email,
"name": current_user.name,
"project_count": project_count,
"joined": current_user.created_at.strftime("%B %Y"),
}) |