OriginService.java
package jasper.service;
import io.micrometer.core.annotation.Timed;
import jasper.component.ConfigCache;
import jasper.component.Storage;
import jasper.config.Props;
import jasper.domain.proj.HasOrigin;
import jasper.repository.ExtRepository;
import jasper.repository.PluginRepository;
import jasper.repository.RefRepository;
import jasper.repository.TemplateRepository;
import jasper.repository.UserRepository;
import jasper.security.Auth;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.Duration;
import java.time.Instant;
import java.util.HashSet;
import java.util.List;
import java.util.Optional;
import static jasper.security.AuthoritiesConstants.ADMIN;
@Service
public class OriginService {
private static final Logger logger = LoggerFactory.getLogger(OriginService.class);
@Autowired
Props props;
@Autowired
ConfigCache configs;
@Autowired
RefRepository refRepository;
@Autowired
ExtRepository extRepository;
@Autowired
UserRepository userRepository;
@Autowired
PluginRepository pluginRepository;
@Autowired
TemplateRepository templateRepository;
@Autowired
Auth auth;
@Autowired
Optional<Storage> storage;
@PreAuthorize("@auth.hasRole('MOD')")
@Timed(value = "jasper.service", extraTags = {"service", "backup"}, histogram = true)
public List<String> listOrigins() {
var set = new HashSet<String>();
set.addAll(refRepository.origins());
set.addAll(extRepository.origins());
set.addAll(pluginRepository.origins());
set.addAll(templateRepository.origins());
set.addAll(userRepository.origins());
set.addAll(userRepository.origins());
if (storage.isPresent()) {
set.addAll(storage.get().listTenants().stream()
.map(HasOrigin::origin).toList());
}
return set.stream()
.filter(auth::subOrigin).toList();
}
@Transactional
@PreAuthorize("@auth.hasRole('MOD') and @auth.subOrigin(#origin)")
@Timed(value = "jasper.service", extraTags = {"service", "origin"}, histogram = true)
public void delete(String origin, Instant olderThan) {
var start = Instant.now();
logger.info("{} Deleting origin {} older than {}", auth.getOrigin(), origin, olderThan);
refRepository.deleteByOriginAndModifiedLessThanEqual(origin, olderThan);
extRepository.deleteByOriginAndModifiedLessThanEqual(origin, olderThan);
userRepository.deleteByOriginAndModifiedLessThanEqual(origin, olderThan);
if (!auth.local(origin) || auth.hasRole(ADMIN)) {
pluginRepository.deleteByOriginAndModifiedLessThanEqual(origin, olderThan);
templateRepository.deleteByOriginAndModifiedLessThanEqual(origin, olderThan);
}
logger.info("{} Finished deleting origin {} older than {} in {}", auth.getOrigin(), origin, olderThan, Duration.between(start, Instant.now()));
if (props.getOrigin().equals(origin)) {
configs.clearUserCache();
configs.clearPluginCache();
configs.clearTemplateCache();
configs.clearConfigCache();
}
}
}