Arslan1997's picture
made it faster and added color picker
f1515e9
Raw
History Blame Contribute Delete
4.08 kB
from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session
from pydantic import BaseModel
from ..core.security import create_access_token, get_current_subject, get_current_user
from ..core.db import get_db
from ..models import User
from ..schemas.auth import LoginRequest, TokenResponse
router = APIRouter(prefix="/api/auth", tags=["auth"])
@router.post("/login", response_model=TokenResponse)
def login(payload: LoginRequest, db: Session = Depends(get_db)):
"""
Demo/testing login endpoint. For production, use Google OAuth at /api/auth/google/login
This creates or gets a test user from the database.
"""
# Find or create test user
user = db.query(User).filter(User.email == payload.email).first()
if not user:
user = User(
email=payload.email,
name="Test User",
provider="test",
is_active=True
)
db.add(user)
db.commit()
db.refresh(user)
token = create_access_token(str(user.id), {"email": user.email})
return TokenResponse(token=token, user={"id": str(user.id), "email": user.email})
@router.post("/logout")
def logout():
return {"success": True, "message": "Logged out successfully"}
@router.get("/me")
def get_current_user_info(
current_user: User = Depends(get_current_user),
db: Session = Depends(get_db)
):
"""Get current authenticated user's profile information"""
# Get user's subscription info
from ..models import Subscription, Form
from datetime import datetime, timezone
subscription = db.query(Subscription).filter(
Subscription.user_id == current_user.id
).order_by(Subscription.created_at.desc()).first()
subscription_info = None
if subscription:
subscription_info = {
"tier": subscription.status, # e.g., "free", "pro", "enterprise"
"status": subscription.status,
"stripe_customer_id": subscription.stripe_customer_id,
"stripe_subscription_id": subscription.stripe_subscription_id,
"created_at": subscription.created_at.isoformat()
}
# Calculate forms created this month
now = datetime.now(timezone.utc)
start_of_month = now.replace(day=1, hour=0, minute=0, second=0, microsecond=0)
forms_this_month = db.query(Form).filter(
Form.user_id == current_user.id,
Form.created_at >= start_of_month
).count()
return {
"id": current_user.id,
"email": current_user.email,
"name": current_user.name,
"picture": current_user.picture,
"provider": current_user.provider,
"is_active": current_user.is_active,
"created_at": current_user.created_at.isoformat(),
"forms_this_month": forms_this_month,
"subscription": subscription_info or {
"tier": "free",
"status": "inactive",
"stripe_customer_id": None,
"stripe_subscription_id": None,
"created_at": None
}
}
class UpdateProfileRequest(BaseModel):
name: str | None = None
@router.patch("/me")
def update_user_profile(
payload: UpdateProfileRequest,
current_user: User = Depends(get_current_user),
db: Session = Depends(get_db)
):
"""Update current user's profile"""
if payload.name is not None:
current_user.name = payload.name
db.commit()
db.refresh(current_user)
return {
"message": "Profile updated successfully",
"user": {
"id": current_user.id,
"email": current_user.email,
"name": current_user.name,
"picture": current_user.picture,
}
}
@router.delete("/me")
def deactivate_account(
current_user: User = Depends(get_current_user),
db: Session = Depends(get_db)
):
"""Deactivate user account (soft delete)"""
current_user.is_active = False
db.commit()
return {
"message": "Account deactivated successfully",
"success": True
}