from fastapi import FastAPI, Depends, HTTPException, status from fastapi.middleware.cors import CORSMiddleware from datetime import timedelta from database.database import SessionLocal from database.models import Document, User from api.auth import ( UserLogin, UserCreate, Token, UserResponse, get_password_hash, verify_password, create_access_token, decode_token, ACCESS_TOKEN_EXPIRE_MINUTES ) app = FastAPI() app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) @app.get("/") def root(): return {"message": "RegWatch API running"} @app.post("/test-login") def test_login(credentials: UserLogin): return {"received": credentials.dict()} @app.post("/signup", response_model=UserResponse) def signup(user: UserCreate): db = SessionLocal() existing_user = db.query(User).filter(User.email == user.email).first() if existing_user: db.close() raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail="Email already registered" ) hashed_password = get_password_hash(user.password) db_user = User( email=user.email, password=hashed_password, full_name=user.full_name ) db.add(db_user) db.commit() db.refresh(db_user) db.close() return UserResponse( id=db_user.id, email=db_user.email, full_name=db_user.full_name ) @app.post("/login", response_model=Token) def login(credentials: UserLogin): try: db = SessionLocal() user = db.query(User).filter(User.email == credentials.email).first() db.close() if not user: raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="User not found" ) if not verify_password(credentials.password, user.password): raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid password" ) access_token_expires = timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES) access_token = create_access_token( data={"sub": user.email}, expires_delta=access_token_expires ) return Token(access_token=access_token, token_type="bearer") except HTTPException: raise except Exception as e: print(f"ERROR in login: {str(e)}") import traceback traceback.print_exc() raise HTTPException( status_code=500, detail=f"Server error: {str(e)}" ) @app.get("/me", response_model=UserResponse) def get_current_user(token: str): email = decode_token(token) if not email: raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid token" ) db = SessionLocal() user = db.query(User).filter(User.email == email).first() db.close() if not user: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="User not found" ) return UserResponse( id=user.id, email=user.email, full_name=user.full_name ) @app.get("/documents") def get_documents(): db = SessionLocal() documents = db.query(Document).all() result = [] for doc in documents: result.append({ "id": doc.id, "title": doc.title, "ingredient": doc.ingredient, "source": doc.source, "type": doc.document_type, "date": doc.meeting_date, "pdf_url": doc.pdf_url }) db.close() return result