editify-backend / auth.py
Nisha56's picture
Add PostgreSQL authentication and UI improvements
6dd7eae
Raw History Blame Contribute Delete
2.61 kB
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"),
})