From 72b632ee88b11389dac75f22b14922e0210e910b Mon Sep 17 00:00:00 2001 From: Rafael Marinho Date: Thu, 22 Jan 2026 09:36:38 +0100 Subject: [PATCH 1/2] [CHA-1427] add moderation routes --- .../chat/java/models/Moderation.java | 1938 ++++++++++++++++- .../chat/java/services/ModerationService.java | 126 ++ 2 files changed, 2035 insertions(+), 29 deletions(-) diff --git a/src/main/java/io/getstream/chat/java/models/Moderation.java b/src/main/java/io/getstream/chat/java/models/Moderation.java index 4678285cd..0218a152e 100644 --- a/src/main/java/io/getstream/chat/java/models/Moderation.java +++ b/src/main/java/io/getstream/chat/java/models/Moderation.java @@ -176,7 +176,7 @@ public static class UpsertConfigResponse extends StreamResponseObject { } @Getter - @EqualsAndHashCode + @EqualsAndHashCode(callSuper = false) @RequiredArgsConstructor public static class DeleteConfigRequest extends StreamRequest { @NotNull private String key; @@ -188,7 +188,7 @@ protected Call generateCall(Client client) { } @Getter - @EqualsAndHashCode + @EqualsAndHashCode(callSuper = false) @RequiredArgsConstructor public static class ConfigGetRequest extends StreamRequest { @NotNull private String key; @@ -199,36 +199,1916 @@ protected Call generateCall(Client client) { } } - /** - * Creates an upsert config request - * - * @param key the moderation config key - * @return the created request - */ - @NotNull - public static UpsertConfigRequest upsertConfig(@NotNull String key) { - return new UpsertConfigRequest(key); + // Phase 1: Core Moderation Actions - Flag + @Builder( + builderClassName = "FlagRequest", + builderMethodName = "", + buildMethodName = "internalBuild") + @Getter + @EqualsAndHashCode + public static class FlagRequestData { + @NotNull + @JsonProperty("entity_type") + private String entityType; + + @NotNull + @JsonProperty("entity_id") + private String entityId; + + @NotNull + @JsonProperty("reason") + private String reason; + + @Nullable + @JsonProperty("entity_creator_id") + private String entityCreatorId; + + @Nullable + @JsonProperty("user_id") + private String userId; + + @Nullable + @JsonProperty("moderation_payload") + private ModerationPayload moderationPayload; + + @Nullable + @JsonProperty("custom") + private java.util.Map custom; + + public static class FlagRequest extends StreamRequest { + @Override + protected Call generateCall(Client client) { + return client.create(ModerationService.class).flag(this.internalBuild()); + } + } } - /** - * Creates a delete config request - * - * @param key the moderation config key - * @return the created request - */ - @NotNull - public static DeleteConfigRequest deleteConfig(@NotNull String key) { - return new DeleteConfigRequest(key); + @Data + @NoArgsConstructor + @EqualsAndHashCode(callSuper = true) + public static class FlagResponse extends StreamResponseObject { + // Response typically contains duration and other metadata } - /* - * Creates a get config request - * - * @param key the moderation config key - * @return the created request - */ - @NotNull - public static ConfigGetRequest getConfig(@NotNull String key) { - return new ConfigGetRequest(key); + // Phase 1: Core Moderation Actions - Mute + @Builder( + builderClassName = "MuteRequest", + builderMethodName = "", + buildMethodName = "internalBuild") + @Getter + @EqualsAndHashCode + public static class MuteRequestData { + @NotNull + @JsonProperty("target_ids") + private List targetIds; + + @Nullable + @JsonProperty("user_id") + private String userId; + + @Nullable + @JsonProperty("timeout") + private Integer timeout; + + public static class MuteRequest extends StreamRequest { + @Override + protected Call generateCall(Client client) { + return client.create(ModerationService.class).mute(this.internalBuild()); + } + } + } + + @Data + @NoArgsConstructor + @EqualsAndHashCode(callSuper = true) + public static class MuteResponse extends StreamResponseObject { + @Nullable + @JsonProperty("mutes") + private List mutes; + } + + // Phase 1: Core Moderation Actions - Unmute + @Builder( + builderClassName = "UnmuteRequest", + builderMethodName = "", + buildMethodName = "internalBuild") + @Getter + @EqualsAndHashCode + public static class UnmuteRequestData { + @NotNull + @JsonProperty("target_ids") + private List targetIds; + + @Nullable + @JsonProperty("user_id") + private String userId; + + public static class UnmuteRequest extends StreamRequest { + @Override + protected Call generateCall(Client client) { + return client.create(ModerationService.class).unmute(this.internalBuild()); + } + } + } + + @Data + @NoArgsConstructor + @EqualsAndHashCode(callSuper = true) + public static class UnmuteResponse extends StreamResponseObject { + // Response typically contains duration and other metadata + } + + // Phase 1: Core Moderation Actions - Check + @Builder( + builderClassName = "CheckRequest", + builderMethodName = "", + buildMethodName = "internalBuild") + @Getter + @EqualsAndHashCode + public static class CheckRequestData { + @NotNull + @JsonProperty("entity_type") + private String entityType; + + @NotNull + @JsonProperty("entity_id") + private String entityId; + + @NotNull + @JsonProperty("moderation_payload") + private ModerationPayload moderationPayload; + + @NotNull + @JsonProperty("config_key") + private String configKey; + + @Nullable + @JsonProperty("entity_creator_id") + private String entityCreatorId; + + @Nullable + @JsonProperty("options") + private CheckOptions options; + + public static class CheckRequest extends StreamRequest { + @Override + protected Call generateCall(Client client) { + return client.create(ModerationService.class).check(this.internalBuild()); + } + } + } + + @Data + @NoArgsConstructor + @Builder + @AllArgsConstructor + public static class ModerationPayload { + @Nullable + @JsonProperty("texts") + private List texts; + + @Nullable + @JsonProperty("images") + private List images; + + @Nullable + @JsonProperty("videos") + private List videos; + + @Nullable + @JsonProperty("custom") + private java.util.Map custom; + } + + @Data + @NoArgsConstructor + @Builder + @AllArgsConstructor + public static class CheckOptions { + @Nullable + @JsonProperty("force_sync") + private Boolean forceSync; + + @Nullable + @JsonProperty("test_mode") + private Boolean testMode; + } + + @Data + @NoArgsConstructor + @EqualsAndHashCode(callSuper = true) + public static class CheckResponse extends StreamResponseObject { + @Nullable + @JsonProperty("status") + private String status; + + @Nullable + @JsonProperty("recommended_action") + private String recommendedAction; + + @Nullable + @JsonProperty("flags") + private List flags; + } + + @Data + @NoArgsConstructor + public static class FlagInfo { + @Nullable + @JsonProperty("type") + private String type; + + @Nullable + @JsonProperty("value") + private String value; + } + + // Phase 1: Core Moderation Actions - Custom Check + @Builder( + builderClassName = "CustomCheckRequest", + builderMethodName = "", + buildMethodName = "internalBuild") + @Getter + @EqualsAndHashCode + public static class CustomCheckRequestData { + @NotNull + @JsonProperty("entity_type") + private String entityType; + + @NotNull + @JsonProperty("entity_id") + private String entityId; + + @NotNull + @JsonProperty("flags") + private List flags; + + @Nullable + @JsonProperty("entity_creator_id") + private String entityCreatorId; + + @Nullable + @JsonProperty("moderation_payload") + private ModerationPayload moderationPayload; + + public static class CustomCheckRequest extends StreamRequest { + @Override + protected Call generateCall(Client client) { + return client.create(ModerationService.class).customCheck(this.internalBuild()); + } + } + } + + @Data + @NoArgsConstructor + @EqualsAndHashCode(callSuper = true) + public static class CustomCheckResponse extends StreamResponseObject { + // Response typically contains duration and other metadata + } + + // Phase 1: Core Moderation Actions - Query Review Queue + @Builder( + builderClassName = "QueryReviewQueueRequest", + builderMethodName = "", + buildMethodName = "internalBuild") + @Getter + @EqualsAndHashCode + public static class QueryReviewQueueRequestData { + @Nullable + @JsonProperty("filter") + private java.util.Map filter; + + @Nullable + @JsonProperty("sort") + private List sort; + + @Nullable + @JsonProperty("limit") + private Integer limit; + + @Nullable + @JsonProperty("offset") + private Integer offset; + + @Nullable + @JsonProperty("next") + private String next; + + @Nullable + @JsonProperty("prev") + private String prev; + + @Nullable + @JsonProperty("lock_items") + private Boolean lockItems; + + @Nullable + @JsonProperty("lock_duration") + private String lockDuration; + + @Nullable + @JsonProperty("lock_count") + private Integer lockCount; + + @Nullable + @JsonProperty("stats_only") + private Boolean statsOnly; + + public static class QueryReviewQueueRequest extends StreamRequest { + @Override + protected Call generateCall(Client client) { + return client.create(ModerationService.class).queryReviewQueue(this.internalBuild()); + } + } + } + + @Data + @NoArgsConstructor + @EqualsAndHashCode(callSuper = true) + public static class QueryReviewQueueResponse extends StreamResponseObject { + @Nullable + @JsonProperty("items") + private List items; + + @Nullable + @JsonProperty("stats") + private java.util.Map stats; + + @Nullable + @JsonProperty("next") + private String next; + + @Nullable + @JsonProperty("prev") + private String prev; + } + + @Data + @NoArgsConstructor + public static class ReviewQueueItem { + @Nullable + @JsonProperty("id") + private String id; + + @Nullable + @JsonProperty("entity_type") + private String entityType; + + @Nullable + @JsonProperty("entity_id") + private String entityId; + + @Nullable + @JsonProperty("created_at") + private Date createdAt; + + @Nullable + @JsonProperty("updated_at") + private Date updatedAt; + } + + // Phase 1: Core Moderation Actions - Query Configs + @Builder( + builderClassName = "QueryConfigsRequest", + builderMethodName = "", + buildMethodName = "internalBuild") + @Getter + @EqualsAndHashCode + public static class QueryConfigsRequestData { + @Nullable + @JsonProperty("filter") + private java.util.Map filter; + + @Nullable + @JsonProperty("sort") + private List sort; + + @Nullable + @JsonProperty("limit") + private Integer limit; + + @Nullable + @JsonProperty("offset") + private Integer offset; + + @Nullable + @JsonProperty("next") + private String next; + + @Nullable + @JsonProperty("prev") + private String prev; + + public static class QueryConfigsRequest extends StreamRequest { + @Override + protected Call generateCall(Client client) { + return client.create(ModerationService.class).queryConfigs(this.internalBuild()); + } + } + } + + @Data + @NoArgsConstructor + @EqualsAndHashCode(callSuper = true) + public static class QueryConfigsResponse extends StreamResponseObject { + @Nullable + @JsonProperty("configs") + private List configs; + + @Nullable + @JsonProperty("next") + private String next; + + @Nullable + @JsonProperty("prev") + private String prev; + } + + // Phase 1: Core Moderation Actions - Submit Action + @Builder( + builderClassName = "SubmitActionRequest", + builderMethodName = "", + buildMethodName = "internalBuild") + @Getter + @EqualsAndHashCode + public static class SubmitActionRequestData { + @NotNull + @JsonProperty("action_type") + private String actionType; + + @NotNull + @JsonProperty("item_id") + private String itemId; + + @Nullable + @JsonProperty("user_id") + private String userId; + + @Nullable + @JsonProperty("details") + private java.util.Map details; + + public static class SubmitActionRequest extends StreamRequest { + @Override + protected Call generateCall(Client client) { + return client.create(ModerationService.class).submitAction(this.internalBuild()); + } + } + } + + @Data + @NoArgsConstructor + @EqualsAndHashCode(callSuper = true) + public static class SubmitActionResponse extends StreamResponseObject { + // Response typically contains duration and other metadata + } + + // Phase 1: Core Moderation Actions - Get User Report + @Getter + @EqualsAndHashCode(callSuper = false) + public static class GetUserReportRequest extends StreamRequest { + @NotNull private String userId; + @Nullable private Boolean createUserIfNotExists; + @Nullable private Boolean includeUserBlocks; + @Nullable private Boolean includeUserMutes; + + private GetUserReportRequest( + @NotNull String userId, + @Nullable Boolean createUserIfNotExists, + @Nullable Boolean includeUserBlocks, + @Nullable Boolean includeUserMutes) { + this.userId = userId; + this.createUserIfNotExists = createUserIfNotExists; + this.includeUserBlocks = includeUserBlocks; + this.includeUserMutes = includeUserMutes; + } + + @Override + protected Call generateCall(Client client) { + return client + .create(ModerationService.class) + .getUserReport( + this.userId, + this.createUserIfNotExists, + this.includeUserBlocks, + this.includeUserMutes); + } + } + + @Data + @NoArgsConstructor + @EqualsAndHashCode(callSuper = true) + public static class GetUserReportResponse extends StreamResponseObject { + @Nullable + @JsonProperty("user") + private User user; + + @Nullable + @JsonProperty("flags") + private List flags; + + @Nullable + @JsonProperty("bans") + private List bans; + + @Nullable + @JsonProperty("mutes") + private List mutes; + } + + // Phase 2: Additional V2 Endpoints - Block + @Builder( + builderClassName = "BlockRequest", + builderMethodName = "", + buildMethodName = "internalBuild") + @Getter + @EqualsAndHashCode + public static class BlockRequestData { + @NotNull + @JsonProperty("target_ids") + private List targetIds; + + @Nullable + @JsonProperty("user_id") + private String userId; + + public static class BlockRequest extends StreamRequest { + @Override + protected Call generateCall(Client client) { + return client.create(ModerationService.class).block(this.internalBuild()); + } + } + } + + @Data + @NoArgsConstructor + @EqualsAndHashCode(callSuper = true) + public static class BlockResponse extends StreamResponseObject { + // Response typically contains duration and other metadata + } + + // Phase 2: Additional V2 Endpoints - Ban + @Builder( + builderClassName = "BanRequest", + builderMethodName = "", + buildMethodName = "internalBuild") + @Getter + @EqualsAndHashCode + public static class BanRequestData { + @NotNull + @JsonProperty("target_ids") + private List targetIds; + + @Nullable + @JsonProperty("user_id") + private String userId; + + @Nullable + @JsonProperty("timeout") + private Integer timeout; + + @Nullable + @JsonProperty("reason") + private String reason; + + @Nullable + @JsonProperty("shadow") + private Boolean shadow; + + @Nullable + @JsonProperty("ip_ban") + private Boolean ipBan; + + public static class BanRequest extends StreamRequest { + @Override + protected Call generateCall(Client client) { + return client.create(ModerationService.class).ban(this.internalBuild()); + } + } + } + + @Data + @NoArgsConstructor + @EqualsAndHashCode(callSuper = true) + public static class BanResponse extends StreamResponseObject { + @Nullable + @JsonProperty("bans") + private List bans; + } + + // Phase 2: Additional V2 Endpoints - Unban + @Builder( + builderClassName = "UnbanRequest", + builderMethodName = "", + buildMethodName = "internalBuild") + @Getter + @EqualsAndHashCode + public static class UnbanRequestData { + @NotNull + @JsonProperty("target_ids") + private List targetIds; + + @Nullable + @JsonProperty("user_id") + private String userId; + + @Nullable + @JsonProperty("shadow") + private Boolean shadow; + + public static class UnbanRequest extends StreamRequest { + @Override + protected Call generateCall(Client client) { + return client.create(ModerationService.class).unban(this.internalBuild()); + } + } + } + + @Data + @NoArgsConstructor + @EqualsAndHashCode(callSuper = true) + public static class UnbanResponse extends StreamResponseObject { + // Response typically contains duration and other metadata + } + + // Phase 2: Additional V2 Endpoints - Appeal + @Builder( + builderClassName = "AppealRequest", + builderMethodName = "", + buildMethodName = "internalBuild") + @Getter + @EqualsAndHashCode + public static class AppealRequestData { + @NotNull + @JsonProperty("ban_id") + private String banId; + + @NotNull + @JsonProperty("user_id") + private String userId; + + @Nullable + @JsonProperty("reason") + private String reason; + + public static class AppealRequest extends StreamRequest { + @Override + protected Call generateCall(Client client) { + return client.create(ModerationService.class).appeal(this.internalBuild()); + } + } + } + + @Data + @NoArgsConstructor + @EqualsAndHashCode(callSuper = true) + public static class AppealResponse extends StreamResponseObject { + @Nullable + @JsonProperty("appeal") + private Appeal appeal; + } + + @Data + @NoArgsConstructor + public static class Appeal { + @Nullable + @JsonProperty("id") + private String id; + + @Nullable + @JsonProperty("ban_id") + private String banId; + + @Nullable + @JsonProperty("user_id") + private String userId; + + @Nullable + @JsonProperty("reason") + private String reason; + + @Nullable + @JsonProperty("status") + private String status; + + @Nullable + @JsonProperty("created_at") + private Date createdAt; + } + + // Phase 2: Additional V2 Endpoints - Get Appeal + @Getter + @EqualsAndHashCode(callSuper = false) + @RequiredArgsConstructor + public static class GetAppealRequest extends StreamRequest { + @NotNull private String id; + + @Override + protected Call generateCall(Client client) { + return client.create(ModerationService.class).getAppeal(this.id); + } + } + + @Data + @NoArgsConstructor + @EqualsAndHashCode(callSuper = true) + public static class GetAppealResponse extends StreamResponseObject { + @Nullable + @JsonProperty("appeal") + private Appeal appeal; + } + + // Phase 2: Additional V2 Endpoints - Query Appeals + @Builder( + builderClassName = "QueryAppealsRequest", + builderMethodName = "", + buildMethodName = "internalBuild") + @Getter + @EqualsAndHashCode + public static class QueryAppealsRequestData { + @Nullable + @JsonProperty("filter") + private java.util.Map filter; + + @Nullable + @JsonProperty("sort") + private List sort; + + @Nullable + @JsonProperty("limit") + private Integer limit; + + @Nullable + @JsonProperty("offset") + private Integer offset; + + @Nullable + @JsonProperty("next") + private String next; + + @Nullable + @JsonProperty("prev") + private String prev; + + public static class QueryAppealsRequest extends StreamRequest { + @Override + protected Call generateCall(Client client) { + return client.create(ModerationService.class).queryAppeals(this.internalBuild()); + } + } + } + + @Data + @NoArgsConstructor + @EqualsAndHashCode(callSuper = true) + public static class QueryAppealsResponse extends StreamResponseObject { + @Nullable + @JsonProperty("appeals") + private List appeals; + + @Nullable + @JsonProperty("next") + private String next; + + @Nullable + @JsonProperty("prev") + private String prev; + } + + // Phase 2: Additional V2 Endpoints - Query Moderation Flags + @Builder( + builderClassName = "QueryModerationFlagsRequest", + builderMethodName = "", + buildMethodName = "internalBuild") + @Getter + @EqualsAndHashCode + public static class QueryModerationFlagsRequestData { + @Nullable + @JsonProperty("filter") + private java.util.Map filter; + + @Nullable + @JsonProperty("sort") + private List sort; + + @Nullable + @JsonProperty("limit") + private Integer limit; + + @Nullable + @JsonProperty("offset") + private Integer offset; + + @Nullable + @JsonProperty("next") + private String next; + + @Nullable + @JsonProperty("prev") + private String prev; + + public static class QueryModerationFlagsRequest + extends StreamRequest { + @Override + protected Call generateCall(Client client) { + return client.create(ModerationService.class).queryModerationFlags(this.internalBuild()); + } + } + } + + @Data + @NoArgsConstructor + @EqualsAndHashCode(callSuper = true) + public static class QueryModerationFlagsResponse extends StreamResponseObject { + @Nullable + @JsonProperty("flags") + private List flags; + + @Nullable + @JsonProperty("next") + private String next; + + @Nullable + @JsonProperty("prev") + private String prev; + } + + // Phase 2: Additional V2 Endpoints - Query Moderation Logs + @Builder( + builderClassName = "QueryModerationLogsRequest", + builderMethodName = "", + buildMethodName = "internalBuild") + @Getter + @EqualsAndHashCode + public static class QueryModerationLogsRequestData { + @Nullable + @JsonProperty("filter") + private java.util.Map filter; + + @Nullable + @JsonProperty("sort") + private List sort; + + @Nullable + @JsonProperty("limit") + private Integer limit; + + @Nullable + @JsonProperty("offset") + private Integer offset; + + @Nullable + @JsonProperty("next") + private String next; + + @Nullable + @JsonProperty("prev") + private String prev; + + public static class QueryModerationLogsRequest + extends StreamRequest { + @Override + protected Call generateCall(Client client) { + return client.create(ModerationService.class).queryModerationLogs(this.internalBuild()); + } + } + } + + @Data + @NoArgsConstructor + @EqualsAndHashCode(callSuper = true) + public static class QueryModerationLogsResponse extends StreamResponseObject { + @Nullable + @JsonProperty("logs") + private List logs; + + @Nullable + @JsonProperty("next") + private String next; + + @Nullable + @JsonProperty("prev") + private String prev; + } + + @Data + @NoArgsConstructor + public static class ModerationLog { + @Nullable + @JsonProperty("id") + private String id; + + @Nullable + @JsonProperty("action") + private String action; + + @Nullable + @JsonProperty("user_id") + private String userId; + + @Nullable + @JsonProperty("created_at") + private Date createdAt; + } + + // Phase 2: Additional V2 Endpoints - Query Usage Stats + @Builder( + builderClassName = "QueryUsageStatsRequest", + builderMethodName = "", + buildMethodName = "internalBuild") + @Getter + @EqualsAndHashCode + public static class QueryUsageStatsRequestData { + @Nullable + @JsonProperty("filter") + private java.util.Map filter; + + @Nullable + @JsonProperty("start_time") + private String startTime; + + @Nullable + @JsonProperty("end_time") + private String endTime; + + public static class QueryUsageStatsRequest extends StreamRequest { + @Override + protected Call generateCall(Client client) { + return client.create(ModerationService.class).queryUsageStats(this.internalBuild()); + } + } + } + + @Data + @NoArgsConstructor + @EqualsAndHashCode(callSuper = true) + public static class QueryUsageStatsResponse extends StreamResponseObject { + @Nullable + @JsonProperty("stats") + private java.util.Map stats; + } + + // Phase 2: Additional V2 Endpoints - Get Moderation Analytics + @Builder( + builderClassName = "GetModerationAnalyticsRequest", + builderMethodName = "", + buildMethodName = "internalBuild") + @Getter + @EqualsAndHashCode + public static class GetModerationAnalyticsRequestData { + @Nullable + @JsonProperty("start_time") + private String startTime; + + @Nullable + @JsonProperty("end_time") + private String endTime; + + @Nullable + @JsonProperty("group_by") + private List groupBy; + + public static class GetModerationAnalyticsRequest + extends StreamRequest { + @Override + protected Call generateCall(Client client) { + return client.create(ModerationService.class).getModerationAnalytics(this.internalBuild()); + } + } + } + + @Data + @NoArgsConstructor + @EqualsAndHashCode(callSuper = true) + public static class GetModerationAnalyticsResponse extends StreamResponseObject { + @Nullable + @JsonProperty("analytics") + private java.util.Map analytics; + } + + // Phase 2: Additional V2 Endpoints - Get Review Queue Item + @Getter + @EqualsAndHashCode(callSuper = false) + @RequiredArgsConstructor + public static class GetReviewQueueItemRequest extends StreamRequest { + @NotNull private String id; + + @Override + protected Call generateCall(Client client) { + return client.create(ModerationService.class).getReviewQueueItem(this.id); + } + } + + @Data + @NoArgsConstructor + @EqualsAndHashCode(callSuper = true) + public static class GetReviewQueueItemResponse extends StreamResponseObject { + @Nullable + @JsonProperty("item") + private ReviewQueueItem item; + } + + // Phase 2: Additional V2 Endpoints - Get Moderator Stats + @Getter + @EqualsAndHashCode(callSuper = false) + public static class GetModeratorStatsRequest extends StreamRequest { + @Nullable private String userId; + @Nullable private String startTime; + @Nullable private String endTime; + + private GetModeratorStatsRequest( + @Nullable String userId, @Nullable String startTime, @Nullable String endTime) { + this.userId = userId; + this.startTime = startTime; + this.endTime = endTime; + } + + @Override + protected Call generateCall(Client client) { + return client + .create(ModerationService.class) + .getModeratorStats(this.userId, this.startTime, this.endTime); + } + } + + @Data + @NoArgsConstructor + @EqualsAndHashCode(callSuper = true) + public static class ModeratorStatsResponse extends StreamResponseObject { + @Nullable + @JsonProperty("stats") + private java.util.Map stats; + } + + // Phase 2: Additional V2 Endpoints - Get Queue Stats + @Getter + @EqualsAndHashCode(callSuper = false) + public static class GetQueueStatsRequest extends StreamRequest { + @Nullable private String startTime; + @Nullable private String endTime; + + private GetQueueStatsRequest(@Nullable String startTime, @Nullable String endTime) { + this.startTime = startTime; + this.endTime = endTime; + } + + @Override + protected Call generateCall(Client client) { + return client.create(ModerationService.class).getQueueStats(this.startTime, this.endTime); + } + } + + @Data + @NoArgsConstructor + @EqualsAndHashCode(callSuper = true) + public static class QueueStatsResponse extends StreamResponseObject { + @Nullable + @JsonProperty("stats") + private java.util.Map stats; + } + + // Phase 2: Additional V2 Endpoints - Export Moderation Logs + @Builder( + builderClassName = "ExportModerationLogsRequest", + builderMethodName = "", + buildMethodName = "internalBuild") + @Getter + @EqualsAndHashCode + public static class ExportModerationLogsRequestData { + @Nullable + @JsonProperty("filter") + private java.util.Map filter; + + @Nullable + @JsonProperty("format") + private String format; + + public static class ExportModerationLogsRequest + extends StreamRequest { + @Override + protected Call generateCall(Client client) { + return client.create(ModerationService.class).exportModerationLogs(this.internalBuild()); + } + } + } + + @Data + @NoArgsConstructor + @EqualsAndHashCode(callSuper = true) + public static class ExportModerationLogsResponse extends StreamResponseObject { + @Nullable + @JsonProperty("task_id") + private String taskId; + } + + // Phase 2: Additional V2 Endpoints - Bulk Image Moderation + @Builder( + builderClassName = "BulkImageModerationRequest", + builderMethodName = "", + buildMethodName = "internalBuild") + @Getter + @EqualsAndHashCode + public static class BulkImageModerationRequestData { + @NotNull + @JsonProperty("image_urls") + private List imageUrls; + + @NotNull + @JsonProperty("config_key") + private String configKey; + + public static class BulkImageModerationRequest + extends StreamRequest { + @Override + protected Call generateCall(Client client) { + return client.create(ModerationService.class).bulkImageModeration(this.internalBuild()); + } + } + } + + @Data + @NoArgsConstructor + @EqualsAndHashCode(callSuper = true) + public static class BulkImageModerationResponse extends StreamResponseObject { + @Nullable + @JsonProperty("results") + private List results; + } + + // Phase 2: Additional V2 Endpoints - Bulk Submit Action + @Builder( + builderClassName = "BulkSubmitActionRequest", + builderMethodName = "", + buildMethodName = "internalBuild") + @Getter + @EqualsAndHashCode + public static class BulkSubmitActionRequestData { + @NotNull + @JsonProperty("actions") + private List actions; + + public static class BulkSubmitActionRequest extends StreamRequest { + @Override + protected Call generateCall(Client client) { + return client.create(ModerationService.class).bulkSubmitAction(this.internalBuild()); + } + } + } + + @Data + @NoArgsConstructor + @Builder + @AllArgsConstructor + public static class BulkActionItem { + @NotNull + @JsonProperty("action_type") + private String actionType; + + @NotNull + @JsonProperty("item_id") + private String itemId; + + @Nullable + @JsonProperty("user_id") + private String userId; + + @Nullable + @JsonProperty("details") + private java.util.Map details; + } + + @Data + @NoArgsConstructor + @EqualsAndHashCode(callSuper = true) + public static class BulkSubmitActionResponse extends StreamResponseObject { + @Nullable + @JsonProperty("results") + private List results; + } + + // Phase 3: Feeds Moderation & Rules - Upsert Template + @Builder( + builderClassName = "UpsertTemplateRequest", + builderMethodName = "", + buildMethodName = "internalBuild") + @Getter + @EqualsAndHashCode + public static class UpsertTemplateRequestData { + @NotNull + @JsonProperty("name") + private String name; + + @Nullable + @JsonProperty("team") + private String team; + + @Nullable + @JsonProperty("template") + private java.util.Map template; + + public static class UpsertTemplateRequest extends StreamRequest { + @Override + protected Call generateCall(Client client) { + return client.create(ModerationService.class).upsertTemplate(this.internalBuild()); + } + } + } + + @Data + @NoArgsConstructor + @EqualsAndHashCode(callSuper = true) + public static class UpsertTemplateResponse extends StreamResponseObject { + @Nullable + @JsonProperty("template") + private FeedModerationTemplate template; + } + + @Data + @NoArgsConstructor + public static class FeedModerationTemplate { + @Nullable + @JsonProperty("name") + private String name; + + @Nullable + @JsonProperty("team") + private String team; + + @Nullable + @JsonProperty("template") + private java.util.Map template; + + @Nullable + @JsonProperty("created_at") + private Date createdAt; + + @Nullable + @JsonProperty("updated_at") + private Date updatedAt; + } + + // Phase 3: Feeds Moderation & Rules - Query Templates + @Getter + @EqualsAndHashCode(callSuper = false) + public static class QueryFeedModerationTemplatesRequest + extends StreamRequest { + @Nullable private String filter; + @Nullable private Integer limit; + @Nullable private Integer offset; + + private QueryFeedModerationTemplatesRequest( + @Nullable String filter, @Nullable Integer limit, @Nullable Integer offset) { + this.filter = filter; + this.limit = limit; + this.offset = offset; + } + + @Override + protected Call generateCall(Client client) { + return client + .create(ModerationService.class) + .queryFeedModerationTemplates(this.filter, this.limit, this.offset); + } + } + + @Data + @NoArgsConstructor + @EqualsAndHashCode(callSuper = true) + public static class QueryFeedModerationTemplatesResponse extends StreamResponseObject { + @Nullable + @JsonProperty("templates") + private List templates; + } + + // Phase 3: Feeds Moderation & Rules - Delete Template + @Getter + @EqualsAndHashCode(callSuper = false) + public static class DeleteModerationTemplateRequest extends StreamRequest { + @NotNull private String name; + @Nullable private String team; + + private DeleteModerationTemplateRequest(@NotNull String name, @Nullable String team) { + this.name = name; + this.team = team; + } + + @Override + protected Call generateCall(Client client) { + return client.create(ModerationService.class).deleteModerationTemplate(this.name, this.team); + } + } + + // Phase 3: Feeds Moderation & Rules - Upsert Moderation Rule + @Builder( + builderClassName = "UpsertModerationRuleRequest", + builderMethodName = "", + buildMethodName = "internalBuild") + @Getter + @EqualsAndHashCode + public static class UpsertModerationRuleRequestData { + @NotNull + @JsonProperty("id") + private String id; + + @Nullable + @JsonProperty("name") + private String name; + + @Nullable + @JsonProperty("description") + private String description; + + @Nullable + @JsonProperty("enabled") + private Boolean enabled; + + @Nullable + @JsonProperty("conditions") + private java.util.Map conditions; + + @Nullable + @JsonProperty("actions") + private List> actions; + + public static class UpsertModerationRuleRequest + extends StreamRequest { + @Override + protected Call generateCall(Client client) { + return client.create(ModerationService.class).upsertModerationRule(this.internalBuild()); + } + } + } + + @Data + @NoArgsConstructor + @EqualsAndHashCode(callSuper = true) + public static class UpsertModerationRuleResponse extends StreamResponseObject { + @Nullable + @JsonProperty("rule") + private ModerationRule rule; + } + + @Data + @NoArgsConstructor + public static class ModerationRule { + @Nullable + @JsonProperty("id") + private String id; + + @Nullable + @JsonProperty("name") + private String name; + + @Nullable + @JsonProperty("description") + private String description; + + @Nullable + @JsonProperty("enabled") + private Boolean enabled; + + @Nullable + @JsonProperty("conditions") + private java.util.Map conditions; + + @Nullable + @JsonProperty("actions") + private List> actions; + + @Nullable + @JsonProperty("created_at") + private Date createdAt; + + @Nullable + @JsonProperty("updated_at") + private Date updatedAt; + } + + // Phase 3: Feeds Moderation & Rules - Query Moderation Rules + @Builder( + builderClassName = "QueryModerationRulesRequest", + builderMethodName = "", + buildMethodName = "internalBuild") + @Getter + @EqualsAndHashCode + public static class QueryModerationRulesRequestData { + @Nullable + @JsonProperty("filter") + private java.util.Map filter; + + @Nullable + @JsonProperty("sort") + private List sort; + + @Nullable + @JsonProperty("limit") + private Integer limit; + + @Nullable + @JsonProperty("offset") + private Integer offset; + + @Nullable + @JsonProperty("next") + private String next; + + @Nullable + @JsonProperty("prev") + private String prev; + + public static class QueryModerationRulesRequest + extends StreamRequest { + @Override + protected Call generateCall(Client client) { + return client.create(ModerationService.class).queryModerationRules(this.internalBuild()); + } + } + } + + @Data + @NoArgsConstructor + @EqualsAndHashCode(callSuper = true) + public static class QueryModerationRulesResponse extends StreamResponseObject { + @Nullable + @JsonProperty("rules") + private List rules; + + @Nullable + @JsonProperty("next") + private String next; + + @Nullable + @JsonProperty("prev") + private String prev; + } + + // Phase 3: Feeds Moderation & Rules - Get Moderation Rule + @Getter + @EqualsAndHashCode(callSuper = false) + @RequiredArgsConstructor + public static class GetModerationRuleRequest extends StreamRequest { + @NotNull private String id; + + @Override + protected Call generateCall(Client client) { + return client.create(ModerationService.class).getModerationRule(this.id); + } + } + + @Data + @NoArgsConstructor + @EqualsAndHashCode(callSuper = true) + public static class GetModerationRuleResponse extends StreamResponseObject { + @Nullable + @JsonProperty("rule") + private ModerationRule rule; + } + + // Phase 3: Feeds Moderation & Rules - Delete Moderation Rule + @Getter + @EqualsAndHashCode(callSuper = false) + @RequiredArgsConstructor + public static class DeleteModerationRuleRequest extends StreamRequest { + @NotNull private String id; + + @Override + protected Call generateCall(Client client) { + return client.create(ModerationService.class).deleteModerationRule(this.id); + } + } + + /** + * Creates an upsert config request + * + * @param key the moderation config key + * @return the created request + */ + @NotNull + public static UpsertConfigRequest upsertConfig(@NotNull String key) { + return new UpsertConfigRequest(key); + } + + /** + * Creates a delete config request + * + * @param key the moderation config key + * @return the created request + */ + @NotNull + public static DeleteConfigRequest deleteConfig(@NotNull String key) { + return new DeleteConfigRequest(key); + } + + /* + * Creates a get config request + * + * @param key the moderation config key + * @return the created request + */ + @NotNull + public static ConfigGetRequest getConfig(@NotNull String key) { + return new ConfigGetRequest(key); + } + + /** + * Creates a flag request + * + * @return the created request + */ + @NotNull + public static FlagRequestData.FlagRequest flag() { + return new FlagRequestData.FlagRequest(); + } + + /** + * Creates a mute request + * + * @return the created request + */ + @NotNull + public static MuteRequestData.MuteRequest mute() { + return new MuteRequestData.MuteRequest(); + } + + /** + * Creates an unmute request + * + * @return the created request + */ + @NotNull + public static UnmuteRequestData.UnmuteRequest unmute() { + return new UnmuteRequestData.UnmuteRequest(); + } + + /** + * Creates a check request + * + * @return the created request + */ + @NotNull + public static CheckRequestData.CheckRequest check() { + return new CheckRequestData.CheckRequest(); + } + + /** + * Creates a custom check request + * + * @return the created request + */ + @NotNull + public static CustomCheckRequestData.CustomCheckRequest customCheck() { + return new CustomCheckRequestData.CustomCheckRequest(); + } + + /** + * Creates a query review queue request + * + * @return the created request + */ + @NotNull + public static QueryReviewQueueRequestData.QueryReviewQueueRequest queryReviewQueue() { + return new QueryReviewQueueRequestData.QueryReviewQueueRequest(); + } + + /** + * Creates a query configs request + * + * @return the created request + */ + @NotNull + public static QueryConfigsRequestData.QueryConfigsRequest queryConfigs() { + return new QueryConfigsRequestData.QueryConfigsRequest(); + } + + /** + * Creates a submit action request + * + * @return the created request + */ + @NotNull + public static SubmitActionRequestData.SubmitActionRequest submitAction() { + return new SubmitActionRequestData.SubmitActionRequest(); + } + + /** + * Creates a get user report request + * + * @param userId the user ID to get report for + * @return the created request + */ + @NotNull + public static GetUserReportRequest getUserReport(@NotNull String userId) { + return new GetUserReportRequest(userId, null, null, null); + } + + /** + * Creates a get user report request with options + * + * @param userId the user ID to get report for + * @param createUserIfNotExists whether to create user if not exists + * @param includeUserBlocks whether to include user blocks + * @param includeUserMutes whether to include user mutes + * @return the created request + */ + @NotNull + public static GetUserReportRequest getUserReport( + @NotNull String userId, + @Nullable Boolean createUserIfNotExists, + @Nullable Boolean includeUserBlocks, + @Nullable Boolean includeUserMutes) { + return new GetUserReportRequest( + userId, createUserIfNotExists, includeUserBlocks, includeUserMutes); + } + + // Phase 2: Additional V2 Endpoints Factory Methods + /** + * Creates a block request + * + * @return the created request + */ + @NotNull + public static BlockRequestData.BlockRequest block() { + return new BlockRequestData.BlockRequest(); + } + + /** + * Creates a ban request + * + * @return the created request + */ + @NotNull + public static BanRequestData.BanRequest ban() { + return new BanRequestData.BanRequest(); + } + + /** + * Creates an unban request + * + * @return the created request + */ + @NotNull + public static UnbanRequestData.UnbanRequest unban() { + return new UnbanRequestData.UnbanRequest(); + } + + /** + * Creates an appeal request + * + * @return the created request + */ + @NotNull + public static AppealRequestData.AppealRequest appeal() { + return new AppealRequestData.AppealRequest(); + } + + /** + * Creates a get appeal request + * + * @param id the appeal ID + * @return the created request + */ + @NotNull + public static GetAppealRequest getAppeal(@NotNull String id) { + return new GetAppealRequest(id); + } + + /** + * Creates a query appeals request + * + * @return the created request + */ + @NotNull + public static QueryAppealsRequestData.QueryAppealsRequest queryAppeals() { + return new QueryAppealsRequestData.QueryAppealsRequest(); + } + + /** + * Creates a query moderation flags request + * + * @return the created request + */ + @NotNull + public static QueryModerationFlagsRequestData.QueryModerationFlagsRequest queryModerationFlags() { + return new QueryModerationFlagsRequestData.QueryModerationFlagsRequest(); + } + + /** + * Creates a query moderation logs request + * + * @return the created request + */ + @NotNull + public static QueryModerationLogsRequestData.QueryModerationLogsRequest queryModerationLogs() { + return new QueryModerationLogsRequestData.QueryModerationLogsRequest(); + } + + /** + * Creates a query usage stats request + * + * @return the created request + */ + @NotNull + public static QueryUsageStatsRequestData.QueryUsageStatsRequest queryUsageStats() { + return new QueryUsageStatsRequestData.QueryUsageStatsRequest(); + } + + /** + * Creates a get moderation analytics request + * + * @return the created request + */ + @NotNull + public static GetModerationAnalyticsRequestData.GetModerationAnalyticsRequest + getModerationAnalytics() { + return new GetModerationAnalyticsRequestData.GetModerationAnalyticsRequest(); + } + + /** + * Creates a get review queue item request + * + * @param id the review queue item ID + * @return the created request + */ + @NotNull + public static GetReviewQueueItemRequest getReviewQueueItem(@NotNull String id) { + return new GetReviewQueueItemRequest(id); + } + + /** + * Creates a get moderator stats request + * + * @return the created request + */ + @NotNull + public static GetModeratorStatsRequest getModeratorStats() { + return new GetModeratorStatsRequest(null, null, null); + } + + /** + * Creates a get moderator stats request with parameters + * + * @param userId the user ID + * @param startTime the start time + * @param endTime the end time + * @return the created request + */ + @NotNull + public static GetModeratorStatsRequest getModeratorStats( + @Nullable String userId, @Nullable String startTime, @Nullable String endTime) { + return new GetModeratorStatsRequest(userId, startTime, endTime); + } + + /** + * Creates a get queue stats request + * + * @return the created request + */ + @NotNull + public static GetQueueStatsRequest getQueueStats() { + return new GetQueueStatsRequest(null, null); + } + + /** + * Creates a get queue stats request with parameters + * + * @param startTime the start time + * @param endTime the end time + * @return the created request + */ + @NotNull + public static GetQueueStatsRequest getQueueStats( + @Nullable String startTime, @Nullable String endTime) { + return new GetQueueStatsRequest(startTime, endTime); + } + + /** + * Creates an export moderation logs request + * + * @return the created request + */ + @NotNull + public static ExportModerationLogsRequestData.ExportModerationLogsRequest exportModerationLogs() { + return new ExportModerationLogsRequestData.ExportModerationLogsRequest(); + } + + /** + * Creates a bulk image moderation request + * + * @return the created request + */ + @NotNull + public static BulkImageModerationRequestData.BulkImageModerationRequest bulkImageModeration() { + return new BulkImageModerationRequestData.BulkImageModerationRequest(); + } + + /** + * Creates a bulk submit action request + * + * @return the created request + */ + @NotNull + public static BulkSubmitActionRequestData.BulkSubmitActionRequest bulkSubmitAction() { + return new BulkSubmitActionRequestData.BulkSubmitActionRequest(); + } + + // Phase 3: Feeds Moderation & Rules Factory Methods + /** + * Creates an upsert template request + * + * @return the created request + */ + @NotNull + public static UpsertTemplateRequestData.UpsertTemplateRequest upsertTemplate() { + return new UpsertTemplateRequestData.UpsertTemplateRequest(); + } + + /** + * Creates a query feed moderation templates request + * + * @return the created request + */ + @NotNull + public static QueryFeedModerationTemplatesRequest queryFeedModerationTemplates() { + return new QueryFeedModerationTemplatesRequest(null, null, null); + } + + /** + * Creates a query feed moderation templates request with parameters + * + * @param filter the filter + * @param limit the limit + * @param offset the offset + * @return the created request + */ + @NotNull + public static QueryFeedModerationTemplatesRequest queryFeedModerationTemplates( + @Nullable String filter, @Nullable Integer limit, @Nullable Integer offset) { + return new QueryFeedModerationTemplatesRequest(filter, limit, offset); + } + + /** + * Creates a delete moderation template request + * + * @param name the template name + * @return the created request + */ + @NotNull + public static DeleteModerationTemplateRequest deleteModerationTemplate(@NotNull String name) { + return new DeleteModerationTemplateRequest(name, null); + } + + /** + * Creates a delete moderation template request with team + * + * @param name the template name + * @param team the team name + * @return the created request + */ + @NotNull + public static DeleteModerationTemplateRequest deleteModerationTemplate( + @NotNull String name, @Nullable String team) { + return new DeleteModerationTemplateRequest(name, team); + } + + /** + * Creates an upsert moderation rule request + * + * @return the created request + */ + @NotNull + public static UpsertModerationRuleRequestData.UpsertModerationRuleRequest upsertModerationRule() { + return new UpsertModerationRuleRequestData.UpsertModerationRuleRequest(); + } + + /** + * Creates a query moderation rules request + * + * @return the created request + */ + @NotNull + public static QueryModerationRulesRequestData.QueryModerationRulesRequest queryModerationRules() { + return new QueryModerationRulesRequestData.QueryModerationRulesRequest(); + } + + /** + * Creates a get moderation rule request + * + * @param id the moderation rule ID + * @return the created request + */ + @NotNull + public static GetModerationRuleRequest getModerationRule(@NotNull String id) { + return new GetModerationRuleRequest(id); + } + + /** + * Creates a delete moderation rule request + * + * @param id the moderation rule ID + * @return the created request + */ + @NotNull + public static DeleteModerationRuleRequest deleteModerationRule(@NotNull String id) { + return new DeleteModerationRuleRequest(id); } } diff --git a/src/main/java/io/getstream/chat/java/services/ModerationService.java b/src/main/java/io/getstream/chat/java/services/ModerationService.java index 09664520b..077879d3b 100644 --- a/src/main/java/io/getstream/chat/java/services/ModerationService.java +++ b/src/main/java/io/getstream/chat/java/services/ModerationService.java @@ -16,4 +16,130 @@ public interface ModerationService { @POST("api/v2/moderation/config") Call upsertConfig(@Nullable @Body UpsertConfigRequestData upsertConfig); + + // Phase 1: Core Moderation Actions + @POST("api/v2/moderation/flag") + Call flag(@NotNull @Body FlagRequestData flagRequestData); + + @POST("api/v2/moderation/mute") + Call mute(@NotNull @Body MuteRequestData muteRequestData); + + @POST("api/v2/moderation/unmute") + Call unmute(@NotNull @Body UnmuteRequestData unmuteRequestData); + + @POST("api/v2/moderation/check") + Call check(@NotNull @Body CheckRequestData checkRequestData); + + @POST("api/v2/moderation/custom_check") + Call customCheck( + @NotNull @Body CustomCheckRequestData customCheckRequestData); + + @POST("api/v2/moderation/review_queue") + Call queryReviewQueue( + @NotNull @Body QueryReviewQueueRequestData queryReviewQueueRequestData); + + @POST("api/v2/moderation/configs") + Call queryConfigs( + @NotNull @Body QueryConfigsRequestData queryConfigsRequestData); + + @POST("api/v2/moderation/submit_action") + Call submitAction( + @NotNull @Body SubmitActionRequestData submitActionRequestData); + + @GET("api/v2/moderation/user_report") + Call getUserReport( + @NotNull @Query("user_id") String userId, + @Nullable @Query("create_user_if_not_exists") Boolean createUserIfNotExists, + @Nullable @Query("include_user_blocks") Boolean includeUserBlocks, + @Nullable @Query("include_user_mutes") Boolean includeUserMutes); + + // Phase 2: Additional V2 Endpoints + @POST("api/v2/moderation/block") + Call block(@NotNull @Body BlockRequestData blockRequestData); + + @POST("api/v2/moderation/ban") + Call ban(@NotNull @Body BanRequestData banRequestData); + + @POST("api/v2/moderation/unban") + Call unban(@NotNull @Body UnbanRequestData unbanRequestData); + + @POST("api/v2/moderation/appeal") + Call appeal(@NotNull @Body AppealRequestData appealRequestData); + + @GET("api/v2/moderation/appeal/{id}") + Call getAppeal(@NotNull @Path("id") String id); + + @POST("api/v2/moderation/appeals") + Call queryAppeals( + @NotNull @Body QueryAppealsRequestData queryAppealsRequestData); + + @POST("api/v2/moderation/flags") + Call queryModerationFlags( + @NotNull @Body QueryModerationFlagsRequestData queryModerationFlagsRequestData); + + @POST("api/v2/moderation/logs") + Call queryModerationLogs( + @NotNull @Body QueryModerationLogsRequestData queryModerationLogsRequestData); + + @POST("api/v2/moderation/usage_stats") + Call queryUsageStats( + @NotNull @Body QueryUsageStatsRequestData queryUsageStatsRequestData); + + @POST("api/v2/moderation/analytics") + Call getModerationAnalytics( + @NotNull @Body GetModerationAnalyticsRequestData getModerationAnalyticsRequestData); + + @GET("api/v2/moderation/review_queue/{id}") + Call getReviewQueueItem(@NotNull @Path("id") String id); + + @GET("api/v2/moderation/moderator_stats") + Call getModeratorStats( + @Nullable @Query("user_id") String userId, + @Nullable @Query("start_time") String startTime, + @Nullable @Query("end_time") String endTime); + + @GET("api/v2/moderation/queue_stats") + Call getQueueStats( + @Nullable @Query("start_time") String startTime, @Nullable @Query("end_time") String endTime); + + @POST("api/v2/moderation/logs/export") + Call exportModerationLogs( + @NotNull @Body ExportModerationLogsRequestData exportModerationLogsRequestData); + + @POST("api/v2/moderation/bulk_image_moderation") + Call bulkImageModeration( + @NotNull @Body BulkImageModerationRequestData bulkImageModerationRequestData); + + @POST("api/v2/moderation/bulk_submit_action") + Call bulkSubmitAction( + @NotNull @Body BulkSubmitActionRequestData bulkSubmitActionRequestData); + + // Phase 3: Feeds Moderation & Rules + @POST("api/v2/moderation/feeds_moderation_template") + Call upsertTemplate( + @NotNull @Body UpsertTemplateRequestData upsertTemplateRequestData); + + @GET("api/v2/moderation/feeds_moderation_template") + Call queryFeedModerationTemplates( + @Nullable @Query("filter") String filter, + @Nullable @Query("limit") Integer limit, + @Nullable @Query("offset") Integer offset); + + @DELETE("api/v2/moderation/feeds_moderation_template") + Call deleteModerationTemplate( + @NotNull @Query("name") String name, @Nullable @Query("team") String team); + + @POST("api/v2/moderation/moderation_rule") + Call upsertModerationRule( + @NotNull @Body UpsertModerationRuleRequestData upsertModerationRuleRequestData); + + @POST("api/v2/moderation/moderation_rules") + Call queryModerationRules( + @NotNull @Body QueryModerationRulesRequestData queryModerationRulesRequestData); + + @GET("api/v2/moderation/moderation_rule/{id}") + Call getModerationRule(@NotNull @Path("id") String id); + + @DELETE("api/v2/moderation/moderation_rule/{id}") + Call deleteModerationRule(@NotNull @Path("id") String id); } From d96362115b9663fe79aa4edb7b9ed14f3a4d2250 Mon Sep 17 00:00:00 2001 From: Rafael Marinho Date: Thu, 22 Jan 2026 09:56:21 +0100 Subject: [PATCH 2/2] clean up --- .../chat/java/models/Moderation.java | 58 ++----------------- .../chat/java/services/ModerationService.java | 2 - 2 files changed, 6 insertions(+), 54 deletions(-) diff --git a/src/main/java/io/getstream/chat/java/models/Moderation.java b/src/main/java/io/getstream/chat/java/models/Moderation.java index 0218a152e..57cfb0b3c 100644 --- a/src/main/java/io/getstream/chat/java/models/Moderation.java +++ b/src/main/java/io/getstream/chat/java/models/Moderation.java @@ -199,7 +199,6 @@ protected Call generateCall(Client client) { } } - // Phase 1: Core Moderation Actions - Flag @Builder( builderClassName = "FlagRequest", builderMethodName = "", @@ -246,11 +245,8 @@ protected Call generateCall(Client client) { @Data @NoArgsConstructor @EqualsAndHashCode(callSuper = true) - public static class FlagResponse extends StreamResponseObject { - // Response typically contains duration and other metadata - } + public static class FlagResponse extends StreamResponseObject {} - // Phase 1: Core Moderation Actions - Mute @Builder( builderClassName = "MuteRequest", builderMethodName = "", @@ -287,7 +283,6 @@ public static class MuteResponse extends StreamResponseObject { private List mutes; } - // Phase 1: Core Moderation Actions - Unmute @Builder( builderClassName = "UnmuteRequest", builderMethodName = "", @@ -314,11 +309,8 @@ protected Call generateCall(Client client) { @Data @NoArgsConstructor @EqualsAndHashCode(callSuper = true) - public static class UnmuteResponse extends StreamResponseObject { - // Response typically contains duration and other metadata - } + public static class UnmuteResponse extends StreamResponseObject {} - // Phase 1: Core Moderation Actions - Check @Builder( builderClassName = "CheckRequest", builderMethodName = "", @@ -423,7 +415,6 @@ public static class FlagInfo { private String value; } - // Phase 1: Core Moderation Actions - Custom Check @Builder( builderClassName = "CustomCheckRequest", builderMethodName = "", @@ -462,11 +453,8 @@ protected Call generateCall(Client client) { @Data @NoArgsConstructor @EqualsAndHashCode(callSuper = true) - public static class CustomCheckResponse extends StreamResponseObject { - // Response typically contains duration and other metadata - } + public static class CustomCheckResponse extends StreamResponseObject {} - // Phase 1: Core Moderation Actions - Query Review Queue @Builder( builderClassName = "QueryReviewQueueRequest", builderMethodName = "", @@ -567,7 +555,6 @@ public static class ReviewQueueItem { private Date updatedAt; } - // Phase 1: Core Moderation Actions - Query Configs @Builder( builderClassName = "QueryConfigsRequest", builderMethodName = "", @@ -624,7 +611,6 @@ public static class QueryConfigsResponse extends StreamResponseObject { private String prev; } - // Phase 1: Core Moderation Actions - Submit Action @Builder( builderClassName = "SubmitActionRequest", builderMethodName = "", @@ -659,11 +645,8 @@ protected Call generateCall(Client client) { @Data @NoArgsConstructor @EqualsAndHashCode(callSuper = true) - public static class SubmitActionResponse extends StreamResponseObject { - // Response typically contains duration and other metadata - } + public static class SubmitActionResponse extends StreamResponseObject {} - // Phase 1: Core Moderation Actions - Get User Report @Getter @EqualsAndHashCode(callSuper = false) public static class GetUserReportRequest extends StreamRequest { @@ -716,7 +699,6 @@ public static class GetUserReportResponse extends StreamResponseObject { private List mutes; } - // Phase 2: Additional V2 Endpoints - Block @Builder( builderClassName = "BlockRequest", builderMethodName = "", @@ -743,11 +725,8 @@ protected Call generateCall(Client client) { @Data @NoArgsConstructor @EqualsAndHashCode(callSuper = true) - public static class BlockResponse extends StreamResponseObject { - // Response typically contains duration and other metadata - } + public static class BlockResponse extends StreamResponseObject {} - // Phase 2: Additional V2 Endpoints - Ban @Builder( builderClassName = "BanRequest", builderMethodName = "", @@ -796,7 +775,6 @@ public static class BanResponse extends StreamResponseObject { private List bans; } - // Phase 2: Additional V2 Endpoints - Unban @Builder( builderClassName = "UnbanRequest", builderMethodName = "", @@ -827,11 +805,8 @@ protected Call generateCall(Client client) { @Data @NoArgsConstructor @EqualsAndHashCode(callSuper = true) - public static class UnbanResponse extends StreamResponseObject { - // Response typically contains duration and other metadata - } + public static class UnbanResponse extends StreamResponseObject {} - // Phase 2: Additional V2 Endpoints - Appeal @Builder( builderClassName = "AppealRequest", builderMethodName = "", @@ -896,7 +871,6 @@ public static class Appeal { private Date createdAt; } - // Phase 2: Additional V2 Endpoints - Get Appeal @Getter @EqualsAndHashCode(callSuper = false) @RequiredArgsConstructor @@ -918,7 +892,6 @@ public static class GetAppealResponse extends StreamResponseObject { private Appeal appeal; } - // Phase 2: Additional V2 Endpoints - Query Appeals @Builder( builderClassName = "QueryAppealsRequest", builderMethodName = "", @@ -975,7 +948,6 @@ public static class QueryAppealsResponse extends StreamResponseObject { private String prev; } - // Phase 2: Additional V2 Endpoints - Query Moderation Flags @Builder( builderClassName = "QueryModerationFlagsRequest", builderMethodName = "", @@ -1033,7 +1005,6 @@ public static class QueryModerationFlagsResponse extends StreamResponseObject { private String prev; } - // Phase 2: Additional V2 Endpoints - Query Moderation Logs @Builder( builderClassName = "QueryModerationLogsRequest", builderMethodName = "", @@ -1111,7 +1082,6 @@ public static class ModerationLog { private Date createdAt; } - // Phase 2: Additional V2 Endpoints - Query Usage Stats @Builder( builderClassName = "QueryUsageStatsRequest", builderMethodName = "", @@ -1148,7 +1118,6 @@ public static class QueryUsageStatsResponse extends StreamResponseObject { private java.util.Map stats; } - // Phase 2: Additional V2 Endpoints - Get Moderation Analytics @Builder( builderClassName = "GetModerationAnalyticsRequest", builderMethodName = "", @@ -1186,7 +1155,6 @@ public static class GetModerationAnalyticsResponse extends StreamResponseObject private java.util.Map analytics; } - // Phase 2: Additional V2 Endpoints - Get Review Queue Item @Getter @EqualsAndHashCode(callSuper = false) @RequiredArgsConstructor @@ -1208,7 +1176,6 @@ public static class GetReviewQueueItemResponse extends StreamResponseObject { private ReviewQueueItem item; } - // Phase 2: Additional V2 Endpoints - Get Moderator Stats @Getter @EqualsAndHashCode(callSuper = false) public static class GetModeratorStatsRequest extends StreamRequest { @@ -1240,7 +1207,6 @@ public static class ModeratorStatsResponse extends StreamResponseObject { private java.util.Map stats; } - // Phase 2: Additional V2 Endpoints - Get Queue Stats @Getter @EqualsAndHashCode(callSuper = false) public static class GetQueueStatsRequest extends StreamRequest { @@ -1267,7 +1233,6 @@ public static class QueueStatsResponse extends StreamResponseObject { private java.util.Map stats; } - // Phase 2: Additional V2 Endpoints - Export Moderation Logs @Builder( builderClassName = "ExportModerationLogsRequest", builderMethodName = "", @@ -1301,7 +1266,6 @@ public static class ExportModerationLogsResponse extends StreamResponseObject { private String taskId; } - // Phase 2: Additional V2 Endpoints - Bulk Image Moderation @Builder( builderClassName = "BulkImageModerationRequest", builderMethodName = "", @@ -1335,7 +1299,6 @@ public static class BulkImageModerationResponse extends StreamResponseObject { private List results; } - // Phase 2: Additional V2 Endpoints - Bulk Submit Action @Builder( builderClassName = "BulkSubmitActionRequest", builderMethodName = "", @@ -1386,7 +1349,6 @@ public static class BulkSubmitActionResponse extends StreamResponseObject { private List results; } - // Phase 3: Feeds Moderation & Rules - Upsert Template @Builder( builderClassName = "UpsertTemplateRequest", builderMethodName = "", @@ -1447,7 +1409,6 @@ public static class FeedModerationTemplate { private Date updatedAt; } - // Phase 3: Feeds Moderation & Rules - Query Templates @Getter @EqualsAndHashCode(callSuper = false) public static class QueryFeedModerationTemplatesRequest @@ -1480,7 +1441,6 @@ public static class QueryFeedModerationTemplatesResponse extends StreamResponseO private List templates; } - // Phase 3: Feeds Moderation & Rules - Delete Template @Getter @EqualsAndHashCode(callSuper = false) public static class DeleteModerationTemplateRequest extends StreamRequest { @@ -1498,7 +1458,6 @@ protected Call generateCall(Client client) { } } - // Phase 3: Feeds Moderation & Rules - Upsert Moderation Rule @Builder( builderClassName = "UpsertModerationRuleRequest", builderMethodName = "", @@ -1584,7 +1543,6 @@ public static class ModerationRule { private Date updatedAt; } - // Phase 3: Feeds Moderation & Rules - Query Moderation Rules @Builder( builderClassName = "QueryModerationRulesRequest", builderMethodName = "", @@ -1642,7 +1600,6 @@ public static class QueryModerationRulesResponse extends StreamResponseObject { private String prev; } - // Phase 3: Feeds Moderation & Rules - Get Moderation Rule @Getter @EqualsAndHashCode(callSuper = false) @RequiredArgsConstructor @@ -1664,7 +1621,6 @@ public static class GetModerationRuleResponse extends StreamResponseObject { private ModerationRule rule; } - // Phase 3: Feeds Moderation & Rules - Delete Moderation Rule @Getter @EqualsAndHashCode(callSuper = false) @RequiredArgsConstructor @@ -1820,7 +1776,6 @@ public static GetUserReportRequest getUserReport( userId, createUserIfNotExists, includeUserBlocks, includeUserMutes); } - // Phase 2: Additional V2 Endpoints Factory Methods /** * Creates a block request * @@ -2011,7 +1966,6 @@ public static BulkSubmitActionRequestData.BulkSubmitActionRequest bulkSubmitActi return new BulkSubmitActionRequestData.BulkSubmitActionRequest(); } - // Phase 3: Feeds Moderation & Rules Factory Methods /** * Creates an upsert template request * diff --git a/src/main/java/io/getstream/chat/java/services/ModerationService.java b/src/main/java/io/getstream/chat/java/services/ModerationService.java index 077879d3b..0642dd2c7 100644 --- a/src/main/java/io/getstream/chat/java/services/ModerationService.java +++ b/src/main/java/io/getstream/chat/java/services/ModerationService.java @@ -53,7 +53,6 @@ Call getUserReport( @Nullable @Query("include_user_blocks") Boolean includeUserBlocks, @Nullable @Query("include_user_mutes") Boolean includeUserMutes); - // Phase 2: Additional V2 Endpoints @POST("api/v2/moderation/block") Call block(@NotNull @Body BlockRequestData blockRequestData); @@ -114,7 +113,6 @@ Call bulkImageModeration( Call bulkSubmitAction( @NotNull @Body BulkSubmitActionRequestData bulkSubmitActionRequestData); - // Phase 3: Feeds Moderation & Rules @POST("api/v2/moderation/feeds_moderation_template") Call upsertTemplate( @NotNull @Body UpsertTemplateRequestData upsertTemplateRequestData);