Skip to content

Commit

Permalink
redis first impl
Browse files Browse the repository at this point in the history
  • Loading branch information
Vitolo-Andrea committed Jan 20, 2025
1 parent 559b3e0 commit 184eca1
Show file tree
Hide file tree
Showing 5 changed files with 95 additions and 55 deletions.
8 changes: 7 additions & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,11 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>

<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.22.0</version>
</dependency>
<!-- Da verificare-->
<dependency>
<groupId>com.azure.spring</groupId>
Expand Down Expand Up @@ -90,6 +94,8 @@
<artifactId>mockwebserver</artifactId>
<scope>test</scope>
</dependency>


</dependencies>

<dependencyManagement>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package it.gov.pagopa.onboarding.citizen.configuration;

import org.redisson.Redisson;
import org.redisson.api.RedissonReactiveClient;
import org.redisson.config.Config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RedissonConfig {

@Value("${redis.url}")
private String redisUrl;
@Bean
public RedissonReactiveClient redissonClient() {
Config config = new Config();
config.useSingleServer().setAddress(redisUrl);
return Redisson.create(config).reactive();
}
}
Original file line number Diff line number Diff line change
@@ -1,52 +1,57 @@
package it.gov.pagopa.onboarding.citizen.service;


import com.azure.cosmos.implementation.guava25.hash.BloomFilter;
import com.azure.cosmos.implementation.guava25.hash.Funnels;
import it.gov.pagopa.onboarding.citizen.repository.CitizenRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.redisson.api.RLock;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import java.nio.charset.StandardCharsets;
import org.redisson.api.RBloomFilter;
import org.redisson.api.RedissonClient;

import java.util.concurrent.TimeUnit;

@Service
@Slf4j
public class BloomFilterServiceImpl implements BloomFilterService{

private final CitizenRepository citizenRepository;

private BloomFilter<String> bloomFilter;

public BloomFilterServiceImpl(CitizenRepository citizenRepository) {
this.citizenRepository = citizenRepository;
public class BloomFilterServiceImpl implements BloomFilterService {

private static final String REDDIS_BF_NAME = "emd-bloom-fiter";
private static final String REDIS_LOCK_NAME = "startup-task-lock";

RBloomFilter<String> bloomFilter ;
public BloomFilterServiceImpl(RedissonClient redissonClient) {
RLock lock = redissonClient.getLock(REDIS_LOCK_NAME);

try {
if (lock.tryLock(0, TimeUnit.SECONDS)) {
try {
this.bloomFilter = initializeBloomFilter(redissonClient);
// carico dati dal db
log.info("[BLOOM-FILTER-SERVICE] Inizializzazione bloom filter eseguita");
} finally {
lock.unlock();
}
} else {
this.bloomFilter = redissonClient.getBloomFilter(REDDIS_BF_NAME);
log.info("BLOOM-FILTER-SERVICE] Un'altra replica sta già eseguendo l'inizializzazione bloom filter ");
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new RuntimeException("Errore durante l'acquisizione del lock.", e);
}
}


@PostConstruct
public void initializeBloomFilter() {
bloomFilter = BloomFilter.create(Funnels.stringFunnel(StandardCharsets.UTF_8), 1000000, 0.01);

citizenRepository.findAll()
.doOnNext(citizenConsent ->
bloomFilter.put(citizenConsent.getFiscalCode()))
.doOnComplete(() -> log.info("Bloom filter initialized"))
.subscribe();
private RBloomFilter<String> initializeBloomFilter(RedissonClient redissonClient) {
RBloomFilter<String> filter = redissonClient.getBloomFilter(REDDIS_BF_NAME);
filter.tryInit(1000000L, 0.01);
return filter;
}
@Override

public boolean mightContain(String fiscalCode) {
return bloomFilter.mightContain(fiscalCode);
public void add(String value) {
bloomFilter.add(value);
}


@Scheduled(fixedRate = 3600000)
public void update() {
this.initializeBloomFilter();
public boolean mightContain(String value) {
return bloomFilter.contains(value);
}

public void add(String fiscalCode){
bloomFilter.put(fiscalCode);
}
}
//Valutare re-inizializzaione temporizata per rimuovere eventuali elementi
}
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ public CitizenServiceImpl(CitizenRepository citizenRepository,

@Override
public Mono<CitizenConsentDTO> createCitizenConsent(String fiscalCode, String tppId){
log.info("[EMD][CITIZEN][UPDATE-CHANNEL-STATE] Received hashedFiscalCode: {} and tppId: {}",
log.info("[EMD-CITIZEN][CREATE-CITIZEN-CONSENT] Received hashedFiscalCode: {} and tppId: {}",
Utils.createSHA256(fiscalCode), inputSanify(tppId));

return tppConnector.get(tppId)
Expand Down Expand Up @@ -84,17 +84,17 @@ public Mono<CitizenConsentDTO> createCitizenConsent(String fiscalCode, String tp
.build();
return citizenRepository
.save(citizenConsentToSave)
.map(mapperToDTO::map);
.map(mapperToDTO::map)
.doOnSuccess(citizenConsentSaved -> bloomFilterService.add(fiscalCode));
}))
)
.doOnSuccess(savedConsent -> {
log.info("[EMD][CREATE-CITIZEN-CONSENT] Created new citizen consent for fiscal code: {}", Utils.createSHA256(fiscalCode));
bloomFilterService.add(fiscalCode);
});
.doOnSuccess(savedConsent ->
log.info("[EMD-CITIZEN][CREATE-CITIZEN-CONSENT] Created new citizen consent for fiscal code: {}", Utils.createSHA256(fiscalCode))
);
}
@Override
public Mono<CitizenConsentDTO> switchState(String fiscalCode, String tppId){
log.info("[EMD][CITIZEN][UPDATE-CHANNEL-STATE] Received hashedFiscalCode: {} and tppId: {}",
log.info("[EMD-CITIZEN][UPDATE-CHANNEL-STATE] Received hashedFiscalCode: {} and tppId: {}",
Utils.createSHA256(fiscalCode), inputSanify(tppId));

return citizenRepository.findByFiscalCode(fiscalCode)
Expand All @@ -109,13 +109,14 @@ public Mono<CitizenConsentDTO> switchState(String fiscalCode, String tppId){
consentDetails.setTppState(!consentDetails.getTppState());
return citizenRepository.save(citizenConsent)
.flatMap(savedConsent -> {

Map<String, ConsentDetails> consents = new HashMap<>();
consents.put(tppId, citizenConsent.getConsents().get(tppId));
citizenConsent.setConsents(consents);
return Mono.just(mapperToDTO.map(citizenConsent));
});
})
.doOnSuccess(savedConsent -> log.info("[EMD][CITIZEN][UPDATE-CHANNEL-STATE] Updated state"));
.doOnSuccess(savedConsent -> log.info("[EMD-CITIZEN][UPDATE-CHANNEL-STATE] Updated state for fiscal code: {}", Utils.createSHA256(fiscalCode)));
}

@Override
Expand All @@ -125,7 +126,7 @@ public Mono<CitizenConsentDTO> getCitizenConsentStatus(String fiscalCode, String
.switchIfEmpty(Mono.error(exceptionMap.throwException
(ExceptionName.CITIZEN_NOT_ONBOARDED, "Citizen consent not founded")))
.map(mapperToDTO::map)
.doOnSuccess(consent -> log.info("[EMD-CITIZEN][GET-CONSENT-STATUS] Consent consent found: {}", consent));
.doOnSuccess(consent -> log.info("[EMD-CITIZEN][GET-CONSENT-STATUS] Consent consent found for fiscal code: {}", Utils.createSHA256(fiscalCode)));

}

Expand All @@ -141,9 +142,9 @@ public Mono<List<String>> getTppEnabledList(String fiscalCode) {
.toList())
.doOnSuccess(tppIdList -> {
if (tppIdList != null){
log.info("EMD][CITIZEN][FIND-CITIZEN-CONSENTS-ENABLED] Consents found: {}", (tppIdList.size()));
log.info("[EMD-CITIZEN][FIND-CITIZEN-CONSENTS-ENABLED] Founded {} Consents for fiscal code: {}", tppIdList.size(),Utils.createSHA256(fiscalCode));
} else {
log.info("EMD][CITIZEN][FIND-CITIZEN-CONSENTS-ENABLED] No consents found.");
log.info("[EMD-CITIZEN][FIND-CITIZEN-CONSENTS-ENABLED] No consents found.");
}
});
}
Expand All @@ -155,7 +156,7 @@ public Mono<CitizenConsentDTO> getCitizenConsentsList(String fiscalCode) {
.switchIfEmpty(Mono.error(exceptionMap.throwException
(ExceptionName.CITIZEN_NOT_ONBOARDED, "Citizen consent not founded during get process ")))
.map(mapperToDTO::map)
.doOnSuccess(consentList -> log.info("[EMD-CITIZEN][FIND-ALL-CITIZEN-CONSENTS] Consents found: {}", consentList));
.doOnSuccess(consentList -> log.info("[EMD-CITIZEN][FIND-ALL-CITIZEN-CONSENTS] Consents for fiscal code: {}", Utils.createSHA256(fiscalCode)));
}

@Override
Expand All @@ -175,9 +176,9 @@ public Mono<CitizenConsentDTO> getCitizenConsentsListEnabled(String fiscalCode)
})
.doOnSuccess(citizenConsent -> {
if (citizenConsent != null && !citizenConsent.getConsents().isEmpty()) {
log.info("EMD][CITIZEN][FIND-CITIZEN-CONSENTS-ENABLED] Consents found: {}", citizenConsent.getConsents().size());
log.info("[EMD-CITIZEN][FIND-CITIZEN-CONSENTS-ENABLED] Funded {} consents for fiscal code: {} ", citizenConsent.getConsents().size(), Utils.createSHA256(fiscalCode));
} else {
log.info("EMD][CITIZEN][FIND-CITIZEN-CONSENTS-ENABLED] No consents found.");
log.info("[EMD-CITIZEN][FIND-CITIZEN-CONSENTS-ENABLED] No consents found.");
}
});

Expand All @@ -188,9 +189,15 @@ public Mono<CitizenConsentDTO> getCitizenConsentsListEnabled(String fiscalCode)
public Mono<List<CitizenConsentDTO>> getCitizenEnabled(String tppId) {
return citizenRepository.findByTppIdEnabled(tppId)
.map(mapperToDTO::map)
.collectList();
.collectList()
.doOnSuccess(citizenConsent -> {
if (citizenConsent != null && !citizenConsent.isEmpty()) {
log.info("[EMD-CITIZEN][FIND-CITIZEN-CONSENTS-ENABLED] Funded {} citizen for tpp: {} ", citizenConsent.size(), tppId);
} else {
log.info("[EMD-CITIZEN][FIND-CITIZEN-CONSENTS-ENABLED] No consents found.");
}
});
}

@Override
public Mono<CitizenConsentDTO> deleteCitizenConsent(String fiscalCode) {
return citizenRepository.findByFiscalCode(fiscalCode)
Expand Down
5 changes: 3 additions & 2 deletions src/main/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ spring:
maxConnectionIdleTimeMS: ${MONGODB_CONNECTIONPOOL_MAX_CONNECTION_IDLE_MS:120000}
maxConnecting: ${MONGODB_CONNECTIONPOOL_MAX_CONNECTING:2}


management:
health:
mongo.enabled: ${HEALTH_MONGO_ENABLED:false}
Expand All @@ -40,4 +39,6 @@ management:
exposure.include: info, health
rest-client:
tpp:
baseUrl: ${EMD_TPP:http://emd-tpp}
baseUrl: ${EMD_TPP:http://emd-tpp}
redis:
url:${REDIS_CONNECTION_URL:redis://localhost:6379}

0 comments on commit 184eca1

Please sign in to comment.