OembedService.java

package jasper.service;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.micrometer.core.annotation.Timed;
import jasper.client.OembedClient;
import jasper.component.OembedProviders;
import jasper.errors.NotFoundException;
import jasper.security.Auth;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.io.IOException;
import java.net.URI;
import java.util.Map;

import static org.apache.commons.lang3.StringUtils.isBlank;

@Service
public class OembedService {
	private static final Logger logger = LoggerFactory.getLogger(OembedService.class);

	@Autowired
	OembedClient oembedClient;

	@Autowired
	OembedProviders oembedProviders;

	@Autowired
	Auth auth;

	@Autowired
	ObjectMapper objectMapper;

	@Cacheable(value = "oembed-cache", key = "#params.get('theme') + '-' + #params.get('maxwidth') + '-' + #params.get('maxheight') + '-' + #params.get('url')")
	@Transactional(readOnly = true)
	@PreAuthorize("@auth.hasRole('VIEWER')")
	@Timed(value = "jasper.service", extraTags = {"service", "oembed"}, histogram = true)
	public JsonNode get(Map<String, String> params) {
		if (isBlank(params.get("url"))) return null;
		var config = oembedProviders.getProvider(auth.getOrigin(), params.get("url"));
		if (config == null) return null;
		params.put("format", "json");
		try {
			return objectMapper.readTree(oembedClient.oembed(new URI(config.getUrl().replace("{format}", "json")), params));
		} catch (Exception e) {
			throw new NotFoundException(e.getMessage());
		}
	}

	@PreAuthorize("@auth.canAddTag('+plugin/oembed')")
	@Timed(value = "jasper.service", extraTags = {"service", "oembed"}, histogram = true)
	public void restoreDefaults() throws IOException {
		oembedProviders.defaults(auth.getOrigin());
	}
}