SyedAzlanzar commited on
Commit
2bb85a3
·
1 Parent(s): 581f65e

@feat : implement token verification for secure API endpoints

Browse files
Files changed (2) hide show
  1. app/api/routes.py +6 -13
  2. app/auth/auth.py +19 -0
app/api/routes.py CHANGED
@@ -1,19 +1,17 @@
1
  from fastapi import APIRouter, HTTPException
2
  from app.models.schema import GenerateRequest, GenerateResponse
3
  from app.services.generator import coverLetterGenerativeAIBot
4
- from app.services.pdf_creator import save_pdf
5
  from app.services.resume_parser import extract_resume_text
6
  from app.utils.file_utils import generate_unique_filename
7
- from fastapi import UploadFile, File
8
  from app.services.hf_storage_service import HuggingFaceStorageService
9
- from app.services.pdf_creator import build_cover_letter_md, convert_md_to_text
10
-
11
  storage_service = HuggingFaceStorageService()
12
 
13
  router = APIRouter()
14
 
15
- @router.post("/generate", response_model=GenerateResponse)
16
- async def generate_cover_letter_api(data: GenerateRequest):
17
  try:
18
  if len(data.job_details) > 8192:
19
  raise HTTPException(status_code=400, detail="Job detail is too long")
@@ -50,23 +48,18 @@ async def generate_cover_letter_api(data: GenerateRequest):
50
 
51
 
52
  @router.post("/upload-resume")
53
- async def upload_resume(resume: UploadFile = File(...)):
54
  try:
55
- # Read resume content
56
  resume_content = await resume.read()
57
-
58
- # Upload to HuggingFace Hub
59
  resume_url = storage_service.upload_file_to_hf(
60
  file_content=resume_content,
61
  folder="resumes",
62
  filename=resume.filename
63
  )
64
-
65
  return {
66
  "success": True,
67
  "url": resume_url
68
  }
69
-
70
  except Exception as e:
71
  return {
72
  "success": False,
@@ -74,7 +67,7 @@ async def upload_resume(resume: UploadFile = File(...)):
74
  }
75
 
76
  @router.post("/upload-file")
77
- async def upload_file(pdf: UploadFile = File(...)):
78
  try:
79
  # Read resume content
80
  pdf_content = await pdf.read()
 
1
  from fastapi import APIRouter, HTTPException
2
  from app.models.schema import GenerateRequest, GenerateResponse
3
  from app.services.generator import coverLetterGenerativeAIBot
 
4
  from app.services.resume_parser import extract_resume_text
5
  from app.utils.file_utils import generate_unique_filename
6
+ from fastapi import UploadFile, File,Depends
7
  from app.services.hf_storage_service import HuggingFaceStorageService
8
+ from app.auth.auth import verify_token
 
9
  storage_service = HuggingFaceStorageService()
10
 
11
  router = APIRouter()
12
 
13
+ @router.post("/generate", response_model=GenerateResponse,)
14
+ async def generate_cover_letter_api(data: GenerateRequest,user=Depends(verify_token)):
15
  try:
16
  if len(data.job_details) > 8192:
17
  raise HTTPException(status_code=400, detail="Job detail is too long")
 
48
 
49
 
50
  @router.post("/upload-resume")
51
+ async def upload_resume(resume: UploadFile = File(...),user=Depends(verify_token)):
52
  try:
 
53
  resume_content = await resume.read()
 
 
54
  resume_url = storage_service.upload_file_to_hf(
55
  file_content=resume_content,
56
  folder="resumes",
57
  filename=resume.filename
58
  )
 
59
  return {
60
  "success": True,
61
  "url": resume_url
62
  }
 
63
  except Exception as e:
64
  return {
65
  "success": False,
 
67
  }
68
 
69
  @router.post("/upload-file")
70
+ async def upload_file(pdf: UploadFile = File(...),user=Depends(verify_token)):
71
  try:
72
  # Read resume content
73
  pdf_content = await pdf.read()
app/auth/auth.py ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from fastapi import Depends, HTTPException, status
2
+ from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
3
+ from jose import jwt, JWTError
4
+ import os
5
+
6
+ security = HTTPBearer()
7
+ def verify_token(credentials: HTTPAuthorizationCredentials = Depends(security)):
8
+ JWT_SECRET = os.getenv("JWT_SECRET_KEY", "fallback_secret")
9
+ ALGORITHM = os.getenv("ALGORITHM")
10
+ token = credentials.credentials
11
+ try:
12
+ payload = jwt.decode(token, JWT_SECRET, algorithms=[ALGORITHM])
13
+ return payload
14
+ except JWTError as e:
15
+ raise HTTPException(
16
+ status_code=status.HTTP_401_UNAUTHORIZED,
17
+ detail="Invalid or expired token",
18
+ headers={"WWW-Authenticate": "Bearer"},
19
+ )