Skip to content

Conversation

@rafaelmf3
Copy link
Contributor

@rafaelmf3 rafaelmf3 commented Jan 22, 2026

Submit a pull request

CLA

  • I have signed the Stream CLA (required).
  • The code changes follow best practices
  • Code changes are tested (add some information if not applicable)

Description of the pull request

Add Moderation V2 API Endpoints to Java SDK

Summary

This PR adds comprehensive support for all Moderation V2 API endpoints to the Java SDK, bringing it to feature parity with the Ruby SDK and aligning with the backend API routes defined in urlspatterns.go.

Previously, the Java SDK only had 3 moderation endpoints (getConfig, deleteConfig, upsertConfig). This PR adds 32 new endpoints, providing complete coverage of the Moderation V2 API.

What Changed

Files Modified

  • ModerationService.java - Added 32 new Retrofit service method definitions
  • Moderation.java - Added request/response models, builder classes, and factory methods for all endpoints

Endpoints Added

Core Moderation Actions (9 endpoints)

  • POST /api/v2/moderation/flag - Flag entities (users, messages, etc.)
  • POST /api/v2/moderation/mute - Mute users (V2 version)
  • POST /api/v2/moderation/unmute - Unmute users (V2 version)
  • POST /api/v2/moderation/check - Check content for moderation
  • POST /api/v2/moderation/custom_check - Add custom flags to entities
  • POST /api/v2/moderation/review_queue - Query review queue items
  • POST /api/v2/moderation/configs - Query moderation configs
  • POST /api/v2/moderation/submit_action - Submit moderation actions
  • GET /api/v2/moderation/user_report - Get user moderation report

Additional V2 Endpoints (16 endpoints)

  • POST /api/v2/moderation/block - Block users
  • POST /api/v2/moderation/ban - Ban users (V2 version)
  • POST /api/v2/moderation/unban - Unban users (V2 version)
  • POST /api/v2/moderation/appeal - Create ban appeal
  • GET /api/v2/moderation/appeal/{id} - Get appeal details
  • POST /api/v2/moderation/appeals - Query appeals
  • POST /api/v2/moderation/flags - Query moderation flags
  • POST /api/v2/moderation/logs - Query moderation logs
  • POST /api/v2/moderation/usage_stats - Query usage statistics
  • POST /api/v2/moderation/analytics - Get moderation analytics
  • GET /api/v2/moderation/review_queue/{id} - Get review queue item
  • GET /api/v2/moderation/moderator_stats - Get moderator statistics
  • GET /api/v2/moderation/queue_stats - Get queue statistics
  • POST /api/v2/moderation/logs/export - Export moderation logs
  • POST /api/v2/moderation/bulk_image_moderation - Bulk image moderation
  • POST /api/v2/moderation/bulk_submit_action - Bulk submit actions

Feeds Moderation & Rules (7 endpoints)

  • POST /api/v2/moderation/feeds_moderation_template - Upsert feeds moderation template
  • GET /api/v2/moderation/feeds_moderation_template - Query feeds moderation templates
  • DELETE /api/v2/moderation/feeds_moderation_template - Delete feeds moderation template
  • POST /api/v2/moderation/moderation_rule - Upsert moderation rule
  • POST /api/v2/moderation/moderation_rules - Query moderation rules
  • GET /api/v2/moderation/moderation_rule/{id} - Get moderation rule
  • DELETE /api/v2/moderation/moderation_rule/{id} - Delete moderation rule

Usage Examples

Flag a User

Moderation.FlagRequestData.FlagRequest flagRequest = Moderation.flag()
    .entityType("stream:user")
    .entityId("user-123")
    .reason("inappropriate_behavior")
    .userId("moderator-456")
    .custom(Map.of("severity", "high"));
FlagResponse response = flagRequest.request();

Mute Users

Moderation.MuteRequestData.MuteRequest muteRequest = Moderation.mute()
    .targetIds(List.of("user-1", "user-2"))
    .userId("moderator-123")
    .timeout(60); // minutes
MuteResponse response = muteRequest.request();

Query Review Queue

Moderation.QueryReviewQueueRequestData.QueryReviewQueueRequest queueRequest = 
    Moderation.queryReviewQueue()
        .filter(Map.of("entity_type", "stream:chat:v1:message"))
        .sort(List.of(Sort.builder().field("created_at").direction(Sort.Direction.DESC).build()))
        .limit(10);
QueryReviewQueueResponse response = queueRequest.request();

Check Content for Moderation

ModerationPayload payload = ModerationPayload.builder()
    .texts(List.of("Check this text"))
    .images(List.of("https://example.com/image.jpg"))
    .build();

Moderation.CheckRequestData.CheckRequest checkRequest = Moderation.check()
    .entityType("stream:chat:v1:message")
    .entityId("msg-123")
    .moderationPayload(payload)
    .configKey("message:default")
    .entityCreatorId("user-123");
CheckResponse response = checkRequest.request();

Get User Moderation Report

GetUserReportResponse response = Moderation.getUserReport(
    "user-123",
    true,  // createUserIfNotExists
    true,  // includeUserBlocks
    true   // includeUserMutes
).request();

Implementation Details

  • Pattern Consistency: All endpoints follow the existing Java SDK patterns:

    • Builder pattern for request data classes
    • StreamRequest for request classes
    • StreamResponseObject for response classes
    • Static factory methods for creating requests
  • Lombok Annotations: Uses @builder, @Getter, @DaTa, @EqualsAndHashCode for clean, concise code

  • Type Safety: All endpoints use proper type annotations (@NotNull, @nullable)

  • Backward Compatibility: All changes are additive - no breaking changes to existing APIs

Testing

  • All code compiles without errors
  • No linter warnings or errors
  • Follows existing code patterns and conventions
  • Ready for integration testing

@rafaelmf3 rafaelmf3 self-assigned this Jan 22, 2026
@rafaelmf3 rafaelmf3 merged commit 2dc87bc into main Jan 22, 2026
1 check passed
@rafaelmf3 rafaelmf3 deleted the cha-1427-mod-routes branch January 22, 2026 09:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants