mirror of
https://github.com/velocitatem/cvfs.git
synced 2026-05-31 16:53:38 +00:00
feat: add dashboard success-rate tracking and submission stages
This commit is contained in:
@@ -8,6 +8,7 @@ from app.schemas import (
|
||||
AiSuggestionRequest,
|
||||
SubmissionCreateRequest,
|
||||
SubmissionResponse,
|
||||
SubmissionStatusUpdateRequest,
|
||||
SuggestionResponse,
|
||||
SuggestionUpdateRequest,
|
||||
)
|
||||
@@ -16,8 +17,10 @@ from app.services.submissions import (
|
||||
get_submission,
|
||||
list_submissions,
|
||||
request_ai_suggestions,
|
||||
update_submission_status,
|
||||
update_suggestion,
|
||||
)
|
||||
from app.models import SubmissionStatus
|
||||
from dlib.auth import AuthenticatedUser
|
||||
|
||||
|
||||
@@ -40,7 +43,9 @@ async def get_submission_endpoint(
|
||||
session: AsyncSession = Depends(get_db),
|
||||
user: AuthenticatedUser = Depends(get_current_user),
|
||||
):
|
||||
submission = await get_submission(session, owner_id=user.sub, submission_id=submission_id)
|
||||
submission = await get_submission(
|
||||
session, owner_id=user.sub, submission_id=submission_id
|
||||
)
|
||||
if not submission:
|
||||
raise HTTPException(status_code=404, detail="Submission not found")
|
||||
return SubmissionResponse.model_validate(submission)
|
||||
@@ -66,6 +71,24 @@ async def create_submission_endpoint(
|
||||
return SubmissionResponse.model_validate(submission)
|
||||
|
||||
|
||||
@router.patch("/{submission_id}/status", response_model=SubmissionResponse)
|
||||
async def update_submission_status_endpoint(
|
||||
submission_id: str,
|
||||
payload: SubmissionStatusUpdateRequest,
|
||||
session: AsyncSession = Depends(get_db),
|
||||
user: AuthenticatedUser = Depends(get_current_user),
|
||||
):
|
||||
submission = await update_submission_status(
|
||||
session,
|
||||
owner_id=user.sub,
|
||||
submission_id=submission_id,
|
||||
status=SubmissionStatus(payload.status),
|
||||
)
|
||||
if not submission:
|
||||
raise HTTPException(status_code=404, detail="Submission not found")
|
||||
return SubmissionResponse.model_validate(submission)
|
||||
|
||||
|
||||
@router.post("/{submission_id}/ai", response_model=list[SuggestionResponse])
|
||||
async def request_submissions_ai(
|
||||
submission_id: str,
|
||||
@@ -85,7 +108,9 @@ async def request_submissions_ai(
|
||||
return [SuggestionResponse.model_validate(item) for item in suggestions]
|
||||
|
||||
|
||||
@router.patch("/{submission_id}/suggestions/{suggestion_id}", response_model=SuggestionResponse)
|
||||
@router.patch(
|
||||
"/{submission_id}/suggestions/{suggestion_id}", response_model=SuggestionResponse
|
||||
)
|
||||
async def update_suggestion_endpoint(
|
||||
submission_id: str,
|
||||
suggestion_id: str,
|
||||
|
||||
@@ -11,6 +11,7 @@ from .cv import (
|
||||
PublishRequest,
|
||||
SubmissionCreateRequest,
|
||||
SubmissionResponse,
|
||||
SubmissionStatusUpdateRequest,
|
||||
SuggestionResponse,
|
||||
SuggestionUpdateRequest,
|
||||
VersionResponse,
|
||||
@@ -25,6 +26,7 @@ __all__ = [
|
||||
"PatchApplyRequest",
|
||||
"SubmissionCreateRequest",
|
||||
"SubmissionResponse",
|
||||
"SubmissionStatusUpdateRequest",
|
||||
"AiSuggestionRequest",
|
||||
"SuggestionResponse",
|
||||
"SuggestionUpdateRequest",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from datetime import datetime
|
||||
from typing import Any
|
||||
from typing import Any, Literal
|
||||
|
||||
from pydantic import BaseModel, ConfigDict, Field
|
||||
|
||||
@@ -90,6 +90,16 @@ class SubmissionCreateRequest(BaseModel):
|
||||
job_description: str | None = None
|
||||
|
||||
|
||||
class SubmissionStatusUpdateRequest(BaseModel):
|
||||
status: Literal[
|
||||
"draft",
|
||||
"tailoring",
|
||||
"pending_review",
|
||||
"published",
|
||||
"archived",
|
||||
]
|
||||
|
||||
|
||||
class SuggestionResponse(BaseModel):
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
|
||||
@@ -133,6 +133,22 @@ async def update_suggestion(
|
||||
return suggestion
|
||||
|
||||
|
||||
async def update_submission_status(
|
||||
session: AsyncSession,
|
||||
*,
|
||||
owner_id: str,
|
||||
submission_id: str,
|
||||
status: SubmissionStatus,
|
||||
) -> Submission | None:
|
||||
submission = await _get_submission_for_owner(session, owner_id, submission_id)
|
||||
if not submission:
|
||||
return None
|
||||
submission.status = status
|
||||
await session.commit()
|
||||
await session.refresh(submission)
|
||||
return submission
|
||||
|
||||
|
||||
async def _get_version_for_owner(
|
||||
session: AsyncSession, owner_id: str, version_id: str
|
||||
) -> CvVersion | None:
|
||||
|
||||
Reference in New Issue
Block a user