Skip to content

Commit

Permalink
Endre brukernotifikasjoner (#291)
Browse files Browse the repository at this point in the history
* Endre brukernotifikasjoner
Unngå duplikate bestillinger for opprettelse og ferdigstilling av oppgaver
Opprette tabell for bestilling av signeringsoppgave til far.
* Update V11_2_0__create-table-oppgavebestilling.sql
  • Loading branch information
s148719 authored Oct 19, 2021
1 parent 57f0278 commit abae401
Show file tree
Hide file tree
Showing 20 changed files with 693 additions and 161 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import io.confluent.kafka.serializers.AbstractKafkaSchemaSerDeConfig;
import io.confluent.kafka.serializers.KafkaAvroSerializer;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import no.nav.brukernotifikasjon.schemas.Beskjed;
Expand All @@ -15,13 +14,14 @@
import no.nav.farskapsportal.consumer.brukernotifikasjon.BrukernotifikasjonConsumer;
import no.nav.farskapsportal.consumer.brukernotifikasjon.Ferdigprodusent;
import no.nav.farskapsportal.consumer.brukernotifikasjon.Oppgaveprodusent;
import no.nav.farskapsportal.persistence.dao.OppgavebestillingDao;
import no.nav.farskapsportal.service.PersistenceService;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.kafka.annotation.EnableKafka;
import org.springframework.kafka.core.DefaultKafkaProducerFactory;
import org.springframework.kafka.core.KafkaTemplate;

Expand Down Expand Up @@ -49,7 +49,7 @@ public class BrukernotifikasjonConfig {
private String saslMechanism;

@Value("${spring.kafka.properties.security.protocol}")
private String securityProtocol;
private String securityProtocol;

public BrukernotifikasjonConfig(@Autowired FarskapsportalEgenskaper farskapsportalEgenskaper) {
this.farskapsportalEgenskaper = farskapsportalEgenskaper;
Expand All @@ -62,13 +62,13 @@ private Map<String, Object> getKafkaConfigProps() {
configProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, KafkaAvroSerializer.class);
configProps.put(AbstractKafkaSchemaSerDeConfig.SCHEMA_REGISTRY_URL_CONFIG, kafkaSchemaRegistryUrlConfig);
configProps.put("schema.registry.ssl.keystore.location", trustStorePath);
configProps.put("schema.registry.ssl.keystore.password",trustStorePwd);
configProps.put("schema.registry.ssl.keystore.password", trustStorePwd);
configProps.put("schema.registry.ssl.truststore.location", trustStorePath);
configProps.put("schema.registry.ssl.truststore.password",trustStorePwd);
configProps.put("schema.registry.ssl.truststore.password", trustStorePwd);
configProps.put("ssl.truststore.location", trustStorePath);
configProps.put("ssl.truststore.password",trustStorePwd);
configProps.put("ssl.truststore.password", trustStorePwd);
configProps.put("ssl.keystore.location", trustStorePath);
configProps.put("ssl.keystore.password",trustStorePwd);
configProps.put("ssl.keystore.password", trustStorePwd);
configProps.put("security.protocol", securityProtocol);
configProps.put("sasl.jaas.config", saslJaasConfig);
configProps.put("sasl.mechanism", saslMechanism);
Expand All @@ -93,8 +93,8 @@ public KafkaTemplate<Nokkel, Oppgave> kafkaTemplateOppgave() {

@Bean
BrukernotifikasjonConsumer brukernotifikasjonConsumer(Beskjedprodusent beskjedprodusent, Ferdigprodusent ferdigprodusent,
Oppgaveprodusent oppgaveprodusent) throws MalformedURLException {
return new BrukernotifikasjonConsumer(toUrl(farskapsportalEgenskaper.getUrl()), beskjedprodusent, ferdigprodusent, oppgaveprodusent);
Oppgaveprodusent oppgaveprodusent, FarskapsportalEgenskaper farskapsportalEgenskaper) throws MalformedURLException {
return new BrukernotifikasjonConsumer(beskjedprodusent, ferdigprodusent, oppgaveprodusent, farskapsportalEgenskaper);
}

@Bean
Expand All @@ -104,16 +104,13 @@ Beskjedprodusent beskjedprodusent(@Qualifier("beskjed") KafkaTemplate<Nokkel, Be

@Bean
Oppgaveprodusent oppgaveprodusent(
@Qualifier("oppgave") KafkaTemplate<Nokkel, Oppgave> kafkaTemplate) throws MalformedURLException {
return new Oppgaveprodusent(toUrl(farskapsportalEgenskaper.getUrl()), farskapsportalEgenskaper, kafkaTemplate);
@Qualifier("oppgave") KafkaTemplate<Nokkel, Oppgave> kafkaTemplate, PersistenceService persistenceService) {
return new Oppgaveprodusent(farskapsportalEgenskaper, kafkaTemplate, persistenceService);
}

@Bean
Ferdigprodusent ferdigprodusent(@Qualifier("ferdig") KafkaTemplate<Nokkel, Done> kafkaTemplate) {
return new Ferdigprodusent(farskapsportalEgenskaper, kafkaTemplate);
}

private URL toUrl(String url) throws MalformedURLException {
return new URL(url);
Ferdigprodusent ferdigprodusent(@Qualifier("ferdig") KafkaTemplate<Nokkel, Done> kafkaTemplate, PersistenceService persistenceService,
OppgavebestillingDao oppgavebestillingDao) {
return new Ferdigprodusent(farskapsportalEgenskaper, kafkaTemplate, persistenceService, oppgavebestillingDao);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
import no.nav.farskapsportal.persistence.dao.FarskapserklaeringDao;
import no.nav.farskapsportal.persistence.dao.ForelderDao;
import no.nav.farskapsportal.persistence.dao.MeldingsloggDao;
import no.nav.farskapsportal.persistence.dao.OppgavebestillingDao;
import no.nav.farskapsportal.persistence.dao.StatusKontrollereFarDao;
import no.nav.farskapsportal.service.FarskapsportalService;
import no.nav.farskapsportal.service.PersistenceService;
Expand Down Expand Up @@ -158,14 +159,15 @@ SkattConsumer skattConsumer(@Qualifier("skatt") RestTemplate restTemplate,
}

@Bean
public PersistenceService persistenceService(PersonopplysningService personopplysningService,
public PersistenceService persistenceService(OppgavebestillingDao oppgavebestillingDao,
PersonopplysningService personopplysningService,
FarskapserklaeringDao farskapserklaeringDao,
Mapper mapper,
BarnDao barnDao,
ForelderDao forelderDao,
StatusKontrollereFarDao kontrollereFarDao,
MeldingsloggDao meldingsloggDao) {
return new PersistenceService(personopplysningService, farskapserklaeringDao, barnDao, forelderDao, kontrollereFarDao,
return new PersistenceService(oppgavebestillingDao, personopplysningService, farskapserklaeringDao, barnDao, forelderDao, kontrollereFarDao,
meldingsloggDao, mapper);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,15 @@
package no.nav.farskapsportal.consumer.brukernotifikasjon;

import java.net.URL;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.UUID;
import lombok.Value;
import lombok.extern.slf4j.Slf4j;
import no.nav.brukernotifikasjon.schemas.Beskjed;
import no.nav.brukernotifikasjon.schemas.Nokkel;
import no.nav.brukernotifikasjon.schemas.builders.BeskjedBuilder;
import no.nav.brukernotifikasjon.schemas.builders.NokkelBuilder;
import no.nav.farskapsportal.config.egenskaper.FarskapsportalEgenskaper;
import no.nav.farskapsportal.persistence.entity.Forelder;
import org.springframework.kafka.core.KafkaTemplate;

@Slf4j
Expand All @@ -22,18 +19,17 @@ public class Beskjedprodusent {
FarskapsportalEgenskaper farskapsportalEgenskaper;
KafkaTemplate<Nokkel, Beskjed> kafkaTemplate;

public void oppretteBeskjedTilBruker(String brukersFoedselsnummer, String meldingTilBruker, boolean medEksternVarsling, URL lenke) {
public void oppretteBeskjedTilBruker(Forelder forelder, String meldingTilBruker, boolean medEksternVarsling, URL lenke, Nokkel nokkel) {

var nokkel = oppretteNokkel();
var beskjed = oppretteBeskjed(brukersFoedselsnummer, meldingTilBruker, medEksternVarsling, lenke);
var beskjed = oppretteBeskjed(forelder.getFoedselsnummer(), meldingTilBruker, medEksternVarsling, lenke);

kafkaTemplate.send(farskapsportalEgenskaper.getBrukernotifikasjon().getTopicBeskjed(), nokkel, beskjed);
try {
kafkaTemplate.send(farskapsportalEgenskaper.getBrukernotifikasjon().getTopicBeskjed(), nokkel, beskjed);
} catch (Exception e) {
log.error("Opprettelse av beskjed til forelder med id {} feilet!", forelder.getId());
}

}

private Nokkel oppretteNokkel() {
var unikEventid = UUID.randomUUID().toString();
return new NokkelBuilder().withSystembruker(farskapsportalEgenskaper.getSystembrukerBrukernavn()).withEventId(unikEventid).build();
log.info("Beskjed sendt til forelder med id {}.", forelder.getId());
}

private Beskjed oppretteBeskjed(String foedselsnummer, String meldingTilBruker, boolean medEksternVarsling, URL lenke) {
Expand All @@ -44,7 +40,8 @@ private Beskjed oppretteBeskjed(String foedselsnummer, String meldingTilBruker,
.withGrupperingsId(farskapsportalEgenskaper.getBrukernotifikasjon().getGrupperingsidFarskap())
.withEksternVarsling(medEksternVarsling)
.withSynligFremTil(
LocalDateTime.now(ZoneId.of("UTC")).withHour(0).plusMonths(farskapsportalEgenskaper.getBrukernotifikasjon().getSynlighetBeskjedAntallMaaneder()))
LocalDateTime.now(ZoneId.of("UTC")).withHour(0)
.plusMonths(farskapsportalEgenskaper.getBrukernotifikasjon().getSynlighetBeskjedAntallMaaneder()))
.withSikkerhetsnivaa(farskapsportalEgenskaper.getBrukernotifikasjon().getSikkerhetsnivaaBeskjed())
.withLink(lenke)
.withTekst(meldingTilBruker)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
package no.nav.farskapsportal.consumer.brukernotifikasjon;

import java.net.MalformedURLException;
import java.net.URL;
import lombok.AllArgsConstructor;
import java.util.UUID;
import lombok.extern.slf4j.Slf4j;
import no.nav.brukernotifikasjon.schemas.Nokkel;
import no.nav.brukernotifikasjon.schemas.builders.NokkelBuilder;
import no.nav.farskapsportal.config.egenskaper.FarskapsportalEgenskaper;
import no.nav.farskapsportal.exception.InternFeilException;
import no.nav.farskapsportal.persistence.entity.Forelder;

@Slf4j
@AllArgsConstructor
public class BrukernotifikasjonConsumer {

private static final String MELDING_OM_SIGNERT_FARSKAPSERKLAERING = "Du har en signert farskapserklæring er tilgjengelig for nedlasting i en begrenset tidsperiode fra farskapsportalen:";
Expand All @@ -14,38 +19,68 @@ public class BrukernotifikasjonConsumer {
private static final String MELDING_TIL_FAR_OM_AVBRUTT_SIGNERING = "Fars signering ble avbrutt, aktuell farskapserklæring måtte derfor slettes. Mor kan opprette ny hvis ønskelig.";
private static final String MELDING_OM_IKKE_UTFOERT_SIGNERINGSOPPGAVE = "Far har ikke signert farskapserklæringen innen fristen. Farskapserklæringen er derfor slettet. Mor kan opprette ny hvis ønskelig. Trykk her for å opprette ny farskapserklæring.";


private final URL farskapsportalUrl;
private final Beskjedprodusent beskjedprodusent;
private final Ferdigprodusent ferdigprodusent;
private final Oppgaveprodusent oppgaveprodusent;
private final FarskapsportalEgenskaper farskapsportalEgenskaper;
private final URL farskapsportalUrl;

public void informereForeldreOmTilgjengeligFarskapserklaering(String foedselsnummerMor, String foedselsnummerFar) {
log.info("Informerer foreldre om ferdigstilt farskapserklæring.");
beskjedprodusent.oppretteBeskjedTilBruker(foedselsnummerMor, MELDING_OM_SIGNERT_FARSKAPSERKLAERING, true, farskapsportalUrl);
beskjedprodusent.oppretteBeskjedTilBruker(foedselsnummerFar, MELDING_OM_SIGNERT_FARSKAPSERKLAERING, true, farskapsportalUrl);
public BrukernotifikasjonConsumer(Beskjedprodusent beskjedprodusent, Ferdigprodusent ferdigprodusent, Oppgaveprodusent oppgaveprodusent,
FarskapsportalEgenskaper farskapsportalEgenskaper)
throws MalformedURLException {
this.beskjedprodusent = beskjedprodusent;
this.ferdigprodusent = ferdigprodusent;
this.oppgaveprodusent = oppgaveprodusent;
this.farskapsportalEgenskaper = farskapsportalEgenskaper;
this.farskapsportalUrl = toUrl(farskapsportalEgenskaper.getUrl());
}

public void varsleMorOmUtgaattOppgaveForSignering(String foedselsnummerMor) {
public void informereForeldreOmTilgjengeligFarskapserklaering(Forelder mor, Forelder far) {
log.info("Informerer foreldre (mor: {}, far: {}) om ferdigstilt farskapserklæring.", mor.getId(), far.getId());
beskjedprodusent.oppretteBeskjedTilBruker(mor, MELDING_OM_SIGNERT_FARSKAPSERKLAERING, true, farskapsportalUrl, oppretteNokkel());
beskjedprodusent.oppretteBeskjedTilBruker(far, MELDING_OM_SIGNERT_FARSKAPSERKLAERING, true, farskapsportalUrl, oppretteNokkel());
}

public void varsleMorOmUtgaattOppgaveForSignering(Forelder mor) {
log.info("Sender varsel til mor om utgått signeringsoppgave");
beskjedprodusent.oppretteBeskjedTilBruker(foedselsnummerMor, MELDING_OM_IKKE_UTFOERT_SIGNERINGSOPPGAVE, true, farskapsportalUrl);
beskjedprodusent.oppretteBeskjedTilBruker(mor, MELDING_OM_IKKE_UTFOERT_SIGNERINGSOPPGAVE, true, farskapsportalUrl, oppretteNokkel());
}

public void varsleOmAvbruttSignering(String foedselsnummerMor, String foedselsnummerFar) {
public void varsleOmAvbruttSignering(Forelder mor, Forelder far) {
log.info("Varsler brukere om avbrutt signering");
beskjedprodusent.oppretteBeskjedTilBruker(foedselsnummerMor, MELDING_TIL_MOR_OM_AVBRUTT_SIGNERING, true, farskapsportalUrl);
beskjedprodusent.oppretteBeskjedTilBruker(foedselsnummerFar, MELDING_TIL_FAR_OM_AVBRUTT_SIGNERING, true, farskapsportalUrl);
beskjedprodusent.oppretteBeskjedTilBruker(mor, MELDING_TIL_MOR_OM_AVBRUTT_SIGNERING, true, farskapsportalUrl, oppretteNokkel());
beskjedprodusent.oppretteBeskjedTilBruker(far, MELDING_TIL_FAR_OM_AVBRUTT_SIGNERING, true, farskapsportalUrl, oppretteNokkel());
}

public void oppretteOppgaveTilFarOmSignering(int idFarskapserklaering, Forelder far) {
try {
oppgaveprodusent
.oppretteOppgaveForSigneringAvFarskapserklaering(idFarskapserklaering, far,
MELDING_OM_VENTENDE_FARSKAPSERKLAERING, true, farskapsportalUrl);
} catch (InternFeilException internFeilException) {
log.error("En feil inntraff ved opprettelse av oppgave til far for farskapserklæring med id {}", idFarskapserklaering);
}
}

public void sletteFarsSigneringsoppgave(String eventId, Forelder far) {
log.info("Sletter signeringsoppgave med eventId {}", eventId);
try {
ferdigprodusent.ferdigstilleFarsSigneringsoppgave(far, oppretteNokkel(eventId));
} catch (InternFeilException internFeilException) {
log.error("En feil oppstod ved sending av ferdigmelding for oppgave med eventId {}.");
}
}

private Nokkel oppretteNokkel() {
var unikEventid = UUID.randomUUID().toString();
return oppretteNokkel(unikEventid);
}

public void oppretteOppgaveTilFarOmSignering(int idFarskapserklaering, String foedselsnummerFar) {
log.info("Oppretter oppgave om signering til far i farskapserklæring med id {}", idFarskapserklaering);
oppgaveprodusent
.oppretteOppgaveForSigneringAvFarskapserklaering(Integer.toString(idFarskapserklaering), foedselsnummerFar,
MELDING_OM_VENTENDE_FARSKAPSERKLAERING, true);
private Nokkel oppretteNokkel(String eventId) {
return new NokkelBuilder().withSystembruker(farskapsportalEgenskaper.getSystembrukerBrukernavn()).withEventId(eventId).build();
}

public void sletteFarsSigneringsoppgave(int idFarskapserklaering, String foedselsnummerFar) {
log.info("Sletter signeringsoppgave knyttet til farskapserklæring med id {}", idFarskapserklaering);
ferdigprodusent.ferdigstilleFarsSigneringsoppgave(Integer.toString(idFarskapserklaering), foedselsnummerFar);
private URL toUrl(String url) throws MalformedURLException {
return new URL(url);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,14 @@
import lombok.Value;
import lombok.extern.slf4j.Slf4j;
import no.nav.brukernotifikasjon.schemas.Done;
import no.nav.brukernotifikasjon.schemas.Nokkel;
import no.nav.brukernotifikasjon.schemas.builders.DoneBuilder;
import no.nav.brukernotifikasjon.schemas.builders.NokkelBuilder;
import no.nav.farskapsportal.api.Feilkode;
import no.nav.farskapsportal.config.egenskaper.FarskapsportalEgenskaper;
import no.nav.farskapsportal.exception.InternFeilException;
import no.nav.farskapsportal.persistence.dao.OppgavebestillingDao;
import no.nav.farskapsportal.persistence.entity.Forelder;
import no.nav.farskapsportal.service.PersistenceService;
import org.springframework.kafka.core.KafkaTemplate;

@Slf4j
Expand All @@ -16,13 +21,27 @@ public class Ferdigprodusent {

FarskapsportalEgenskaper farskapsportalEgenskaper;
KafkaTemplate kafkaTemplate;

public void ferdigstilleFarsSigneringsoppgave(String idFarskapserklaering, String foedselsnummerFar) {

var nokkel = new NokkelBuilder().withEventId(idFarskapserklaering).withSystembruker(farskapsportalEgenskaper.getSystembrukerBrukernavn()).build();
var melding = oppretteDone(foedselsnummerFar);

kafkaTemplate.send(farskapsportalEgenskaper.getBrukernotifikasjon().getTopicFerdig(), nokkel, melding);
PersistenceService persistenceService;
OppgavebestillingDao oppgavebestillingDao;

public void ferdigstilleFarsSigneringsoppgave(Forelder far, Nokkel nokkel) {

var oppgaveSomSkalFerdigstilles = oppgavebestillingDao.henteOppgavebestilling(nokkel.getEventId());

if (oppgaveSomSkalFerdigstilles.isPresent() && oppgaveSomSkalFerdigstilles.get().getFerdigstilt() == null) {
var melding = oppretteDone(far.getFoedselsnummer());
try {
kafkaTemplate.send(farskapsportalEgenskaper.getBrukernotifikasjon().getTopicFerdig(), nokkel, melding);
} catch (Exception e) {
throw new InternFeilException(Feilkode.BRUKERNOTIFIKASJON_OPPRETTE_OPPGAVE, e);
}

log.info("Ferdigmelding ble sendt for oppgave med eventId {}.");
persistenceService.setteOppgaveTilFerdigstilt(nokkel.getEventId());
} else {
log.warn("Fant ingen aktiv oppgavebestilling for eventId {} (gjelder far med id: {}). Bestiller derfor ikke ferdigstilling.",
nokkel.getEventId(), far.getId());
}
}

private Done oppretteDone(String foedselsnummerFar) {
Expand All @@ -32,5 +51,4 @@ private Done oppretteDone(String foedselsnummerFar) {
.withGrupperingsId(farskapsportalEgenskaper.getBrukernotifikasjon().getGrupperingsidFarskap())
.build();
}

}
Loading

0 comments on commit abae401

Please sign in to comment.