From dc11e1ad46cdb120a7e37087d660cb47f80f04a9 Mon Sep 17 00:00:00 2001 From: Sajeer Date: Tue, 28 Jul 2026 13:03:54 +0530 Subject: [PATCH] updated added --- db/models.py | 16 ++++++++-- main.py | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++-- schemas.py | 20 ++++++------- 3 files changed, 105 insertions(+), 15 deletions(-) diff --git a/db/models.py b/db/models.py index d8a8eee..d07c28c 100644 --- a/db/models.py +++ b/db/models.py @@ -1,4 +1,5 @@ -from sqlalchemy import Column,Integer,String,Float +from sqlalchemy import Column, Integer, String, Float, DateTime, ForeignKey +from datetime import datetime from db.database import Base @@ -6,12 +7,14 @@ class QuizResult(Base): __tablename__ = "quiz_results" id = Column(Integer, primary_key=True, index=True) + user_id = Column(Integer, ForeignKey("users.id")) # NEW topic = Column(String) difficulty = Column(String) score = Column(Integer) total = Column(Integer) percentage = Column(Float) + class User(Base): __tablename__ = "users" @@ -21,10 +24,19 @@ class User(Base): password = Column(String) +class UserSession(Base): + __tablename__ = "sessions" + + id = Column(Integer, primary_key=True, index=True) + session_id = Column(String, unique=True, index=True) + user_id = Column(Integer, ForeignKey("users.id")) + created_at = Column(DateTime, default=datetime.utcnow) + + class ChatHistory(Base): __tablename__ = "chat_history" id = Column(Integer, primary_key=True) - user_id = Column(Integer) + user_id = Column(Integer, ForeignKey("users.id")) # Better than plain Integer question = Column(String) answer = Column(String) \ No newline at end of file diff --git a/main.py b/main.py index ca41205..f3de68a 100644 --- a/main.py +++ b/main.py @@ -1,4 +1,4 @@ -from fastapi import FastAPI,UploadFile,File,Depends,HTTPException +from fastapi import FastAPI,UploadFile,File,Depends,HTTPException,Response,Cookie from rag.loader import load_pdf from rag.splitter import split_documents @@ -7,13 +7,13 @@ from rag.chatbot import ask_rag from rag.quiz_generator import generate_quiz,evaluate_quiz -from schemas import ChatRequest,ChatResponse,QuizRequest,QuizSubmission,QuizStore +from schemas import ChatRequest,ChatResponse,QuizRequest,QuizSubmission,QuizStore,UserLogin from fastapi.middleware.cors import CORSMiddleware from pydantic import BaseModel from ml import difficulty,classifier from db.database import engine,Base,SessionLocal -from db.models import QuizResult +from db.models import QuizResult, User, UserSession from sqlalchemy.orm import Session from analytics import get_analytics,analyze_topics,recommend_topics import os @@ -52,6 +52,84 @@ def home(): "message":"StudyMate Running" } + +@app.post("/login") +def login( + request: UserLogin, + response: Response, + db: Session = Depends(get_db) +): + + # Find user + user = db.query(User).filter( + User.email == request.email + ).first() + + if user is None: + raise HTTPException( + status_code=401, + detail="Invalid email or password" + ) + + # Verify password + if user.password != request.password: + raise HTTPException( + status_code=401, + detail="Invalid email or password" + ) + + # Generate session id + session_id = str(uuid.uuid4()) + + # Store session in database + session = UserSession( + session_id=session_id, + user_id=user.id + ) + + db.add(session) + db.commit() + + # Send session id as cookie + response.set_cookie( + key="session_id", + value=session_id, + httponly=True, + samesite="lax" + ) + + return { + "message": "Login Successful" + } + + +@app.post("/logout") +def logout( + response: Response, + session_id: str = Cookie(None), + db: Session = Depends(get_db) +): + if session_id is None: + raise HTTPException( + status_code=401, + detail="No active session" + ) + + session = db.query(UserSession).filter( + UserSession.session_id == session_id + ).first() + + if session: + db.delete(session) + db.commit() + + response.delete_cookie("session_id") + + return { + "message": "Logout Successful" + } + + @app.post("/upload") async def upload_pdf( file: UploadFile = File(...) diff --git a/schemas.py b/schemas.py index 0616e65..bd6e65d 100644 --- a/schemas.py +++ b/schemas.py @@ -1,4 +1,6 @@ -from pydantic import BaseModel +from pydantic import BaseModel, EmailStr + +# Chat class ChatRequest(BaseModel): question: str @@ -6,6 +8,8 @@ class ChatRequest(BaseModel): class ChatResponse(BaseModel): answer: str +# Quiz + class QuizRequest(BaseModel): topic: str difficulty: str @@ -15,23 +19,19 @@ class QuizSubmission(BaseModel): questions: list answers: list - class QuizStore(BaseModel): topic: str difficulty: str score: int total: int -#for user login +# User + class UserCreate(BaseModel): username: str - email: str + email: EmailStr password: str class UserLogin(BaseModel): - email: str - password: str - -class Token(BaseModel): - access_token: str - token_type: str \ No newline at end of file + email: EmailStr + password: str \ No newline at end of file