Skip to content

Commit

Permalink
EP-4401
Browse files Browse the repository at this point in the history
  • Loading branch information
oplekal committed Oct 24, 2024
1 parent 0cff525 commit b7622be
Show file tree
Hide file tree
Showing 9 changed files with 140 additions and 5 deletions.
Original file line number Diff line number Diff line change
@@ -1,11 +1,17 @@
package fi.vm.sade.eperusteet.ylops.config;

import fi.vm.sade.eperusteet.ylops.dto.util.CacheArvot;
import fi.vm.sade.eperusteet.ylops.repository.OphSessionMappingStorage;
import fi.vm.sade.eperusteet.ylops.service.util.MaintenanceService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.core.context.SecurityContextHolder;

@Configuration
@EnableScheduling
Expand All @@ -15,9 +21,29 @@ public class ScheduledConfiguration {
@Autowired
private OphSessionMappingStorage ophSessionMappingStorage;

@Autowired
private MaintenanceService maintenanceService;

@Scheduled(cron = "0 0 * * * *")
public void cleanOphSession() {
ophSessionMappingStorage.clean();
}

@Scheduled(cron = "0 0 1 * * *")
public void cacheOpetussuunnitelmaJulkaisut() {
SecurityContextHolder.getContext().setAuthentication(useAdminAuth());
maintenanceService.clearCache(CacheArvot.OPETUSSUUNNITELMA_JULKAISU);
maintenanceService.clearCache(CacheArvot.OPETUSSUUNNITELMA_NAVIGAATIO_JULKINEN);
maintenanceService.cacheJulkaistutOpetussuunnitelmat();
maintenanceService.cacheOpetussuunnitelmaNavigaatiot();
}

private Authentication useAdminAuth() {
// Käytetään pääkäyttäjän oikeuksia.
return new UsernamePasswordAuthenticationToken("system",
"ROLE_ADMIN", AuthorityUtils.createAuthorityList("ROLE_ADMIN",
"ROLE_APP_EPERUSTEET_YLOPS_CRUD_1.2.246.562.10.00000000001",
"ROLE_APP_EPERUSTEET_YLOPS_ADMIN_1.2.246.562.10.00000000001",
"ROLE_APP_EPERUSTEET_ADMIN_1.2.246.562.10.00000000001"));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package fi.vm.sade.eperusteet.ylops.dto.util;

import lombok.experimental.UtilityClass;

@UtilityClass
public class CacheArvot {
public static final String OPETUSSUUNNITELMA_JULKAISU = "opetussuunnitelma_julkaisu";
public static final String OPETUSSUUNNITELMA_NAVIGAATIO_JULKINEN = "opetussuunnitelma_navigaatio_julkinen";
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public interface JulkaisuRepository extends JpaRepository<OpetussuunnitelmanJulk
" SELECT * " +
" FROM julkaistu_opetussuunnitelma_data_view data" +
" WHERE 1 = 1 " +
" AND (:nimi LIKE '' OR LOWER(nimi->>:kieli) LIKE LOWER(CONCAT('%',:nimi,'%'))) " +
" AND (:nimi LIKE '' OR LOWER(nimi->>:kieli) LIKE LOWER(CONCAT('%',:nimi,'%')) OR EXISTS (SELECT 1 FROM jsonb_array_elements(organisaatiot) elem WHERE LOWER(elem->'nimi'->>:kieli) LIKE LOWER(CONCAT('%',:nimi,'%')))) " +
" AND (:perusteenDiaarinumero = '' OR peruste->>'diaarinumero' = :perusteenDiaarinumero) " +
" AND (COALESCE(:koulutustyypit, NULL) = '' OR koulutustyyppi IN (:koulutustyypit)) " +
" order by nimi->>:kieli asc " +
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ public class MaintenanceController {

@RequestMapping(value = "/cacheclear/{cache}", method = GET)
public ResponseEntity clearCache(@PathVariable final String cache) {
cacheManager.getCache(cache).clear();
maintenanceService.clearCache(cache);
return ResponseEntity.status(HttpStatus.OK)
.build();
}
Expand All @@ -48,4 +48,10 @@ public void teeJulkaisut(
koulutustyypit != null ? koulutustyypit.stream().map(KoulutusTyyppi::of).collect(Collectors.toSet()) : null);
}


@RequestMapping(value = "/cache/julkaisut", method = GET)
public void cacheOpetussuunnitelmaJulkaisut() {
maintenanceService.cacheJulkaistutOpetussuunnitelmat();
maintenanceService.cacheOpetussuunnitelmaNavigaatiot();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@
import fi.vm.sade.eperusteet.ylops.dto.teksti.TekstiKappaleDto;
import fi.vm.sade.eperusteet.ylops.dto.teksti.TekstiKappaleViiteDto;
import fi.vm.sade.eperusteet.ylops.dto.teksti.TekstiKappaleViitePerusteTekstillaDto;
import fi.vm.sade.eperusteet.ylops.dto.util.CacheArvot;
import fi.vm.sade.eperusteet.ylops.repository.cache.PerusteCacheRepository;
import fi.vm.sade.eperusteet.ylops.repository.dokumentti.DokumenttiRepository;
import fi.vm.sade.eperusteet.ylops.repository.lops2019.Lops2019OpintojaksoRepository;
Expand Down Expand Up @@ -128,6 +129,7 @@
import fi.vm.sade.eperusteet.ylops.service.util.JulkaisuService;
import fi.vm.sade.eperusteet.ylops.service.util.LambdaUtil.ConstructedCopier;
import fi.vm.sade.eperusteet.ylops.service.util.LambdaUtil.Copier;
import fi.vm.sade.eperusteet.ylops.service.util.MaintenanceService;
import fi.vm.sade.eperusteet.ylops.service.util.NavigationUtil;
import fi.vm.sade.eperusteet.ylops.service.util.SecurityUtil;
import fi.vm.sade.eperusteet.ylops.service.util.Validointi;
Expand Down Expand Up @@ -290,6 +292,9 @@ public class OpetussuunnitelmaServiceImpl implements OpetussuunnitelmaService {
@Autowired
private OpetussuunnitelmaAsyncTekstitPohjastaService opetussuunnitelmaAsyncTekstitPohjastaService;

@Autowired
private MaintenanceService maintenanceService;

private final ObjectMapper objectMapper = InitJacksonConverter.createMapper();

private List<Opetussuunnitelma> findJulkaistutByQuery(OpetussuunnitelmaQuery pquery) {
Expand Down Expand Up @@ -641,6 +646,11 @@ public NavigationNodeDto buildNavigation(Long opsId, String kieli) {
}

@Override
@Cacheable(
value= CacheArvot.OPETUSSUUNNITELMA_NAVIGAATIO_JULKINEN,
condition = "#revision == null",
key = "#opsId + #kieli"
)
public NavigationNodeDto buildNavigationPublic(Long opsId, String kieli, Integer revision) {
NavigationNodeDto navigationNodeDto = dispatcher.get(opsId, NavigationBuilderPublic.class).buildNavigation(opsId, kieli, revision);
siirraLiitteetLoppuun(navigationNodeDto);
Expand Down Expand Up @@ -1883,7 +1893,6 @@ public OpetussuunnitelmaDto updateTila(Long id, Tila tila) {
Opetussuunnitelma ops = opetussuunnitelmaRepository.findOne(id);
assertExists(ops, "Opetussuunnitelmaa ei ole olemassa");


if (ops.getTyyppi() == Tyyppi.POHJA && tila == Tila.JULKAISTU) {
tila = Tila.VALMIS;
}
Expand All @@ -1897,6 +1906,7 @@ public OpetussuunnitelmaDto updateTila(Long id, Tila tila) {
ops.setTila(tila);
}

maintenanceService.clearOpetussuunnitelmaCaches(id);
ops = opetussuunnitelmaRepository.save(ops);
muokkaustietoService.addOpsMuokkausTieto(id, ops, MuokkausTapahtuma.PAIVITYS, "tapahtuma-opetussuunnitelma-tila-" + tila);
return mapper.map(ops, OpetussuunnitelmaDto.class);
Expand Down Expand Up @@ -2046,6 +2056,11 @@ public OpetussuunnitelmaExportDto getOpetussuunnitelmaJulkaistuSisalto(Long opsI
}

@Override
@Cacheable(
value= CacheArvot.OPETUSSUUNNITELMA_JULKAISU,
condition = "#revision == null",
key = "#opsId"
)
public OpetussuunnitelmaExportDto getOpetussuunnitelmaJulkaistuSisalto(Long opsId, Integer revision) {
Opetussuunnitelma ops = opetussuunnitelmaRepository.findOne(opsId);
if (ops == null || ops.getTila().equals(Tila.POISTETTU)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,18 @@

public interface MaintenanceService {

@PreAuthorize("hasPermission(null, 'pohja', 'LUONTI')")
void clearCache(String cache);

@PreAuthorize("hasPermission(null, 'pohja', 'LUONTI')")
void teeJulkaisut(boolean julkaiseKaikki, Set<KoulutusTyyppi> koulutustyypit);

@PreAuthorize("isAuthenticated()")
void clearOpetussuunnitelmaCaches(Long opetussuunnitelmaId);

@PreAuthorize("hasPermission(null, 'pohja', 'LUONTI')")
void cacheOpetussuunnitelmaNavigaatiot();

@PreAuthorize("hasPermission(null, 'pohja', 'LUONTI')")
void cacheJulkaistutOpetussuunnitelmat();
}
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
import fi.vm.sade.eperusteet.ylops.service.ops.ValidointiService;
import fi.vm.sade.eperusteet.ylops.service.util.JsonMapper;
import fi.vm.sade.eperusteet.ylops.service.util.JulkaisuService;
import fi.vm.sade.eperusteet.ylops.service.util.MaintenanceService;
import fi.vm.sade.eperusteet.ylops.service.util.Validointi;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
Expand Down Expand Up @@ -117,6 +118,9 @@ public class JulkaisuServiceImpl implements JulkaisuService {
@Lazy
private JulkaisuService self;

@Autowired
private MaintenanceService maintenanceService;

private static final int JULKAISUN_ODOTUSAIKA_SEKUNNEISSA = 60 * 60;
private final ObjectMapper objectMapper = InitJacksonConverter.createMapper();

Expand Down Expand Up @@ -246,6 +250,7 @@ public void addJulkaisuAsync(Long opsId, UusiJulkaisuDto julkaisuDto) {
opetussuunnitelma.setTila(Tila.JULKAISTU);
julkaistuOpetussuunnitelmaTila.setJulkaisutila(JulkaisuTila.JULKAISTU);
self.saveJulkaistuOpetussuunnitelmaTila(julkaistuOpetussuunnitelmaTila);
maintenanceService.clearOpetussuunnitelmaCaches(opsId);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import fi.vm.sade.eperusteet.ylops.domain.teksti.Kieli;
import fi.vm.sade.eperusteet.ylops.domain.teksti.LokalisoituTeksti;
import fi.vm.sade.eperusteet.ylops.dto.OpetussuunnitelmaExportDto;
import fi.vm.sade.eperusteet.ylops.dto.util.CacheArvot;
import fi.vm.sade.eperusteet.ylops.repository.ops.JulkaisuRepository;
import fi.vm.sade.eperusteet.ylops.repository.ops.OpetussuunnitelmaRepository;
import fi.vm.sade.eperusteet.ylops.service.ops.OpetussuunnitelmaService;
Expand All @@ -18,7 +19,8 @@
import fi.vm.sade.eperusteet.ylops.service.util.MaintenanceService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Profile;
import org.springframework.cache.CacheManager;
import org.springframework.context.annotation.Lazy;
import org.springframework.scheduling.annotation.Async;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;
Expand All @@ -31,13 +33,13 @@
import java.io.IOException;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;

@Service
@Transactional
@Slf4j
@Profile("!test")
public class MaintenanceServiceImpl implements MaintenanceService {

@Autowired
Expand All @@ -50,6 +52,7 @@ public class MaintenanceServiceImpl implements MaintenanceService {
private JulkaisuRepository julkaisuRepository;

@Autowired
@Lazy
private OpetussuunnitelmaService opetussuunnitelmaService;

@Autowired
Expand All @@ -58,6 +61,14 @@ public class MaintenanceServiceImpl implements MaintenanceService {
@Autowired
private JsonMapper jsonMapper;

@Autowired
private CacheManager cacheManager;

@Override
public void clearCache(String cache) {
Objects.requireNonNull(cacheManager.getCache(cache)).clear();
}

@Override
@Async
@Transactional(propagation = Propagation.NEVER)
Expand Down Expand Up @@ -115,4 +126,36 @@ private void teeJulkaisu(String username, Long opsId) {
return true;
});
}

@Override
public void clearOpetussuunnitelmaCaches(Long opetussuunnitelmaId) {
opetussuunnitelmaRepository.findOne(opetussuunnitelmaId).getJulkaisukielet().forEach(kieli -> {
cacheManager.getCache(CacheArvot.OPETUSSUUNNITELMA_NAVIGAATIO_JULKINEN).evictIfPresent(opetussuunnitelmaId + kieli.toString());
});
cacheManager.getCache(CacheArvot.OPETUSSUUNNITELMA_JULKAISU).evictIfPresent(opetussuunnitelmaId);
}

@Override
public void cacheOpetussuunnitelmaNavigaatiot() {
opetussuunnitelmaService.getKaikkiJulkaistutOpetussuunnitelmat().forEach(ops -> {
try {
ops.getJulkaisukielet().forEach(kieli -> opetussuunnitelmaService.buildNavigationPublic(ops.getId(), kieli.toString(), null));
} catch (Exception e) {
log.error("Error caching navigation for opetussuunnitelma {}", ops.getId(), e);
}
});
}

@Override
public void cacheJulkaistutOpetussuunnitelmat() {
opetussuunnitelmaService.getKaikkiJulkaistutOpetussuunnitelmat().forEach(ops -> {
try {
opetussuunnitelmaService.getOpetussuunnitelmaJulkaistuSisalto(ops.getId(), null);
} catch(Exception e) {
log.error("Error caching julkaistu sisalto for opetussuunnitelma {}", ops.getId(), e);
}
});
}


}
20 changes: 20 additions & 0 deletions eperusteet-ylops-service/src/main/resources/jcache.xml
Original file line number Diff line number Diff line change
Expand Up @@ -122,5 +122,25 @@
</resources>
</cache>

<cache alias="opetussuunnitelma_julkaisu">
<expiry>
<ttl unit="seconds">86400</ttl>
</expiry>

<resources>
<heap unit="entries">9999</heap>
</resources>
</cache>

<cache alias="opetussuunnitelma_navigaatio_julkinen">
<expiry>
<ttl unit="seconds">86400</ttl>
</expiry>

<resources>
<heap unit="entries">9999</heap>
</resources>
</cache>


</config>

0 comments on commit b7622be

Please sign in to comment.