import type { Instant } from '@household/domain' export type AnonymousFeedbackModerationStatus = 'accepted' | 'posted' | 'rejected' | 'failed' export type AnonymousFeedbackRejectionReason = | 'not_member' | 'too_short' | 'too_long' | 'cooldown' | 'daily_cap' | 'blocklisted' export interface AnonymousFeedbackMemberRecord { id: string telegramUserId: string displayName: string } export interface AnonymousFeedbackRateLimitSnapshot { acceptedCountSince: number earliestAcceptedAtSince: Instant | null lastAcceptedAt: Instant | null } export interface AnonymousFeedbackSubmissionRecord { id: string moderationStatus: AnonymousFeedbackModerationStatus } export interface AnonymousFeedbackRepository { getMemberByTelegramUserId(telegramUserId: string): Promise getRateLimitSnapshot( memberId: string, acceptedSince: Instant ): Promise createSubmission(input: { submittedByMemberId: string rawText: string sanitizedText: string | null moderationStatus: AnonymousFeedbackModerationStatus moderationReason: string | null telegramChatId: string telegramMessageId: string telegramUpdateId: string }): Promise<{ submission: AnonymousFeedbackSubmissionRecord; duplicate: boolean }> markPosted(input: { submissionId: string postedChatId: string postedThreadId: string postedMessageId: string postedAt: Instant }): Promise markFailed(submissionId: string, failureReason: string): Promise }