public function getProperties(
        $repositoryId,
        $objectId,
        $filter = null,
        ExtensionDataInterface $extension = null
    ) {
        $cacheKey = $this->createCacheKey(
            $objectId,
            [
                $repositoryId,
                $filter,
                $extension,
                $this->getSuccinct()
            ]
        );

        if ($this->isCached($cacheKey)) {
            return $this->getCached($cacheKey);
        }

        $url = $this->getObjectUrl($repositoryId, $objectId, Constants::SELECTOR_PROPERTIES);
        $url->getQuery()->modify(
            [
                Constants::PARAM_SUCCINCT => $this->getSuccinct() ? 'true' : 'false',
                Constants::PARAM_DATETIME_FORMAT => (string) $this->getDateTimeFormat()
            ]
        );

        if (!empty($filter)) {
            $url->getQuery()->modify([Constants::PARAM_FILTER => (string) $filter]);
        }

        $responseData = (array) $this->readJson($url);

        if ($this->getSuccinct()) {
            $objectData = $this->getJsonConverter()->convertSuccinctProperties($responseData);
        } else {
            $objectData = $this->getJsonConverter()->convertProperties($responseData);
        }

        return $this->cache(
            $cacheKey,
            $objectData
        );
    }