1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
use serde::{Deserialize, Serialize};

/// Reason for reporting content (message or server)
#[derive(Serialize, Deserialize, Debug, Clone)]
pub enum ContentReportReason {
    /// No reason has been specified
    NoneSpecified,

    /// Blatantly illegal content
    Illegal,

    /// Content that promotes harm to others / self
    PromotesHarm,

    /// Spam or platform abuse
    SpamAbuse,

    /// Distribution of malware
    Malware,

    /// Harassment or abuse targeted at another user
    Harassment,
}

/// Reason for reporting a user
#[derive(Serialize, Deserialize, Debug, Clone)]
pub enum UserReportReason {
    /// No reason has been specified
    NoneSpecified,

    /// User is sending spam or otherwise abusing the platform
    SpamAbuse,

    /// User's profile contains inappropriate content for a general audience
    InappropriateProfile,

    /// User is impersonating another user
    Impersonation,

    /// User is evading a ban
    BanEvasion,

    /// User is not of minimum age to use the platform
    Underage,
}

/// The content being reported
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(tag = "type")]
pub enum ReportedContent {
    /// Report a message
    Message {
        /// ID of the message
        id: String,
        /// Reason for reporting message
        report_reason: ContentReportReason,
    },
    /// Report a server
    Server {
        /// ID of the server
        id: String,
        /// Reason for reporting server
        report_reason: ContentReportReason,
    },
    /// Report a user
    User {
        /// ID of the user
        id: String,
        /// Reason for reporting a user
        report_reason: UserReportReason,
    },
}

/// Status of the report
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(tag = "status")]
pub enum ReportStatus {
    /// Report is waiting for triage / action
    Created,

    /// Report was rejected
    Rejected { rejection_reason: String },

    /// Report was actioned and resolved
    Resolved,
}

/// User-generated platform moderation report.
#[derive(Deserialize, Debug, Clone)]
pub struct Report {
    /// Unique Id
    #[serde(rename = "_id")]
    pub id: String,
    /// Id of the user creating this report
    pub author_id: String,
    /// Reported content
    pub content: ReportedContent,
    /// Additional report context
    pub additional_context: String,
    /// Status of the report
    #[serde(flatten)]
    pub status: ReportStatus,
    /// Additional notes included on the report
    #[serde(default)]
    pub notes: String,
}