161 lines
6.2 KiB
Python
161 lines
6.2 KiB
Python
"""
|
|
Resume API routes
|
|
"""
|
|
from fastapi import APIRouter, Depends, HTTPException, status, Request
|
|
from typing import List
|
|
from pydantic import BaseModel
|
|
from sqlalchemy.orm import Session
|
|
|
|
from ...database import SessionLocal
|
|
from ...models import Resume, User
|
|
from ...config.settings import settings
|
|
from ...services.resume_service import create_resume, get_user_resumes, get_resume_by_id, update_resume, delete_resume
|
|
|
|
router = APIRouter()
|
|
|
|
# Pydantic models for resumes
|
|
class ResumeCreate(BaseModel):
|
|
title: str
|
|
content: str
|
|
|
|
class Config:
|
|
json_schema_extra = {
|
|
"example": {
|
|
"title": "John Doe's Resume",
|
|
"content": "Experienced software engineer with 5 years of experience..."
|
|
}
|
|
}
|
|
|
|
class ResumeUpdate(BaseModel):
|
|
title: str = None
|
|
content: str = None
|
|
|
|
class ResumeResponse(BaseModel):
|
|
id: int
|
|
user_id: int
|
|
title: str
|
|
content: str
|
|
is_active: bool
|
|
|
|
class Config:
|
|
from_attributes = True
|
|
json_schema_extra = {
|
|
"example": {
|
|
"id": 1,
|
|
"user_id": 1,
|
|
"title": "John Doe's Resume",
|
|
"content": "Experienced software engineer with 5 years of experience...",
|
|
"is_active": True
|
|
}
|
|
}
|
|
|
|
@router.get("/", response_model=List[ResumeResponse])
|
|
async def get_resumes(db: Session = Depends(SessionLocal), request: Request = None):
|
|
"""Get all resumes for the current user"""
|
|
tenant_id = getattr(request.state, 'tenant_id', None)
|
|
if not tenant_id and settings.MULTI_TENANT_ENABLED:
|
|
raise HTTPException(status_code=400, detail="Tenant ID is required")
|
|
|
|
# Extract user_id from token in a real app, for now using a default
|
|
user_id = 1 # This would come from authentication in a real implementation
|
|
|
|
# Verify user belongs to the current tenant
|
|
user = db.query(User).filter(
|
|
User.id == user_id,
|
|
User.tenant_id == tenant_id
|
|
).first()
|
|
if not user and settings.MULTI_TENANT_ENABLED:
|
|
raise HTTPException(status_code=400, detail="Access denied")
|
|
|
|
resumes = get_user_resumes(db, user_id, tenant_id)
|
|
return resumes
|
|
|
|
@router.get("/{resume_id}", response_model=ResumeResponse)
|
|
async def get_resume(resume_id: int, db: Session = Depends(SessionLocal), request: Request = None):
|
|
"""Get a specific resume"""
|
|
tenant_id = getattr(request.state, 'tenant_id', None)
|
|
if not tenant_id and settings.MULTI_TENANT_ENABLED:
|
|
raise HTTPException(status_code=400, detail="Tenant ID is required")
|
|
|
|
# Extract user_id from token in a real app, for now using a default
|
|
user_id = 1 # This would come from authentication in a real implementation
|
|
|
|
# Verify user belongs to the current tenant
|
|
user = db.query(User).filter(
|
|
User.id == user_id,
|
|
User.tenant_id == tenant_id
|
|
).first()
|
|
if not user and settings.MULTI_TENANT_ENABLED:
|
|
raise HTTPException(status_code=400, detail="Access denied")
|
|
|
|
resume = get_resume_by_id(db, resume_id, user_id, tenant_id)
|
|
if not resume:
|
|
raise HTTPException(status_code=404, detail="Resume not found")
|
|
return resume
|
|
|
|
@router.post("/", response_model=ResumeResponse)
|
|
async def create_user_resume(resume: ResumeCreate, db: Session = Depends(SessionLocal), request: Request = None):
|
|
"""Create a new resume for the current user"""
|
|
tenant_id = getattr(request.state, 'tenant_id', None)
|
|
if not tenant_id and settings.MULTI_TENANT_ENABLED:
|
|
raise HTTPException(status_code=400, detail="Tenant ID is required")
|
|
|
|
# Extract user_id from token in a real app, for now using a default
|
|
user_id = 1 # This would come from authentication in a real implementation
|
|
|
|
# Verify user belongs to the current tenant
|
|
user = db.query(User).filter(
|
|
User.id == user_id,
|
|
User.tenant_id == tenant_id
|
|
).first()
|
|
if not user and settings.MULTI_TENANT_ENABLED:
|
|
raise HTTPException(status_code=400, detail="Access denied")
|
|
|
|
db_resume = create_resume(db, user_id, resume.title, resume.content, tenant_id)
|
|
return db_resume
|
|
|
|
@router.put("/{resume_id}", response_model=ResumeResponse)
|
|
async def update_user_resume(resume_id: int, resume_update: ResumeUpdate, db: Session = Depends(SessionLocal), request: Request = None):
|
|
"""Update a resume for the current user"""
|
|
tenant_id = getattr(request.state, 'tenant_id', None)
|
|
if not tenant_id and settings.MULTI_TENANT_ENABLED:
|
|
raise HTTPException(status_code=400, detail="Tenant ID is required")
|
|
|
|
# Extract user_id from token in a real app, for now using a default
|
|
user_id = 1 # This would come from authentication in a real implementation
|
|
|
|
# Verify user belongs to the current tenant
|
|
user = db.query(User).filter(
|
|
User.id == user_id,
|
|
User.tenant_id == tenant_id
|
|
).first()
|
|
if not user and settings.MULTI_TENANT_ENABLED:
|
|
raise HTTPException(status_code=400, detail="Access denied")
|
|
|
|
db_resume = update_resume(db, resume_id, user_id, tenant_id, resume_update.title, resume_update.content)
|
|
if not db_resume:
|
|
raise HTTPException(status_code=404, detail="Resume not found")
|
|
return db_resume
|
|
|
|
@router.delete("/{resume_id}")
|
|
async def delete_user_resume(resume_id: int, db: Session = Depends(SessionLocal), request: Request = None):
|
|
"""Delete a resume for the current user"""
|
|
tenant_id = getattr(request.state, 'tenant_id', None)
|
|
if not tenant_id and settings.MULTI_TENANT_ENABLED:
|
|
raise HTTPException(status_code=400, detail="Tenant ID is required")
|
|
|
|
# Extract user_id from token in a real app, for now using a default
|
|
user_id = 1 # This would come from authentication in a real implementation
|
|
|
|
# Verify user belongs to the current tenant
|
|
user = db.query(User).filter(
|
|
User.id == user_id,
|
|
User.tenant_id == tenant_id
|
|
).first()
|
|
if not user and settings.MULTI_TENANT_ENABLED:
|
|
raise HTTPException(status_code=400, detail="Access denied")
|
|
|
|
success = delete_resume(db, resume_id, user_id, tenant_id)
|
|
if not success:
|
|
raise HTTPException(status_code=404, detail="Resume not found")
|
|
return {"message": "Resume deleted successfully"} |