feat: LocalPro Finder — отзывы, рейтинги, чат, AI-оценка, диагностика, подписки

This commit is contained in:
2026-07-03 15:06:02 +00:00
parent ef711d461f
commit 81c755ec3a
9 changed files with 803 additions and 0 deletions
+77
View File
@@ -0,0 +1,77 @@
"""Онлайн-диагностика — AI задаёт вопросы, мастер подтверждает"""
from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.ext.asyncio import AsyncSession
import uuid
from ...core.database import async_session_factory, Diagnosis, Project
from pydantic import BaseModel
router = APIRouter()
class CreateDiagnosisRequest(BaseModel):
project_id: uuid.UUID
problem_description: str
photos: list[str] = []
@router.post("/")
async def create_diagnosis(req: CreateDiagnosisRequest, session: AsyncSession = Depends(async_session_factory), user=Depends(get_current_user)):
"""Создать диагностику проблемы."""
project = await session.get(Project, req.project_id)
if not project or project.client_id != user.id:
raise HTTPException(403)
diagnosis = Diagnosis(
project_id=req.project_id,
problem_description=req.problem_description,
photos=req.photos,
ai_questions=["Какой тип крана?", "Как давно течёт?"], # AI генерирует динамически
)
session.add(diagnosis)
await session.commit()
return {"id": str(diagnosis.id), "ai_questions": diagnosis.ai_questions}
@router.post("/{diagnosis_id}/answer")
async def answer_diagnosis(diagnosis_id: uuid.UUID, answers: dict, session: AsyncSession = Depends(async_session_factory)):
"""Ответить на вопросы диагностики."""
diagnosis = await session.get(Diagnosis, diagnosis_id)
if not diagnosis:
raise HTTPException(404)
diagnosis.client_answers = answers
# AI генерирует результат
diagnosis.diagnosis_result = "Замена картриджа однорычажного крана. Стоимость ~1500₽."
await session.commit()
return {"diagnosis_result": diagnosis.diagnosis_result}
@router.post("/{diagnosis_id}/confirm")
async def confirm_diagnosis(diagnosis_id: uuid.UUID, master_confirmation: str, session: AsyncSession = Depends(async_session_factory)):
"""Мастер подтверждает диагностику."""
diagnosis = await session.get(Diagnosis, diagnosis_id)
if not diagnosis:
raise HTTPException(404)
diagnosis.master_confirmation = master_confirmation
await session.commit()
@router.get("/project/{project_id}")
async def get_project_diagnosis(project_id: uuid.UUID, session: AsyncSession = Depends(async_session_factory)):
"""Получить диагностику проекта."""
result = await session.execute(select(Diagnosis).where(Diagnosis.project_id == project_id))
diagnosis = result.scalar_one_or_none()
return diagnosis.mapped() if diagnosis else None
from sqlalchemy import select