From 0be40907b05018b891b9fbc228aa7bd0eb89bfb7 Mon Sep 17 00:00:00 2001 From: Sanne Edland Date: Tue, 18 Jul 2023 16:24:11 +0200 Subject: [PATCH 01/16] Lagt til OverblikkAPI --- .../nav/pto/veilarbfilter/database/Table.java | 8 ++ .../nav/pto/veilarbfilter/domene/Chips.java | 30 +++++++ .../pto/veilarbfilter/domene/ChipsModel.java | 33 +++++++ .../veilarbfilter/domene/NyttChipsModel.java | 18 ++++ .../MineLagredeChipsRepository.java | 89 +++++++++++++++++++ .../rest/MineChipsController.java | 53 +++++++++++ .../veilarbfilter/service/ChipsService.java | 16 ++++ .../service/ChipsServiceImpl.java | 45 ++++++++++ .../service/MineLagredeChipsService.java | 46 ++++++++++ 9 files changed, 338 insertions(+) create mode 100644 src/main/java/no/nav/pto/veilarbfilter/domene/Chips.java create mode 100644 src/main/java/no/nav/pto/veilarbfilter/domene/ChipsModel.java create mode 100644 src/main/java/no/nav/pto/veilarbfilter/domene/NyttChipsModel.java create mode 100644 src/main/java/no/nav/pto/veilarbfilter/repository/MineLagredeChipsRepository.java create mode 100644 src/main/java/no/nav/pto/veilarbfilter/rest/MineChipsController.java create mode 100644 src/main/java/no/nav/pto/veilarbfilter/service/ChipsService.java create mode 100644 src/main/java/no/nav/pto/veilarbfilter/service/ChipsServiceImpl.java create mode 100644 src/main/java/no/nav/pto/veilarbfilter/service/MineLagredeChipsService.java diff --git a/src/main/java/no/nav/pto/veilarbfilter/database/Table.java b/src/main/java/no/nav/pto/veilarbfilter/database/Table.java index 815117a9..289c11de 100644 --- a/src/main/java/no/nav/pto/veilarbfilter/database/Table.java +++ b/src/main/java/no/nav/pto/veilarbfilter/database/Table.java @@ -31,4 +31,12 @@ public static class MetricsReporterInfo { public static String REPORTER_ID = "reporter_id"; public static String OPPRETTET = "opprettet"; } + + public static class DetaljerVisning { + public static String TABLE_NAME = "DetaljerVisning"; + public static String VEILEDER_ID = "veileder_id"; + public static String OPPRETTET = "opprettet"; + public static String DETALJER_VISNING = "detaljer_visning"; + } } + diff --git a/src/main/java/no/nav/pto/veilarbfilter/domene/Chips.java b/src/main/java/no/nav/pto/veilarbfilter/domene/Chips.java new file mode 100644 index 00000000..e4485c18 --- /dev/null +++ b/src/main/java/no/nav/pto/veilarbfilter/domene/Chips.java @@ -0,0 +1,30 @@ +package no.nav.pto.veilarbfilter.domene; + +import com.fasterxml.jackson.annotation.*; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.util.List; + +import static java.util.Collections.emptyList; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +@JsonPropertyOrder(alphabetic = true) +@JsonIgnoreProperties(ignoreUnknown = true) +public class Chips { + + @JsonSetter(nulls = Nulls.AS_EMPTY) + @Setter + private List detaljerVisning = emptyList(); + private String veilederID = ""; + + @JsonIgnore + public Boolean isNotEmpty() { + return (veilederID != null && !veilederID.isEmpty()) || + (detaljerVisning != null && !detaljerVisning.isEmpty()); + } +} diff --git a/src/main/java/no/nav/pto/veilarbfilter/domene/ChipsModel.java b/src/main/java/no/nav/pto/veilarbfilter/domene/ChipsModel.java new file mode 100644 index 00000000..ed602894 --- /dev/null +++ b/src/main/java/no/nav/pto/veilarbfilter/domene/ChipsModel.java @@ -0,0 +1,33 @@ +package no.nav.pto.veilarbfilter.domene; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; +import no.nav.pto.veilarbfilter.domene.deserializer.DateDeserializer; +import no.nav.pto.veilarbfilter.domene.deserializer.DateSerializer; +import java.util.List; +import java.time.LocalDateTime; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +@JsonPropertyOrder(alphabetic = true) +@JsonIgnoreProperties(ignoreUnknown = true) +public class ChipsModel { + + @JsonSetter(nulls = Nulls.AS_EMPTY) + private String veilederID = null; + + @JsonSetter(nulls = Nulls.AS_EMPTY) + private String detaljerVisning = null; + + @JsonSetter(nulls = Nulls.AS_EMPTY) + private LocalDateTime opprettet = null; +} diff --git a/src/main/java/no/nav/pto/veilarbfilter/domene/NyttChipsModel.java b/src/main/java/no/nav/pto/veilarbfilter/domene/NyttChipsModel.java new file mode 100644 index 00000000..432c8d98 --- /dev/null +++ b/src/main/java/no/nav/pto/veilarbfilter/domene/NyttChipsModel.java @@ -0,0 +1,18 @@ +package no.nav.pto.veilarbfilter.domene; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.util.List; + +@Data +@Setter +@AllArgsConstructor +@JsonDeserialize +@NoArgsConstructor +public class NyttChipsModel { + List detaljerVisning; +} diff --git a/src/main/java/no/nav/pto/veilarbfilter/repository/MineLagredeChipsRepository.java b/src/main/java/no/nav/pto/veilarbfilter/repository/MineLagredeChipsRepository.java new file mode 100644 index 00000000..40dd72d4 --- /dev/null +++ b/src/main/java/no/nav/pto/veilarbfilter/repository/MineLagredeChipsRepository.java @@ -0,0 +1,89 @@ +package no.nav.pto.veilarbfilter.repository; + +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import no.nav.pto.veilarbfilter.database.Table; +import no.nav.pto.veilarbfilter.domene.*; +import no.nav.pto.veilarbfilter.service.LagredeFilterFeilmeldinger; +import no.nav.pto.veilarbfilter.util.DateUtils; +import org.springframework.data.relational.core.sql.Select; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Service; +import org.springframework.util.Assert; + +import java.time.LocalDateTime; +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import static no.nav.pto.veilarbfilter.database.Table.DetaljerVisning; +import static no.nav.pto.veilarbfilter.database.Table.MineLagredeFilter; +import static no.nav.pto.veilarbfilter.util.DateUtils.fromLocalDateTimeToTimestamp; + +@Service +@Slf4j +@RequiredArgsConstructor +public class MineLagredeChipsRepository { + private final JdbcTemplate db; + private final ObjectMapper objectMapper; + + public Optional hentVisning(String veilederId) { + try { + String selectSql = String.format("SELECT * FROM %s where %s = ?", DetaljerVisning.TABLE_NAME, DetaljerVisning.VEILEDER_ID); + ChipsModel minLagretDetaljerVisning = db.queryForObject(selectSql, (rs, rowNum) -> { + try { + return new ChipsModel(rs.getString(DetaljerVisning.VEILEDER_ID), rs.getString(DetaljerVisning.DETALJER_VISNING), null); + } catch (Exception e) { + log.error("Error ved å hente visningen " + e, e); + throw new RuntimeException(e); + } + }, veilederId); + + return Optional.of(minLagretDetaljerVisning); + } catch (Exception e) { + log.warn("Finner ikke visningen " + e, e); + return Optional.empty(); + } + } + + public void lagreVisning(String veilederId, List detaljerVisning) throws IllegalArgumentException { + try { + String insertSql = String.format("INSERT INTO %s (%s, to_json(?::JSON), %s) VALUES (?, ?, ?)", + DetaljerVisning.TABLE_NAME, DetaljerVisning.VEILEDER_ID, DetaljerVisning.DETALJER_VISNING, DetaljerVisning.OPPRETTET); + db.update(insertSql, veilederId, objectMapper.writeValueAsString(detaljerVisning), fromLocalDateTimeToTimestamp(LocalDateTime.now())); + } catch (IllegalArgumentException e) { + throw e; + } catch (Exception e) { + log.error("Kan ikke lagre visningen " + e, e); + } + } + + public void oppdaterVisning(String veilederId, List detaljerVisning) throws IllegalArgumentException { + try { + + String updateSql = String.format("UPDATE %s, %s = to_json(?::JSON) WHERE %s = ?", DetaljerVisning.TABLE_NAME, DetaljerVisning.DETALJER_VISNING, DetaljerVisning.VEILEDER_ID); + db.update(updateSql, objectMapper.writeValueAsString(detaljerVisning), veilederId); + + } catch (IllegalArgumentException e) { + throw e; + } catch (Exception e) { + log.error("Kan ikke oppdatere visning " + e, e); + } + } + + public void slettVisning(String veilederId) throws IllegalArgumentException { + try { + String deleteSql = String.format("DELETE FROM %s WHERE %s = ?", + DetaljerVisning.TABLE_NAME, DetaljerVisning.VEILEDER_ID); + + db.update(deleteSql, veilederId); + + } catch (IllegalArgumentException e) { + throw e; + } catch (Exception e) { + log.error("Kan ikke slette visning " + e, e); + } + } +} diff --git a/src/main/java/no/nav/pto/veilarbfilter/rest/MineChipsController.java b/src/main/java/no/nav/pto/veilarbfilter/rest/MineChipsController.java new file mode 100644 index 00000000..db4679c6 --- /dev/null +++ b/src/main/java/no/nav/pto/veilarbfilter/rest/MineChipsController.java @@ -0,0 +1,53 @@ +package no.nav.pto.veilarbfilter.rest; + +import jakarta.ws.rs.GET; +import lombok.RequiredArgsConstructor; +import no.nav.pto.veilarbfilter.auth.AuthUtils; +import no.nav.pto.veilarbfilter.domene.Chips; +import no.nav.pto.veilarbfilter.domene.ChipsModel; +import no.nav.pto.veilarbfilter.domene.NyttChipsModel; +import no.nav.pto.veilarbfilter.repository.MineLagredeChipsRepository; +import no.nav.pto.veilarbfilter.service.ChipsService; +import okhttp3.Response; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Optional; + +import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; + +@RequiredArgsConstructor +@RestController +@RequestMapping(value = "/api/overblikkvisning", produces = APPLICATION_JSON_VALUE) + +public class MineChipsController { + + private final ChipsService chipsService; + + +@PostMapping + public ResponseEntity lagreOgOppdaterVisning(@RequestBody NyttChipsModel nyttChipsModel) throws Exception { + String veilederId = AuthUtils.getInnloggetVeilederIdent().toString(); + + chipsService.lagreOgOppdater(veilederId, nyttChipsModel.getDetaljerVisning()); + return ResponseEntity.ok().build(); + } + + @GetMapping + public ResponseEntity> hentVisning() { + String veilederId = AuthUtils.getInnloggetVeilederIdent().toString(); + + Optional visningsListe = chipsService.hentVisning(veilederId); + return ResponseEntity.ok().body(visningsListe); + + } + + @DeleteMapping + public ResponseEntity slettVisning() { + String veilederId = AuthUtils.getInnloggetVeilederIdent().toString(); + + chipsService.slettVisning(veilederId); + return ResponseEntity.ok().build(); + } +} diff --git a/src/main/java/no/nav/pto/veilarbfilter/service/ChipsService.java b/src/main/java/no/nav/pto/veilarbfilter/service/ChipsService.java new file mode 100644 index 00000000..dfe3a17e --- /dev/null +++ b/src/main/java/no/nav/pto/veilarbfilter/service/ChipsService.java @@ -0,0 +1,16 @@ +package no.nav.pto.veilarbfilter.service; + +import no.nav.pto.veilarbfilter.domene.ChipsModel; +import no.nav.pto.veilarbfilter.domene.NyttChipsModel; +import no.nav.pto.veilarbfilter.domene.SortOrder; + +import java.util.List; +import java.util.Optional; + +public interface ChipsService { + + Optional hentVisning(String veilederId); + void lagreOgOppdater(String veilederId, List detaljerVisning) throws Exception; + + void slettVisning(String veilederId); +} diff --git a/src/main/java/no/nav/pto/veilarbfilter/service/ChipsServiceImpl.java b/src/main/java/no/nav/pto/veilarbfilter/service/ChipsServiceImpl.java new file mode 100644 index 00000000..6f875181 --- /dev/null +++ b/src/main/java/no/nav/pto/veilarbfilter/service/ChipsServiceImpl.java @@ -0,0 +1,45 @@ +package no.nav.pto.veilarbfilter.service; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import no.nav.pto.veilarbfilter.domene.ChipsModel; +import no.nav.pto.veilarbfilter.domene.NyttChipsModel; +import no.nav.pto.veilarbfilter.repository.MineLagredeChipsRepository; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; + +@Service +@Slf4j +@RequiredArgsConstructor +public class ChipsServiceImpl implements ChipsService { + + private final MineLagredeChipsRepository mineLagredeChipsRepository; + + @Override + public Optional hentVisning(String veilederId) { + return mineLagredeChipsRepository.hentVisning(veilederId); + } + + public void lagreOgOppdater(String veilederId, List detaljerVisning) { + try{ + Optional lagretVisning = mineLagredeChipsRepository.hentVisning(veilederId); + if (lagretVisning.isEmpty()) { + mineLagredeChipsRepository.lagreVisning(veilederId, detaljerVisning); + } else { + mineLagredeChipsRepository.oppdaterVisning(veilederId, detaljerVisning); + } + } + catch (Exception e) { + log.error("Kan ikke lagre og oppdatere visning " + e, e); + throw e; + } + } + + @Override + public void slettVisning(String veilederId) { + mineLagredeChipsRepository.slettVisning(veilederId); + } + +} diff --git a/src/main/java/no/nav/pto/veilarbfilter/service/MineLagredeChipsService.java b/src/main/java/no/nav/pto/veilarbfilter/service/MineLagredeChipsService.java new file mode 100644 index 00000000..2d7531d5 --- /dev/null +++ b/src/main/java/no/nav/pto/veilarbfilter/service/MineLagredeChipsService.java @@ -0,0 +1,46 @@ +package no.nav.pto.veilarbfilter.service; + +import lombok.RequiredArgsConstructor; +import no.nav.pto.veilarbfilter.domene.ChipsModel; +import no.nav.pto.veilarbfilter.domene.MineLagredeChipsModel; +import no.nav.pto.veilarbfilter.domene.NyttChipsModel; +import no.nav.pto.veilarbfilter.domene.SortOrder; +import no.nav.pto.veilarbfilter.repository.MineLagredeChipsRepository; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; + +@Service +@RequiredArgsConstructor +public class MineLagredeChipsService implements ChipsService { + private final MineLagredeChipsRepository mineLagredeChipsRepository; + + @Override + public Optional lagreChips(String veilederId, NyttChipsModel nyttChips) throws IllegalArgumentException { + try { + return mineLagredeChipsRepository.lagreChips(veilederId, nyttChips); + } catch (IllegalArgumentException e) { + throw e; + } + } + + @Override + public Optional oppdaterChips(String veilederId, ChipsModel chips) throws IllegalArgumentException { + try { + return mineLagredeChipsRepository.oppdaterChips(veilederId, chips); + } catch (IllegalArgumentException e) { + throw e; + } + } + + @Override + public Optional hentChips(Integer chipsId) { + return mineLagredeChipsRepository.hentChips(chipsId); + } + + @Override + public Integer slettChips(Integer chipsId, String veilederId) { + return mineLagredeChipsRepository.slettChips(chipsId, veilederId); + } +} From 2be8960feed8d9fa656f49aba7aa381ea9290700 Mon Sep 17 00:00:00 2001 From: Kristine Schuessler Date: Wed, 19 Jul 2023 12:27:35 +0200 Subject: [PATCH 02/16] =?UTF-8?q?lagt=20til=20table=20for=20OverblikkFilte?= =?UTF-8?q?r=20og=20begynt=20p=C3=A5=20tester?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MineLagredeChipsRepository.java | 8 --- .../rest/MineChipsController.java | 7 +-- .../veilarbfilter/service/ChipsService.java | 2 - .../service/ChipsServiceImpl.java | 1 - .../service/MineLagredeChipsService.java | 46 ---------------- .../db/migration/V11__OverblikkFilter.sql | 8 +++ .../pto/veilarbfilter/config/AppConfig.java | 8 +-- .../rest/OverblikkFilterTest.java | 55 +++++++++++++++++++ 8 files changed, 68 insertions(+), 67 deletions(-) delete mode 100644 src/main/java/no/nav/pto/veilarbfilter/service/MineLagredeChipsService.java create mode 100644 src/main/resources/db/migration/V11__OverblikkFilter.sql create mode 100644 src/test/java/no/nav/pto/veilarbfilter/rest/OverblikkFilterTest.java diff --git a/src/main/java/no/nav/pto/veilarbfilter/repository/MineLagredeChipsRepository.java b/src/main/java/no/nav/pto/veilarbfilter/repository/MineLagredeChipsRepository.java index 40dd72d4..1a54a022 100644 --- a/src/main/java/no/nav/pto/veilarbfilter/repository/MineLagredeChipsRepository.java +++ b/src/main/java/no/nav/pto/veilarbfilter/repository/MineLagredeChipsRepository.java @@ -3,23 +3,15 @@ import com.fasterxml.jackson.databind.ObjectMapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import no.nav.pto.veilarbfilter.database.Table; import no.nav.pto.veilarbfilter.domene.*; -import no.nav.pto.veilarbfilter.service.LagredeFilterFeilmeldinger; -import no.nav.pto.veilarbfilter.util.DateUtils; -import org.springframework.data.relational.core.sql.Select; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; -import org.springframework.util.Assert; import java.time.LocalDateTime; -import java.util.Collections; import java.util.List; import java.util.Optional; -import java.util.stream.Collectors; import static no.nav.pto.veilarbfilter.database.Table.DetaljerVisning; -import static no.nav.pto.veilarbfilter.database.Table.MineLagredeFilter; import static no.nav.pto.veilarbfilter.util.DateUtils.fromLocalDateTimeToTimestamp; @Service diff --git a/src/main/java/no/nav/pto/veilarbfilter/rest/MineChipsController.java b/src/main/java/no/nav/pto/veilarbfilter/rest/MineChipsController.java index db4679c6..74eec898 100644 --- a/src/main/java/no/nav/pto/veilarbfilter/rest/MineChipsController.java +++ b/src/main/java/no/nav/pto/veilarbfilter/rest/MineChipsController.java @@ -1,18 +1,13 @@ package no.nav.pto.veilarbfilter.rest; -import jakarta.ws.rs.GET; import lombok.RequiredArgsConstructor; import no.nav.pto.veilarbfilter.auth.AuthUtils; -import no.nav.pto.veilarbfilter.domene.Chips; import no.nav.pto.veilarbfilter.domene.ChipsModel; import no.nav.pto.veilarbfilter.domene.NyttChipsModel; -import no.nav.pto.veilarbfilter.repository.MineLagredeChipsRepository; import no.nav.pto.veilarbfilter.service.ChipsService; -import okhttp3.Response; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import java.util.List; import java.util.Optional; import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; @@ -27,7 +22,7 @@ public class MineChipsController { @PostMapping - public ResponseEntity lagreOgOppdaterVisning(@RequestBody NyttChipsModel nyttChipsModel) throws Exception { + public ResponseEntity lagreOgOppdater(@RequestBody NyttChipsModel nyttChipsModel) throws Exception { String veilederId = AuthUtils.getInnloggetVeilederIdent().toString(); chipsService.lagreOgOppdater(veilederId, nyttChipsModel.getDetaljerVisning()); diff --git a/src/main/java/no/nav/pto/veilarbfilter/service/ChipsService.java b/src/main/java/no/nav/pto/veilarbfilter/service/ChipsService.java index dfe3a17e..29890d42 100644 --- a/src/main/java/no/nav/pto/veilarbfilter/service/ChipsService.java +++ b/src/main/java/no/nav/pto/veilarbfilter/service/ChipsService.java @@ -1,8 +1,6 @@ package no.nav.pto.veilarbfilter.service; import no.nav.pto.veilarbfilter.domene.ChipsModel; -import no.nav.pto.veilarbfilter.domene.NyttChipsModel; -import no.nav.pto.veilarbfilter.domene.SortOrder; import java.util.List; import java.util.Optional; diff --git a/src/main/java/no/nav/pto/veilarbfilter/service/ChipsServiceImpl.java b/src/main/java/no/nav/pto/veilarbfilter/service/ChipsServiceImpl.java index 6f875181..a9519905 100644 --- a/src/main/java/no/nav/pto/veilarbfilter/service/ChipsServiceImpl.java +++ b/src/main/java/no/nav/pto/veilarbfilter/service/ChipsServiceImpl.java @@ -3,7 +3,6 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import no.nav.pto.veilarbfilter.domene.ChipsModel; -import no.nav.pto.veilarbfilter.domene.NyttChipsModel; import no.nav.pto.veilarbfilter.repository.MineLagredeChipsRepository; import org.springframework.stereotype.Service; diff --git a/src/main/java/no/nav/pto/veilarbfilter/service/MineLagredeChipsService.java b/src/main/java/no/nav/pto/veilarbfilter/service/MineLagredeChipsService.java deleted file mode 100644 index 2d7531d5..00000000 --- a/src/main/java/no/nav/pto/veilarbfilter/service/MineLagredeChipsService.java +++ /dev/null @@ -1,46 +0,0 @@ -package no.nav.pto.veilarbfilter.service; - -import lombok.RequiredArgsConstructor; -import no.nav.pto.veilarbfilter.domene.ChipsModel; -import no.nav.pto.veilarbfilter.domene.MineLagredeChipsModel; -import no.nav.pto.veilarbfilter.domene.NyttChipsModel; -import no.nav.pto.veilarbfilter.domene.SortOrder; -import no.nav.pto.veilarbfilter.repository.MineLagredeChipsRepository; -import org.springframework.stereotype.Service; - -import java.util.List; -import java.util.Optional; - -@Service -@RequiredArgsConstructor -public class MineLagredeChipsService implements ChipsService { - private final MineLagredeChipsRepository mineLagredeChipsRepository; - - @Override - public Optional lagreChips(String veilederId, NyttChipsModel nyttChips) throws IllegalArgumentException { - try { - return mineLagredeChipsRepository.lagreChips(veilederId, nyttChips); - } catch (IllegalArgumentException e) { - throw e; - } - } - - @Override - public Optional oppdaterChips(String veilederId, ChipsModel chips) throws IllegalArgumentException { - try { - return mineLagredeChipsRepository.oppdaterChips(veilederId, chips); - } catch (IllegalArgumentException e) { - throw e; - } - } - - @Override - public Optional hentChips(Integer chipsId) { - return mineLagredeChipsRepository.hentChips(chipsId); - } - - @Override - public Integer slettChips(Integer chipsId, String veilederId) { - return mineLagredeChipsRepository.slettChips(chipsId, veilederId); - } -} diff --git a/src/main/resources/db/migration/V11__OverblikkFilter.sql b/src/main/resources/db/migration/V11__OverblikkFilter.sql new file mode 100644 index 00000000..7f25f3f0 --- /dev/null +++ b/src/main/resources/db/migration/V11__OverblikkFilter.sql @@ -0,0 +1,8 @@ +CREATE TABLE OverblikkFilter ( + VEILEDER_ID VARCHAR(10), + OPPRETTET TIMESTAMP, + DETALJER_VISNING JSONB, + PRIMARY KEY (VEILEDER_ID) + ); + + diff --git a/src/test/java/no/nav/pto/veilarbfilter/config/AppConfig.java b/src/test/java/no/nav/pto/veilarbfilter/config/AppConfig.java index 14939c4e..0eab43d0 100644 --- a/src/test/java/no/nav/pto/veilarbfilter/config/AppConfig.java +++ b/src/test/java/no/nav/pto/veilarbfilter/config/AppConfig.java @@ -10,13 +10,13 @@ import no.nav.poao_tilgang.client.PoaoTilgangClient; import no.nav.poao_tilgang.client.api.ApiResult; import no.nav.pto.veilarbfilter.client.VeilarbveilederClient; +import no.nav.pto.veilarbfilter.repository.MineLagredeChipsRepository; import no.nav.pto.veilarbfilter.repository.MineLagredeFilterRepository; import no.nav.pto.veilarbfilter.repository.VeilederGruppeFilterRepository; +import no.nav.pto.veilarbfilter.rest.MineChipsController; import no.nav.pto.veilarbfilter.rest.MineLagredeFilterController; import no.nav.pto.veilarbfilter.rest.VeilederGruppeController; -import no.nav.pto.veilarbfilter.service.MineLagredeFilterService; -import no.nav.pto.veilarbfilter.service.UnleashService; -import no.nav.pto.veilarbfilter.service.VeilederGrupperService; +import no.nav.pto.veilarbfilter.service.*; import org.mockito.Mockito; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Bean; @@ -38,7 +38,7 @@ MineLagredeFilterService.class, MineLagredeFilterController.class, VeilederGruppeController.class, - UnleashService.class}) + UnleashService.class, ChipsServiceImpl.class, MineLagredeChipsRepository.class, MineChipsController.class}) public class AppConfig { @MockBean public InfluxClient metricsClient; diff --git a/src/test/java/no/nav/pto/veilarbfilter/rest/OverblikkFilterTest.java b/src/test/java/no/nav/pto/veilarbfilter/rest/OverblikkFilterTest.java new file mode 100644 index 00000000..a0f898db --- /dev/null +++ b/src/test/java/no/nav/pto/veilarbfilter/rest/OverblikkFilterTest.java @@ -0,0 +1,55 @@ +package no.nav.pto.veilarbfilter.rest; + +import com.fasterxml.jackson.core.type.TypeReference; +import lombok.val; +import no.nav.pto.veilarbfilter.AbstractTest; +import no.nav.pto.veilarbfilter.domene.ChipsModel; +import no.nav.pto.veilarbfilter.domene.MineLagredeFilterModel; +import no.nav.pto.veilarbfilter.domene.NyttChipsModel; +import no.nav.pto.veilarbfilter.service.ChipsService; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.testcontainers.shaded.com.fasterxml.jackson.databind.ObjectMapper; +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.*; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + + +@WebMvcTest(controllers = MineChipsController.class) +@ActiveProfiles({"test"}) +public class OverblikkFilterTest extends AbstractTest { + + @Autowired + private ObjectMapper objectMapper; + + @Autowired + private MockMvc mockMvc = MockMvcBuilders.standaloneSetup() + .setControllerAdvice(RestResponseEntityExceptionHandler.class).build(); + + @BeforeEach + public void beforeEach() { + } + + @Test + public void testInit() { + Assertions.assertNotNull(mockMvc); + } + + + +} From cf56e4bf0d0ea65a1b9479571f85700e40ff3911 Mon Sep 17 00:00:00 2001 From: Kristine Schuessler Date: Wed, 19 Jul 2023 13:25:49 +0200 Subject: [PATCH 03/16] lagt til tester for slettVisningOverblikk --- .../rest/OverblikkFilterTest.java | 48 ++++++++++++++++++- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/src/test/java/no/nav/pto/veilarbfilter/rest/OverblikkFilterTest.java b/src/test/java/no/nav/pto/veilarbfilter/rest/OverblikkFilterTest.java index a0f898db..d4f693df 100644 --- a/src/test/java/no/nav/pto/veilarbfilter/rest/OverblikkFilterTest.java +++ b/src/test/java/no/nav/pto/veilarbfilter/rest/OverblikkFilterTest.java @@ -1,6 +1,7 @@ package no.nav.pto.veilarbfilter.rest; import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; import lombok.val; import no.nav.pto.veilarbfilter.AbstractTest; import no.nav.pto.veilarbfilter.domene.ChipsModel; @@ -14,6 +15,7 @@ import org.mockito.Mock; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.test.context.ActiveProfiles; @@ -21,11 +23,13 @@ import org.springframework.test.web.servlet.MvcResult; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.testcontainers.shaded.com.fasterxml.jackson.databind.ObjectMapper; + +import java.util.List; import java.util.Optional; -import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; +import static org.springframework.http.RequestEntity.delete; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -45,11 +49,51 @@ public class OverblikkFilterTest extends AbstractTest { public void beforeEach() { } + @MockBean + private ChipsService chipsService; + @Test public void testInit() { Assertions.assertNotNull(mockMvc); } + @Test + public void testSlettVisning() throws Exception { + String veilederId = "someVeilederId"; + doNothing().when(chipsService).slettVisning(eq(veilederId)); + MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.delete("/api/overblikkvisning")) + .andReturn(); + Assertions.assertEquals(HttpStatus.OK.value(), mvcResult.getResponse().getStatus()); + } + + //Hjelpefunskjoner + private String slettVisningTest(String veilederId) { + try { + MvcResult mvcResult = this.mockMvc.perform(MockMvcRequestBuilders.delete("/api/overblikkvisning/" + veilederId).accept(MediaType.APPLICATION_JSON).contentType(MediaType.APPLICATION_JSON)).andReturn(); + return mvcResult.getResponse().getContentAsString(); + } catch (Exception e) { + Assertions.fail(); + return null; + } + } + + private ApiResponse> hentVisningTest() { + try { + MvcResult mvcResult = this.mockMvc.perform(MockMvcRequestBuilders.get("/api/overblikkvisning").accept(MediaType.APPLICATION_JSON).contentType(MediaType.APPLICATION_JSON)).andReturn(); + + if (mvcResult.getResponse().getStatus() == HttpStatus.OK.value()) { + return new ApiResponse<>(mvcResult.getResponse().getStatus(), objectMapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference<>() { + }), ""); + } else { + return new ApiResponse<>(mvcResult.getResponse().getStatus(), + null, mvcResult.getResolvedException().getMessage()); + } + } catch (Exception e) { + Assertions.fail(); + return null; + } + } + } From c623039269351dbae8b6c50d7d92b800f52959ae Mon Sep 17 00:00:00 2001 From: Kristine Schuessler Date: Thu, 20 Jul 2023 10:36:03 +0200 Subject: [PATCH 04/16] implementer tester for overblikkVisning og refaktorer navn --- .../nav/pto/veilarbfilter/database/Table.java | 6 +- ...odel.java => NyOverblikkVisningModel.java} | 5 +- .../{Chips.java => OverblikkVisning.java} | 8 +-- ...sModel.java => OverblikkVisningModel.java} | 10 +-- ...y.java => OverblikkVisningRepository.java} | 18 ++--- ...r.java => OverblikkVisningController.java} | 22 +++--- ...vice.java => OverblikkVisningService.java} | 7 +- ....java => OverblikkVisningServiceImpl.java} | 20 +++--- ...kkFilter.sql => V11__OverblikkVisning.sql} | 4 +- .../pto/veilarbfilter/config/AppConfig.java | 8 +-- ...terTest.java => OverblikkVisningTest.java} | 67 ++++++++++++++----- 11 files changed, 99 insertions(+), 76 deletions(-) rename src/main/java/no/nav/pto/veilarbfilter/domene/{NyttChipsModel.java => NyOverblikkVisningModel.java} (80%) rename src/main/java/no/nav/pto/veilarbfilter/domene/{Chips.java => OverblikkVisning.java} (78%) rename src/main/java/no/nav/pto/veilarbfilter/domene/{ChipsModel.java => OverblikkVisningModel.java} (65%) rename src/main/java/no/nav/pto/veilarbfilter/repository/{MineLagredeChipsRepository.java => OverblikkVisningRepository.java} (74%) rename src/main/java/no/nav/pto/veilarbfilter/rest/{MineChipsController.java => OverblikkVisningController.java} (54%) rename src/main/java/no/nav/pto/veilarbfilter/service/{ChipsService.java => OverblikkVisningService.java} (57%) rename src/main/java/no/nav/pto/veilarbfilter/service/{ChipsServiceImpl.java => OverblikkVisningServiceImpl.java} (51%) rename src/main/resources/db/migration/{V11__OverblikkFilter.sql => V11__OverblikkVisning.sql} (60%) rename src/test/java/no/nav/pto/veilarbfilter/rest/{OverblikkFilterTest.java => OverblikkVisningTest.java} (57%) diff --git a/src/main/java/no/nav/pto/veilarbfilter/database/Table.java b/src/main/java/no/nav/pto/veilarbfilter/database/Table.java index 289c11de..ad4d51ae 100644 --- a/src/main/java/no/nav/pto/veilarbfilter/database/Table.java +++ b/src/main/java/no/nav/pto/veilarbfilter/database/Table.java @@ -32,11 +32,11 @@ public static class MetricsReporterInfo { public static String OPPRETTET = "opprettet"; } - public static class DetaljerVisning { - public static String TABLE_NAME = "DetaljerVisning"; + public static class OverblikkVisning { + public static String TABLE_NAME = "OverblikkVisning"; public static String VEILEDER_ID = "veileder_id"; public static String OPPRETTET = "opprettet"; - public static String DETALJER_VISNING = "detaljer_visning"; + public static String OVERBLIKK_VISNING = "overblikk_visning"; } } diff --git a/src/main/java/no/nav/pto/veilarbfilter/domene/NyttChipsModel.java b/src/main/java/no/nav/pto/veilarbfilter/domene/NyOverblikkVisningModel.java similarity index 80% rename from src/main/java/no/nav/pto/veilarbfilter/domene/NyttChipsModel.java rename to src/main/java/no/nav/pto/veilarbfilter/domene/NyOverblikkVisningModel.java index 432c8d98..91cf6bf7 100644 --- a/src/main/java/no/nav/pto/veilarbfilter/domene/NyttChipsModel.java +++ b/src/main/java/no/nav/pto/veilarbfilter/domene/NyOverblikkVisningModel.java @@ -5,7 +5,6 @@ import lombok.Data; import lombok.NoArgsConstructor; import lombok.Setter; - import java.util.List; @Data @@ -13,6 +12,6 @@ @AllArgsConstructor @JsonDeserialize @NoArgsConstructor -public class NyttChipsModel { - List detaljerVisning; +public class NyOverblikkVisningModel { + List overblikkVisning; } diff --git a/src/main/java/no/nav/pto/veilarbfilter/domene/Chips.java b/src/main/java/no/nav/pto/veilarbfilter/domene/OverblikkVisning.java similarity index 78% rename from src/main/java/no/nav/pto/veilarbfilter/domene/Chips.java rename to src/main/java/no/nav/pto/veilarbfilter/domene/OverblikkVisning.java index e4485c18..4398d4ca 100644 --- a/src/main/java/no/nav/pto/veilarbfilter/domene/Chips.java +++ b/src/main/java/no/nav/pto/veilarbfilter/domene/OverblikkVisning.java @@ -5,9 +5,7 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; - import java.util.List; - import static java.util.Collections.emptyList; @Getter @@ -15,16 +13,16 @@ @AllArgsConstructor @JsonPropertyOrder(alphabetic = true) @JsonIgnoreProperties(ignoreUnknown = true) -public class Chips { +public class OverblikkVisning { @JsonSetter(nulls = Nulls.AS_EMPTY) @Setter - private List detaljerVisning = emptyList(); + private List overblikkVisning = emptyList(); private String veilederID = ""; @JsonIgnore public Boolean isNotEmpty() { return (veilederID != null && !veilederID.isEmpty()) || - (detaljerVisning != null && !detaljerVisning.isEmpty()); + (overblikkVisning != null && !overblikkVisning.isEmpty()); } } diff --git a/src/main/java/no/nav/pto/veilarbfilter/domene/ChipsModel.java b/src/main/java/no/nav/pto/veilarbfilter/domene/OverblikkVisningModel.java similarity index 65% rename from src/main/java/no/nav/pto/veilarbfilter/domene/ChipsModel.java rename to src/main/java/no/nav/pto/veilarbfilter/domene/OverblikkVisningModel.java index ed602894..e547ba60 100644 --- a/src/main/java/no/nav/pto/veilarbfilter/domene/ChipsModel.java +++ b/src/main/java/no/nav/pto/veilarbfilter/domene/OverblikkVisningModel.java @@ -4,15 +4,9 @@ import com.fasterxml.jackson.annotation.JsonPropertyOrder; import com.fasterxml.jackson.annotation.JsonSetter; import com.fasterxml.jackson.annotation.Nulls; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; import lombok.AllArgsConstructor; -import lombok.Data; import lombok.Getter; import lombok.NoArgsConstructor; -import no.nav.pto.veilarbfilter.domene.deserializer.DateDeserializer; -import no.nav.pto.veilarbfilter.domene.deserializer.DateSerializer; -import java.util.List; import java.time.LocalDateTime; @Getter @@ -20,13 +14,13 @@ @AllArgsConstructor @JsonPropertyOrder(alphabetic = true) @JsonIgnoreProperties(ignoreUnknown = true) -public class ChipsModel { +public class OverblikkVisningModel { @JsonSetter(nulls = Nulls.AS_EMPTY) private String veilederID = null; @JsonSetter(nulls = Nulls.AS_EMPTY) - private String detaljerVisning = null; + private String overblikkVisning = null; @JsonSetter(nulls = Nulls.AS_EMPTY) private LocalDateTime opprettet = null; diff --git a/src/main/java/no/nav/pto/veilarbfilter/repository/MineLagredeChipsRepository.java b/src/main/java/no/nav/pto/veilarbfilter/repository/OverblikkVisningRepository.java similarity index 74% rename from src/main/java/no/nav/pto/veilarbfilter/repository/MineLagredeChipsRepository.java rename to src/main/java/no/nav/pto/veilarbfilter/repository/OverblikkVisningRepository.java index 1a54a022..cefed741 100644 --- a/src/main/java/no/nav/pto/veilarbfilter/repository/MineLagredeChipsRepository.java +++ b/src/main/java/no/nav/pto/veilarbfilter/repository/OverblikkVisningRepository.java @@ -11,22 +11,22 @@ import java.util.List; import java.util.Optional; -import static no.nav.pto.veilarbfilter.database.Table.DetaljerVisning; +import static no.nav.pto.veilarbfilter.database.Table.OverblikkVisning; import static no.nav.pto.veilarbfilter.util.DateUtils.fromLocalDateTimeToTimestamp; @Service @Slf4j @RequiredArgsConstructor -public class MineLagredeChipsRepository { +public class OverblikkVisningRepository { private final JdbcTemplate db; private final ObjectMapper objectMapper; - public Optional hentVisning(String veilederId) { + public Optional hentVisning(String veilederId) { try { - String selectSql = String.format("SELECT * FROM %s where %s = ?", DetaljerVisning.TABLE_NAME, DetaljerVisning.VEILEDER_ID); - ChipsModel minLagretDetaljerVisning = db.queryForObject(selectSql, (rs, rowNum) -> { + String selectSql = String.format("SELECT * FROM %s where %s = ?", OverblikkVisning.TABLE_NAME, OverblikkVisning.VEILEDER_ID); + OverblikkVisningModel minLagretDetaljerVisning = db.queryForObject(selectSql, (rs, rowNum) -> { try { - return new ChipsModel(rs.getString(DetaljerVisning.VEILEDER_ID), rs.getString(DetaljerVisning.DETALJER_VISNING), null); + return new OverblikkVisningModel(rs.getString(OverblikkVisning.VEILEDER_ID), rs.getString(OverblikkVisning.OVERBLIKK_VISNING), null); } catch (Exception e) { log.error("Error ved å hente visningen " + e, e); throw new RuntimeException(e); @@ -43,7 +43,7 @@ public Optional hentVisning(String veilederId) { public void lagreVisning(String veilederId, List detaljerVisning) throws IllegalArgumentException { try { String insertSql = String.format("INSERT INTO %s (%s, to_json(?::JSON), %s) VALUES (?, ?, ?)", - DetaljerVisning.TABLE_NAME, DetaljerVisning.VEILEDER_ID, DetaljerVisning.DETALJER_VISNING, DetaljerVisning.OPPRETTET); + OverblikkVisning.TABLE_NAME, OverblikkVisning.VEILEDER_ID, OverblikkVisning.OVERBLIKK_VISNING, OverblikkVisning.OPPRETTET); db.update(insertSql, veilederId, objectMapper.writeValueAsString(detaljerVisning), fromLocalDateTimeToTimestamp(LocalDateTime.now())); } catch (IllegalArgumentException e) { throw e; @@ -55,7 +55,7 @@ public void lagreVisning(String veilederId, List detaljerVisning) throws public void oppdaterVisning(String veilederId, List detaljerVisning) throws IllegalArgumentException { try { - String updateSql = String.format("UPDATE %s, %s = to_json(?::JSON) WHERE %s = ?", DetaljerVisning.TABLE_NAME, DetaljerVisning.DETALJER_VISNING, DetaljerVisning.VEILEDER_ID); + String updateSql = String.format("UPDATE %s, %s = to_json(?::JSON) WHERE %s = ?", OverblikkVisning.TABLE_NAME, OverblikkVisning.OVERBLIKK_VISNING, OverblikkVisning.VEILEDER_ID); db.update(updateSql, objectMapper.writeValueAsString(detaljerVisning), veilederId); } catch (IllegalArgumentException e) { @@ -68,7 +68,7 @@ public void oppdaterVisning(String veilederId, List detaljerVisning) thr public void slettVisning(String veilederId) throws IllegalArgumentException { try { String deleteSql = String.format("DELETE FROM %s WHERE %s = ?", - DetaljerVisning.TABLE_NAME, DetaljerVisning.VEILEDER_ID); + OverblikkVisning.TABLE_NAME, OverblikkVisning.VEILEDER_ID); db.update(deleteSql, veilederId); diff --git a/src/main/java/no/nav/pto/veilarbfilter/rest/MineChipsController.java b/src/main/java/no/nav/pto/veilarbfilter/rest/OverblikkVisningController.java similarity index 54% rename from src/main/java/no/nav/pto/veilarbfilter/rest/MineChipsController.java rename to src/main/java/no/nav/pto/veilarbfilter/rest/OverblikkVisningController.java index 74eec898..9a7fa7d8 100644 --- a/src/main/java/no/nav/pto/veilarbfilter/rest/MineChipsController.java +++ b/src/main/java/no/nav/pto/veilarbfilter/rest/OverblikkVisningController.java @@ -2,9 +2,9 @@ import lombok.RequiredArgsConstructor; import no.nav.pto.veilarbfilter.auth.AuthUtils; -import no.nav.pto.veilarbfilter.domene.ChipsModel; -import no.nav.pto.veilarbfilter.domene.NyttChipsModel; -import no.nav.pto.veilarbfilter.service.ChipsService; +import no.nav.pto.veilarbfilter.domene.NyOverblikkVisningModel; +import no.nav.pto.veilarbfilter.domene.OverblikkVisningModel; +import no.nav.pto.veilarbfilter.service.OverblikkVisningService; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -16,24 +16,24 @@ @RestController @RequestMapping(value = "/api/overblikkvisning", produces = APPLICATION_JSON_VALUE) -public class MineChipsController { +public class OverblikkVisningController { - private final ChipsService chipsService; + private final OverblikkVisningService overblikkVisningService; -@PostMapping - public ResponseEntity lagreOgOppdater(@RequestBody NyttChipsModel nyttChipsModel) throws Exception { + @PostMapping + public ResponseEntity lagreOgOppdater(@RequestBody NyOverblikkVisningModel nyOverblikkVisningModel) throws Exception { String veilederId = AuthUtils.getInnloggetVeilederIdent().toString(); - chipsService.lagreOgOppdater(veilederId, nyttChipsModel.getDetaljerVisning()); + overblikkVisningService.lagreOgOppdater(veilederId, nyOverblikkVisningModel.getOverblikkVisning()); return ResponseEntity.ok().build(); } @GetMapping - public ResponseEntity> hentVisning() { + public ResponseEntity> hentVisning() { String veilederId = AuthUtils.getInnloggetVeilederIdent().toString(); - Optional visningsListe = chipsService.hentVisning(veilederId); + Optional visningsListe = overblikkVisningService.hentVisning(veilederId); return ResponseEntity.ok().body(visningsListe); } @@ -42,7 +42,7 @@ public ResponseEntity> hentVisning() { public ResponseEntity slettVisning() { String veilederId = AuthUtils.getInnloggetVeilederIdent().toString(); - chipsService.slettVisning(veilederId); + overblikkVisningService.slettVisning(veilederId); return ResponseEntity.ok().build(); } } diff --git a/src/main/java/no/nav/pto/veilarbfilter/service/ChipsService.java b/src/main/java/no/nav/pto/veilarbfilter/service/OverblikkVisningService.java similarity index 57% rename from src/main/java/no/nav/pto/veilarbfilter/service/ChipsService.java rename to src/main/java/no/nav/pto/veilarbfilter/service/OverblikkVisningService.java index 29890d42..17232e64 100644 --- a/src/main/java/no/nav/pto/veilarbfilter/service/ChipsService.java +++ b/src/main/java/no/nav/pto/veilarbfilter/service/OverblikkVisningService.java @@ -1,13 +1,12 @@ package no.nav.pto.veilarbfilter.service; -import no.nav.pto.veilarbfilter.domene.ChipsModel; - +import no.nav.pto.veilarbfilter.domene.OverblikkVisningModel; import java.util.List; import java.util.Optional; -public interface ChipsService { +public interface OverblikkVisningService { - Optional hentVisning(String veilederId); + Optional hentVisning(String veilederId); void lagreOgOppdater(String veilederId, List detaljerVisning) throws Exception; void slettVisning(String veilederId); diff --git a/src/main/java/no/nav/pto/veilarbfilter/service/ChipsServiceImpl.java b/src/main/java/no/nav/pto/veilarbfilter/service/OverblikkVisningServiceImpl.java similarity index 51% rename from src/main/java/no/nav/pto/veilarbfilter/service/ChipsServiceImpl.java rename to src/main/java/no/nav/pto/veilarbfilter/service/OverblikkVisningServiceImpl.java index a9519905..ed738b85 100644 --- a/src/main/java/no/nav/pto/veilarbfilter/service/ChipsServiceImpl.java +++ b/src/main/java/no/nav/pto/veilarbfilter/service/OverblikkVisningServiceImpl.java @@ -2,8 +2,8 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import no.nav.pto.veilarbfilter.domene.ChipsModel; -import no.nav.pto.veilarbfilter.repository.MineLagredeChipsRepository; +import no.nav.pto.veilarbfilter.domene.OverblikkVisningModel; +import no.nav.pto.veilarbfilter.repository.OverblikkVisningRepository; import org.springframework.stereotype.Service; import java.util.List; @@ -12,22 +12,22 @@ @Service @Slf4j @RequiredArgsConstructor -public class ChipsServiceImpl implements ChipsService { +public class OverblikkVisningServiceImpl implements OverblikkVisningService { - private final MineLagredeChipsRepository mineLagredeChipsRepository; + private final OverblikkVisningRepository overblikkVisningRepository; @Override - public Optional hentVisning(String veilederId) { - return mineLagredeChipsRepository.hentVisning(veilederId); + public Optional hentVisning(String veilederId) { + return overblikkVisningRepository.hentVisning(veilederId); } public void lagreOgOppdater(String veilederId, List detaljerVisning) { try{ - Optional lagretVisning = mineLagredeChipsRepository.hentVisning(veilederId); + Optional lagretVisning = overblikkVisningRepository.hentVisning(veilederId); if (lagretVisning.isEmpty()) { - mineLagredeChipsRepository.lagreVisning(veilederId, detaljerVisning); + overblikkVisningRepository.lagreVisning(veilederId, detaljerVisning); } else { - mineLagredeChipsRepository.oppdaterVisning(veilederId, detaljerVisning); + overblikkVisningRepository.oppdaterVisning(veilederId, detaljerVisning); } } catch (Exception e) { @@ -38,7 +38,7 @@ public void lagreOgOppdater(String veilederId, List detaljerVisning) { @Override public void slettVisning(String veilederId) { - mineLagredeChipsRepository.slettVisning(veilederId); + overblikkVisningRepository.slettVisning(veilederId); } } diff --git a/src/main/resources/db/migration/V11__OverblikkFilter.sql b/src/main/resources/db/migration/V11__OverblikkVisning.sql similarity index 60% rename from src/main/resources/db/migration/V11__OverblikkFilter.sql rename to src/main/resources/db/migration/V11__OverblikkVisning.sql index 7f25f3f0..f970276a 100644 --- a/src/main/resources/db/migration/V11__OverblikkFilter.sql +++ b/src/main/resources/db/migration/V11__OverblikkVisning.sql @@ -1,7 +1,7 @@ -CREATE TABLE OverblikkFilter ( +CREATE TABLE OverblikkVisning ( VEILEDER_ID VARCHAR(10), OPPRETTET TIMESTAMP, - DETALJER_VISNING JSONB, + OVERBLIKK_VISNING JSONB, PRIMARY KEY (VEILEDER_ID) ); diff --git a/src/test/java/no/nav/pto/veilarbfilter/config/AppConfig.java b/src/test/java/no/nav/pto/veilarbfilter/config/AppConfig.java index 0eab43d0..74e820e5 100644 --- a/src/test/java/no/nav/pto/veilarbfilter/config/AppConfig.java +++ b/src/test/java/no/nav/pto/veilarbfilter/config/AppConfig.java @@ -10,11 +10,11 @@ import no.nav.poao_tilgang.client.PoaoTilgangClient; import no.nav.poao_tilgang.client.api.ApiResult; import no.nav.pto.veilarbfilter.client.VeilarbveilederClient; -import no.nav.pto.veilarbfilter.repository.MineLagredeChipsRepository; import no.nav.pto.veilarbfilter.repository.MineLagredeFilterRepository; +import no.nav.pto.veilarbfilter.repository.OverblikkVisningRepository; import no.nav.pto.veilarbfilter.repository.VeilederGruppeFilterRepository; -import no.nav.pto.veilarbfilter.rest.MineChipsController; import no.nav.pto.veilarbfilter.rest.MineLagredeFilterController; +import no.nav.pto.veilarbfilter.rest.OverblikkVisningController; import no.nav.pto.veilarbfilter.rest.VeilederGruppeController; import no.nav.pto.veilarbfilter.service.*; import org.mockito.Mockito; @@ -23,9 +23,7 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.test.context.ActiveProfiles; - import java.util.List; - import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; @@ -38,7 +36,7 @@ MineLagredeFilterService.class, MineLagredeFilterController.class, VeilederGruppeController.class, - UnleashService.class, ChipsServiceImpl.class, MineLagredeChipsRepository.class, MineChipsController.class}) + UnleashService.class, OverblikkVisningServiceImpl.class, OverblikkVisningRepository.class, OverblikkVisningController.class}) public class AppConfig { @MockBean public InfluxClient metricsClient; diff --git a/src/test/java/no/nav/pto/veilarbfilter/rest/OverblikkFilterTest.java b/src/test/java/no/nav/pto/veilarbfilter/rest/OverblikkVisningTest.java similarity index 57% rename from src/test/java/no/nav/pto/veilarbfilter/rest/OverblikkFilterTest.java rename to src/test/java/no/nav/pto/veilarbfilter/rest/OverblikkVisningTest.java index d4f693df..39364df9 100644 --- a/src/test/java/no/nav/pto/veilarbfilter/rest/OverblikkFilterTest.java +++ b/src/test/java/no/nav/pto/veilarbfilter/rest/OverblikkVisningTest.java @@ -4,15 +4,11 @@ import com.fasterxml.jackson.databind.ObjectMapper; import lombok.val; import no.nav.pto.veilarbfilter.AbstractTest; -import no.nav.pto.veilarbfilter.domene.ChipsModel; -import no.nav.pto.veilarbfilter.domene.MineLagredeFilterModel; -import no.nav.pto.veilarbfilter.domene.NyttChipsModel; -import no.nav.pto.veilarbfilter.service.ChipsService; +import no.nav.pto.veilarbfilter.domene.OverblikkVisningModel; +import no.nav.pto.veilarbfilter.service.OverblikkVisningService; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; @@ -24,19 +20,16 @@ import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import java.time.LocalDateTime; import java.util.List; import java.util.Optional; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; -import static org.springframework.http.RequestEntity.delete; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -@WebMvcTest(controllers = MineChipsController.class) +@WebMvcTest(controllers = OverblikkVisningController.class) @ActiveProfiles({"test"}) -public class OverblikkFilterTest extends AbstractTest { +public class OverblikkVisningTest extends AbstractTest { @Autowired private ObjectMapper objectMapper; @@ -50,7 +43,7 @@ public void beforeEach() { } @MockBean - private ChipsService chipsService; + private OverblikkVisningService overblikkVisningService; @Test public void testInit() { @@ -59,14 +52,41 @@ public void testInit() { @Test public void testSlettVisning() throws Exception { - String veilederId = "someVeilederId"; - doNothing().when(chipsService).slettVisning(eq(veilederId)); + String veilederId = "VeilederId"; + doNothing().when(overblikkVisningService).slettVisning(eq(veilederId)); MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.delete("/api/overblikkvisning")) .andReturn(); Assertions.assertEquals(HttpStatus.OK.value(), mvcResult.getResponse().getStatus()); + + val visningResponse = hentVisningTest(); + if (visningResponse == null) { + fail(); + } + + val responseCode = slettVisningTest(veilederId); + assertFalse(responseCode.equals(200)); + } + + @Test + public void testLagreOgOppdaterVisning() throws Exception { + OverblikkVisningModel overblikkVisningModel = new OverblikkVisningModel(); + + val visningRespons = hentVisningTest(); + lagreEllerOppdaterVisninger("someVeilederID", List.of("CV", "personalia"), LocalDateTime.now()); + + val nyVisningResponse = hentVisningTest(); + + if (nyVisningResponse.getContent() == null) { + fail(); + } + + assertTrue(visningRespons.getContent() == nyVisningResponse.getContent()); + + } //Hjelpefunskjoner + private String slettVisningTest(String veilederId) { try { MvcResult mvcResult = this.mockMvc.perform(MockMvcRequestBuilders.delete("/api/overblikkvisning/" + veilederId).accept(MediaType.APPLICATION_JSON).contentType(MediaType.APPLICATION_JSON)).andReturn(); @@ -77,7 +97,7 @@ private String slettVisningTest(String veilederId) { } } - private ApiResponse> hentVisningTest() { + private ApiResponse> hentVisningTest() { try { MvcResult mvcResult = this.mockMvc.perform(MockMvcRequestBuilders.get("/api/overblikkvisning").accept(MediaType.APPLICATION_JSON).contentType(MediaType.APPLICATION_JSON)).andReturn(); @@ -94,6 +114,21 @@ private ApiResponse> hentVisningTest() { } } + private ApiResponse lagreEllerOppdaterVisninger (String veilederId, List overblikkVisning, LocalDateTime opprettet) throws Exception { + try { + MvcResult mvcResult = this.mockMvc.perform(MockMvcRequestBuilders.post("/api/overblikkvisning").content(objectMapper.writeValueAsString(veilederId)).contentType(MediaType.APPLICATION_JSON)).andReturn(); + + if (mvcResult.getResponse().getStatus() == HttpStatus.OK.value()) { + return new ApiResponse<>(mvcResult.getResponse().getStatus(), objectMapper.readValue(mvcResult.getResponse().getContentAsString(), OverblikkVisningModel.class), ""); + } else { + return new ApiResponse<>(mvcResult.getResponse().getStatus(), null, mvcResult.getResponse().getContentAsString()); + } + + } catch (Exception e){ + Assertions.fail(); + return null; + } + } } From f84e352ae4e511a8bcf10f8291a4b0221ed21288 Mon Sep 17 00:00:00 2001 From: kristinelynneschuessler <136683349+kristinelynneschuessler@users.noreply.github.com> Date: Thu, 20 Jul 2023 13:45:38 +0200 Subject: [PATCH 05/16] Update src/main/java/no/nav/pto/veilarbfilter/repository/OverblikkVisningRepository.java Co-authored-by: Julie Hill Roa --- .../veilarbfilter/repository/OverblikkVisningRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/no/nav/pto/veilarbfilter/repository/OverblikkVisningRepository.java b/src/main/java/no/nav/pto/veilarbfilter/repository/OverblikkVisningRepository.java index cefed741..f1215d4c 100644 --- a/src/main/java/no/nav/pto/veilarbfilter/repository/OverblikkVisningRepository.java +++ b/src/main/java/no/nav/pto/veilarbfilter/repository/OverblikkVisningRepository.java @@ -42,7 +42,7 @@ public Optional hentVisning(String veilederId) { public void lagreVisning(String veilederId, List detaljerVisning) throws IllegalArgumentException { try { - String insertSql = String.format("INSERT INTO %s (%s, to_json(?::JSON), %s) VALUES (?, ?, ?)", + String insertSql = String.format("INSERT INTO %s (%s, %s, %s) VALUES (?, to_json(?::JSON), ?)", OverblikkVisning.TABLE_NAME, OverblikkVisning.VEILEDER_ID, OverblikkVisning.OVERBLIKK_VISNING, OverblikkVisning.OPPRETTET); db.update(insertSql, veilederId, objectMapper.writeValueAsString(detaljerVisning), fromLocalDateTimeToTimestamp(LocalDateTime.now())); } catch (IllegalArgumentException e) { From ee1d19bbf4fa927a2322cdc74fdeece7abf2ea50 Mon Sep 17 00:00:00 2001 From: Kristine Schuessler Date: Mon, 24 Jul 2023 09:56:01 +0200 Subject: [PATCH 06/16] fiks testen for lagreOgOppdater visning --- .../domene/NyOverblikkVisningModel.java | 11 +- .../domene/OverblikkVisning.java | 28 ----- .../MineLagredeFilterRepository.java | 1 + .../OverblikkVisningRepository.java | 8 +- .../rest/OverblikkVisningController.java | 19 ++- .../service/OverblikkVisningServiceImpl.java | 3 + .../db/migration/V11__OverblikkVisning.sql | 1 + .../pto/veilarbfilter/config/AppConfig.java | 5 +- .../rest/OverblikkVisningTest.java | 109 +++++++++++------- 9 files changed, 102 insertions(+), 83 deletions(-) delete mode 100644 src/main/java/no/nav/pto/veilarbfilter/domene/OverblikkVisning.java diff --git a/src/main/java/no/nav/pto/veilarbfilter/domene/NyOverblikkVisningModel.java b/src/main/java/no/nav/pto/veilarbfilter/domene/NyOverblikkVisningModel.java index 91cf6bf7..6e891e10 100644 --- a/src/main/java/no/nav/pto/veilarbfilter/domene/NyOverblikkVisningModel.java +++ b/src/main/java/no/nav/pto/veilarbfilter/domene/NyOverblikkVisningModel.java @@ -1,17 +1,20 @@ package no.nav.pto.veilarbfilter.domene; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.Setter; +import lombok.*; +import org.flywaydb.core.internal.configuration.ListDeserializer; + import java.util.List; @Data +@Getter @Setter @AllArgsConstructor @JsonDeserialize @NoArgsConstructor public class NyOverblikkVisningModel { + @JsonSetter(nulls = Nulls.AS_EMPTY) List overblikkVisning; } diff --git a/src/main/java/no/nav/pto/veilarbfilter/domene/OverblikkVisning.java b/src/main/java/no/nav/pto/veilarbfilter/domene/OverblikkVisning.java deleted file mode 100644 index 4398d4ca..00000000 --- a/src/main/java/no/nav/pto/veilarbfilter/domene/OverblikkVisning.java +++ /dev/null @@ -1,28 +0,0 @@ -package no.nav.pto.veilarbfilter.domene; - -import com.fasterxml.jackson.annotation.*; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import java.util.List; -import static java.util.Collections.emptyList; - -@Getter -@NoArgsConstructor -@AllArgsConstructor -@JsonPropertyOrder(alphabetic = true) -@JsonIgnoreProperties(ignoreUnknown = true) -public class OverblikkVisning { - - @JsonSetter(nulls = Nulls.AS_EMPTY) - @Setter - private List overblikkVisning = emptyList(); - private String veilederID = ""; - - @JsonIgnore - public Boolean isNotEmpty() { - return (veilederID != null && !veilederID.isEmpty()) || - (overblikkVisning != null && !overblikkVisning.isEmpty()); - } -} diff --git a/src/main/java/no/nav/pto/veilarbfilter/repository/MineLagredeFilterRepository.java b/src/main/java/no/nav/pto/veilarbfilter/repository/MineLagredeFilterRepository.java index 7bebed1a..31a4a8a6 100644 --- a/src/main/java/no/nav/pto/veilarbfilter/repository/MineLagredeFilterRepository.java +++ b/src/main/java/no/nav/pto/veilarbfilter/repository/MineLagredeFilterRepository.java @@ -40,6 +40,7 @@ public Optional lagreFilter(String veilederId, NyttFilterModel nytt String insertSql = String.format("INSERT INTO %s (%s, %s, %s) VALUES (?, to_json(?::JSON), ?)", Filter.TABLE_NAME, Filter.FILTER_NAVN, Filter.VALGTE_FILTER, Filter.OPPRETTET); int affectedRows = db.update(insertSql, nyttFilterModel.getFilterNavn(), objectMapper.writeValueAsString(nyttFilterModel.getFilterValg()), fromLocalDateTimeToTimestamp(LocalDateTime.now())); + log.info("Det gikk å lagre i filter!! {}", affectedRows); if (affectedRows > 0) { String lastId = String.format("SELECT MAX(%s) FROM %s", diff --git a/src/main/java/no/nav/pto/veilarbfilter/repository/OverblikkVisningRepository.java b/src/main/java/no/nav/pto/veilarbfilter/repository/OverblikkVisningRepository.java index f1215d4c..fec361df 100644 --- a/src/main/java/no/nav/pto/veilarbfilter/repository/OverblikkVisningRepository.java +++ b/src/main/java/no/nav/pto/veilarbfilter/repository/OverblikkVisningRepository.java @@ -42,9 +42,10 @@ public Optional hentVisning(String veilederId) { public void lagreVisning(String veilederId, List detaljerVisning) throws IllegalArgumentException { try { - String insertSql = String.format("INSERT INTO %s (%s, %s, %s) VALUES (?, to_json(?::JSON), ?)", + String insertSql = String.format("INSERT INTO %s (%s, %s, %s) VALUES (?, to_json(?::JSON), ?)", OverblikkVisning.TABLE_NAME, OverblikkVisning.VEILEDER_ID, OverblikkVisning.OVERBLIKK_VISNING, OverblikkVisning.OPPRETTET); - db.update(insertSql, veilederId, objectMapper.writeValueAsString(detaljerVisning), fromLocalDateTimeToTimestamp(LocalDateTime.now())); + int numberOfRowsAffected = db.update(insertSql, veilederId, objectMapper.writeValueAsString(detaljerVisning), fromLocalDateTimeToTimestamp(LocalDateTime.now())); + log.info("Det gikk å lagre repository!! {}", numberOfRowsAffected); } catch (IllegalArgumentException e) { throw e; } catch (Exception e) { @@ -56,7 +57,8 @@ public void oppdaterVisning(String veilederId, List detaljerVisning) thr try { String updateSql = String.format("UPDATE %s, %s = to_json(?::JSON) WHERE %s = ?", OverblikkVisning.TABLE_NAME, OverblikkVisning.OVERBLIKK_VISNING, OverblikkVisning.VEILEDER_ID); - db.update(updateSql, objectMapper.writeValueAsString(detaljerVisning), veilederId); + int numerOfAffctedRows = db.update(updateSql, objectMapper.writeValueAsString(detaljerVisning), veilederId); + log.info("Det gikk å oppdatere i repo!! {}", numerOfAffctedRows); } catch (IllegalArgumentException e) { throw e; diff --git a/src/main/java/no/nav/pto/veilarbfilter/rest/OverblikkVisningController.java b/src/main/java/no/nav/pto/veilarbfilter/rest/OverblikkVisningController.java index 9a7fa7d8..045df96c 100644 --- a/src/main/java/no/nav/pto/veilarbfilter/rest/OverblikkVisningController.java +++ b/src/main/java/no/nav/pto/veilarbfilter/rest/OverblikkVisningController.java @@ -1,18 +1,24 @@ package no.nav.pto.veilarbfilter.rest; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import no.nav.pto.veilarbfilter.auth.AuthUtils; import no.nav.pto.veilarbfilter.domene.NyOverblikkVisningModel; import no.nav.pto.veilarbfilter.domene.OverblikkVisningModel; import no.nav.pto.veilarbfilter.service.OverblikkVisningService; +import no.nav.pto.veilarbfilter.service.OverblikkVisningServiceImpl; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Optional; +import java.util.List; import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; @RequiredArgsConstructor +@Slf4j @RestController @RequestMapping(value = "/api/overblikkvisning", produces = APPLICATION_JSON_VALUE) @@ -23,6 +29,7 @@ public class OverblikkVisningController { @PostMapping public ResponseEntity lagreOgOppdater(@RequestBody NyOverblikkVisningModel nyOverblikkVisningModel) throws Exception { + String veilederId = AuthUtils.getInnloggetVeilederIdent().toString(); overblikkVisningService.lagreOgOppdater(veilederId, nyOverblikkVisningModel.getOverblikkVisning()); @@ -30,12 +37,18 @@ public ResponseEntity lagreOgOppdater(@RequestBody NyOverblikkVisningModel nyOve } @GetMapping - public ResponseEntity> hentVisning() { + public ResponseEntity>> hentVisning() { + String veilederId = AuthUtils.getInnloggetVeilederIdent().toString(); Optional visningsListe = overblikkVisningService.hentVisning(veilederId); - return ResponseEntity.ok().body(visningsListe); + if (visningsListe.isPresent()){ + String overblikkVisning = visningsListe.get().getOverblikkVisning(); + List overblikkVisningListe = new ArrayList(Arrays.asList(overblikkVisning.replace("[", "").replace("]", "").split(","))); + return ResponseEntity.ok().body(Optional.of(overblikkVisningListe)); + } + return ResponseEntity.ok().body(Optional.empty()); } @DeleteMapping @@ -43,6 +56,6 @@ public ResponseEntity slettVisning() { String veilederId = AuthUtils.getInnloggetVeilederIdent().toString(); overblikkVisningService.slettVisning(veilederId); - return ResponseEntity.ok().build(); + return ResponseEntity.noContent().build(); } } diff --git a/src/main/java/no/nav/pto/veilarbfilter/service/OverblikkVisningServiceImpl.java b/src/main/java/no/nav/pto/veilarbfilter/service/OverblikkVisningServiceImpl.java index ed738b85..78bb1954 100644 --- a/src/main/java/no/nav/pto/veilarbfilter/service/OverblikkVisningServiceImpl.java +++ b/src/main/java/no/nav/pto/veilarbfilter/service/OverblikkVisningServiceImpl.java @@ -24,10 +24,13 @@ public Optional hentVisning(String veilederId) { public void lagreOgOppdater(String veilederId, List detaljerVisning) { try{ Optional lagretVisning = overblikkVisningRepository.hentVisning(veilederId); + log.info("er i service!"); if (lagretVisning.isEmpty()) { overblikkVisningRepository.lagreVisning(veilederId, detaljerVisning); + log.info("er tom!"); } else { overblikkVisningRepository.oppdaterVisning(veilederId, detaljerVisning); + log.info("er ikke tom!"); } } catch (Exception e) { diff --git a/src/main/resources/db/migration/V11__OverblikkVisning.sql b/src/main/resources/db/migration/V11__OverblikkVisning.sql index f970276a..b3920d4b 100644 --- a/src/main/resources/db/migration/V11__OverblikkVisning.sql +++ b/src/main/resources/db/migration/V11__OverblikkVisning.sql @@ -1,5 +1,6 @@ CREATE TABLE OverblikkVisning ( VEILEDER_ID VARCHAR(10), + FILTER_ID VARCHAR(10), OPPRETTET TIMESTAMP, OVERBLIKK_VISNING JSONB, PRIMARY KEY (VEILEDER_ID) diff --git a/src/test/java/no/nav/pto/veilarbfilter/config/AppConfig.java b/src/test/java/no/nav/pto/veilarbfilter/config/AppConfig.java index 74e820e5..bb7d3c2c 100644 --- a/src/test/java/no/nav/pto/veilarbfilter/config/AppConfig.java +++ b/src/test/java/no/nav/pto/veilarbfilter/config/AppConfig.java @@ -36,7 +36,10 @@ MineLagredeFilterService.class, MineLagredeFilterController.class, VeilederGruppeController.class, - UnleashService.class, OverblikkVisningServiceImpl.class, OverblikkVisningRepository.class, OverblikkVisningController.class}) + UnleashService.class, + OverblikkVisningServiceImpl.class, + OverblikkVisningRepository.class, + OverblikkVisningController.class}) public class AppConfig { @MockBean public InfluxClient metricsClient; diff --git a/src/test/java/no/nav/pto/veilarbfilter/rest/OverblikkVisningTest.java b/src/test/java/no/nav/pto/veilarbfilter/rest/OverblikkVisningTest.java index 39364df9..11ec70f2 100644 --- a/src/test/java/no/nav/pto/veilarbfilter/rest/OverblikkVisningTest.java +++ b/src/test/java/no/nav/pto/veilarbfilter/rest/OverblikkVisningTest.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import lombok.val; import no.nav.pto.veilarbfilter.AbstractTest; +import no.nav.pto.veilarbfilter.domene.NyOverblikkVisningModel; import no.nav.pto.veilarbfilter.domene.OverblikkVisningModel; import no.nav.pto.veilarbfilter.service.OverblikkVisningService; import org.junit.jupiter.api.Assertions; @@ -21,6 +22,7 @@ import org.springframework.test.web.servlet.setup.MockMvcBuilders; import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.List; import java.util.Optional; @@ -42,62 +44,65 @@ public class OverblikkVisningTest extends AbstractTest { public void beforeEach() { } - @MockBean - private OverblikkVisningService overblikkVisningService; - @Test public void testInit() { Assertions.assertNotNull(mockMvc); } - @Test - public void testSlettVisning() throws Exception { - String veilederId = "VeilederId"; - doNothing().when(overblikkVisningService).slettVisning(eq(veilederId)); - MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.delete("/api/overblikkvisning")) - .andReturn(); - Assertions.assertEquals(HttpStatus.OK.value(), mvcResult.getResponse().getStatus()); - - val visningResponse = hentVisningTest(); - if (visningResponse == null) { - fail(); - } - val responseCode = slettVisningTest(veilederId); - assertFalse(responseCode.equals(200)); - } @Test public void testLagreOgOppdaterVisning() throws Exception { - OverblikkVisningModel overblikkVisningModel = new OverblikkVisningModel(); - - val visningRespons = hentVisningTest(); - lagreEllerOppdaterVisninger("someVeilederID", List.of("CV", "personalia"), LocalDateTime.now()); - - val nyVisningResponse = hentVisningTest(); - - if (nyVisningResponse.getContent() == null) { - fail(); - } - - assertTrue(visningRespons.getContent() == nyVisningResponse.getContent()); - + //lagre en ny visning med 2 elementer + val listeAvVisninger = new ArrayList(); + listeAvVisninger.add("CV"); + listeAvVisninger.add("Personalia"); + val lagreVisning = lagreEllerOppdaterVisninger(new NyOverblikkVisningModel(listeAvVisninger)); + Assertions.assertEquals(HttpStatus.OK.value(), lagreVisning.getStatus()); + + //hente visningen med 2 + val hentVisning = hentVisningTest(); + Assertions.assertEquals(HttpStatus.OK.value(), hentVisning.getStatus()); + Assertions.assertEquals(hentVisning.getContent().size(), 2); + + //oppdatere visningen til å ha 3 elementer + val listeAvOppdaterteVisninger = new ArrayList(listeAvVisninger); + listeAvOppdaterteVisninger.add("Registrering"); + val oppdatereVisning = lagreEllerOppdaterVisninger(new NyOverblikkVisningModel(listeAvOppdaterteVisninger)); + Assertions.assertEquals(HttpStatus.OK.value(), oppdatereVisning.getStatus()); + + //hent oppdatert visning + val hentOppdatertVisning = hentVisningTest(); + Assertions.assertEquals(HttpStatus.OK.value(), hentOppdatertVisning.getStatus()); + Assertions.assertEquals(3, hentOppdatertVisning.getContent().size()); } - //Hjelpefunskjoner + @Test + public void testSlettVisning() throws Exception { + //lagre en ny visning + val listeAvVisninger = new ArrayList(); + listeAvVisninger.add("CV"); + listeAvVisninger.add("Personalia"); + val lagreVisning = lagreEllerOppdaterVisninger(new NyOverblikkVisningModel(listeAvVisninger)); + Assertions.assertEquals(HttpStatus.OK.value(), lagreVisning.getStatus()); + + //hente visningen + val hentVisning = hentVisningTest(); + Assertions.assertEquals(HttpStatus.OK.value(), hentVisning.getStatus()); + Assertions.assertEquals(hentVisning.getContent().size(), 2); + + //slett visningen + val slettVisning = slettVisningTest(); + val hentVisningEtterSletting = hentVisningTest(); + Assertions.assertEquals(HttpStatus.NO_CONTENT.value(), slettVisning.getStatus()); + Assertions.assertEquals(HttpStatus.OK.value(), hentVisningEtterSletting.getStatus()); + Assertions.assertEquals(hentVisningEtterSletting.getContent(), null); - private String slettVisningTest(String veilederId) { - try { - MvcResult mvcResult = this.mockMvc.perform(MockMvcRequestBuilders.delete("/api/overblikkvisning/" + veilederId).accept(MediaType.APPLICATION_JSON).contentType(MediaType.APPLICATION_JSON)).andReturn(); - return mvcResult.getResponse().getContentAsString(); - } catch (Exception e) { - Assertions.fail(); - return null; - } } + //Hjelpefunskjoner - private ApiResponse> hentVisningTest() { + private ApiResponse> hentVisningTest() { try { MvcResult mvcResult = this.mockMvc.perform(MockMvcRequestBuilders.get("/api/overblikkvisning").accept(MediaType.APPLICATION_JSON).contentType(MediaType.APPLICATION_JSON)).andReturn(); @@ -114,12 +119,12 @@ private ApiResponse> hentVisningTest() { } } - private ApiResponse lagreEllerOppdaterVisninger (String veilederId, List overblikkVisning, LocalDateTime opprettet) throws Exception { + private ApiResponse lagreEllerOppdaterVisninger (NyOverblikkVisningModel nyOverblikkVisningModel) throws Exception { try { - MvcResult mvcResult = this.mockMvc.perform(MockMvcRequestBuilders.post("/api/overblikkvisning").content(objectMapper.writeValueAsString(veilederId)).contentType(MediaType.APPLICATION_JSON)).andReturn(); + MvcResult mvcResult = this.mockMvc.perform(MockMvcRequestBuilders.post("/api/overblikkvisning").content(objectMapper.writeValueAsString(nyOverblikkVisningModel)).accept(MediaType.APPLICATION_JSON).contentType(MediaType.APPLICATION_JSON)).andReturn(); if (mvcResult.getResponse().getStatus() == HttpStatus.OK.value()) { - return new ApiResponse<>(mvcResult.getResponse().getStatus(), objectMapper.readValue(mvcResult.getResponse().getContentAsString(), OverblikkVisningModel.class), ""); + return new ApiResponse<>(mvcResult.getResponse().getStatus(), null, ""); } else { return new ApiResponse<>(mvcResult.getResponse().getStatus(), null, mvcResult.getResponse().getContentAsString()); } @@ -130,5 +135,21 @@ private ApiResponse lagreEllerOppdaterVisninger (String v } } + private ApiResponse slettVisningTest() throws Exception { + try { + MvcResult mvcResult = this.mockMvc.perform(MockMvcRequestBuilders.delete("/api/overblikkvisning").accept(MediaType.APPLICATION_JSON).contentType(MediaType.APPLICATION_JSON)).andReturn(); + + if (mvcResult.getResponse().getStatus() == HttpStatus.NO_CONTENT.value()) { + return new ApiResponse<>(mvcResult.getResponse().getStatus(), null, ""); + } else { + return new ApiResponse<>(mvcResult.getResponse().getStatus(), null, mvcResult.getResponse().getContentAsString()); + } + + } catch (Exception e) { + Assertions.fail(); + return null; + } + } + } From d6270902492bb0ea83184a94ba5dc3625394558b Mon Sep 17 00:00:00 2001 From: Kristine Schuessler Date: Mon, 24 Jul 2023 11:06:18 +0200 Subject: [PATCH 07/16] =?UTF-8?q?FEIL:=20endre=20sql=20i=20oppdaterfunksjo?= =?UTF-8?q?nen=20i=20repo,=20FIX:=20feilh=C3=A5ndtering?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../OverblikkVisningRepository.java | 35 ++++--------------- .../rest/OverblikkVisningController.java | 12 ++++--- .../service/OverblikkVisningService.java | 2 +- .../service/OverblikkVisningServiceImpl.java | 13 ++----- .../rest/OverblikkVisningTest.java | 13 ++----- 5 files changed, 20 insertions(+), 55 deletions(-) diff --git a/src/main/java/no/nav/pto/veilarbfilter/repository/OverblikkVisningRepository.java b/src/main/java/no/nav/pto/veilarbfilter/repository/OverblikkVisningRepository.java index fec361df..7b00650e 100644 --- a/src/main/java/no/nav/pto/veilarbfilter/repository/OverblikkVisningRepository.java +++ b/src/main/java/no/nav/pto/veilarbfilter/repository/OverblikkVisningRepository.java @@ -40,44 +40,23 @@ public Optional hentVisning(String veilederId) { } } - public void lagreVisning(String veilederId, List detaljerVisning) throws IllegalArgumentException { - try { + public void lagreVisning(String veilederId, List detaljerVisning) throws Exception { String insertSql = String.format("INSERT INTO %s (%s, %s, %s) VALUES (?, to_json(?::JSON), ?)", OverblikkVisning.TABLE_NAME, OverblikkVisning.VEILEDER_ID, OverblikkVisning.OVERBLIKK_VISNING, OverblikkVisning.OPPRETTET); - int numberOfRowsAffected = db.update(insertSql, veilederId, objectMapper.writeValueAsString(detaljerVisning), fromLocalDateTimeToTimestamp(LocalDateTime.now())); - log.info("Det gikk å lagre repository!! {}", numberOfRowsAffected); - } catch (IllegalArgumentException e) { - throw e; - } catch (Exception e) { - log.error("Kan ikke lagre visningen " + e, e); - } + db.update(insertSql, veilederId, objectMapper.writeValueAsString(detaljerVisning), fromLocalDateTimeToTimestamp(LocalDateTime.now())); } - public void oppdaterVisning(String veilederId, List detaljerVisning) throws IllegalArgumentException { - try { - - String updateSql = String.format("UPDATE %s, %s = to_json(?::JSON) WHERE %s = ?", OverblikkVisning.TABLE_NAME, OverblikkVisning.OVERBLIKK_VISNING, OverblikkVisning.VEILEDER_ID); - int numerOfAffctedRows = db.update(updateSql, objectMapper.writeValueAsString(detaljerVisning), veilederId); - log.info("Det gikk å oppdatere i repo!! {}", numerOfAffctedRows); - - } catch (IllegalArgumentException e) { - throw e; - } catch (Exception e) { - log.error("Kan ikke oppdatere visning " + e, e); - } + public void oppdaterVisning(String veilederId, List detaljerVisning) throws Exception { + String updateSql = String.format("UPDATE %s SET %s = to_json(?::JSON) WHERE %s = ?", OverblikkVisning.TABLE_NAME, OverblikkVisning.OVERBLIKK_VISNING, OverblikkVisning.VEILEDER_ID); + db.update(updateSql, objectMapper.writeValueAsString(detaljerVisning), veilederId); } - public void slettVisning(String veilederId) throws IllegalArgumentException { - try { + public void slettVisning(String veilederId) throws Exception { String deleteSql = String.format("DELETE FROM %s WHERE %s = ?", OverblikkVisning.TABLE_NAME, OverblikkVisning.VEILEDER_ID); db.update(deleteSql, veilederId); - } catch (IllegalArgumentException e) { - throw e; - } catch (Exception e) { - log.error("Kan ikke slette visning " + e, e); - } + } } diff --git a/src/main/java/no/nav/pto/veilarbfilter/rest/OverblikkVisningController.java b/src/main/java/no/nav/pto/veilarbfilter/rest/OverblikkVisningController.java index 045df96c..97fc5458 100644 --- a/src/main/java/no/nav/pto/veilarbfilter/rest/OverblikkVisningController.java +++ b/src/main/java/no/nav/pto/veilarbfilter/rest/OverblikkVisningController.java @@ -6,7 +6,6 @@ import no.nav.pto.veilarbfilter.domene.NyOverblikkVisningModel; import no.nav.pto.veilarbfilter.domene.OverblikkVisningModel; import no.nav.pto.veilarbfilter.service.OverblikkVisningService; -import no.nav.pto.veilarbfilter.service.OverblikkVisningServiceImpl; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -54,8 +53,13 @@ public ResponseEntity>> hentVisning() { @DeleteMapping public ResponseEntity slettVisning() { String veilederId = AuthUtils.getInnloggetVeilederIdent().toString(); - - overblikkVisningService.slettVisning(veilederId); - return ResponseEntity.noContent().build(); + try { + overblikkVisningService.slettVisning(veilederId); + return ResponseEntity.noContent().build(); + } + catch (Exception e) { + log.error("Klarte ikke slette visningen", e); + return ResponseEntity.internalServerError().build(); + } } } diff --git a/src/main/java/no/nav/pto/veilarbfilter/service/OverblikkVisningService.java b/src/main/java/no/nav/pto/veilarbfilter/service/OverblikkVisningService.java index 17232e64..2b47ecd7 100644 --- a/src/main/java/no/nav/pto/veilarbfilter/service/OverblikkVisningService.java +++ b/src/main/java/no/nav/pto/veilarbfilter/service/OverblikkVisningService.java @@ -9,5 +9,5 @@ public interface OverblikkVisningService { Optional hentVisning(String veilederId); void lagreOgOppdater(String veilederId, List detaljerVisning) throws Exception; - void slettVisning(String veilederId); + void slettVisning(String veilederId) throws Exception; } diff --git a/src/main/java/no/nav/pto/veilarbfilter/service/OverblikkVisningServiceImpl.java b/src/main/java/no/nav/pto/veilarbfilter/service/OverblikkVisningServiceImpl.java index 78bb1954..c0ba991c 100644 --- a/src/main/java/no/nav/pto/veilarbfilter/service/OverblikkVisningServiceImpl.java +++ b/src/main/java/no/nav/pto/veilarbfilter/service/OverblikkVisningServiceImpl.java @@ -21,26 +21,17 @@ public Optional hentVisning(String veilederId) { return overblikkVisningRepository.hentVisning(veilederId); } - public void lagreOgOppdater(String veilederId, List detaljerVisning) { - try{ + public void lagreOgOppdater(String veilederId, List detaljerVisning) throws Exception { Optional lagretVisning = overblikkVisningRepository.hentVisning(veilederId); - log.info("er i service!"); if (lagretVisning.isEmpty()) { overblikkVisningRepository.lagreVisning(veilederId, detaljerVisning); - log.info("er tom!"); } else { overblikkVisningRepository.oppdaterVisning(veilederId, detaljerVisning); - log.info("er ikke tom!"); } - } - catch (Exception e) { - log.error("Kan ikke lagre og oppdatere visning " + e, e); - throw e; - } } @Override - public void slettVisning(String veilederId) { + public void slettVisning(String veilederId) throws Exception { overblikkVisningRepository.slettVisning(veilederId); } diff --git a/src/test/java/no/nav/pto/veilarbfilter/rest/OverblikkVisningTest.java b/src/test/java/no/nav/pto/veilarbfilter/rest/OverblikkVisningTest.java index 11ec70f2..f1352a88 100644 --- a/src/test/java/no/nav/pto/veilarbfilter/rest/OverblikkVisningTest.java +++ b/src/test/java/no/nav/pto/veilarbfilter/rest/OverblikkVisningTest.java @@ -6,13 +6,11 @@ import no.nav.pto.veilarbfilter.AbstractTest; import no.nav.pto.veilarbfilter.domene.NyOverblikkVisningModel; import no.nav.pto.veilarbfilter.domene.OverblikkVisningModel; -import no.nav.pto.veilarbfilter.service.OverblikkVisningService; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.test.context.ActiveProfiles; @@ -20,14 +18,8 @@ import org.springframework.test.web.servlet.MvcResult; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.setup.MockMvcBuilders; - -import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; -import java.util.Optional; - -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.*; @WebMvcTest(controllers = OverblikkVisningController.class) @ActiveProfiles({"test"}) @@ -49,8 +41,6 @@ public void testInit() { Assertions.assertNotNull(mockMvc); } - - @Test public void testLagreOgOppdaterVisning() throws Exception { //lagre en ny visning med 2 elementer @@ -100,8 +90,9 @@ public void testSlettVisning() throws Exception { Assertions.assertEquals(hentVisningEtterSletting.getContent(), null); } - //Hjelpefunskjoner + + //Hjelpefunskjoner private ApiResponse> hentVisningTest() { try { MvcResult mvcResult = this.mockMvc.perform(MockMvcRequestBuilders.get("/api/overblikkvisning").accept(MediaType.APPLICATION_JSON).contentType(MediaType.APPLICATION_JSON)).andReturn(); From 86d4afc7eb54fb108ded2d0e4585754fde33f8bb Mon Sep 17 00:00:00 2001 From: Kristine Schuessler Date: Mon, 24 Jul 2023 15:44:00 +0200 Subject: [PATCH 08/16] legg til UtilityClass ref forslag fra CodeSmells --- src/main/java/no/nav/pto/veilarbfilter/database/Table.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/no/nav/pto/veilarbfilter/database/Table.java b/src/main/java/no/nav/pto/veilarbfilter/database/Table.java index ad4d51ae..c5618afe 100644 --- a/src/main/java/no/nav/pto/veilarbfilter/database/Table.java +++ b/src/main/java/no/nav/pto/veilarbfilter/database/Table.java @@ -1,6 +1,10 @@ package no.nav.pto.veilarbfilter.database; +import lombok.experimental.UtilityClass; + +@UtilityClass public class Table { + public static class Filter { public static String TABLE_NAME = "Filter"; public static String FILTER_ID = "filter_id"; @@ -37,6 +41,7 @@ public static class OverblikkVisning { public static String VEILEDER_ID = "veileder_id"; public static String OPPRETTET = "opprettet"; public static String OVERBLIKK_VISNING = "overblikk_visning"; + } } From d8cf89f1f4eaebb0b0b7a06038f60ac5f062d4e4 Mon Sep 17 00:00:00 2001 From: Sondre Larsen Ovrid Date: Tue, 25 Jul 2023 14:42:25 +0200 Subject: [PATCH 09/16] Diverse refaktoreringer --- .../nav/pto/veilarbfilter/database/Table.java | 53 ++++--- .../domene/NyOverblikkVisningModel.java | 20 --- .../domene/OverblikkVisning.java | 10 ++ .../domene/OverblikkVisningAlternativer.java | 5 + .../domene/OverblikkVisningModel.java | 27 ---- .../domene/OverblikkVisningRequest.java | 13 ++ .../OverblikkVisningRepository.java | 86 ++++++----- .../rest/OverblikkVisningController.java | 77 ++++++---- .../service/OverblikkVisningService.java | 28 +++- .../service/OverblikkVisningServiceImpl.java | 38 ----- .../veilarbfilter/util/PostgresqlUtils.java | 14 ++ .../veilarbfilter/util/SecureLogUtils.java | 12 ++ .../V11__CreateOverblikkVisningTable.sql | 10 ++ .../db/migration/V11__OverblikkVisning.sql | 9 -- .../pto/veilarbfilter/config/AppConfig.java | 2 +- .../rest/OverblikkVisningTest.java | 142 +++++++++++------- 16 files changed, 305 insertions(+), 241 deletions(-) delete mode 100644 src/main/java/no/nav/pto/veilarbfilter/domene/NyOverblikkVisningModel.java create mode 100644 src/main/java/no/nav/pto/veilarbfilter/domene/OverblikkVisning.java create mode 100644 src/main/java/no/nav/pto/veilarbfilter/domene/OverblikkVisningAlternativer.java delete mode 100644 src/main/java/no/nav/pto/veilarbfilter/domene/OverblikkVisningModel.java create mode 100644 src/main/java/no/nav/pto/veilarbfilter/domene/OverblikkVisningRequest.java delete mode 100644 src/main/java/no/nav/pto/veilarbfilter/service/OverblikkVisningServiceImpl.java create mode 100644 src/main/java/no/nav/pto/veilarbfilter/util/PostgresqlUtils.java create mode 100644 src/main/java/no/nav/pto/veilarbfilter/util/SecureLogUtils.java create mode 100644 src/main/resources/db/migration/V11__CreateOverblikkVisningTable.sql delete mode 100644 src/main/resources/db/migration/V11__OverblikkVisning.sql diff --git a/src/main/java/no/nav/pto/veilarbfilter/database/Table.java b/src/main/java/no/nav/pto/veilarbfilter/database/Table.java index c5618afe..28f8b1eb 100644 --- a/src/main/java/no/nav/pto/veilarbfilter/database/Table.java +++ b/src/main/java/no/nav/pto/veilarbfilter/database/Table.java @@ -4,44 +4,47 @@ @UtilityClass public class Table { - public static class Filter { - public static String TABLE_NAME = "Filter"; - public static String FILTER_ID = "filter_id"; - public static String FILTER_NAVN = "filter_navn"; - public static String VALGTE_FILTER = "valgte_filter"; - public static String OPPRETTET = "opprettet"; - public static String FILTER_CLEANUP = "filter_cleanup"; + public static final String TABLE_NAME = "Filter"; + public static final String FILTER_ID = "filter_id"; + public static final String FILTER_NAVN = "filter_navn"; + public static final String VALGTE_FILTER = "valgte_filter"; + public static final String OPPRETTET = "opprettet"; + public static final String FILTER_CLEANUP = "filter_cleanup"; + private Filter() { throw new UnsupportedOperationException(); } } public static class MineLagredeFilter { - public static String TABLE_NAME = "minelagredefilter"; - public static String FILTER_ID = "mine_filter_id"; - public static String VEILEDER_ID = "veileder_id"; - public static String AKTIV = "aktiv"; - public static String NOTE = "note"; - public static String SORT_ORDER = "sort_order"; + public static final String TABLE_NAME = "minelagredefilter"; + public static final String FILTER_ID = "mine_filter_id"; + public static final String VEILEDER_ID = "veileder_id"; + public static final String AKTIV = "aktiv"; + public static final String NOTE = "note"; + public static final String SORT_ORDER = "sort_order"; + private MineLagredeFilter() { throw new UnsupportedOperationException(); } } public static class VeilederGrupperFilter { - public static String TABLE_NAME = "veiledergrupperfilter"; - public static String FILTER_ID = "veiledergruppe_filter_id"; - public static String ENHET_ID = "enhet_id"; - + public static final String TABLE_NAME = "veiledergrupperfilter"; + public static final String FILTER_ID = "veiledergruppe_filter_id"; + public static final String ENHET_ID = "enhet_id"; + private VeilederGrupperFilter() { throw new UnsupportedOperationException(); } } public static class MetricsReporterInfo { - public static String TABLE_NAME = "MetricsReporterInfo"; - public static String REPORTER_ID = "reporter_id"; - public static String OPPRETTET = "opprettet"; + public static final String TABLE_NAME = "MetricsReporterInfo"; + public static final String REPORTER_ID = "reporter_id"; + public static final String OPPRETTET = "opprettet"; + private MetricsReporterInfo() { throw new UnsupportedOperationException(); } } public static class OverblikkVisning { - public static String TABLE_NAME = "OverblikkVisning"; - public static String VEILEDER_ID = "veileder_id"; - public static String OPPRETTET = "opprettet"; - public static String OVERBLIKK_VISNING = "overblikk_visning"; - + public static final String TABLE_NAME = "OverblikkVisning"; + public static final String OVERBLIKK_VISNING_ID = "overblikk_visning_id"; + public static final String VEILEDER_ID = "veileder_id"; + public static final String SIST_ENDRET = "sist_endret"; + public static final String VISNING = "visning"; + private OverblikkVisning() { throw new UnsupportedOperationException(); } } } diff --git a/src/main/java/no/nav/pto/veilarbfilter/domene/NyOverblikkVisningModel.java b/src/main/java/no/nav/pto/veilarbfilter/domene/NyOverblikkVisningModel.java deleted file mode 100644 index 6e891e10..00000000 --- a/src/main/java/no/nav/pto/veilarbfilter/domene/NyOverblikkVisningModel.java +++ /dev/null @@ -1,20 +0,0 @@ -package no.nav.pto.veilarbfilter.domene; - -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import lombok.*; -import org.flywaydb.core.internal.configuration.ListDeserializer; - -import java.util.List; - -@Data -@Getter -@Setter -@AllArgsConstructor -@JsonDeserialize -@NoArgsConstructor -public class NyOverblikkVisningModel { - @JsonSetter(nulls = Nulls.AS_EMPTY) - List overblikkVisning; -} diff --git a/src/main/java/no/nav/pto/veilarbfilter/domene/OverblikkVisning.java b/src/main/java/no/nav/pto/veilarbfilter/domene/OverblikkVisning.java new file mode 100644 index 00000000..21529ae2 --- /dev/null +++ b/src/main/java/no/nav/pto/veilarbfilter/domene/OverblikkVisning.java @@ -0,0 +1,10 @@ +package no.nav.pto.veilarbfilter.domene; + +import java.util.List; +import java.util.UUID; + +public record OverblikkVisning( + UUID overblikkVisningId, + List visning +) { +} diff --git a/src/main/java/no/nav/pto/veilarbfilter/domene/OverblikkVisningAlternativer.java b/src/main/java/no/nav/pto/veilarbfilter/domene/OverblikkVisningAlternativer.java new file mode 100644 index 00000000..b930201b --- /dev/null +++ b/src/main/java/no/nav/pto/veilarbfilter/domene/OverblikkVisningAlternativer.java @@ -0,0 +1,5 @@ +package no.nav.pto.veilarbfilter.domene; + +public enum OverblikkVisningAlternativer { + CV, JOBBONSKER, REGISTRERING, OPPFOLGING, YTELSER, PERSONALIA +} diff --git a/src/main/java/no/nav/pto/veilarbfilter/domene/OverblikkVisningModel.java b/src/main/java/no/nav/pto/veilarbfilter/domene/OverblikkVisningModel.java deleted file mode 100644 index e547ba60..00000000 --- a/src/main/java/no/nav/pto/veilarbfilter/domene/OverblikkVisningModel.java +++ /dev/null @@ -1,27 +0,0 @@ -package no.nav.pto.veilarbfilter.domene; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonPropertyOrder; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import java.time.LocalDateTime; - -@Getter -@NoArgsConstructor -@AllArgsConstructor -@JsonPropertyOrder(alphabetic = true) -@JsonIgnoreProperties(ignoreUnknown = true) -public class OverblikkVisningModel { - - @JsonSetter(nulls = Nulls.AS_EMPTY) - private String veilederID = null; - - @JsonSetter(nulls = Nulls.AS_EMPTY) - private String overblikkVisning = null; - - @JsonSetter(nulls = Nulls.AS_EMPTY) - private LocalDateTime opprettet = null; -} diff --git a/src/main/java/no/nav/pto/veilarbfilter/domene/OverblikkVisningRequest.java b/src/main/java/no/nav/pto/veilarbfilter/domene/OverblikkVisningRequest.java new file mode 100644 index 00000000..01dcf3c3 --- /dev/null +++ b/src/main/java/no/nav/pto/veilarbfilter/domene/OverblikkVisningRequest.java @@ -0,0 +1,13 @@ +package no.nav.pto.veilarbfilter.domene; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; + +import java.util.List; + +public record OverblikkVisningRequest( + List overblikkVisning +) { +} diff --git a/src/main/java/no/nav/pto/veilarbfilter/repository/OverblikkVisningRepository.java b/src/main/java/no/nav/pto/veilarbfilter/repository/OverblikkVisningRepository.java index 7b00650e..c53357b0 100644 --- a/src/main/java/no/nav/pto/veilarbfilter/repository/OverblikkVisningRepository.java +++ b/src/main/java/no/nav/pto/veilarbfilter/repository/OverblikkVisningRepository.java @@ -1,62 +1,76 @@ package no.nav.pto.veilarbfilter.repository; -import com.fasterxml.jackson.databind.ObjectMapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import no.nav.pto.veilarbfilter.domene.*; -import org.springframework.jdbc.core.JdbcTemplate; +import no.nav.pto.veilarbfilter.database.Table; +import no.nav.pto.veilarbfilter.domene.OverblikkVisning; +import no.nav.pto.veilarbfilter.domene.value.VeilederId; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; import org.springframework.stereotype.Service; import java.time.LocalDateTime; -import java.util.List; -import java.util.Optional; +import java.util.*; -import static no.nav.pto.veilarbfilter.database.Table.OverblikkVisning; import static no.nav.pto.veilarbfilter.util.DateUtils.fromLocalDateTimeToTimestamp; +import static no.nav.pto.veilarbfilter.util.PostgresqlUtils.mapTilPostgresqlArray; @Service @Slf4j @RequiredArgsConstructor public class OverblikkVisningRepository { - private final JdbcTemplate db; - private final ObjectMapper objectMapper; + private final NamedParameterJdbcTemplate db; + + public Optional hent(VeilederId veilederId) { + MapSqlParameterSource paramSource = new MapSqlParameterSource().addValue("veilederid", veilederId.getValue()); + String sql = String.format("SELECT * FROM %s where %s = :veilederid", Table.OverblikkVisning.TABLE_NAME, Table.OverblikkVisning.VEILEDER_ID); - public Optional hentVisning(String veilederId) { try { - String selectSql = String.format("SELECT * FROM %s where %s = ?", OverblikkVisning.TABLE_NAME, OverblikkVisning.VEILEDER_ID); - OverblikkVisningModel minLagretDetaljerVisning = db.queryForObject(selectSql, (rs, rowNum) -> { - try { - return new OverblikkVisningModel(rs.getString(OverblikkVisning.VEILEDER_ID), rs.getString(OverblikkVisning.OVERBLIKK_VISNING), null); - } catch (Exception e) { - log.error("Error ved å hente visningen " + e, e); - throw new RuntimeException(e); - } - }, veilederId); - - return Optional.of(minLagretDetaljerVisning); - } catch (Exception e) { - log.warn("Finner ikke visningen " + e, e); + OverblikkVisning overblikkVisning = db.queryForObject( + sql, + paramSource, + (rs, rowNum) -> new OverblikkVisning( + (UUID) rs.getObject(Table.OverblikkVisning.OVERBLIKK_VISNING_ID), + Arrays.asList((String[]) rs.getArray(Table.OverblikkVisning.VISNING).getArray()) + ) + ); + return Optional.ofNullable(overblikkVisning); + } catch (EmptyResultDataAccessException e) { return Optional.empty(); } } - public void lagreVisning(String veilederId, List detaljerVisning) throws Exception { - String insertSql = String.format("INSERT INTO %s (%s, %s, %s) VALUES (?, to_json(?::JSON), ?)", - OverblikkVisning.TABLE_NAME, OverblikkVisning.VEILEDER_ID, OverblikkVisning.OVERBLIKK_VISNING, OverblikkVisning.OPPRETTET); - db.update(insertSql, veilederId, objectMapper.writeValueAsString(detaljerVisning), fromLocalDateTimeToTimestamp(LocalDateTime.now())); - } + public void lagre(VeilederId veilederId, List overblikkVisning) { + Optional maybeOverblikkvisning = hent(veilederId); + MapSqlParameterSource paramSource = new MapSqlParameterSource().addValues(Map.ofEntries( + Map.entry("overblikkvisningid", maybeOverblikkvisning.isPresent() ? maybeOverblikkvisning.get().overblikkVisningId() : UUID.randomUUID()), + Map.entry("veilederid", veilederId.getValue()), + Map.entry("visning", mapTilPostgresqlArray(overblikkVisning)), + Map.entry("sistendret", fromLocalDateTimeToTimestamp(LocalDateTime.now())) + )); + String query = String.format(""" + INSERT INTO %s (%s, %s, %s, %s) VALUES (:overblikkvisningid, :veilederid, :visning::varchar[], :sistendret) + ON CONFLICT (%s) + DO UPDATE SET(%s, %s) = (:visning::varchar[], :sistendret) + """, + Table.OverblikkVisning.TABLE_NAME, + Table.OverblikkVisning.OVERBLIKK_VISNING_ID, + Table.OverblikkVisning.VEILEDER_ID, + Table.OverblikkVisning.VISNING, + Table.OverblikkVisning.SIST_ENDRET, + Table.OverblikkVisning.OVERBLIKK_VISNING_ID, + Table.OverblikkVisning.VISNING, + Table.OverblikkVisning.SIST_ENDRET + ); - public void oppdaterVisning(String veilederId, List detaljerVisning) throws Exception { - String updateSql = String.format("UPDATE %s SET %s = to_json(?::JSON) WHERE %s = ?", OverblikkVisning.TABLE_NAME, OverblikkVisning.OVERBLIKK_VISNING, OverblikkVisning.VEILEDER_ID); - db.update(updateSql, objectMapper.writeValueAsString(detaljerVisning), veilederId); + db.update(query, paramSource); } - public void slettVisning(String veilederId) throws Exception { - String deleteSql = String.format("DELETE FROM %s WHERE %s = ?", - OverblikkVisning.TABLE_NAME, OverblikkVisning.VEILEDER_ID); - - db.update(deleteSql, veilederId); - + public void slett(VeilederId veilederId) { + MapSqlParameterSource paramSource = new MapSqlParameterSource().addValue("veilederid", veilederId.getValue()); + String query = String.format("DELETE FROM %s WHERE %s = :veilederid", Table.OverblikkVisning.TABLE_NAME, Table.OverblikkVisning.VEILEDER_ID); + db.update(query, paramSource); } } diff --git a/src/main/java/no/nav/pto/veilarbfilter/rest/OverblikkVisningController.java b/src/main/java/no/nav/pto/veilarbfilter/rest/OverblikkVisningController.java index 97fc5458..cc013798 100644 --- a/src/main/java/no/nav/pto/veilarbfilter/rest/OverblikkVisningController.java +++ b/src/main/java/no/nav/pto/veilarbfilter/rest/OverblikkVisningController.java @@ -3,63 +3,88 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import no.nav.pto.veilarbfilter.auth.AuthUtils; -import no.nav.pto.veilarbfilter.domene.NyOverblikkVisningModel; -import no.nav.pto.veilarbfilter.domene.OverblikkVisningModel; +import no.nav.pto.veilarbfilter.domene.OverblikkVisning; +import no.nav.pto.veilarbfilter.domene.OverblikkVisningAlternativer; +import no.nav.pto.veilarbfilter.domene.OverblikkVisningRequest; +import no.nav.pto.veilarbfilter.domene.value.VeilederId; import no.nav.pto.veilarbfilter.service.OverblikkVisningService; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import java.util.ArrayList; import java.util.Arrays; -import java.util.Optional; +import java.util.Collections; import java.util.List; +import java.util.Optional; +import static no.nav.pto.veilarbfilter.util.SecureLogUtils.secureLog; import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; @RequiredArgsConstructor @Slf4j @RestController @RequestMapping(value = "/api/overblikkvisning", produces = APPLICATION_JSON_VALUE) - public class OverblikkVisningController { private final OverblikkVisningService overblikkVisningService; - @PostMapping - public ResponseEntity lagreOgOppdater(@RequestBody NyOverblikkVisningModel nyOverblikkVisningModel) throws Exception { + public ResponseEntity lagreOverblikkvisningForInnloggetVeileder(@RequestBody OverblikkVisningRequest overblikkVisningRequest) { + VeilederId veilederId = AuthUtils.getInnloggetVeilederIdent(); - String veilederId = AuthUtils.getInnloggetVeilederIdent().toString(); - overblikkVisningService.lagreOgOppdater(veilederId, nyOverblikkVisningModel.getOverblikkVisning()); - return ResponseEntity.ok().build(); + try { + validerRequest(overblikkVisningRequest); + overblikkVisningService.lagreOverblikkVisning(veilederId, overblikkVisningRequest.overblikkVisning()); + return ResponseEntity.noContent().build(); + } catch (IllegalArgumentException e) { + secureLog.error("Klarte ikke å lagre overblikk visning for veilederId: {}. Grunn: ulovlige verdier i request.", veilederId, e); + return ResponseEntity.badRequest().build(); + } catch (Exception e) { + secureLog.error("Klarte ikke å lagre overblikk visning for veilederId: {}", veilederId, e); + return ResponseEntity.internalServerError().build(); + } } @GetMapping - public ResponseEntity>> hentVisning() { + public ResponseEntity> hentOverblikkvisningForInnloggetVeileder() { + VeilederId veilederId = AuthUtils.getInnloggetVeilederIdent(); - String veilederId = AuthUtils.getInnloggetVeilederIdent().toString(); - - Optional visningsListe = overblikkVisningService.hentVisning(veilederId); - if (visningsListe.isPresent()){ - String overblikkVisning = visningsListe.get().getOverblikkVisning(); - List overblikkVisningListe = new ArrayList(Arrays.asList(overblikkVisning.replace("[", "").replace("]", "").split(","))); - return ResponseEntity.ok().body(Optional.of(overblikkVisningListe)); + try { + Optional visningsListe = overblikkVisningService.hentOverblikkVisning(veilederId); + return visningsListe + .map(overblikkVisning -> ResponseEntity.ok().body(overblikkVisning.visning())) + .orElseGet(() -> ResponseEntity.ok().body(Collections.emptyList())); + } catch (Exception e) { + secureLog.error("Klarte ikke å hente overblikk visning for veilederId: {}", veilederId, e); + return ResponseEntity.internalServerError().build(); } - - return ResponseEntity.ok().body(Optional.empty()); } @DeleteMapping - public ResponseEntity slettVisning() { - String veilederId = AuthUtils.getInnloggetVeilederIdent().toString(); + public ResponseEntity slettOverblikkvisningForInnloggetVeileder() { + VeilederId veilederId = AuthUtils.getInnloggetVeilederIdent(); + try { - overblikkVisningService.slettVisning(veilederId); + overblikkVisningService.slettOverblikkVisning(veilederId); return ResponseEntity.noContent().build(); - } - catch (Exception e) { - log.error("Klarte ikke slette visningen", e); + } catch (Exception e) { + secureLog.error("Klarte ikke å slette overblikk visning for veilederId: {}", veilederId, e); return ResponseEntity.internalServerError().build(); } } + + private void validerRequest(OverblikkVisningRequest overblikkVisningRequest) { + + boolean alleValgteAlternativerErLovlige = overblikkVisningRequest.overblikkVisning().stream() + .map(String::toUpperCase) + .allMatch(valgtAlternativ -> { + return Arrays.stream(OverblikkVisningAlternativer.values()) + .map(Enum::name) + .anyMatch(lovligAlternativ -> lovligAlternativ.equals(valgtAlternativ)); + }); + + if (!alleValgteAlternativerErLovlige) { + throw new IllegalArgumentException(); + } + } } diff --git a/src/main/java/no/nav/pto/veilarbfilter/service/OverblikkVisningService.java b/src/main/java/no/nav/pto/veilarbfilter/service/OverblikkVisningService.java index 2b47ecd7..a6e9c8a2 100644 --- a/src/main/java/no/nav/pto/veilarbfilter/service/OverblikkVisningService.java +++ b/src/main/java/no/nav/pto/veilarbfilter/service/OverblikkVisningService.java @@ -1,13 +1,31 @@ package no.nav.pto.veilarbfilter.service; -import no.nav.pto.veilarbfilter.domene.OverblikkVisningModel; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import no.nav.pto.veilarbfilter.domene.OverblikkVisning; +import no.nav.pto.veilarbfilter.domene.value.VeilederId; +import no.nav.pto.veilarbfilter.repository.OverblikkVisningRepository; +import org.springframework.stereotype.Service; + import java.util.List; import java.util.Optional; -public interface OverblikkVisningService { +@Service +@Slf4j +@RequiredArgsConstructor +public class OverblikkVisningService { + + private final OverblikkVisningRepository overblikkVisningRepository; + + public Optional hentOverblikkVisning(VeilederId veilederId) { + return overblikkVisningRepository.hent(veilederId); + } - Optional hentVisning(String veilederId); - void lagreOgOppdater(String veilederId, List detaljerVisning) throws Exception; + public void lagreOverblikkVisning(VeilederId veilederId, List overblikkVisning) { + overblikkVisningRepository.lagre(veilederId, overblikkVisning); + } - void slettVisning(String veilederId) throws Exception; + public void slettOverblikkVisning(VeilederId veilederId) { + overblikkVisningRepository.slett(veilederId); + } } diff --git a/src/main/java/no/nav/pto/veilarbfilter/service/OverblikkVisningServiceImpl.java b/src/main/java/no/nav/pto/veilarbfilter/service/OverblikkVisningServiceImpl.java deleted file mode 100644 index c0ba991c..00000000 --- a/src/main/java/no/nav/pto/veilarbfilter/service/OverblikkVisningServiceImpl.java +++ /dev/null @@ -1,38 +0,0 @@ -package no.nav.pto.veilarbfilter.service; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import no.nav.pto.veilarbfilter.domene.OverblikkVisningModel; -import no.nav.pto.veilarbfilter.repository.OverblikkVisningRepository; -import org.springframework.stereotype.Service; - -import java.util.List; -import java.util.Optional; - -@Service -@Slf4j -@RequiredArgsConstructor -public class OverblikkVisningServiceImpl implements OverblikkVisningService { - - private final OverblikkVisningRepository overblikkVisningRepository; - - @Override - public Optional hentVisning(String veilederId) { - return overblikkVisningRepository.hentVisning(veilederId); - } - - public void lagreOgOppdater(String veilederId, List detaljerVisning) throws Exception { - Optional lagretVisning = overblikkVisningRepository.hentVisning(veilederId); - if (lagretVisning.isEmpty()) { - overblikkVisningRepository.lagreVisning(veilederId, detaljerVisning); - } else { - overblikkVisningRepository.oppdaterVisning(veilederId, detaljerVisning); - } - } - - @Override - public void slettVisning(String veilederId) throws Exception { - overblikkVisningRepository.slettVisning(veilederId); - } - -} diff --git a/src/main/java/no/nav/pto/veilarbfilter/util/PostgresqlUtils.java b/src/main/java/no/nav/pto/veilarbfilter/util/PostgresqlUtils.java new file mode 100644 index 00000000..9d9b967e --- /dev/null +++ b/src/main/java/no/nav/pto/veilarbfilter/util/PostgresqlUtils.java @@ -0,0 +1,14 @@ +package no.nav.pto.veilarbfilter.util; + +import java.util.List; +import java.util.stream.Collectors; + +public final class PostgresqlUtils { + private PostgresqlUtils() { + throw new UnsupportedOperationException(); + } + + public static String mapTilPostgresqlArray(List elementer) { + return elementer.stream().collect(Collectors.joining(",", "{", "}")); + } +} diff --git a/src/main/java/no/nav/pto/veilarbfilter/util/SecureLogUtils.java b/src/main/java/no/nav/pto/veilarbfilter/util/SecureLogUtils.java new file mode 100644 index 00000000..fe044b1e --- /dev/null +++ b/src/main/java/no/nav/pto/veilarbfilter/util/SecureLogUtils.java @@ -0,0 +1,12 @@ +package no.nav.pto.veilarbfilter.util; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public final class SecureLogUtils { + private SecureLogUtils() { + throw new UnsupportedOperationException(); + } + + public static final Logger secureLog = LoggerFactory.getLogger("SecureLog"); +} diff --git a/src/main/resources/db/migration/V11__CreateOverblikkVisningTable.sql b/src/main/resources/db/migration/V11__CreateOverblikkVisningTable.sql new file mode 100644 index 00000000..e3f5b666 --- /dev/null +++ b/src/main/resources/db/migration/V11__CreateOverblikkVisningTable.sql @@ -0,0 +1,10 @@ +CREATE TABLE OverblikkVisning +( + OVERBLIKK_VISNING_ID UUID NOT NULL, + VEILEDER_ID VARCHAR(32) NOT NULL, + SIST_ENDRET TIMESTAMP NOT NULL, + VISNING VARCHAR(32)[] NOT NULL, + PRIMARY KEY (OVERBLIKK_VISNING_ID) +); + +CREATE UNIQUE INDEX overblikk_visning_veileder_id_index ON OverblikkVisning (VEILEDER_ID, OVERBLIKK_VISNING_ID); \ No newline at end of file diff --git a/src/main/resources/db/migration/V11__OverblikkVisning.sql b/src/main/resources/db/migration/V11__OverblikkVisning.sql deleted file mode 100644 index b3920d4b..00000000 --- a/src/main/resources/db/migration/V11__OverblikkVisning.sql +++ /dev/null @@ -1,9 +0,0 @@ -CREATE TABLE OverblikkVisning ( - VEILEDER_ID VARCHAR(10), - FILTER_ID VARCHAR(10), - OPPRETTET TIMESTAMP, - OVERBLIKK_VISNING JSONB, - PRIMARY KEY (VEILEDER_ID) - ); - - diff --git a/src/test/java/no/nav/pto/veilarbfilter/config/AppConfig.java b/src/test/java/no/nav/pto/veilarbfilter/config/AppConfig.java index bb7d3c2c..999460f7 100644 --- a/src/test/java/no/nav/pto/veilarbfilter/config/AppConfig.java +++ b/src/test/java/no/nav/pto/veilarbfilter/config/AppConfig.java @@ -37,7 +37,7 @@ MineLagredeFilterController.class, VeilederGruppeController.class, UnleashService.class, - OverblikkVisningServiceImpl.class, + OverblikkVisningService.class, OverblikkVisningRepository.class, OverblikkVisningController.class}) public class AppConfig { diff --git a/src/test/java/no/nav/pto/veilarbfilter/rest/OverblikkVisningTest.java b/src/test/java/no/nav/pto/veilarbfilter/rest/OverblikkVisningTest.java index f1352a88..439f5239 100644 --- a/src/test/java/no/nav/pto/veilarbfilter/rest/OverblikkVisningTest.java +++ b/src/test/java/no/nav/pto/veilarbfilter/rest/OverblikkVisningTest.java @@ -2,10 +2,9 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; -import lombok.val; import no.nav.pto.veilarbfilter.AbstractTest; -import no.nav.pto.veilarbfilter.domene.NyOverblikkVisningModel; -import no.nav.pto.veilarbfilter.domene.OverblikkVisningModel; +import no.nav.pto.veilarbfilter.database.Table; +import no.nav.pto.veilarbfilter.domene.OverblikkVisning; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -13,14 +12,19 @@ import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; +import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MvcResult; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.setup.MockMvcBuilders; + import java.util.ArrayList; +import java.util.Collections; import java.util.List; +import static org.assertj.core.api.Assertions.assertThat; + @WebMvcTest(controllers = OverblikkVisningController.class) @ActiveProfiles({"test"}) public class OverblikkVisningTest extends AbstractTest { @@ -32,8 +36,12 @@ public class OverblikkVisningTest extends AbstractTest { private MockMvc mockMvc = MockMvcBuilders.standaloneSetup() .setControllerAdvice(RestResponseEntityExceptionHandler.class).build(); + @Autowired + private JdbcTemplate db; + @BeforeEach - public void beforeEach() { + public void resetDB() { + db.update("TRUNCATE " + Table.OverblikkVisning.TABLE_NAME); } @Test @@ -42,58 +50,86 @@ public void testInit() { } @Test - public void testLagreOgOppdaterVisning() throws Exception { - //lagre en ny visning med 2 elementer - val listeAvVisninger = new ArrayList(); - listeAvVisninger.add("CV"); - listeAvVisninger.add("Personalia"); - val lagreVisning = lagreEllerOppdaterVisninger(new NyOverblikkVisningModel(listeAvVisninger)); - Assertions.assertEquals(HttpStatus.OK.value(), lagreVisning.getStatus()); - - //hente visningen med 2 - val hentVisning = hentVisningTest(); - Assertions.assertEquals(HttpStatus.OK.value(), hentVisning.getStatus()); - Assertions.assertEquals(hentVisning.getContent().size(), 2); - - //oppdatere visningen til å ha 3 elementer - val listeAvOppdaterteVisninger = new ArrayList(listeAvVisninger); - listeAvOppdaterteVisninger.add("Registrering"); - val oppdatereVisning = lagreEllerOppdaterVisninger(new NyOverblikkVisningModel(listeAvOppdaterteVisninger)); - Assertions.assertEquals(HttpStatus.OK.value(), oppdatereVisning.getStatus()); - - //hent oppdatert visning - val hentOppdatertVisning = hentVisningTest(); - Assertions.assertEquals(HttpStatus.OK.value(), hentOppdatertVisning.getStatus()); - Assertions.assertEquals(3, hentOppdatertVisning.getContent().size()); + public void skal_returnere_overblikkvisning_naar_overblikkvisning_eksisterer() { + var overblikkVisningJson = "{\"overblikkVisning\":[\"CV\",\"Personalia\"]}"; + lagreOverblikkVisning(overblikkVisningJson); + var faktiskTilstand = hentOverblikkVisning(); + + var forventetTilstand = new ArrayList(); + forventetTilstand.add("CV"); + forventetTilstand.add("Personalia"); + assertThat(faktiskTilstand.getStatus()).isEqualTo(HttpStatus.OK.value()); + assertThat(faktiskTilstand.getContent()).containsExactlyInAnyOrderElementsOf(forventetTilstand); } @Test - public void testSlettVisning() throws Exception { - //lagre en ny visning - val listeAvVisninger = new ArrayList(); - listeAvVisninger.add("CV"); - listeAvVisninger.add("Personalia"); - val lagreVisning = lagreEllerOppdaterVisninger(new NyOverblikkVisningModel(listeAvVisninger)); - Assertions.assertEquals(HttpStatus.OK.value(), lagreVisning.getStatus()); - - //hente visningen - val hentVisning = hentVisningTest(); - Assertions.assertEquals(HttpStatus.OK.value(), hentVisning.getStatus()); - Assertions.assertEquals(hentVisning.getContent().size(), 2); - - //slett visningen - val slettVisning = slettVisningTest(); - val hentVisningEtterSletting = hentVisningTest(); - Assertions.assertEquals(HttpStatus.NO_CONTENT.value(), slettVisning.getStatus()); - Assertions.assertEquals(HttpStatus.OK.value(), hentVisningEtterSletting.getStatus()); - Assertions.assertEquals(hentVisningEtterSletting.getContent(), null); + public void skal_returnere_default_respons_naar_ingen_overblikkvisning_eksisterer() { + var hentVisningRespons = hentOverblikkVisning(); + assertThat(hentVisningRespons.getStatus()).isEqualTo(HttpStatus.OK.value()); + assertThat(hentVisningRespons.getContent()).isEqualTo(Collections.emptyList()); } + @Test + public void skal_lagre_ny_overblikkvisning() { + var overblikkVisningJson = "{\"overblikkVisning\":[\"CV\",\"Personalia\"]}"; + + var lagreVisningRespons = lagreOverblikkVisning(overblikkVisningJson); + var lagretTilstand = hentOverblikkVisning(); + + var forventetTilstand = new ArrayList(); + forventetTilstand.add("CV"); + forventetTilstand.add("Personalia"); + assertThat(lagreVisningRespons.getStatus()).isEqualTo(HttpStatus.NO_CONTENT.value()); + assertThat(lagretTilstand.getContent()).containsExactlyInAnyOrderElementsOf(forventetTilstand); + } + + @Test + public void skal_overskrive_overblikkvisning_dersom_overblikkvisning_eksisterer() { + var overblikkVisningRequest_1 = "{\"overblikkVisning\":[\"CV\",\"Personalia\"]}"; + lagreOverblikkVisning(overblikkVisningRequest_1); + + var overblikkVisningRequest_2 = "{\"overblikkVisning\":[\"CV\"]}"; + lagreOverblikkVisning(overblikkVisningRequest_2); + var faktiskTilstand = hentOverblikkVisning(); + + var forventetTilstand = new ArrayList(); + forventetTilstand.add("CV"); + assertThat(faktiskTilstand.getStatus()).isEqualTo(HttpStatus.OK.value()); + assertThat(faktiskTilstand.getContent()).containsExactlyInAnyOrderElementsOf(forventetTilstand); + } + + @Test + public void skal_returnere_tom_respons_nar_sletting_er_utfort_dersom_veileder_har_lagret_overblikkvisning() { + var overblikkVisningJson = "{\"overblikkVisning\":[\"CV\",\"Personalia\"]}"; + lagreOverblikkVisning(overblikkVisningJson); + + var slettOverblikkvisningRespons = slettVisningTest(); + var faktiskTilstand = hentOverblikkVisning(); - //Hjelpefunskjoner - private ApiResponse> hentVisningTest() { + List forventetTilstand = Collections.emptyList(); + assertThat(slettOverblikkvisningRespons.getStatus()).isEqualTo(HttpStatus.NO_CONTENT.value()); + assertThat(faktiskTilstand.getContent()).containsExactlyInAnyOrderElementsOf(forventetTilstand); + } + + @Test + public void skal_returnere_tom_respons_nar_sletting_er_utfort_dersom_veileder_ikke_har_lagret_overblikkvisning() { + var slettOverblikkvisningRespons = slettVisningTest(); + + assertThat(slettOverblikkvisningRespons.getStatus()).isEqualTo(HttpStatus.NO_CONTENT.value()); + } + + @Test + public void skal_returnere_feilmelding_dersom_input_data_er_ulovlig() { + var overblikkVisningJson = "{\"overblikkVisning\":[\"FØØ\",\"BÅR\"]}"; + + var lagreVisningRespons = lagreOverblikkVisning(overblikkVisningJson); + + assertThat(lagreVisningRespons.getStatus()).isEqualTo(HttpStatus.BAD_REQUEST.value()); + } + + private ApiResponse> hentOverblikkVisning() { try { MvcResult mvcResult = this.mockMvc.perform(MockMvcRequestBuilders.get("/api/overblikkvisning").accept(MediaType.APPLICATION_JSON).contentType(MediaType.APPLICATION_JSON)).andReturn(); @@ -110,9 +146,9 @@ private ApiResponse> hentVisningTest() { } } - private ApiResponse lagreEllerOppdaterVisninger (NyOverblikkVisningModel nyOverblikkVisningModel) throws Exception { + private ApiResponse lagreOverblikkVisning(String json) { try { - MvcResult mvcResult = this.mockMvc.perform(MockMvcRequestBuilders.post("/api/overblikkvisning").content(objectMapper.writeValueAsString(nyOverblikkVisningModel)).accept(MediaType.APPLICATION_JSON).contentType(MediaType.APPLICATION_JSON)).andReturn(); + MvcResult mvcResult = this.mockMvc.perform(MockMvcRequestBuilders.post("/api/overblikkvisning").content(json).accept(MediaType.APPLICATION_JSON).contentType(MediaType.APPLICATION_JSON)).andReturn(); if (mvcResult.getResponse().getStatus() == HttpStatus.OK.value()) { return new ApiResponse<>(mvcResult.getResponse().getStatus(), null, ""); @@ -120,13 +156,13 @@ private ApiResponse lagreEllerOppdaterVisninger (NyOverbl return new ApiResponse<>(mvcResult.getResponse().getStatus(), null, mvcResult.getResponse().getContentAsString()); } - } catch (Exception e){ + } catch (Exception e) { Assertions.fail(); return null; } } - private ApiResponse slettVisningTest() throws Exception { + private ApiResponse slettVisningTest() { try { MvcResult mvcResult = this.mockMvc.perform(MockMvcRequestBuilders.delete("/api/overblikkvisning").accept(MediaType.APPLICATION_JSON).contentType(MediaType.APPLICATION_JSON)).andReturn(); @@ -141,6 +177,4 @@ private ApiResponse slettVisningTest() throws Exception { return null; } } - - } From 171bbeb5063108b9ba93974e3104308c9dfe1720 Mon Sep 17 00:00:00 2001 From: Sondre Larsen Ovrid Date: Tue, 8 Aug 2023 13:04:24 +0200 Subject: [PATCH 10/16] Fjern logglinje som ble brukt til testing --- .../veilarbfilter/repository/MineLagredeFilterRepository.java | 1 - .../nav/pto/veilarbfilter/rest/OverblikkVisningController.java | 1 - 2 files changed, 2 deletions(-) diff --git a/src/main/java/no/nav/pto/veilarbfilter/repository/MineLagredeFilterRepository.java b/src/main/java/no/nav/pto/veilarbfilter/repository/MineLagredeFilterRepository.java index 31a4a8a6..7bebed1a 100644 --- a/src/main/java/no/nav/pto/veilarbfilter/repository/MineLagredeFilterRepository.java +++ b/src/main/java/no/nav/pto/veilarbfilter/repository/MineLagredeFilterRepository.java @@ -40,7 +40,6 @@ public Optional lagreFilter(String veilederId, NyttFilterModel nytt String insertSql = String.format("INSERT INTO %s (%s, %s, %s) VALUES (?, to_json(?::JSON), ?)", Filter.TABLE_NAME, Filter.FILTER_NAVN, Filter.VALGTE_FILTER, Filter.OPPRETTET); int affectedRows = db.update(insertSql, nyttFilterModel.getFilterNavn(), objectMapper.writeValueAsString(nyttFilterModel.getFilterValg()), fromLocalDateTimeToTimestamp(LocalDateTime.now())); - log.info("Det gikk å lagre i filter!! {}", affectedRows); if (affectedRows > 0) { String lastId = String.format("SELECT MAX(%s) FROM %s", diff --git a/src/main/java/no/nav/pto/veilarbfilter/rest/OverblikkVisningController.java b/src/main/java/no/nav/pto/veilarbfilter/rest/OverblikkVisningController.java index cc013798..6ff91f7e 100644 --- a/src/main/java/no/nav/pto/veilarbfilter/rest/OverblikkVisningController.java +++ b/src/main/java/no/nav/pto/veilarbfilter/rest/OverblikkVisningController.java @@ -31,7 +31,6 @@ public class OverblikkVisningController { public ResponseEntity lagreOverblikkvisningForInnloggetVeileder(@RequestBody OverblikkVisningRequest overblikkVisningRequest) { VeilederId veilederId = AuthUtils.getInnloggetVeilederIdent(); - try { validerRequest(overblikkVisningRequest); overblikkVisningService.lagreOverblikkVisning(veilederId, overblikkVisningRequest.overblikkVisning()); From edffb4b87aca9962a6b278c22ea8d45d9bc2169a Mon Sep 17 00:00:00 2001 From: Sondre Larsen Ovrid Date: Tue, 8 Aug 2023 13:30:34 +0200 Subject: [PATCH 11/16] =?UTF-8?q?Wrap=20logg-melding=20i=20String.format?= =?UTF-8?q?=20slik=20at=20exception=20ogs=C3=A5=20logges?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../veilarbfilter/rest/OverblikkVisningController.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/no/nav/pto/veilarbfilter/rest/OverblikkVisningController.java b/src/main/java/no/nav/pto/veilarbfilter/rest/OverblikkVisningController.java index 6ff91f7e..ff0514e7 100644 --- a/src/main/java/no/nav/pto/veilarbfilter/rest/OverblikkVisningController.java +++ b/src/main/java/no/nav/pto/veilarbfilter/rest/OverblikkVisningController.java @@ -36,10 +36,10 @@ public ResponseEntity lagreOverblikkvisningForInnloggetVeileder(@Request overblikkVisningService.lagreOverblikkVisning(veilederId, overblikkVisningRequest.overblikkVisning()); return ResponseEntity.noContent().build(); } catch (IllegalArgumentException e) { - secureLog.error("Klarte ikke å lagre overblikk visning for veilederId: {}. Grunn: ulovlige verdier i request.", veilederId, e); + secureLog.error(String.format("Klarte ikke å lagre overblikk visning for veilederId: %s. Grunn: ulovlige verdier i request.", veilederId), e); return ResponseEntity.badRequest().build(); } catch (Exception e) { - secureLog.error("Klarte ikke å lagre overblikk visning for veilederId: {}", veilederId, e); + secureLog.error(String.format("Klarte ikke å lagre overblikk visning for veilederId: %s.", veilederId), e); return ResponseEntity.internalServerError().build(); } } @@ -54,7 +54,7 @@ public ResponseEntity> hentOverblikkvisningForInnloggetVeileder() { .map(overblikkVisning -> ResponseEntity.ok().body(overblikkVisning.visning())) .orElseGet(() -> ResponseEntity.ok().body(Collections.emptyList())); } catch (Exception e) { - secureLog.error("Klarte ikke å hente overblikk visning for veilederId: {}", veilederId, e); + secureLog.error(String.format("Klarte ikke å hente overblikk visning for veilederId: %s", veilederId), e); return ResponseEntity.internalServerError().build(); } } @@ -67,7 +67,7 @@ public ResponseEntity slettOverblikkvisningForInnloggetVeileder() { overblikkVisningService.slettOverblikkVisning(veilederId); return ResponseEntity.noContent().build(); } catch (Exception e) { - secureLog.error("Klarte ikke å slette overblikk visning for veilederId: {}", veilederId, e); + secureLog.error(String.format("Klarte ikke å slette overblikk visning for veilederId: %s", veilederId), e); return ResponseEntity.internalServerError().build(); } } From b98e1a337cf557aa49597315771d80815ae65d08 Mon Sep 17 00:00:00 2001 From: Sondre Larsen Ovrid Date: Tue, 8 Aug 2023 14:23:09 +0200 Subject: [PATCH 12/16] Refaktorer: skill ut opprett og oppdater som separate metoder --- .../domene/OverblikkVisning.java | 2 +- .../OverblikkVisningRepository.java | 49 ++++++++++++------- .../service/OverblikkVisningService.java | 7 ++- 3 files changed, 38 insertions(+), 20 deletions(-) diff --git a/src/main/java/no/nav/pto/veilarbfilter/domene/OverblikkVisning.java b/src/main/java/no/nav/pto/veilarbfilter/domene/OverblikkVisning.java index 21529ae2..e5883802 100644 --- a/src/main/java/no/nav/pto/veilarbfilter/domene/OverblikkVisning.java +++ b/src/main/java/no/nav/pto/veilarbfilter/domene/OverblikkVisning.java @@ -4,7 +4,7 @@ import java.util.UUID; public record OverblikkVisning( - UUID overblikkVisningId, + UUID id, List visning ) { } diff --git a/src/main/java/no/nav/pto/veilarbfilter/repository/OverblikkVisningRepository.java b/src/main/java/no/nav/pto/veilarbfilter/repository/OverblikkVisningRepository.java index c53357b0..66380d56 100644 --- a/src/main/java/no/nav/pto/veilarbfilter/repository/OverblikkVisningRepository.java +++ b/src/main/java/no/nav/pto/veilarbfilter/repository/OverblikkVisningRepository.java @@ -2,7 +2,6 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import no.nav.pto.veilarbfilter.database.Table; import no.nav.pto.veilarbfilter.domene.OverblikkVisning; import no.nav.pto.veilarbfilter.domene.value.VeilederId; import org.springframework.dao.EmptyResultDataAccessException; @@ -13,6 +12,7 @@ import java.time.LocalDateTime; import java.util.*; +import static no.nav.pto.veilarbfilter.database.Table.OverblikkVisning.*; import static no.nav.pto.veilarbfilter.util.DateUtils.fromLocalDateTimeToTimestamp; import static no.nav.pto.veilarbfilter.util.PostgresqlUtils.mapTilPostgresqlArray; @@ -24,15 +24,15 @@ public class OverblikkVisningRepository { public Optional hent(VeilederId veilederId) { MapSqlParameterSource paramSource = new MapSqlParameterSource().addValue("veilederid", veilederId.getValue()); - String sql = String.format("SELECT * FROM %s where %s = :veilederid", Table.OverblikkVisning.TABLE_NAME, Table.OverblikkVisning.VEILEDER_ID); + String sql = String.format("SELECT * FROM %s where %s = :veilederid", TABLE_NAME, VEILEDER_ID); try { OverblikkVisning overblikkVisning = db.queryForObject( sql, paramSource, (rs, rowNum) -> new OverblikkVisning( - (UUID) rs.getObject(Table.OverblikkVisning.OVERBLIKK_VISNING_ID), - Arrays.asList((String[]) rs.getArray(Table.OverblikkVisning.VISNING).getArray()) + (UUID) rs.getObject(OVERBLIKK_VISNING_ID), + Arrays.asList((String[]) rs.getArray(VISNING).getArray()) ) ); return Optional.ofNullable(overblikkVisning); @@ -41,27 +41,40 @@ public Optional hent(VeilederId veilederId) { } } - public void lagre(VeilederId veilederId, List overblikkVisning) { - Optional maybeOverblikkvisning = hent(veilederId); + public void oppdater(UUID overblikkVisningId, List overblikkVisning) { MapSqlParameterSource paramSource = new MapSqlParameterSource().addValues(Map.ofEntries( - Map.entry("overblikkvisningid", maybeOverblikkvisning.isPresent() ? maybeOverblikkvisning.get().overblikkVisningId() : UUID.randomUUID()), + Map.entry("overblikkvisningid", overblikkVisningId), + Map.entry("visning", mapTilPostgresqlArray(overblikkVisning)), + Map.entry("sistendret", fromLocalDateTimeToTimestamp(LocalDateTime.now())) + )); + String query = String.format(""" + UPDATE %s SET %s = :visning::varchar[], %s = :sistendret + WHERE %s = :overblikkvisningid + """, + TABLE_NAME, + VISNING, + SIST_ENDRET, + OVERBLIKK_VISNING_ID + ); + + db.update(query, paramSource); + } + + public void opprett(VeilederId veilederId, List overblikkVisning) { + MapSqlParameterSource paramSource = new MapSqlParameterSource().addValues(Map.ofEntries( + Map.entry("overblikkvisningid", UUID.randomUUID()), Map.entry("veilederid", veilederId.getValue()), Map.entry("visning", mapTilPostgresqlArray(overblikkVisning)), Map.entry("sistendret", fromLocalDateTimeToTimestamp(LocalDateTime.now())) )); String query = String.format(""" INSERT INTO %s (%s, %s, %s, %s) VALUES (:overblikkvisningid, :veilederid, :visning::varchar[], :sistendret) - ON CONFLICT (%s) - DO UPDATE SET(%s, %s) = (:visning::varchar[], :sistendret) """, - Table.OverblikkVisning.TABLE_NAME, - Table.OverblikkVisning.OVERBLIKK_VISNING_ID, - Table.OverblikkVisning.VEILEDER_ID, - Table.OverblikkVisning.VISNING, - Table.OverblikkVisning.SIST_ENDRET, - Table.OverblikkVisning.OVERBLIKK_VISNING_ID, - Table.OverblikkVisning.VISNING, - Table.OverblikkVisning.SIST_ENDRET + TABLE_NAME, + OVERBLIKK_VISNING_ID, + VEILEDER_ID, + VISNING, + SIST_ENDRET ); db.update(query, paramSource); @@ -69,7 +82,7 @@ DO UPDATE SET(%s, %s) = (:visning::varchar[], :sistendret) public void slett(VeilederId veilederId) { MapSqlParameterSource paramSource = new MapSqlParameterSource().addValue("veilederid", veilederId.getValue()); - String query = String.format("DELETE FROM %s WHERE %s = :veilederid", Table.OverblikkVisning.TABLE_NAME, Table.OverblikkVisning.VEILEDER_ID); + String query = String.format("DELETE FROM %s WHERE %s = :veilederid", TABLE_NAME, VEILEDER_ID); db.update(query, paramSource); } diff --git a/src/main/java/no/nav/pto/veilarbfilter/service/OverblikkVisningService.java b/src/main/java/no/nav/pto/veilarbfilter/service/OverblikkVisningService.java index a6e9c8a2..2dc38808 100644 --- a/src/main/java/no/nav/pto/veilarbfilter/service/OverblikkVisningService.java +++ b/src/main/java/no/nav/pto/veilarbfilter/service/OverblikkVisningService.java @@ -22,7 +22,12 @@ public Optional hentOverblikkVisning(VeilederId veilederId) { } public void lagreOverblikkVisning(VeilederId veilederId, List overblikkVisning) { - overblikkVisningRepository.lagre(veilederId, overblikkVisning); + Optional maybeEksisterendeOverblikkVisning = overblikkVisningRepository.hent(veilederId); + + maybeEksisterendeOverblikkVisning.ifPresentOrElse( + (eksisterendeOverblikkVisning) -> overblikkVisningRepository.oppdater(eksisterendeOverblikkVisning.id(), overblikkVisning), + () -> overblikkVisningRepository.opprett(veilederId, overblikkVisning) + ); } public void slettOverblikkVisning(VeilederId veilederId) { From a6edf2dcec65770deabec68dc979bdae3a01b512 Mon Sep 17 00:00:00 2001 From: Sondre Larsen Ovrid Date: Thu, 10 Aug 2023 08:31:38 +0200 Subject: [PATCH 13/16] Wrap respons i eget respons-objekt --- .../domene/OverblikkVisningResponse.java | 8 ++++++++ .../rest/OverblikkVisningController.java | 8 ++++---- .../rest/OverblikkVisningTest.java | 17 +++++++++-------- 3 files changed, 21 insertions(+), 12 deletions(-) create mode 100644 src/main/java/no/nav/pto/veilarbfilter/domene/OverblikkVisningResponse.java diff --git a/src/main/java/no/nav/pto/veilarbfilter/domene/OverblikkVisningResponse.java b/src/main/java/no/nav/pto/veilarbfilter/domene/OverblikkVisningResponse.java new file mode 100644 index 00000000..d96e1de0 --- /dev/null +++ b/src/main/java/no/nav/pto/veilarbfilter/domene/OverblikkVisningResponse.java @@ -0,0 +1,8 @@ +package no.nav.pto.veilarbfilter.domene; + +import java.util.List; + +public record OverblikkVisningResponse( + List overblikkVisning +) { +} diff --git a/src/main/java/no/nav/pto/veilarbfilter/rest/OverblikkVisningController.java b/src/main/java/no/nav/pto/veilarbfilter/rest/OverblikkVisningController.java index ff0514e7..29bbf046 100644 --- a/src/main/java/no/nav/pto/veilarbfilter/rest/OverblikkVisningController.java +++ b/src/main/java/no/nav/pto/veilarbfilter/rest/OverblikkVisningController.java @@ -6,6 +6,7 @@ import no.nav.pto.veilarbfilter.domene.OverblikkVisning; import no.nav.pto.veilarbfilter.domene.OverblikkVisningAlternativer; import no.nav.pto.veilarbfilter.domene.OverblikkVisningRequest; +import no.nav.pto.veilarbfilter.domene.OverblikkVisningResponse; import no.nav.pto.veilarbfilter.domene.value.VeilederId; import no.nav.pto.veilarbfilter.service.OverblikkVisningService; import org.springframework.http.ResponseEntity; @@ -13,7 +14,6 @@ import java.util.Arrays; import java.util.Collections; -import java.util.List; import java.util.Optional; import static no.nav.pto.veilarbfilter.util.SecureLogUtils.secureLog; @@ -45,14 +45,14 @@ public ResponseEntity lagreOverblikkvisningForInnloggetVeileder(@Request } @GetMapping - public ResponseEntity> hentOverblikkvisningForInnloggetVeileder() { + public ResponseEntity hentOverblikkvisningForInnloggetVeileder() { VeilederId veilederId = AuthUtils.getInnloggetVeilederIdent(); try { Optional visningsListe = overblikkVisningService.hentOverblikkVisning(veilederId); return visningsListe - .map(overblikkVisning -> ResponseEntity.ok().body(overblikkVisning.visning())) - .orElseGet(() -> ResponseEntity.ok().body(Collections.emptyList())); + .map(overblikkVisning -> ResponseEntity.ok().body(new OverblikkVisningResponse(overblikkVisning.visning()))) + .orElseGet(() -> ResponseEntity.ok().body(new OverblikkVisningResponse(Collections.emptyList()))); } catch (Exception e) { secureLog.error(String.format("Klarte ikke å hente overblikk visning for veilederId: %s", veilederId), e); return ResponseEntity.internalServerError().build(); diff --git a/src/test/java/no/nav/pto/veilarbfilter/rest/OverblikkVisningTest.java b/src/test/java/no/nav/pto/veilarbfilter/rest/OverblikkVisningTest.java index 439f5239..2ce97513 100644 --- a/src/test/java/no/nav/pto/veilarbfilter/rest/OverblikkVisningTest.java +++ b/src/test/java/no/nav/pto/veilarbfilter/rest/OverblikkVisningTest.java @@ -5,6 +5,7 @@ import no.nav.pto.veilarbfilter.AbstractTest; import no.nav.pto.veilarbfilter.database.Table; import no.nav.pto.veilarbfilter.domene.OverblikkVisning; +import no.nav.pto.veilarbfilter.domene.OverblikkVisningResponse; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -60,7 +61,7 @@ public void skal_returnere_overblikkvisning_naar_overblikkvisning_eksisterer() { forventetTilstand.add("CV"); forventetTilstand.add("Personalia"); assertThat(faktiskTilstand.getStatus()).isEqualTo(HttpStatus.OK.value()); - assertThat(faktiskTilstand.getContent()).containsExactlyInAnyOrderElementsOf(forventetTilstand); + assertThat(faktiskTilstand.getContent().overblikkVisning()).containsExactlyInAnyOrderElementsOf(forventetTilstand); } @Test @@ -68,7 +69,7 @@ public void skal_returnere_default_respons_naar_ingen_overblikkvisning_eksistere var hentVisningRespons = hentOverblikkVisning(); assertThat(hentVisningRespons.getStatus()).isEqualTo(HttpStatus.OK.value()); - assertThat(hentVisningRespons.getContent()).isEqualTo(Collections.emptyList()); + assertThat(hentVisningRespons.getContent().overblikkVisning()).isEqualTo(Collections.emptyList()); } @Test @@ -82,7 +83,7 @@ public void skal_lagre_ny_overblikkvisning() { forventetTilstand.add("CV"); forventetTilstand.add("Personalia"); assertThat(lagreVisningRespons.getStatus()).isEqualTo(HttpStatus.NO_CONTENT.value()); - assertThat(lagretTilstand.getContent()).containsExactlyInAnyOrderElementsOf(forventetTilstand); + assertThat(lagretTilstand.getContent().overblikkVisning()).containsExactlyInAnyOrderElementsOf(forventetTilstand); } @Test @@ -97,7 +98,7 @@ public void skal_overskrive_overblikkvisning_dersom_overblikkvisning_eksisterer( var forventetTilstand = new ArrayList(); forventetTilstand.add("CV"); assertThat(faktiskTilstand.getStatus()).isEqualTo(HttpStatus.OK.value()); - assertThat(faktiskTilstand.getContent()).containsExactlyInAnyOrderElementsOf(forventetTilstand); + assertThat(faktiskTilstand.getContent().overblikkVisning()).containsExactlyInAnyOrderElementsOf(forventetTilstand); } @Test @@ -110,7 +111,7 @@ public void skal_returnere_tom_respons_nar_sletting_er_utfort_dersom_veileder_ha List forventetTilstand = Collections.emptyList(); assertThat(slettOverblikkvisningRespons.getStatus()).isEqualTo(HttpStatus.NO_CONTENT.value()); - assertThat(faktiskTilstand.getContent()).containsExactlyInAnyOrderElementsOf(forventetTilstand); + assertThat(faktiskTilstand.getContent().overblikkVisning()).containsExactlyInAnyOrderElementsOf(forventetTilstand); } @Test @@ -129,7 +130,7 @@ public void skal_returnere_feilmelding_dersom_input_data_er_ulovlig() { assertThat(lagreVisningRespons.getStatus()).isEqualTo(HttpStatus.BAD_REQUEST.value()); } - private ApiResponse> hentOverblikkVisning() { + private ApiResponse hentOverblikkVisning() { try { MvcResult mvcResult = this.mockMvc.perform(MockMvcRequestBuilders.get("/api/overblikkvisning").accept(MediaType.APPLICATION_JSON).contentType(MediaType.APPLICATION_JSON)).andReturn(); @@ -146,7 +147,7 @@ private ApiResponse> hentOverblikkVisning() { } } - private ApiResponse lagreOverblikkVisning(String json) { + private ApiResponse lagreOverblikkVisning(String json) { try { MvcResult mvcResult = this.mockMvc.perform(MockMvcRequestBuilders.post("/api/overblikkvisning").content(json).accept(MediaType.APPLICATION_JSON).contentType(MediaType.APPLICATION_JSON)).andReturn(); @@ -162,7 +163,7 @@ private ApiResponse lagreOverblikkVisning(String json) { } } - private ApiResponse slettVisningTest() { + private ApiResponse slettVisningTest() { try { MvcResult mvcResult = this.mockMvc.perform(MockMvcRequestBuilders.delete("/api/overblikkvisning").accept(MediaType.APPLICATION_JSON).contentType(MediaType.APPLICATION_JSON)).andReturn(); From 0b90a0fb2fdacfd8c8f3e303fc4e9f48ab2e1af3 Mon Sep 17 00:00:00 2001 From: Sondre Larsen Ovrid Date: Mon, 14 Aug 2023 12:51:21 +0200 Subject: [PATCH 14/16] PR tilbakemeldinger: Forbedre lesbarhet --- .../repository/OverblikkVisningRepository.java | 10 +++++----- .../veilarbfilter/rest/OverblikkVisningController.java | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/no/nav/pto/veilarbfilter/repository/OverblikkVisningRepository.java b/src/main/java/no/nav/pto/veilarbfilter/repository/OverblikkVisningRepository.java index 66380d56..ba236056 100644 --- a/src/main/java/no/nav/pto/veilarbfilter/repository/OverblikkVisningRepository.java +++ b/src/main/java/no/nav/pto/veilarbfilter/repository/OverblikkVisningRepository.java @@ -42,11 +42,11 @@ public Optional hent(VeilederId veilederId) { } public void oppdater(UUID overblikkVisningId, List overblikkVisning) { - MapSqlParameterSource paramSource = new MapSqlParameterSource().addValues(Map.ofEntries( - Map.entry("overblikkvisningid", overblikkVisningId), - Map.entry("visning", mapTilPostgresqlArray(overblikkVisning)), - Map.entry("sistendret", fromLocalDateTimeToTimestamp(LocalDateTime.now())) - )); + MapSqlParameterSource paramSource = new MapSqlParameterSource() + .addValue("overblikkvisningid", overblikkVisningId) + .addValue("visning", mapTilPostgresqlArray(overblikkVisning)) + .addValue("sistendret", fromLocalDateTimeToTimestamp(LocalDateTime.now())); + String query = String.format(""" UPDATE %s SET %s = :visning::varchar[], %s = :sistendret WHERE %s = :overblikkvisningid diff --git a/src/main/java/no/nav/pto/veilarbfilter/rest/OverblikkVisningController.java b/src/main/java/no/nav/pto/veilarbfilter/rest/OverblikkVisningController.java index 29bbf046..e89967bd 100644 --- a/src/main/java/no/nav/pto/veilarbfilter/rest/OverblikkVisningController.java +++ b/src/main/java/no/nav/pto/veilarbfilter/rest/OverblikkVisningController.java @@ -76,11 +76,11 @@ private void validerRequest(OverblikkVisningRequest overblikkVisningRequest) { boolean alleValgteAlternativerErLovlige = overblikkVisningRequest.overblikkVisning().stream() .map(String::toUpperCase) - .allMatch(valgtAlternativ -> { - return Arrays.stream(OverblikkVisningAlternativer.values()) - .map(Enum::name) - .anyMatch(lovligAlternativ -> lovligAlternativ.equals(valgtAlternativ)); - }); + .allMatch(valgtAlternativ -> + Arrays.stream(OverblikkVisningAlternativer.values()) + .map(Enum::name) + .anyMatch(lovligAlternativ -> lovligAlternativ.equals(valgtAlternativ)) + ); if (!alleValgteAlternativerErLovlige) { throw new IllegalArgumentException(); From 2f15dc13db243a687ac5aed080606c2ada4c410e Mon Sep 17 00:00:00 2001 From: Sondre Ovrid <111113539+slovrid@users.noreply.github.com> Date: Mon, 14 Aug 2023 12:56:23 +0200 Subject: [PATCH 15/16] Bruke Spring-annotasjon som korresponderer til klassen Co-authored-by: Dragutin Vujovic <66312566+dragutin-nav@users.noreply.github.com> --- .../veilarbfilter/repository/OverblikkVisningRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/no/nav/pto/veilarbfilter/repository/OverblikkVisningRepository.java b/src/main/java/no/nav/pto/veilarbfilter/repository/OverblikkVisningRepository.java index ba236056..a6261787 100644 --- a/src/main/java/no/nav/pto/veilarbfilter/repository/OverblikkVisningRepository.java +++ b/src/main/java/no/nav/pto/veilarbfilter/repository/OverblikkVisningRepository.java @@ -16,7 +16,7 @@ import static no.nav.pto.veilarbfilter.util.DateUtils.fromLocalDateTimeToTimestamp; import static no.nav.pto.veilarbfilter.util.PostgresqlUtils.mapTilPostgresqlArray; -@Service +@Repository @Slf4j @RequiredArgsConstructor public class OverblikkVisningRepository { From 49a00b299718d7dc61c97063a79734bfc57dbb9d Mon Sep 17 00:00:00 2001 From: Sondre Larsen Ovrid Date: Mon, 14 Aug 2023 13:01:37 +0200 Subject: [PATCH 16/16] Legg til manglende import --- .../veilarbfilter/repository/OverblikkVisningRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/no/nav/pto/veilarbfilter/repository/OverblikkVisningRepository.java b/src/main/java/no/nav/pto/veilarbfilter/repository/OverblikkVisningRepository.java index a6261787..a023aa98 100644 --- a/src/main/java/no/nav/pto/veilarbfilter/repository/OverblikkVisningRepository.java +++ b/src/main/java/no/nav/pto/veilarbfilter/repository/OverblikkVisningRepository.java @@ -7,7 +7,7 @@ import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Repository; import java.time.LocalDateTime; import java.util.*;