amazon-transcreation/backend/app/services/feedback_service.py
DJP 98fa16bfc3 feat: complete Phase 1-2 scaffold — backend, frontend, pipeline skeleton
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>
2026-04-10 12:31:43 -04:00

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