Files
fluxer/packages/api/src/report/IReportRepository.tsx
2026-02-17 12:22:36 +00:00

163 lines
5.2 KiB
TypeScript

/*
* Copyright (C) 2026 Fluxer Contributors
*
* This file is part of Fluxer.
*
* Fluxer is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Fluxer is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with Fluxer. If not, see <https://www.gnu.org/licenses/>.
*/
import type {ChannelID, GuildID, MessageID, ReportID, UserID} from '@fluxer/api/src/BrandedTypes';
import type {MessageAttachment, MessageEmbed, MessageStickerItem} from '@fluxer/api/src/database/types/MessageTypes';
import type {DSAReportEmailVerificationRow, DSAReportTicketRow} from '@fluxer/api/src/database/types/ReportTypes';
export enum ReportStatus {
PENDING = 0,
RESOLVED = 1,
}
export enum ReportType {
MESSAGE = 0,
USER = 1,
GUILD = 2,
}
const REPORT_STATUS_STRINGS: Record<ReportStatus, string> = {
[ReportStatus.PENDING]: 'pending',
[ReportStatus.RESOLVED]: 'resolved',
};
export function reportStatusToString(status: ReportStatus | number): string {
return REPORT_STATUS_STRINGS[status as ReportStatus] ?? 'unknown';
}
type MentionCollection = ReadonlyArray<bigint> | Set<bigint> | null | undefined;
export interface IARMessageContextRow {
message_id: bigint;
channel_id: bigint | null;
author_id: bigint;
author_username: string;
author_discriminator: number;
author_avatar_hash: string | null;
content: string | null;
timestamp: Date;
edited_timestamp: Date | null;
type: number;
flags: number;
mention_everyone: boolean;
mention_users: MentionCollection;
mention_roles: MentionCollection;
mention_channels: MentionCollection;
attachments: Array<MessageAttachment> | null;
embeds: Array<MessageEmbed> | null;
sticker_items: Array<MessageStickerItem> | null;
}
export interface IARMessageContext {
messageId: MessageID;
channelId: ChannelID | null;
authorId: UserID;
authorUsername: string;
authorDiscriminator: number;
authorAvatarHash: string | null;
content: string | null;
timestamp: Date;
editedTimestamp: Date | null;
type: number;
flags: number;
mentionEveryone: boolean;
mentionUsers: Array<bigint>;
mentionRoles: Array<bigint>;
mentionChannels: Array<bigint>;
attachments: Array<MessageAttachment>;
embeds: Array<MessageEmbed>;
stickers: Array<MessageStickerItem>;
}
export interface IARSubmissionRow {
report_id: bigint;
reporter_id: bigint | null;
reporter_email: string | null;
reporter_full_legal_name: string | null;
reporter_country_of_residence: string | null;
reported_at: Date;
status: number;
report_type: number;
category: string;
additional_info: string | null;
reported_user_id: bigint | null;
reported_user_avatar_hash: string | null;
reported_guild_id: bigint | null;
reported_guild_name: string | null;
reported_guild_icon_hash: string | null;
reported_message_id: bigint | null;
reported_channel_id: bigint | null;
reported_channel_name: string | null;
message_context: Array<IARMessageContextRow> | null;
guild_context_id: bigint | null;
resolved_at: Date | null;
resolved_by_admin_id: bigint | null;
public_comment: string | null;
audit_log_reason: string | null;
reported_guild_invite_code: string | null;
}
export interface IARSubmission {
reportId: ReportID;
reporterId: UserID | null;
reporterEmail: string | null;
reporterFullLegalName: string | null;
reporterCountryOfResidence: string | null;
reportedAt: Date;
status: number;
reportType: number;
category: string;
additionalInfo: string | null;
reportedUserId: UserID | null;
reportedUserAvatarHash: string | null;
reportedGuildId: GuildID | null;
reportedGuildName: string | null;
reportedGuildIconHash: string | null;
reportedMessageId: MessageID | null;
reportedChannelId: ChannelID | null;
reportedChannelName: string | null;
messageContext: Array<IARMessageContext> | null;
guildContextId: GuildID | null;
resolvedAt: Date | null;
resolvedByAdminId: UserID | null;
publicComment: string | null;
auditLogReason: string | null;
reportedGuildInviteCode: string | null;
}
export abstract class IReportRepository {
abstract createReport(data: IARSubmissionRow): Promise<IARSubmission>;
abstract getReport(reportId: ReportID): Promise<IARSubmission | null>;
abstract resolveReport(
reportId: ReportID,
resolvedByAdminId: UserID,
publicComment: string | null,
auditLogReason: string | null,
): Promise<IARSubmission>;
abstract listAllReportsPaginated(limit: number, lastReportId?: ReportID): Promise<Array<IARSubmission>>;
abstract upsertDsaEmailVerification(row: DSAReportEmailVerificationRow): Promise<void>;
abstract deleteDsaEmailVerification(emailLower: string): Promise<void>;
abstract getDsaEmailVerification(emailLower: string): Promise<DSAReportEmailVerificationRow | null>;
abstract createDsaTicket(row: DSAReportTicketRow): Promise<void>;
abstract getDsaTicket(ticket: string): Promise<DSAReportTicketRow | null>;
abstract deleteDsaTicket(ticket: string): Promise<void>;
}