From c1e72b1c3c4c1c61d8fabd485a7090aa07c3af83 Mon Sep 17 00:00:00 2001 From: Ramin Esfandiari Date: Fri, 24 Jan 2025 15:39:40 +0100 Subject: [PATCH] =?UTF-8?q?Publiserer=20ForelderBarnRelasjon=20hendelser?= =?UTF-8?q?=20ved=20f=C3=B8dselshendelser.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ForelderBarnRelasjonHendelseDto.java | 14 +++ .../server/api/pdl/PdlLeesahRestTjeneste.java | 88 ++++++++++++++++--- .../resources/avro/leesah/Personhendelse.avdl | 2 + .../ForelderBarnRelasjon.avdl | 11 +++ 4 files changed, 104 insertions(+), 11 deletions(-) create mode 100644 kontrakter/src/main/java/no/nav/foreldrepenger/vtp/kontrakter/ForelderBarnRelasjonHendelseDto.java create mode 100644 server/src/main/resources/avro/leesah/forelderbarnrelasjon/ForelderBarnRelasjon.avdl diff --git a/kontrakter/src/main/java/no/nav/foreldrepenger/vtp/kontrakter/ForelderBarnRelasjonHendelseDto.java b/kontrakter/src/main/java/no/nav/foreldrepenger/vtp/kontrakter/ForelderBarnRelasjonHendelseDto.java new file mode 100644 index 000000000..a2f993d3a --- /dev/null +++ b/kontrakter/src/main/java/no/nav/foreldrepenger/vtp/kontrakter/ForelderBarnRelasjonHendelseDto.java @@ -0,0 +1,14 @@ +package no.nav.foreldrepenger.vtp.kontrakter; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import io.swagger.v3.oas.annotations.media.Schema; + +@Schema(name = "FamilierelasjonHendelseDto") +@JsonIgnoreProperties(ignoreUnknown = true) +public record ForelderBarnRelasjonHendelseDto(@Schema String endringstype, + @Schema String fnr, + @Schema String relatertPersonsFnr, + @Schema String relatertPersonsRolle, + @Schema String minRolleForPerson) implements PersonhendelseDto { + +} diff --git a/server/src/main/java/no/nav/foreldrepenger/vtp/server/api/pdl/PdlLeesahRestTjeneste.java b/server/src/main/java/no/nav/foreldrepenger/vtp/server/api/pdl/PdlLeesahRestTjeneste.java index 5451d16cc..d52b48ff2 100644 --- a/server/src/main/java/no/nav/foreldrepenger/vtp/server/api/pdl/PdlLeesahRestTjeneste.java +++ b/server/src/main/java/no/nav/foreldrepenger/vtp/server/api/pdl/PdlLeesahRestTjeneste.java @@ -3,6 +3,7 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; @@ -26,6 +27,7 @@ import no.nav.foreldrepenger.vtp.kontrakter.DødfødselhendelseDto; import no.nav.foreldrepenger.vtp.kontrakter.DødshendelseDto; import no.nav.foreldrepenger.vtp.kontrakter.FamilierelasjonHendelseDto; +import no.nav.foreldrepenger.vtp.kontrakter.ForelderBarnRelasjonHendelseDto; import no.nav.foreldrepenger.vtp.kontrakter.FødselshendelseDto; import no.nav.foreldrepenger.vtp.kontrakter.PersonhendelseDto; import no.nav.foreldrepenger.vtp.testmodell.personopplysning.BarnModell; @@ -39,6 +41,7 @@ import no.nav.person.pdl.leesah.doedsfall.Doedsfall; import no.nav.person.pdl.leesah.familierelasjon.Familierelasjon; import no.nav.person.pdl.leesah.foedselsdato.Foedselsdato; +import no.nav.person.pdl.leesah.forelderbarnrelasjon.ForelderBarnRelasjon; @Tag(name = "Legge hendelser på PDL topic") @Path("/api/pdl/leesah") @@ -74,16 +77,15 @@ public PdlLeesahRestTjeneste(TestscenarioRepository testscenarioRepository) { @Operation(description = "Legg til hendelse") public Response leggTilHendelse(PersonhendelseDto personhendelseDto) { try { - if (personhendelseDto instanceof FødselshendelseDto fødselshendelseDto) { - produserFødselshendelse(fødselshendelseDto); - } else if (personhendelseDto instanceof DødshendelseDto dødshendelseDto) { - produserDødshendelse(dødshendelseDto); - } else if (personhendelseDto instanceof DødfødselhendelseDto dødfødselhendelseDto) { - produserDødfødselshendelse(dødfødselhendelseDto); - } else if (personhendelseDto instanceof FamilierelasjonHendelseDto familierelasjonHendelseDto) { - produserFamilierelasjonHendelse(familierelasjonHendelseDto); - } else { - return Response.status(Response.Status.BAD_REQUEST).entity("{\"error\": \"Ukjent hendelsestype\"}").build(); + switch (personhendelseDto) { + case FødselshendelseDto fødselshendelseDto -> produserFødselshendelse(fødselshendelseDto); + case DødshendelseDto dødshendelseDto -> produserDødshendelse(dødshendelseDto); + case DødfødselhendelseDto dødfødselhendelseDto -> produserDødfødselshendelse(dødfødselhendelseDto); + case FamilierelasjonHendelseDto familierelasjonHendelseDto -> produserFamilierelasjonHendelse(familierelasjonHendelseDto); + case ForelderBarnRelasjonHendelseDto forelderBarnRelasjonHendelseDto -> produserForelderBarnRelasjonHendelse(forelderBarnRelasjonHendelseDto); + case null, default -> { + return Response.status(Response.Status.BAD_REQUEST).entity("{\"error\": \"Ukjent hendelsestype\"}").build(); + } } } catch (RuntimeException e) { @@ -93,6 +95,38 @@ public Response leggTilHendelse(PersonhendelseDto personhendelseDto) { return Response.status(201).entity("{\"success\": \"Personhendelse opprettet\"}").build(); } + private void produserForelderBarnRelasjonHendelse(ForelderBarnRelasjonHendelseDto forelderBarnRelasjonHendelseDto) { + if (forelderBarnRelasjonHendelseDto == null) { + LOG.warn("ForelderBarnRelasjonHendelseDto er null, kan ikke produsere hendelse"); + return; + } + + GenericRecordBuilder personhendelse = new GenericRecordBuilder(Personhendelse.SCHEMA$); + + personhendelse.set(HENDELSE_ID, UUID.randomUUID().toString()); + personhendelse.set(MASTER_FIELD, "Freg"); + personhendelse.set(OPPRETTET, LocalDateTime.now().atZone(ZoneId.systemDefault()).toEpochSecond() * 1000); + personhendelse.set(OPPLYSNINGSTYPE, "FORELDERBARNRELASJON_V1"); + personhendelse.set(ENDRINGSTYPE, Endringstype.valueOf(forelderBarnRelasjonHendelseDto.endringstype())); + + String fnr = forelderBarnRelasjonHendelseDto.fnr(); + personhendelse.set(PERSONIDENTER, List.of(fnr, testscenarioRepository.getPersonIndeks().finnByIdent(fnr).getAktørIdent())); + + if (!Endringstype.ANNULLERT.toString().equals(forelderBarnRelasjonHendelseDto.endringstype())) { + GenericRecordBuilder forelderBarnRelasjon = new GenericRecordBuilder(ForelderBarnRelasjon.SCHEMA$); + String relatertPersonsFnr = forelderBarnRelasjonHendelseDto.relatertPersonsFnr(); + forelderBarnRelasjon.set("relatertPersonsIdent", relatertPersonsFnr); + forelderBarnRelasjon.set("relatertPersonsRolle", forelderBarnRelasjonHendelseDto.relatertPersonsRolle()); + forelderBarnRelasjon.set("minRolleForPerson", forelderBarnRelasjonHendelseDto.minRolleForPerson()); + personhendelse.set("forelderBarnRelasjon", forelderBarnRelasjon.build()); + } + + LOG.info("Publiserer FORELDERBARNRELASJON_V1 hendelse med minRolle: {}, minFnr: {}, relatertPersonRolle: {}, relatertPersonFnr: {}", + forelderBarnRelasjonHendelseDto.minRolleForPerson(), forelderBarnRelasjonHendelseDto.fnr(), + forelderBarnRelasjonHendelseDto.relatertPersonsRolle(), forelderBarnRelasjonHendelseDto.relatertPersonsFnr()); + sendHendelsePåKafka(personhendelse.build()); + } + private void produserFødselshendelse(FødselshendelseDto fødselshendelseDto) { var barnIdent = registererNyttBarnPåForeldre(fødselshendelseDto); GenericRecordBuilder personhendelse = new GenericRecordBuilder(Personhendelse.SCHEMA$); @@ -113,9 +147,36 @@ public Response leggTilHendelse(PersonhendelseDto personhendelseDto) { personhendelse.set("foedselsdato", fødselsdato.build()); } + LOG.info("Publiserer FOEDSELSDATO_V1 på kafka for barn med ident {}, født: {}", barnIdent, fødselshendelseDto.fødselsdato()); sendHendelsePåKafka(personhendelse.build()); + + produserForelderBarnRelasjon(fødselshendelseDto, barnIdent); + } + + private void produserForelderBarnRelasjon(FødselshendelseDto fødselshendelseDto, String barnIdent) { + List forelderBarnRelasjonHendelseDtos = new ArrayList<>(); + if (fødselshendelseDto.fnrMor() != null) { + // Legg til relasjoner for mor + leggTilForelderBarnRelasjon(forelderBarnRelasjonHendelseDtos, fødselshendelseDto.endringstype(), + fødselshendelseDto.fnrMor(), barnIdent); + } else if (fødselshendelseDto.fnrFar() != null) { + // Legg til relasjoner for far + leggTilForelderBarnRelasjon(forelderBarnRelasjonHendelseDtos, fødselshendelseDto.endringstype(), + fødselshendelseDto.fnrFar(), barnIdent); + } + + forelderBarnRelasjonHendelseDtos.forEach(this::produserForelderBarnRelasjonHendelse); } + private void leggTilForelderBarnRelasjon(List dtos, + String endringstype, + String forelderFnr, + String barnFnr) { + dtos.add(new ForelderBarnRelasjonHendelseDto(endringstype, forelderFnr, barnFnr, "BARN", "MOR")); + dtos.add(new ForelderBarnRelasjonHendelseDto(endringstype, barnFnr, forelderFnr, "MOR", "BARN")); + } + + public void sendHendelsePåKafka(GenericData.Record rekord) { localKafkaProducer.sendMelding(LEESAH_TOPIC, rekord); } @@ -140,6 +201,7 @@ public Response leggTilHendelse(PersonhendelseDto personhendelseDto) { personhendelse.set("doedsfall", dødsfall.build()); } + LOG.info("Publiserer DOEDSFALL_V1 hendelse på kafka for person med ident {}, dødsdato: {}", dødshendelseDto.fnr(), dødshendelseDto.doedsdato()); sendHendelsePåKafka(personhendelse.build()); } @@ -163,6 +225,7 @@ public Response leggTilHendelse(PersonhendelseDto personhendelseDto) { personhendelse.set("doedfoedtBarn", dødfødtBarn.build()); } + LOG.info("Publiserer DOEDFOEDT_BARN_V1 hendelse på kafka for barn med ident {}, dødsdato: {}", dødfødselhendelseDto.fnr(), dødfødselhendelseDto.doedfoedselsdato()); sendHendelsePåKafka(personhendelse.build()); } @@ -184,6 +247,9 @@ private void produserFamilierelasjonHendelse(FamilierelasjonHendelseDto familier personhendelse.set("familierelasjon", familierelasjon.build()); } + LOG.info("Publiserer FAMILIERELASJON_V1 hendelse med minRolle: {}, minFnr: {}, relatertPersonRolle: {}, relatertPersonFnr: {}", + familierelasjonHendelseDto.minRolleForPerson(), familierelasjonHendelseDto.fnr(), + familierelasjonHendelseDto.relatertPersonsRolle(), familierelasjonHendelseDto.relatertPersonsFnr()); sendHendelsePåKafka(personhendelse.build()); } @@ -226,7 +292,7 @@ private int oversettLocalDateTilAvroFormat(LocalDate localDate) { setDødsdatoerIIndeksene(personopplysninger, dødshendelseDto); } - private void setDødsdatoerIIndeksene(Personopplysninger personopplysninger, DødshendelseDto dødshendelseDto){ + private void setDødsdatoerIIndeksene(Personopplysninger personopplysninger, DødshendelseDto dødshendelseDto) { if (dødshendelseDto.fnr().equalsIgnoreCase(personopplysninger.getSøker().getIdent())) { personopplysninger.getSøker().setDødsdato(dødshendelseDto.doedsdato()); } else if (dødshendelseDto.fnr().equalsIgnoreCase(personopplysninger.getAnnenPart().getIdent())) { diff --git a/server/src/main/resources/avro/leesah/Personhendelse.avdl b/server/src/main/resources/avro/leesah/Personhendelse.avdl index 325e80cf1..74fd2b1b9 100644 --- a/server/src/main/resources/avro/leesah/Personhendelse.avdl +++ b/server/src/main/resources/avro/leesah/Personhendelse.avdl @@ -5,6 +5,7 @@ protocol PersonhendelseProto { import idl "foedsel/Foedsel.avdl"; import idl "foedselsdato/Foedselsdato.avdl"; import idl "familierelasjon/Familierelasjon.avdl"; + import idl "forelderbarnrelasjon/ForelderBarnRelasjon.avdl"; enum Endringstype { OPPRETTET, @@ -29,5 +30,6 @@ protocol PersonhendelseProto { union { null, no.nav.person.pdl.leesah.foedsel.Foedsel } foedsel = null; union { null, no.nav.person.pdl.leesah.foedselsdato.Foedselsdato } foedselsdato = null; union { null, no.nav.person.pdl.leesah.familierelasjon.Familierelasjon } familierelasjon = null; + union { null, no.nav.person.pdl.leesah.forelderbarnrelasjon.ForelderBarnRelasjon } forelderBarnRelasjon = null; } } diff --git a/server/src/main/resources/avro/leesah/forelderbarnrelasjon/ForelderBarnRelasjon.avdl b/server/src/main/resources/avro/leesah/forelderbarnrelasjon/ForelderBarnRelasjon.avdl new file mode 100644 index 000000000..0c9272b89 --- /dev/null +++ b/server/src/main/resources/avro/leesah/forelderbarnrelasjon/ForelderBarnRelasjon.avdl @@ -0,0 +1,11 @@ +/*https://github.com/navikt/pdl/blob/master/libs/contract-pdl-avro/src/main/avro/no/nav/person/pdl/leesah/forelderbarnrelasjon/ForelderBarnRelasjon.avdl*/ + +@namespace("no.nav.person.pdl.leesah.forelderbarnrelasjon") +protocol ForelderBarnRelasjonV1 { + + record ForelderBarnRelasjon { + union { null, string } relatertPersonsIdent = null; + string relatertPersonsRolle; + union { null, string } minRolleForPerson = null; + } +}