feat: add dashboard success-rate tracking and submission stages

This commit is contained in:
2026-04-04 15:16:12 +02:00
parent 07fbfbbd85
commit 5facc4b7a5
7 changed files with 229 additions and 19 deletions

View File

@@ -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,

View File

@@ -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",

View File

@@ -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)

View File

@@ -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: