public Mono<Void> authAndUpsertGroupConversationReadDate(
            @NotNull Long groupId,
            @NotNull Long memberId,
            @Nullable @PastOrPresent Date readDate) {
        if (!isReadReceiptEnabled) {
            return Mono.error(
                    ResponseException.get(ResponseStatusCode.UPDATING_READ_DATE_IS_DISABLED));
        }
        return groupService.queryGroupTypeIfActiveAndNotDeleted(groupId, true)
                .switchIfEmpty(Mono.defer(() -> Mono.error(ResponseException.get(
                        ResponseStatusCode.UPDATING_READ_DATE_OF_NONEXISTENT_GROUP_CONVERSATION))))
                .flatMap(groupType -> groupMemberService.isGroupMember(groupId, memberId, true)
                        .flatMap(isGroupMember -> {
                            if (!isGroupMember) {
                                return Mono.error(ResponseException.get(
                                        ResponseStatusCode.NOT_GROUP_MEMBER_TO_UPDATE_READ_DATE_OF_GROUP_CONVERSATION));
                            }
                            if (!groupType.getEnableReadReceipt()) {
                                return Mono.error(ResponseException.get(
                                        ResponseStatusCode.UPDATING_READ_DATE_IS_DISABLED_BY_GROUP));
                            }
                            return upsertGroupConversationReadDate(groupId,
                                    memberId,
                                    useServerTime
                                            ? new Date()
                                            : readDate);
                        }));
    }
@param groupService is lazy because conversationService -> groupService ->
                    conversationService
turms-service/src/main/java/im/turms/service/domain/conversation/service/ConversationService.java