개선관리 요구사항과 Google 로그인을 완료

This commit is contained in:
Yun Chan 2026-08-28 16:07:09 +09:00
parent cc0a15b7c6
commit 2a39636163
112 changed files with 10166 additions and 527 deletions

View file

@ -21,7 +21,7 @@ from ..contracts.deliberate_practice import (
PracticePrescription,
)
from ..deps import AIView, Principal, Role, db_for_ai_view, require_role
from ..services import deliberate_practice_store
from ..services import deliberate_practice_store, feedback_policy
router = APIRouter(tags=["deliberate-practice"])
@ -248,6 +248,14 @@ class DeliberatePracticeReadModelResponse(BaseModel):
def _http_error(exc: Exception) -> HTTPException:
if isinstance(
exc,
deliberate_practice_store.DeliberatePracticeFeedbackDisabledError,
):
return HTTPException(
status.HTTP_403_FORBIDDEN,
detail=feedback_policy.LEARNER_FEEDBACK_DISABLED_DETAIL,
)
if isinstance(exc, deliberate_practice_store.DeliberatePracticeNotFoundError):
return HTTPException(status.HTTP_404_NOT_FOUND, detail=str(exc))
if isinstance(exc, deliberate_practice_store.DeliberatePracticeConflictError):
@ -295,6 +303,7 @@ async def create_practice_attempt(
body: PracticeAttemptSubmissionRequest,
principal: LearnerPrincipal,
) -> PracticeAttemptSubmissionResponse:
feedback_policy.require_principal_learner_feedback(principal)
try:
payload = await deliberate_practice_store.append_learner_attempt_submission(
principal=principal,
@ -305,6 +314,7 @@ async def create_practice_attempt(
except (
deliberate_practice_store.DeliberatePracticeNotFoundError,
deliberate_practice_store.DeliberatePracticeConflictError,
deliberate_practice_store.DeliberatePracticeFeedbackDisabledError,
deliberate_practice_store.DeliberatePracticeStateError,
) as exc:
raise _http_error(exc) from exc
@ -321,6 +331,10 @@ async def observe_completed_practice_session(
practice_session_id: UUID,
principal: LearnerPrincipal,
) -> PracticeAttemptSubmissionResponse:
await feedback_policy.require_session_learner_feedback(
practice_session_id,
principal,
)
try:
payload = await deliberate_practice_store.append_runtime_practice_session(
principal=principal,
@ -330,6 +344,7 @@ async def observe_completed_practice_session(
except (
deliberate_practice_store.DeliberatePracticeNotFoundError,
deliberate_practice_store.DeliberatePracticeConflictError,
deliberate_practice_store.DeliberatePracticeFeedbackDisabledError,
deliberate_practice_store.DeliberatePracticeStateError,
) as exc:
raise _http_error(exc) from exc
@ -368,6 +383,7 @@ async def correct_practice_attempt(
async def get_my_deliberate_practice(
principal: LearnerPrincipal,
) -> DeliberatePracticeReadModelResponse:
feedback_policy.require_principal_learner_feedback(principal)
try:
payload = await deliberate_practice_store.read_deliberate_practice(
principal=principal
@ -375,6 +391,7 @@ async def get_my_deliberate_practice(
except (
deliberate_practice_store.DeliberatePracticeNotFoundError,
deliberate_practice_store.DeliberatePracticeConflictError,
deliberate_practice_store.DeliberatePracticeFeedbackDisabledError,
deliberate_practice_store.DeliberatePracticeStateError,
) as exc:
raise _http_error(exc) from exc