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"), })