
All checks were successful
Deploy to Production, build images and push to Gitea Registry / build_and_push (pull_request) Successful in 1m30s
This commit introduces a detailed roadmap for implementing various features, focusing on backend and frontend improvements. Key additions include: - New database schema designs for financial audit logging, archiving lists, and categorizing items. - Backend logic for financial audit logging, archiving functionality, and chore subtasks. - Frontend UI updates for archiving lists, managing categories, and enhancing the chore interface. - Introduction of a guest user flow and integration of Redis for caching to improve performance. These changes aim to enhance the application's functionality, user experience, and maintainability.
65 lines
2.3 KiB
Python
65 lines
2.3 KiB
Python
from fastapi import APIRouter, Depends, HTTPException, status
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
import uuid
|
|
|
|
from app import models
|
|
from app.schemas.user import UserCreate, UserClaim, UserPublic
|
|
from app.schemas.auth import Token
|
|
from app.database import get_session
|
|
from app.auth import current_active_user, get_jwt_strategy, get_refresh_jwt_strategy
|
|
from app.core.security import get_password_hash
|
|
from app.crud import user as crud_user
|
|
|
|
router = APIRouter()
|
|
|
|
@router.post("/guest", response_model=Token)
|
|
async def create_guest_user(db: AsyncSession = Depends(get_session)):
|
|
"""
|
|
Creates a new guest user.
|
|
"""
|
|
guest_email = f"guest_{uuid.uuid4()}@guest.mitlist.app"
|
|
guest_password = uuid.uuid4().hex
|
|
|
|
user_in = UserCreate(email=guest_email, password=guest_password)
|
|
user = await crud_user.create_user(db, user_in=user_in, is_guest=True)
|
|
|
|
# Use the same JWT strategy as regular login to generate both access and refresh tokens
|
|
access_strategy = get_jwt_strategy()
|
|
refresh_strategy = get_refresh_jwt_strategy()
|
|
|
|
access_token = await access_strategy.write_token(user)
|
|
refresh_token = await refresh_strategy.write_token(user)
|
|
|
|
return {
|
|
"access_token": access_token,
|
|
"refresh_token": refresh_token,
|
|
"token_type": "bearer"
|
|
}
|
|
|
|
@router.post("/guest/claim", response_model=UserPublic)
|
|
async def claim_guest_account(
|
|
claim_in: UserClaim,
|
|
db: AsyncSession = Depends(get_session),
|
|
current_user: models.User = Depends(current_active_user),
|
|
):
|
|
"""
|
|
Claims a guest account, converting it to a full user.
|
|
"""
|
|
if not current_user.is_guest:
|
|
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="Not a guest account.")
|
|
|
|
existing_user = await crud_user.get_user_by_email(db, email=claim_in.email)
|
|
if existing_user:
|
|
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="Email already registered.")
|
|
|
|
hashed_password = get_password_hash(claim_in.password)
|
|
current_user.email = claim_in.email
|
|
current_user.hashed_password = hashed_password
|
|
current_user.is_guest = False
|
|
current_user.is_verified = False # Require email verification
|
|
|
|
db.add(current_user)
|
|
await db.commit()
|
|
await db.refresh(current_user)
|
|
|
|
return current_user |