import type { Watchlist } from "@calcom/prisma/client"; import type { WatchlistAction, WatchlistSource, WatchlistType } from "../types"; /** * Interface for Global Watchlist Repository * Follows Dependency Inversion Principle */ export interface IGlobalWatchlistRepository { findBlockedEmail(email: string): Promise; findBlockedDomain(domain: string): Promise; findFreeEmailDomain(domain: string): Promise; findById(id: string): Promise; listBlockedEntries(): Promise; /** * Bulk find blocking entries for multiple emails and domains. * Single query for N emails and domains - eliminates N+1. */ findBlockingEntriesForEmailsAndDomains(params: { emails: string[]; domains: string[]; }): Promise; // Write operations createEntry(data: { type: WatchlistType; value: string; description?: string; action: WatchlistAction; source?: WatchlistSource; }): Promise; updateEntry( id: string, data: { value?: string; description?: string; action?: WatchlistAction; source?: WatchlistSource; } ): Promise; deleteEntry(id: string): Promise; } /** * Interface for Organization Watchlist Repository * Follows Dependency Inversion Principle */ export interface IOrganizationWatchlistRepository { findBlockedEmail({ email, organizationId, }: { email: string; organizationId: number; }): Promise; findBlockedDomain(domain: string, organizationId: number): Promise; findById(id: string, organizationId: number): Promise; listBlockedEntries(organizationId: number): Promise; listAllOrganizationEntries(): Promise; /** * Bulk find blocking entries for multiple emails and domains within an organization. * Single query for N emails and domains - eliminates N+1. */ findBlockingEntriesForEmailsAndDomains(params: { emails: string[]; domains: string[]; organizationId: number; }): Promise; // Write operations createEntry( organizationId: number, data: { type: WatchlistType; value: string; description?: string; action: WatchlistAction; source?: WatchlistSource; } ): Promise; updateEntry( id: string, organizationId: number, data: { value?: string; description?: string; action?: WatchlistAction; source?: WatchlistSource; } ): Promise; deleteEntry(id: string, organizationId: number): Promise; }