6a2a9d2c87
Backend: - Add user_feedback table with RLS policy - Create feedback submission API (multipart/form-data) - Implement xlsx report generation with embedded images - Add scheduled email delivery via Feishu SMTP - Create HTML email templates (daily_report, no_feedback) Frontend: - Add feedback screen with type selection and image picker - Support anonymous submission via skipAuth flag - Collect device info and app version Protocol: - Document feedback API contract and error codes - Update http-error-codes.md with FEEDBACK_* codes
41 lines
961 B
Python
41 lines
961 B
Python
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass
|
|
from uuid import UUID
|
|
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from models.user_feedback import UserFeedback
|
|
|
|
|
|
@dataclass
|
|
class FeedbackRepository:
|
|
session: AsyncSession
|
|
|
|
async def create_feedback(
|
|
self,
|
|
*,
|
|
user_id: UUID | None,
|
|
feedback_type: str,
|
|
content: str,
|
|
images: list[str],
|
|
device_info: dict,
|
|
app_version: str,
|
|
os_version: str,
|
|
) -> UserFeedback:
|
|
feedback = UserFeedback(
|
|
user_id=user_id,
|
|
feedback_type=feedback_type,
|
|
content=content,
|
|
images=images,
|
|
device_info=device_info,
|
|
app_version=app_version,
|
|
os_version=os_version,
|
|
)
|
|
self.session.add(feedback)
|
|
await self.session.flush()
|
|
return feedback
|
|
|
|
async def save(self) -> None:
|
|
await self.session.commit()
|