Spaces:
Running
Running
SyedAzlanzar
commited on
Commit
·
2bb85a3
1
Parent(s):
581f65e
@feat : implement token verification for secure API endpoints
Browse files- app/api/routes.py +6 -13
- 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.
|
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 |
+
)
|