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