Skip to content

Commit daa36dd

Browse files
committed
feature: Enhance KDI handling by introducing InstKdiHendelseService and refactoring related classes
1 parent 9c8c716 commit daa36dd

6 files changed

Lines changed: 207 additions & 84 deletions

File tree

apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/instdata/InstKdiHendelseService.java

Lines changed: 0 additions & 14 deletions
This file was deleted.

apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/instdata/InstdataClient.java

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import no.nav.dolly.bestilling.ClientRegister;
77
import no.nav.dolly.bestilling.instdata.domain.InstdataKdiDTO;
88
import no.nav.dolly.bestilling.instdata.domain.InstdataResponse;
9+
import no.nav.dolly.bestilling.instdata.service.InstKdiHendelseService;
910
import no.nav.dolly.domain.jpa.BestillingProgress;
1011
import no.nav.dolly.domain.resultset.RsDollyUtvidetBestilling;
1112
import no.nav.dolly.domain.resultset.dolly.DollyPerson;
@@ -30,10 +31,13 @@
3031
@RequiredArgsConstructor
3132
public class InstdataClient implements ClientRegister {
3233

34+
private static final String KDI_STATUS = "KDI_STATUS:";
35+
3336
private final MapperFacade mapperFacade;
3437
private final InstdataConsumer instdataConsumer;
3538
private final ErrorStatusDecoder errorStatusDecoder;
3639
private final TransactionHelperService transactionHelperService;
40+
private final InstKdiHendelseService instKdiHendelseService;
3741

3842
@Override
3943
public Mono<BestillingProgress> gjenopprett(RsDollyUtvidetBestilling bestilling, DollyPerson dollyPerson, BestillingProgress progress, boolean isOpprettEndre) {
@@ -43,25 +47,26 @@ public Mono<BestillingProgress> gjenopprett(RsDollyUtvidetBestilling bestilling,
4347
return Mono.empty();
4448
}
4549

46-
return Flux.merge(doInst2Bestilling(bestilling, dollyPerson, progress, isOpprettEndre),
47-
doInstKdiBestilling(bestilling, dollyPerson, progress, isOpprettEndre))
50+
return Flux.merge(doInst2Bestilling(bestilling, dollyPerson, isOpprettEndre),
51+
doInstKdiBestilling(bestilling, dollyPerson, progress.getBestillingId(), isOpprettEndre))
4852
.collect(Collectors.joining(","))
4953
.flatMap(resultat -> oppdaterStatus(progress, resultat));
5054
}
5155

52-
private Mono<String> doInstKdiBestilling(RsDollyUtvidetBestilling bestilling, DollyPerson dollyPerson, BestillingProgress progress) {
56+
private Mono<String> doInstKdiBestilling(RsDollyUtvidetBestilling bestilling, DollyPerson dollyPerson, Long bestillingId, boolean isOpprettEndre) {
5357

5458
return Mono.just(bestilling)
5559
.filter(bestilling1 -> nonNull(bestilling1.getInstdataKdi()))
5660
.flatMap(bestilling1 -> instdataConsumer.getMiljoer())
5761
.flatMapMany(miljoer -> Flux.fromIterable(miljoer.getKdiEnvironments())
5862
.filter(miljoe -> bestilling.getEnvironments().contains(miljoe))
59-
.flatMap(miljoe -> instdataConsumer.getInstdataKdi(dollyPerson.getIdent(), miljoe))
63+
.flatMap(miljoe -> instKdiHendelseService.getBestilling(bestilling, bestillingId,
64+
dollyPerson.getIdent(), miljoe, isOpprettEndre)
6065
.map(instKdiData -> {
61-
6266
var context = MappingContextUtils.getMappingContext();
63-
context.setProperty("instKdiData", instKdiData);
64-
return mapperFacade.map(bestilling.getInstdataKdi(), InstdataKdiDTO.class, context);
67+
context.setProperty("ident", dollyPerson.getIdent());
68+
context.setProperty("miljoe", dollyPerson.getIdent());
69+
return mapperFacade.map(instKdiData, InstdataKdiDTO.class, context);
6570
})
6671
.flatMap(instKdiRequest -> instdataConsumer.postInstdataKdi(instKdiRequest, dollyPerson.getIdent()))
6772
.map(response -> String.format("%s:opphold=%d$%s",

apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/instdata/mapper/InstdataKdiMappingStrategy.java

Lines changed: 29 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,15 @@
44
import ma.glasnost.orika.MapperFactory;
55
import ma.glasnost.orika.MappingContext;
66
import no.nav.dolly.bestilling.instdata.domain.InstdataKdiDTO;
7-
import no.nav.dolly.bestilling.instdata.domain.InstdataKdiResponse;
87
import no.nav.dolly.domain.resultset.inst.RsInstdataKdi;
98
import no.nav.dolly.mapper.MappingStrategy;
109
import org.springframework.stereotype.Component;
1110

12-
import java.time.LocalDateTime;
13-
import java.util.Collection;
14-
import java.util.List;
15-
import java.util.stream.Stream;
16-
1711
@Component
1812
public class InstdataKdiMappingStrategy implements MappingStrategy {
1913

2014
private static final String IDENT = "ident";
21-
private static final String TIMESTAMP = "timestamp";
15+
private static final String MILJOE = "miljoe";
2216

2317
@Override
2418
public void register(MapperFactory factory) {
@@ -27,25 +21,9 @@ public void register(MapperFactory factory) {
2721
@Override
2822
public void mapAtoB(RsInstdataKdi kilde, InstdataKdiDTO dest, MappingContext context) {
2923

30-
var instdataKdiResponse = (InstdataKdiResponse) context.getProperty("instKdiData");
31-
32-
var kdidata = instdataKdiResponse.getInstdataKdi().getData();
33-
var maksId = Stream.of(List.of(kdidata.getInnsettelse(),
34-
kdidata.getAvbruddStart(),
35-
kdidata.getAvbruddSlutt(),
36-
kdidata.getLoeslatelse(),
37-
kdidata.getForventetLoeslatelse()))
38-
.flatMap(Collection::stream)
39-
.flatMap(Collection::stream)
40-
.map(InstdataKdiDTO.Hendelse::getHendelseId)
41-
.max(String::compareTo)
42-
.orElse("0");
43-
44-
context.setProperty("maksId", maksId);
45-
context.setProperty(IDENT, instdataKdiResponse.getIdent());
46-
context.setProperty(TIMESTAMP, LocalDateTime.now());
47-
48-
dest.setEnvironment(instdataKdiResponse.getEnvironment());
24+
var miljoe = (String) context.getProperty(MILJOE);
25+
dest.setEnvironment(miljoe);
26+
4927
dest.getData().setInnsettelse(mapperFacade.mapAsList(kilde.getData().getInnsettelse(), InstdataKdiDTO.Innsettelse.class, context));
5028
dest.getData().setAvbruddStart(mapperFacade.mapAsList(kilde.getData().getAvbruddStart(), InstdataKdiDTO.AvbruddStart.class, context));
5129
dest.getData().setAvbruddSlutt(mapperFacade.mapAsList(kilde.getData().getAvbruddSlutt(), InstdataKdiDTO.AvbruddSlutt.class, context));
@@ -62,7 +40,10 @@ public void mapAtoB(RsInstdataKdi kilde, InstdataKdiDTO dest, MappingContext con
6240
public void mapAtoB(RsInstdataKdi.Innsettelse kilde, InstdataKdiDTO.Innsettelse dest, MappingContext context) {
6341

6442
dest.setNorskident((String) context.getProperty(IDENT));
65-
dest.setPubliseringstidspunkt((LocalDateTime) context.getProperty(TIMESTAMP));
43+
44+
var miljoe = (String) context.getProperty(MILJOE);
45+
dest.setHendelseId(kilde.getVersion().get(miljoe).getHendelseId());
46+
dest.setPubliseringstidspunkt(kilde.getVersion().get(miljoe).getPubliseringstidspunkt());
6647
}
6748
})
6849
.byDefault()
@@ -74,7 +55,10 @@ public void mapAtoB(RsInstdataKdi.Innsettelse kilde, InstdataKdiDTO.Innsettelse
7455
public void mapAtoB(RsInstdataKdi.AvbruddStart kilde, InstdataKdiDTO.AvbruddStart dest, MappingContext context) {
7556

7657
dest.setNorskident((String) context.getProperty(IDENT));
77-
dest.setPubliseringstidspunkt((LocalDateTime) context.getProperty(TIMESTAMP));
58+
59+
var miljoe = (String) context.getProperty(MILJOE);
60+
dest.setHendelseId(kilde.getVersion().get(miljoe).getHendelseId());
61+
dest.setPubliseringstidspunkt(kilde.getVersion().get(miljoe).getPubliseringstidspunkt());
7862
}
7963
})
8064
.byDefault()
@@ -86,7 +70,10 @@ public void mapAtoB(RsInstdataKdi.AvbruddStart kilde, InstdataKdiDTO.AvbruddStar
8670
public void mapAtoB(RsInstdataKdi.AvbruddSlutt kilde, InstdataKdiDTO.AvbruddSlutt dest, MappingContext context) {
8771

8872
dest.setNorskident((String) context.getProperty(IDENT));
89-
dest.setPubliseringstidspunkt((LocalDateTime) context.getProperty(TIMESTAMP));
73+
74+
var miljoe = (String) context.getProperty(MILJOE);
75+
dest.setHendelseId(kilde.getVersion().get(miljoe).getHendelseId());
76+
dest.setPubliseringstidspunkt(kilde.getVersion().get(miljoe).getPubliseringstidspunkt());
9077
}
9178
})
9279
.byDefault()
@@ -98,7 +85,10 @@ public void mapAtoB(RsInstdataKdi.AvbruddSlutt kilde, InstdataKdiDTO.AvbruddSlut
9885
public void mapAtoB(RsInstdataKdi.ForventetLoeslatelse kilde, InstdataKdiDTO.ForventetLoeslatelse dest, MappingContext context) {
9986

10087
dest.setNorskident((String) context.getProperty(IDENT));
101-
dest.setPubliseringstidspunkt((LocalDateTime) context.getProperty(TIMESTAMP));
88+
89+
var miljoe = (String) context.getProperty(MILJOE);
90+
dest.setHendelseId(kilde.getVersion().get(miljoe).getHendelseId());
91+
dest.setPubliseringstidspunkt(kilde.getVersion().get(miljoe).getPubliseringstidspunkt());
10292
}
10393
})
10494
.byDefault()
@@ -110,7 +100,10 @@ public void mapAtoB(RsInstdataKdi.ForventetLoeslatelse kilde, InstdataKdiDTO.For
110100
public void mapAtoB(RsInstdataKdi.Loeslatelse kilde, InstdataKdiDTO.Loeslatelse dest, MappingContext context) {
111101

112102
dest.setNorskident((String) context.getProperty(IDENT));
113-
dest.setPubliseringstidspunkt((LocalDateTime) context.getProperty(TIMESTAMP));
103+
104+
var miljoe = (String) context.getProperty(MILJOE);
105+
dest.setHendelseId(kilde.getVersion().get(miljoe).getHendelseId());
106+
dest.setPubliseringstidspunkt(kilde.getVersion().get(miljoe).getPubliseringstidspunkt());
114107
}
115108
})
116109
.byDefault()
@@ -122,33 +115,13 @@ public void mapAtoB(RsInstdataKdi.Loeslatelse kilde, InstdataKdiDTO.Loeslatelse
122115
public void mapAtoB(RsInstdataKdi.Annullering kilde, InstdataKdiDTO.Annullering dest, MappingContext context) {
123116

124117
dest.setNorskident((String) context.getProperty(IDENT));
125-
dest.setPubliseringstidspunkt((LocalDateTime) context.getProperty(TIMESTAMP));
118+
119+
var miljoe = (String) context.getProperty(MILJOE);
120+
dest.setHendelseId(kilde.getVersion().get(miljoe).getHendelseId());
121+
dest.setPubliseringstidspunkt(kilde.getVersion().get(miljoe).getPubliseringstidspunkt());
126122
}
127123
})
128124
.byDefault()
129125
.register();
130126
}
131-
132-
private static Long getBestillingId(String maksId, Long bestillingId) {
133-
134-
return maksId.length() == 30 ? Long.parseLong(maksId.substring(2, 21)) : bestillingId;
135-
}
136-
137-
private static Long getLoepenummer(String maksId) {
138-
139-
return maksId.length() == 30 ? Long.parseLong(maksId.substring(20)) : 0L;
140-
}
141-
142-
private static String getMaxHendelseId(List<InstdataKdiDTO.Hendelse> response) {
143-
144-
return response.stream()
145-
.map(InstdataKdiDTO.Hendelse::getHendelseId)
146-
.max(String::compareTo)
147-
.orElse("0");
148-
}
149-
150-
private static String makeHendelseId(Long bestillingId, Integer eksisterendeLoepenr, Integer offsetLoepenr) {
151-
152-
return "0x%0d18%0d10".formatted(bestillingId, eksisterendeLoepenr + offsetLoepenr);
153-
}
154-
}
127+
}
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
package no.nav.dolly.bestilling.instdata.service;
2+
3+
import lombok.RequiredArgsConstructor;
4+
import ma.glasnost.orika.CustomMapper;
5+
import ma.glasnost.orika.MapperFacade;
6+
import ma.glasnost.orika.MappingContext;
7+
import no.nav.dolly.bestilling.instdata.InstdataConsumer;
8+
import no.nav.dolly.bestilling.instdata.domain.InstdataKdiDTO;
9+
import no.nav.dolly.bestilling.instdata.domain.InstdataKdiResponse;
10+
import no.nav.dolly.bestilling.instdata.domain.InstdataResponse;
11+
import no.nav.dolly.domain.jpa.Bestilling;
12+
import no.nav.dolly.domain.resultset.RsDollyUtvidetBestilling;
13+
import no.nav.dolly.domain.resultset.inst.RsInstdataKdi;
14+
import no.nav.dolly.repository.BestillingRepository;
15+
import no.nav.dolly.service.TransactionHelperService;
16+
import no.nav.testnav.libs.dto.arbeidsplassencv.v1.ArbeidsplassenCVDTO;
17+
import org.springframework.stereotype.Service;
18+
import reactor.core.publisher.Mono;
19+
20+
import java.time.LocalDateTime;
21+
import java.util.Collection;
22+
import java.util.List;
23+
import java.util.Map;
24+
import java.util.Objects;
25+
import java.util.stream.Stream;
26+
27+
import static java.util.Objects.isNull;
28+
29+
@Service
30+
@RequiredArgsConstructor
31+
public class InstKdiHendelseService {
32+
33+
private static final String INNSETTELSE = "A";
34+
private static final String AVBRUDD_START = "B";
35+
private static final String AVBRUDD_SLUTT = "C";
36+
private static final String LOESLATELSE = "D";
37+
private static final String FORVENTET_LOESLATELSE = "E";
38+
39+
private final InstdataConsumer instdataConsumer;
40+
private final TransactionHelperService transactionHelperService;
41+
42+
public Mono<RsInstdataKdi> getBestilling(RsDollyUtvidetBestilling bestilling, Long bestillingId, String ident, String miljoe, boolean isOpprettEndre) {
43+
44+
if (isOpprettEndre) {
45+
return instdataConsumer.getInstdataKdi(ident, miljoe)
46+
.map(instdataKdiResponse -> oppdaterBestilling(instdataKdiResponse, bestilling.getInstdataKdi(), bestillingId, miljoe))
47+
.doOnNext(bestilling::setInstdataKdi)
48+
.flatMap(oppdaterBestilling -> transactionHelperService.persister(bestillingId, bestilling)
49+
.then(Mono.just(oppdaterBestilling)));
50+
51+
} else {
52+
return Mono.just(bestilling.getInstdataKdi());
53+
}
54+
}
55+
56+
private RsInstdataKdi oppdaterBestilling(InstdataKdiResponse instdataKdiResponse, RsInstdataKdi bestilling, Long bestillingId, String miljoe) {
57+
58+
var kdidata = instdataKdiResponse.getInstdataKdi().getData();
59+
60+
var annuleringer = kdidata.getAnnullering().stream()
61+
.map(InstdataKdiDTO.Annullering::getHendelseId)
62+
.toList();
63+
64+
var data = bestilling.getData();
65+
66+
oppdaterHendelser(data.getInnsettelse(), getHendelseId(kdidata.getInnsettelse(),
67+
INNSETTELSE, bestillingId, annuleringer), miljoe);
68+
oppdaterHendelser(data.getAvbruddStart(), getHendelseId(kdidata.getAvbruddStart(),
69+
AVBRUDD_START, bestillingId, annuleringer), miljoe);
70+
oppdaterHendelser(data.getAvbruddSlutt(), getHendelseId(kdidata.getAvbruddSlutt(),
71+
AVBRUDD_SLUTT, bestillingId, annuleringer), miljoe);
72+
oppdaterHendelser(data.getLoeslatelse(), getHendelseId(kdidata.getLoeslatelse(),
73+
LOESLATELSE, bestillingId, annuleringer), miljoe);
74+
oppdaterHendelser(data.getForventetLoeslatelse(), getHendelseId(kdidata.getForventetLoeslatelse(),
75+
FORVENTET_LOESLATELSE, bestillingId, annuleringer), miljoe);
76+
77+
data.getAnnullering()
78+
.forEach(annulering ->
79+
annulering.getVersion().put(miljoe,
80+
RsInstdataKdi.Version.builder()
81+
.hendelseId(annulering.getHendelseId())
82+
.publiseringstidspunkt(isNull(annulering.getPubliseringstidspunkt()) ?
83+
LocalDateTime.now() : annulering.getPubliseringstidspunkt())
84+
.build()));
85+
86+
return bestilling;
87+
}
88+
89+
private static String getHendelseId(List<? extends InstdataKdiDTO.Hendelse> hendelser,
90+
String type,
91+
Long bestillingId,
92+
List<String> annuleringer) {
93+
94+
var hendelseId = getHendelseId(hendelser, type, bestillingId);
95+
96+
return !annuleringer.contains(hendelseId) ? hendelseId : getNextHendelseId(hendelseId);
97+
}
98+
99+
private static String getNextHendelseId(String hendelseId) {
100+
101+
return hendelseId.substring(0, 21) + String.format("%010d", Long.parseLong(hendelseId.substring(21)) + 1);
102+
}
103+
104+
private static String makeHendelseId(Long bestillingId, String type, Integer loepenummer) {
105+
106+
return "0x%010d00000%s00%010d".formatted(bestillingId, type, loepenummer);
107+
}
108+
109+
private static String getHendelseId(List<? extends InstdataKdiDTO.Hendelse> hendelser, String type, Long bestillingId) {
110+
111+
return hendelser.stream()
112+
.map(InstdataKdiDTO.Hendelse::getHendelseId)
113+
.max(String::compareTo)
114+
.orElse(makeHendelseId(bestillingId, type, 1));
115+
}
116+
117+
private static void oppdaterHendelser(List<? extends RsInstdataKdi.Hendelse> hendelser, String hendelseId, String miljoe) {
118+
119+
hendelser.forEach(hendelse -> hendelse.getVersion().put(miljoe,
120+
RsInstdataKdi.Version.builder()
121+
.hendelseId(hendelseId)
122+
.publiseringstidspunkt(LocalDateTime.now())
123+
.build()
124+
));
125+
}
126+
}

apps/dolly-backend/src/main/java/no/nav/dolly/domain/resultset/RsDollyBestilling.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public class RsDollyBestilling {
5656
private static final Set<String> EXCLUDE_METHODS = Set.of("getClass", "getMalBestillingNavn", "getEnvironments", "getPdldata", "getId");
5757

5858
@JsonIgnore
59-
private long id; // Ved gjenopprett vil denne ID kan ha verdi fra bestillingen som gjenopprettes
59+
private long id; // Ved gjenopprett vil denne ID ha verdi fra bestillingen som gjenopprettes
6060

6161
@Schema(description = "Sett av miljøer bestillingen skal deployes til")
6262
private Set<String> environments;

0 commit comments

Comments
 (0)