// SPDX-License-Identifier: AGPL-3.0-or-later import type {UserID} from '../BrandedTypes'; import type { AdminAuditLogRow, BannedAvatarHashRow, BannedFileShaRow, BannedProfileSubstringRow, BannedProfileSubstringScope, BannedUrlDomainRow, BannedUrlRow, } from '../database/types/AdminArchiveTypes'; export interface AdminAuditLog { logId: bigint; adminUserId: UserID; targetType: string; targetId: bigint; action: string; auditLogReason: string | null; metadata: Map; createdAt: Date; } export type BannedIpKind = 'permanent' | 'temporary_24h'; export interface BannedIpEntry { ip: string; kind: BannedIpKind; reason: string | null; expiresAt: Date | null; createdAt: Date | null; } export interface DisposableEmailDomainPage { domains: Array; pageState: string | null; } export abstract class IAdminRepository { abstract createAuditLog(log: AdminAuditLogRow): Promise; abstract getAuditLog(logId: bigint): Promise; abstract listAuditLogsByIds(logIds: Array): Promise>; abstract listAllAuditLogsPaginated(limit: number, lastLogId?: bigint): Promise>; abstract isIpBanned(ip: string): Promise; abstract banIp(ip: string): Promise; abstract banIpTemp(ip: string, ttlSeconds: number): Promise; abstract unbanIp(ip: string): Promise; abstract loadAllBannedIpEntries(): Promise>; abstract isEmailBanned(email: string): Promise; abstract banEmail(email: string): Promise; abstract unbanEmail(email: string): Promise; abstract isEmailDomainSuspicious(domain: string): Promise; abstract addSuspiciousEmailDomain(domain: string): Promise; abstract removeSuspiciousEmailDomain(domain: string): Promise; abstract listSuspiciousEmailDomains(limit?: number): Promise>; abstract isEmailDomainDisposable(domain: string): Promise; abstract addDisposableEmailDomain(domain: string): Promise; abstract removeDisposableEmailDomain(domain: string): Promise; abstract listDisposableEmailDomains(limit?: number): Promise>; abstract listDisposableEmailDomainsPage(limit: number, pageState?: string | null): Promise; abstract isPhraseBanned(phrase: string): Promise; abstract banPhrase(phrase: string): Promise; abstract unbanPhrase(phrase: string): Promise; abstract loadAllBannedPhrases(): Promise>; abstract loadAllBannedPhonePrefixes(): Promise>; abstract loadAllBannedIps(): Promise>; abstract isUrlBanned(url: string): Promise; abstract banUrl(row: BannedUrlRow): Promise; abstract unbanUrl(url: string): Promise; abstract loadAllBannedUrls(): Promise>; abstract isUrlDomainBanned(domain: string): Promise; abstract banUrlDomain(row: BannedUrlDomainRow): Promise; abstract unbanUrlDomain(domain: string): Promise; abstract loadAllBannedUrlDomains(): Promise>; abstract isFileShaBanned(sha256Hex: string): Promise; abstract banFileSha(row: BannedFileShaRow): Promise; abstract unbanFileSha(sha256Hex: string): Promise; abstract loadAllBannedFileShas(): Promise>; abstract isAvatarHashBanned(hashShort: string): Promise; abstract banAvatarHash(row: BannedAvatarHashRow): Promise; abstract unbanAvatarHash(hashShort: string): Promise; abstract loadAllBannedAvatarHashes(): Promise>; abstract banProfileSubstring(row: BannedProfileSubstringRow): Promise; abstract unbanProfileSubstring(scope: BannedProfileSubstringScope, substring: string): Promise; abstract loadAllBannedProfileSubstrings(): Promise>; }