public Mono<Void> upsertGroupConversationReadDate(
            @NotNull Long groupId,
            @NotNull Long memberId,
            @Nullable @PastOrPresent Date readDate) {
        try {
            Validator.notNull(groupId, "groupId");
            Validator.notNull(memberId, "memberId");
            Validator.pastOrPresent(readDate, "readDate");
        } catch (ResponseException e) {
            return Mono.error(e);
        }
        Date finalReadDate = readDate == null
                ? new Date()
                : readDate;
        return groupConversationRepository
                .upsert(groupId, memberId, finalReadDate, allowMoveReadDateForward)
                .onErrorResume(DuplicateKeyException.class,
                        e -> readDate == null
                                ? Mono.empty()
                                : Mono.error(ResponseException.get(
                                        ResponseStatusCode.MOVING_READ_DATE_FORWARD_IS_DISABLED)))
                .then();
    }
@param groupService is lazy because conversationService -> groupService ->
                    conversationService
turms-service/src/main/java/im/turms/service/domain/conversation/service/ConversationService.java