116 lines
3.6 KiB
Python
116 lines
3.6 KiB
Python
"""
|
|
Job application management service
|
|
"""
|
|
from typing import List, Optional
|
|
from sqlalchemy.orm import Session
|
|
|
|
from ..models import Application, JobPosting, Resume
|
|
from ..config.settings import settings
|
|
|
|
|
|
def create_application(db: Session, user_id: int, job_posting_id: int, resume_id: int,
|
|
cover_letter: str = None, tenant_id: int = None) -> Application:
|
|
"""
|
|
Create a new job application
|
|
"""
|
|
# Verify that the resume belongs to the user
|
|
resume = db.query(Resume).filter(
|
|
Resume.id == resume_id,
|
|
Resume.user_id == user_id
|
|
).first()
|
|
if not resume:
|
|
raise ValueError("Resume does not belong to user")
|
|
|
|
# In a multi-tenant setup, we should verify tenant access to the job posting
|
|
if settings.MULTI_TENANT_ENABLED and tenant_id:
|
|
job_posting = db.query(JobPosting).filter(
|
|
JobPosting.id == job_posting_id,
|
|
JobPosting.tenant_id == tenant_id
|
|
).first()
|
|
if not job_posting:
|
|
raise ValueError("Job posting not found in tenant")
|
|
|
|
db_application = Application(
|
|
user_id=user_id,
|
|
job_posting_id=job_posting_id,
|
|
resume_id=resume_id,
|
|
cover_letter=cover_letter
|
|
)
|
|
db.add(db_application)
|
|
db.commit()
|
|
db.refresh(db_application)
|
|
return db_application
|
|
|
|
|
|
def get_user_applications(db: Session, user_id: int) -> List[Application]:
|
|
"""
|
|
Get all applications for a specific user
|
|
"""
|
|
return db.query(Application).filter(Application.user_id == user_id).all()
|
|
|
|
|
|
def get_job_applications(db: Session, job_posting_id: int, tenant_id: int = None) -> List[Application]:
|
|
"""
|
|
Get all applications for a specific job posting within a tenant
|
|
"""
|
|
query = db.query(Application).join(JobPosting).filter(Application.job_posting_id == job_posting_id)
|
|
|
|
if settings.MULTI_TENANT_ENABLED and tenant_id:
|
|
query = query.filter(JobPosting.tenant_id == tenant_id)
|
|
|
|
return query.all()
|
|
|
|
|
|
def get_application_by_id(db: Session, application_id: int, user_id: int = None,
|
|
job_posting_id: int = None) -> Optional[Application]:
|
|
"""
|
|
Get a specific application by ID with optional user or job constraints
|
|
"""
|
|
query = db.query(Application).filter(Application.id == application_id)
|
|
|
|
if user_id:
|
|
query = query.filter(Application.user_id == user_id)
|
|
if job_posting_id:
|
|
query = query.filter(Application.job_posting_id == job_posting_id)
|
|
|
|
return query.first()
|
|
|
|
|
|
def update_application_status(db: Session, application_id: int, status: str,
|
|
user_id: int = None, job_posting_id: int = None) -> Optional[Application]:
|
|
"""
|
|
Update application status
|
|
"""
|
|
query = db.query(Application).filter(Application.id == application_id)
|
|
|
|
if user_id:
|
|
query = query.filter(Application.user_id == user_id)
|
|
if job_posting_id:
|
|
query = query.filter(Application.job_posting_id == job_posting_id)
|
|
|
|
db_application = query.first()
|
|
if not db_application:
|
|
return None
|
|
|
|
db_application.status = status
|
|
db.commit()
|
|
db.refresh(db_application)
|
|
return db_application
|
|
|
|
|
|
def delete_application(db: Session, application_id: int, user_id: int = None) -> bool:
|
|
"""
|
|
Delete an application
|
|
"""
|
|
query = db.query(Application).filter(Application.id == application_id)
|
|
|
|
if user_id:
|
|
query = query.filter(Application.user_id == user_id)
|
|
|
|
db_application = query.first()
|
|
if not db_application:
|
|
return False
|
|
|
|
db.delete(db_application)
|
|
db.commit()
|
|
return True |