Skip to content

Commit f11a65f

Browse files
authored
feat: add new moderation apis (#101)
1 parent e94416a commit f11a65f

File tree

4 files changed

+118
-0
lines changed

4 files changed

+118
-0
lines changed

src/Clients/FlagClient.cs

+12
Original file line numberDiff line numberDiff line change
@@ -35,5 +35,17 @@ public async Task<QueryMessageFlagsResponse> QueryMessageFlags(FlagMessageQueryR
3535
HttpMethod.GET,
3636
HttpStatusCode.OK,
3737
queryParams: request.ToQueryParameters());
38+
39+
public async Task<QueryFlagReportsResponse> QueryFlagReportsAsync(QueryFlagReportsRequest request)
40+
=> await ExecuteRequestAsync<QueryFlagReportsResponse>("moderation/reports",
41+
HttpMethod.POST,
42+
HttpStatusCode.Created,
43+
request);
44+
45+
public async Task<ReviewFlagReportResponse> ReviewFlagReportAsync(string reportId, ReviewFlagReportRequest request)
46+
=> await ExecuteRequestAsync<ReviewFlagReportResponse>($"moderation/reports/{reportId}",
47+
HttpMethod.PATCH,
48+
HttpStatusCode.OK,
49+
request);
3850
}
3951
}

src/Clients/IFlagClient.cs

+12
Original file line numberDiff line numberDiff line change
@@ -32,5 +32,17 @@ public interface IFlagClient
3232
/// </summary>
3333
/// <remarks>https://getstream.io/chat/docs/dotnet-csharp/moderation/?language=csharp#query-message-flags</remarks>
3434
Task<QueryMessageFlagsResponse> QueryMessageFlags(FlagMessageQueryRequest request);
35+
36+
/// <summary>
37+
/// Queries flag reports.
38+
/// </summary>
39+
/// <remarks>https://getstream.io/chat/docs/dotnet-csharp/moderation/?language=csharp</remarks>
40+
Task<QueryFlagReportsResponse> QueryFlagReportsAsync(QueryFlagReportsRequest request);
41+
42+
/// <summary>
43+
/// Sends a flag report review.
44+
/// </summary>
45+
/// <remarks>https://getstream.io/chat/docs/dotnet-csharp/moderation/?language=csharp</remarks>
46+
Task<ReviewFlagReportResponse> ReviewFlagReportAsync(string reportId, ReviewFlagReportRequest request);
3547
}
3648
}

src/Models/Moderation.cs

+71
Original file line numberDiff line numberDiff line change
@@ -104,4 +104,75 @@ public List<KeyValuePair<string, string>> ToQueryParameters()
104104
};
105105
}
106106
}
107+
108+
public class QueryFlagReportsRequest
109+
{
110+
private const int DefaultOffset = 0;
111+
private const int DefaultLimit = 20;
112+
113+
[JsonProperty(NullValueHandling = NullValueHandling.Ignore, PropertyName = "filter_conditions")]
114+
public Dictionary<string, object> FilterConditions { get; set; }
115+
public int Limit { get; set; } = DefaultLimit;
116+
public int Offset { get; set; } = DefaultOffset;
117+
}
118+
119+
public class FlagReport
120+
{
121+
public string Id { get; set; }
122+
public Message Message { get; set; }
123+
124+
[JsonProperty("flags_count")]
125+
public int FlagsCount { get; set; }
126+
127+
[JsonProperty("message_user_id")]
128+
public string MessageUserId { get; set; }
129+
130+
[JsonProperty("channel_cid")]
131+
public string ChannelCid { get; set; }
132+
133+
[JsonProperty("created_at")]
134+
public DateTimeOffset CreatedAt { get; set; }
135+
136+
[JsonProperty("updated_at")]
137+
public DateTimeOffset UpdatedAt { get; set; }
138+
}
139+
140+
public class QueryFlagReportsResponse : ApiResponse
141+
{
142+
[JsonProperty("flag_reports")]
143+
public List<FlagReport> FlagReports { get; set; }
144+
}
145+
146+
public class ReviewFlagReportRequest
147+
{
148+
[JsonProperty(NullValueHandling = NullValueHandling.Ignore, PropertyName = "review_result")]
149+
public string ReviewResult { get; set; }
150+
151+
[JsonProperty(NullValueHandling = NullValueHandling.Ignore, PropertyName = "user_id")]
152+
public string UserId { get; set; }
153+
154+
[JsonProperty(NullValueHandling = NullValueHandling.Ignore, PropertyName = "review_details")]
155+
public Dictionary<string, object> ReviewDetails { get; set; }
156+
}
157+
158+
public class ExtendedFlagReport : FlagReport
159+
{
160+
[JsonProperty("review_result")]
161+
public string ReviewResult { get; set; }
162+
163+
[JsonProperty("review_details")]
164+
public Dictionary<string, object> ReviewDetails { get; set; }
165+
166+
[JsonProperty("reviewed_at")]
167+
public DateTimeOffset ReviewedAt { get; set; }
168+
169+
[JsonProperty("reviewed_by")]
170+
public User ReviewedBy { get; set; }
171+
}
172+
173+
public class ReviewFlagReportResponse : ApiResponse
174+
{
175+
[JsonProperty("flag_report")]
176+
public ExtendedFlagReport FlagReport { get; set; }
177+
}
107178
}

tests/FlagClientTests.cs

+23
Original file line numberDiff line numberDiff line change
@@ -77,5 +77,28 @@ await WaitForAsync(async () =>
7777
return resp.Flags.Count > 0;
7878
});
7979
}
80+
81+
[Test]
82+
public async Task TestQueryFlagAndReviewFlagAsync()
83+
{
84+
await _flagClient.FlagMessageAsync(_message.Id, _chanMember2.Id);
85+
86+
var queryResp = await _flagClient.QueryFlagReportsAsync(new QueryFlagReportsRequest
87+
{
88+
FilterConditions = new Dictionary<string, object>
89+
{
90+
{ "message_id", _message.Id },
91+
},
92+
});
93+
var report = queryResp.FlagReports[0];
94+
report.Message.Id.Should().Be(_message.Id);
95+
96+
var reviewResp = await _flagClient.ReviewFlagReportAsync(report.Id, new ReviewFlagReportRequest
97+
{
98+
ReviewResult = "reviewed",
99+
UserId = _chanMember1.Id,
100+
});
101+
reviewResp.FlagReport.ReviewResult.Should().Be("reviewed");
102+
}
80103
}
81104
}

0 commit comments

Comments
 (0)