public Mono<GroupJoinRequest> createGroupJoinRequest(
            @Nullable Long id,
            @NotNull Long groupId,
            @NotNull Long requesterId,
            @NotNull Long responderId,
            @Nullable String content,
            @Nullable @ValidRequestStatus RequestStatus status,
            @Nullable @PastOrPresent Date creationDate,
            @Nullable @PastOrPresent Date responseDate,
            @Nullable String responseReason) {
        try {
            Validator.notNull(groupId, "groupId");
            Validator.notNull(requesterId, "requesterId");
            Validator.notNull(responderId, "responderId");
            Validator.maxLength(content, "content", maxContentLength);
            DataValidator.validRequestStatus(status);
            Validator.pastOrPresent(creationDate, "creationDate");
            Validator.pastOrPresent(responseDate, "responseDate");
        } catch (ResponseException e) {
            return Mono.error(e);
        }
        Date now = new Date();
        id = id == null
                ? node.nextLargeGapId(ServiceType.GROUP_JOIN_REQUEST)
                : id;
        if (content == null) {
            content = "";
        }
        if (creationDate == null) {
            creationDate = now;
        }
        if (status == null) {
            status = RequestStatus.PENDING;
        }
        responseDate = getResponseDateBasedOnStatusForNewRecord(now, status, responseDate);
        GroupJoinRequest groupJoinRequest = new GroupJoinRequest(
                id,
                content,
                status,
                creationDate,
                responseDate,
                responseReason,
                groupId,
                requesterId,
                responderId);
        return groupJoinRequestRepository.insert(groupJoinRequest)
                .then(Mono.whenDelayError(groupVersionService.updateJoinRequestsVersion(groupId)
                        .onErrorResume(t -> {
                            LOGGER.error(
                                    "Caught an error while updating the join requests version of the group ({}) after creating a join request",
                                    groupId,
                                    t);
                            return Mono.empty();
                        }),
                        userVersionService.updateSentGroupJoinRequestsVersion(requesterId)
                                .onErrorResume(t -> {
                                    LOGGER.error(
                                            "Caught an error while updating the sent join requests version of the requester ({}) after creating a join request",
                                            requesterId,
                                            t);
                                    return Mono.empty();
                                })))
                .thenReturn(groupJoinRequest);
    }
@return requester ID, group ID, and status
turms-service/src/main/java/im/turms/service/domain/group/service/GroupJoinRequestService.java