public Mono<Void> upsertPrivateConversationsReadDate(
            @NotNull Set<PrivateConversation.Key> keys,
            @Nullable @PastOrPresent Date readDate) {
        try {
            Validator.notNull(keys, "keys");
            Validator.pastOrPresent(readDate, "readDate");
        } catch (ResponseException e) {
            return Mono.error(e);
        }
        if (keys.isEmpty()) {
            return Mono.empty();
        }
        Date finalReadDate = readDate == null
                ? new Date()
                : readDate;
        return privateConversationRepository.upsert(keys, finalReadDate, allowMoveReadDateForward)
                .onErrorResume(DuplicateKeyException.class,
                        e -> readDate == null
                                ? Mono.empty()
                                : Mono.error(ResponseException.get(
                                        ResponseStatusCode.MOVING_READ_DATE_FORWARD_IS_DISABLED)))
                .then();
    }
@throws com.mongodb.DuplicateKeyException if {@code readDate} isn't after the read date in DB
                                          when "isAllowMoveReadDateForward" is enabled
turms-service/src/main/java/im/turms/service/domain/conversation/service/ConversationService.java