Full-stack Amazon AI Transcreation Platform with: - FastAPI backend (async, PostgreSQL, Redis, Celery) with 11 DB tables - JWT auth (SSO-ready abstract provider pattern) - 6-agent pipeline orchestrator with deterministic modules - Next.js 14 frontend with Amazon branding (Ember fonts, orange/dark theme) - Job wizard, monitoring HUD, output review, admin screens - 154 TM/reference files imported, 12 locales configured - Docker Compose for all services Agents 2-5 (TM retrieval, ranker, transcreator, compliance) are stubs pending Phase 3 LLM integration. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
66 lines
1.9 KiB
Python
66 lines
1.9 KiB
Python
from uuid import UUID
|
|
|
|
from sqlalchemy import select
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from app.models.feedback import Feedback
|
|
from app.schemas.feedback import FeedbackCreate
|
|
|
|
|
|
class FeedbackService:
|
|
"""Service for feedback CRUD operations."""
|
|
|
|
async def create_feedback(
|
|
self,
|
|
db: AsyncSession,
|
|
data: FeedbackCreate,
|
|
user_id: UUID,
|
|
) -> Feedback:
|
|
"""Create a new feedback entry."""
|
|
feedback = Feedback(
|
|
output_id=data.output_id,
|
|
user_id=user_id,
|
|
option_column=data.option_column,
|
|
flag_type=data.flag_type,
|
|
comment=data.comment,
|
|
)
|
|
db.add(feedback)
|
|
await db.flush()
|
|
return feedback
|
|
|
|
async def list_feedback(
|
|
self,
|
|
db: AsyncSession,
|
|
output_id: UUID | None = None,
|
|
user_id: UUID | None = None,
|
|
) -> list[Feedback]:
|
|
"""List feedback entries with optional filters."""
|
|
query = select(Feedback)
|
|
if output_id:
|
|
query = query.where(Feedback.output_id == output_id)
|
|
if user_id:
|
|
query = query.where(Feedback.user_id == user_id)
|
|
query = query.order_by(Feedback.created_at.desc())
|
|
|
|
result = await db.execute(query)
|
|
return list(result.scalars().all())
|
|
|
|
async def get_feedback(
|
|
self, db: AsyncSession, feedback_id: UUID
|
|
) -> Feedback | None:
|
|
"""Get a single feedback entry by ID."""
|
|
result = await db.execute(
|
|
select(Feedback).where(Feedback.id == feedback_id)
|
|
)
|
|
return result.scalar_one_or_none()
|
|
|
|
async def delete_feedback(
|
|
self, db: AsyncSession, feedback_id: UUID
|
|
) -> bool:
|
|
"""Delete a feedback entry."""
|
|
feedback = await self.get_feedback(db, feedback_id)
|
|
if feedback is None:
|
|
return False
|
|
await db.delete(feedback)
|
|
await db.flush()
|
|
return True
|