Skip to content

Commit

Permalink
feat: bruker PathParam for task status og id for enklere input i swag…
Browse files Browse the repository at this point in the history
…ger-ui. (#744)

* feat: bruker PathParam for task status og id for enklere input i swagger-ui.

* refactor: bruker exhaustiv switch for mapping.
  • Loading branch information
mrsladek authored Dec 9, 2024
1 parent c4c11bc commit 443fe4a
Show file tree
Hide file tree
Showing 9 changed files with 107 additions and 71 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,14 @@
import java.net.HttpURLConnection;
import java.util.List;

import jakarta.enterprise.context.RequestScoped;
import jakarta.inject.Inject;
import jakarta.transaction.Transactional;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import jakarta.ws.rs.Consumes;
import jakarta.ws.rs.POST;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.BeanParam;

import jakarta.ws.rs.PathParam;

import no.nav.vedtak.felles.prosesstask.rest.dto.IkkeFerdigProsessTaskStatusEnum;

import no.nav.vedtak.felles.prosesstask.rest.dto.ProsessTaskStatusDto;
import no.nav.vedtak.felles.prosesstask.rest.dto.StatusFilterDto;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand All @@ -25,6 +22,17 @@
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.enterprise.context.RequestScoped;
import jakarta.inject.Inject;
import jakarta.transaction.Transactional;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import jakarta.ws.rs.Consumes;
import jakarta.ws.rs.POST;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
import no.nav.vedtak.felles.prosesstask.api.ProsessTaskStatus;
import no.nav.vedtak.felles.prosesstask.rest.app.ProsessTaskApplikasjonTjeneste;
import no.nav.vedtak.felles.prosesstask.rest.dto.FeiletProsessTaskDataDto;
Expand All @@ -36,7 +44,6 @@
import no.nav.vedtak.felles.prosesstask.rest.dto.ProsessTaskRetryAllResultatDto;
import no.nav.vedtak.felles.prosesstask.rest.dto.ProsessTaskSetFerdigInputDto;
import no.nav.vedtak.felles.prosesstask.rest.dto.SokeFilterDto;
import no.nav.vedtak.felles.prosesstask.rest.dto.StatusFilterDto;
import no.nav.vedtak.sikkerhet.abac.BeskyttetRessurs;
import no.nav.vedtak.sikkerhet.abac.TilpassetAbacAttributt;
import no.nav.vedtak.sikkerhet.abac.beskyttet.ActionType;
Expand Down Expand Up @@ -66,8 +73,8 @@ public ProsessTaskRestTjeneste(ProsessTaskApplikasjonTjeneste prosessTaskApplika
@Path("/create")
@Consumes(MediaType.APPLICATION_JSON)
@Operation(description = "Oppretter en prosess task i henhold til request", summary = "Oppretter en ny task klar for kjøring.", tags = "prosesstask", responses = {
@ApiResponse(responseCode = "202", description = "Prosesstaskens oppdatert informasjon", content = @Content(mediaType = "application/json", schema = @Schema(implementation = ProsessTaskDataDto.class))),
@ApiResponse(responseCode = "500", description = "Feilet pga ukjent feil eller tekniske/funksjonelle feil")
@ApiResponse(responseCode = "202", description = "Prosesstaskens oppdatert informasjon", content = @Content(mediaType = "application/json", schema = @Schema(implementation = ProsessTaskDataDto.class))),
@ApiResponse(responseCode = "500", description = "Feilet pga ukjent feil eller tekniske/funksjonelle feil")
})
@BeskyttetRessurs(actionType = ActionType.CREATE, property = ABAC_DRIFT_ATTRIBUTT)
public ProsessTaskDataDto createProsessTask(@Parameter(description = "Informasjon for restart en eksisterende prosesstask") @TilpassetAbacAttributt(supplierClass = AbacEmptySupplier.class) @Valid ProsessTaskOpprettInputDto inputDto) {
Expand All @@ -77,16 +84,15 @@ public ProsessTaskDataDto createProsessTask(@Parameter(description = "Informasjo
}

@POST
@Path("/launch")
@Path("/launch/{prosessTaskId}/{prosessTaskStatus}")
@Consumes(MediaType.APPLICATION_JSON)
@Operation(description = "Restarter en eksisterende prosesstask.", summary = "En allerede FERDIG prosesstask kan ikke restartes. En prosesstask har normalt et gitt antall forsøk den kan kjøres automatisk. "
+
"Dette endepunktet vil tvinge tasken til å trigge uavhengig av maks antall forsøk", tags = "prosesstask", responses = {
@ApiResponse(responseCode = "200", description = "Prosesstaskens oppdatert informasjon", content = @Content(mediaType = "application/json", schema = @Schema(implementation = ProsessTaskRestartResultatDto.class))),
@ApiResponse(responseCode = "500", description = "Feilet pga ukjent feil eller tekniske/funksjonelle feil")
@Operation(description = "Restarter en eksisterende prosesstask.", summary =
"En allerede FERDIG prosesstask kan ikke restartes. Dette endepunktet vil tvinge tasken til å trigge uavhengig av maks antall forsøk", tags = "prosesstask", responses = {
@ApiResponse(responseCode = "200", description = "Prosesstaskens oppdatert informasjon", content = @Content(mediaType = "application/json", schema = @Schema(implementation = ProsessTaskRestartResultatDto.class))),
@ApiResponse(responseCode = "500", description = "Feilet pga ukjent feil eller tekniske/funksjonelle feil")
})
@BeskyttetRessurs(actionType = ActionType.CREATE, property = ABAC_DRIFT_ATTRIBUTT, sporingslogg = false)
public ProsessTaskRestartResultatDto restartProsessTask(@Parameter(description = "Informasjon for restart en eksisterende prosesstask") @TilpassetAbacAttributt(supplierClass = AbacEmptySupplier.class) @Valid ProsessTaskRestartInputDto restartInputDto) {
public ProsessTaskRestartResultatDto restartProsessTask(@Parameter(description = "Informasjon for restart en eksisterende prosesstask") @TilpassetAbacAttributt(supplierClass = AbacEmptySupplier.class) @Valid @BeanParam ProsessTaskRestartInputDto restartInputDto) {
// kjøres manuelt for å avhjelpe feilsituasjon, da er det veldig greit at det blir logget!
LOG.info("Restarter prossess task {}", restartInputDto.getProsessTaskId());
return prosessTaskApplikasjonTjeneste.flaggProsessTaskForRestart(restartInputDto);
Expand All @@ -96,8 +102,8 @@ public ProsessTaskRestartResultatDto restartProsessTask(@Parameter(description =
@Path("/retryall")
@Consumes(MediaType.APPLICATION_JSON)
@Operation(description = "Restarter alle prosesstask med status FEILET.", summary = "Dette endepunktet vil tvinge feilede tasks til å trigge ett forsøk uavhengig av maks antall forsøk", tags = "prosesstask", responses = {
@ApiResponse(responseCode = "200", description = "Response med liste av prosesstasks som restartes", content = @Content(mediaType = "application/json", schema = @Schema(implementation = ProsessTaskRetryAllResultatDto.class))),
@ApiResponse(responseCode = "500", description = "Feilet pga ukjent feil eller tekniske/funksjonelle feil")
@ApiResponse(responseCode = "200", description = "Response med liste av prosesstasks som restartes", content = @Content(mediaType = "application/json", schema = @Schema(implementation = ProsessTaskRetryAllResultatDto.class))),
@ApiResponse(responseCode = "500", description = "Feilet pga ukjent feil eller tekniske/funksjonelle feil")
})
@BeskyttetRessurs(actionType = ActionType.CREATE, property = ABAC_DRIFT_ATTRIBUTT, sporingslogg = false)
public ProsessTaskRetryAllResultatDto retryAllProsessTask() {
Expand All @@ -107,37 +113,40 @@ public ProsessTaskRetryAllResultatDto retryAllProsessTask() {
}

@POST
@Path("/list")
@Path("/list/{prosessTaskStatus}")
@Consumes(MediaType.APPLICATION_JSON)
@Operation(description = "Lister prosesstasker med angitt status.", tags = "prosesstask", responses = {
@ApiResponse(responseCode = "200", description = "Liste over prosesstasker, eller tom liste når angitt/default søkefilter ikke finner noen prosesstasker", content = @Content(mediaType = "application/json", schema = @Schema(implementation = ProsessTaskDataDto.class)))
@ApiResponse(responseCode = "200", description = "Liste over prosesstasker, eller tom liste når angitt/default søkefilter ikke finner noen prosesstasker", content = @Content(mediaType = "application/json", schema = @Schema(implementation = ProsessTaskDataDto.class)))
})
@BeskyttetRessurs(actionType = ActionType.READ, property = ABAC_DRIFT_ATTRIBUTT)
public List<ProsessTaskDataDto> finnProsessTasks(@Parameter(description = "Liste av statuser som skal hentes.") @TilpassetAbacAttributt(supplierClass = AbacEmptySupplier.class) @Valid StatusFilterDto statusFilterDto) {
public List<ProsessTaskDataDto> finnProsessTasks(@Parameter(description = "Liste av statuser som skal hentes.") @TilpassetAbacAttributt(supplierClass = AbacEmptySupplier.class) @Valid @PathParam("prosessTaskStatus")
IkkeFerdigProsessTaskStatusEnum finnTaskStatus) {
var statusFilterDto = new StatusFilterDto();
statusFilterDto.setProsessTaskStatuser(List.of(new ProsessTaskStatusDto(finnTaskStatus.name())));
return prosessTaskApplikasjonTjeneste.finnAlle(statusFilterDto);
}

@POST
@Path("/search")
@Consumes(MediaType.APPLICATION_JSON)
@Operation(description = "Søker etter prosesstask med angitt tekst i properties.", tags = "prosesstask", responses = {
@ApiResponse(responseCode = "200", description = "Liste over prosesstasker, eller tom liste når angitt/default søkefilter ikke finner noen prosesstasker", content = @Content(mediaType = "application/json", schema = @Schema(implementation = ProsessTaskDataDto.class)))
@ApiResponse(responseCode = "200", description = "Liste over prosesstasker, eller tom liste når angitt/default søkefilter ikke finner noen prosesstasker", content = @Content(mediaType = "application/json", schema = @Schema(implementation = ProsessTaskDataDto.class)))
})
@BeskyttetRessurs(actionType = ActionType.READ, property = ABAC_DRIFT_ATTRIBUTT)
public List<ProsessTaskDataDto> searchProsessTasks(@Parameter(description = "Søkefilter for å begrense resultatet av returnerte prosesstask.") @TilpassetAbacAttributt(supplierClass = AbacEmptySupplier.class) @Valid SokeFilterDto sokeFilterDto) {
return prosessTaskApplikasjonTjeneste.søk(sokeFilterDto);
}

@POST
@Path("/feil")
@Path("/feil/{prosessTaskId}")
@Consumes(MediaType.APPLICATION_JSON)
@Operation(description = "Henter informasjon om feilet prosesstask med angitt prosesstask-id", tags = "prosesstask", responses = {
@ApiResponse(responseCode = "200", description = "Angitt prosesstask-id finnes", content = @Content(mediaType = "application/json", schema = @Schema(implementation = FeiletProsessTaskDataDto.class))),
@ApiResponse(responseCode = "404", description = "Tom respons når angitt prosesstask-id ikke finnes"),
@ApiResponse(responseCode = "400", description = "Feil input")
@ApiResponse(responseCode = "200", description = "Angitt prosesstask-id finnes", content = @Content(mediaType = "application/json", schema = @Schema(implementation = FeiletProsessTaskDataDto.class))),
@ApiResponse(responseCode = "404", description = "Tom respons når angitt prosesstask-id ikke finnes"),
@ApiResponse(responseCode = "400", description = "Feil input")
})
@BeskyttetRessurs(actionType = ActionType.READ, property = ABAC_DRIFT_ATTRIBUTT)
public Response finnFeiletProsessTask(@NotNull @Parameter(description = "Prosesstask-id for feilet prosesstask") @TilpassetAbacAttributt(supplierClass = AbacEmptySupplier.class) @Valid ProsessTaskIdDto prosessTaskIdDto) {
public Response finnFeiletProsessTask(@NotNull @Parameter(description = "Prosesstask-id for feilet prosesstask") @TilpassetAbacAttributt(supplierClass = AbacEmptySupplier.class) @Valid @BeanParam ProsessTaskIdDto prosessTaskIdDto) {
var resultat = prosessTaskApplikasjonTjeneste.finnFeiletProsessTask(prosessTaskIdDto.getProsessTaskId());
if (resultat.isPresent()) {
return Response.ok(resultat.get()).build();
Expand All @@ -146,15 +155,25 @@ public Response finnFeiletProsessTask(@NotNull @Parameter(description = "Prosess
}

@POST
@Path("/setferdig")
@Path("/setferdig/{prosessTaskId}/{prosessTaskStatus}")
@Consumes(MediaType.APPLICATION_JSON)
@Operation(description = "Setter feilet prosesstask med angitt prosesstask-id til FERDIG (kjøres ikke)", tags = "prosesstask", responses = {
@ApiResponse(responseCode = "200", description = "Angitt prosesstask-id satt til status FERDIG"),
@ApiResponse(responseCode = "500", description = "Feilet pga ukjent feil eller tekniske/funksjonelle feil")
@ApiResponse(responseCode = "200", description = "Angitt prosesstask-id satt til status FERDIG"),
@ApiResponse(responseCode = "500", description = "Feilet pga ukjent feil eller tekniske/funksjonelle feil")
})
@BeskyttetRessurs(actionType = ActionType.CREATE, property = ABAC_DRIFT_ATTRIBUTT)
public Response setFeiletProsessTaskFerdig(@NotNull @Parameter(description = "Prosesstask-id for feilet prosesstask") @TilpassetAbacAttributt(supplierClass = AbacEmptySupplier.class) @Valid ProsessTaskSetFerdigInputDto prosessTaskIdDto) {
prosessTaskApplikasjonTjeneste.setProsessTaskFerdig(prosessTaskIdDto.getProsessTaskId(), ProsessTaskStatus.valueOf(prosessTaskIdDto.getNaaVaaerendeStatus()));
public Response setFeiletProsessTaskFerdig(@NotNull @Parameter(description = "Prosesstask-id for feilet prosesstask") @TilpassetAbacAttributt(supplierClass = AbacEmptySupplier.class) @Valid @BeanParam ProsessTaskSetFerdigInputDto prosessTaskIdDto) {
prosessTaskApplikasjonTjeneste.setProsessTaskFerdig(prosessTaskIdDto.getProsessTaskId(), mapToProsessTaskStatus(prosessTaskIdDto.getNaaVaaerendeStatus()));
return Response.ok().build();
}

private ProsessTaskStatus mapToProsessTaskStatus(IkkeFerdigProsessTaskStatusEnum ikkeFerdigStatus) {
return switch (ikkeFerdigStatus) {
case FEILET -> ProsessTaskStatus.FEILET;
case VENTER_SVAR -> ProsessTaskStatus.VENTER_SVAR;
case KLAR -> ProsessTaskStatus.KLAR;
case SUSPENDERT -> ProsessTaskStatus.SUSPENDERT;
case VETO -> ProsessTaskStatus.VETO;
};
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ public void setProsessTaskFerdig(Long prosessTaskId, ProsessTaskStatus status) {
}

public ProsessTaskRestartResultatDto flaggProsessTaskForRestart(ProsessTaskRestartInputDto prosessTaskRestartInputDto) {
prosessTaskTjeneste.flaggProsessTaskForRestart(prosessTaskRestartInputDto.getProsessTaskId(), prosessTaskRestartInputDto.getNaaVaaerendeStatus());
prosessTaskTjeneste.flaggProsessTaskForRestart(prosessTaskRestartInputDto.getProsessTaskId(), prosessTaskRestartInputDto.getNaaVaaerendeStatus().name());

var restartResultatDto = new ProsessTaskRestartResultatDto();
restartResultatDto.setNesteKjoeretidspunkt(LocalDateTime.now());
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package no.nav.vedtak.felles.prosesstask.rest.dto;

public enum FeiletProsessTaskStatusEnum {
FEILET,
VENTER_SVAR,
SUSPENDERT
;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package no.nav.vedtak.felles.prosesstask.rest.dto;

public enum IkkeFerdigProsessTaskStatusEnum {
FEILET,
VENTER_SVAR,
SUSPENDERT,
VETO,
KLAR
;
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import com.fasterxml.jackson.annotation.JsonProperty;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.ws.rs.PathParam;

@JsonIgnoreProperties(ignoreUnknown = true)
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
Expand All @@ -22,6 +23,7 @@ public class ProsessTaskIdDto {
@NotNull
@Min(0)
@Max(Long.MAX_VALUE)
@PathParam("prosessTaskId")
private Long prosessTaskId;

public ProsessTaskIdDto() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,5 @@
package no.nav.vedtak.felles.prosesstask.rest.dto;

import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
import jakarta.validation.constraints.Size;

import com.fasterxml.jackson.annotation.JsonAlias;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
Expand All @@ -14,6 +8,11 @@
import com.fasterxml.jackson.annotation.JsonProperty;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.Valid;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
import jakarta.ws.rs.PathParam;

@JsonIgnoreProperties(ignoreUnknown = true)
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
Expand All @@ -25,14 +24,14 @@ public class ProsessTaskRestartInputDto {
@Min(0)
@Max(Long.MAX_VALUE)
@NotNull
@PathParam("prosessTaskId")
private Long prosessTaskId;

@JsonAlias(value = { "naaVaarendeStatus" })
@JsonProperty(value = "inneværendeStatus", required = true)
@Schema(description = "Nåværende status. Angis hviss prosessen som skal restartes har en annen status enn KLAR.", allowableValues = "VENTER_SVAR, SUSPENDERT, FEILET")
@Size(max = 15)
@Pattern(regexp = "VENTER_SVAR|FEILET|SUSPENDERT")
private String naaVaaerendeStatus;
@Valid
@PathParam("prosessTaskStatus")
private FeiletProsessTaskStatusEnum naaVaaerendeStatus;

public ProsessTaskRestartInputDto() {
// Jackson
Expand All @@ -46,11 +45,11 @@ public void setProsessTaskId(Long prosessTaskId) {
this.prosessTaskId = prosessTaskId;
}

public String getNaaVaaerendeStatus() {
public FeiletProsessTaskStatusEnum getNaaVaaerendeStatus() {
return naaVaaerendeStatus;
}

public void setNaaVaaerendeStatus(String naaVaaerendeStatus) {
public void setNaaVaaerendeStatus(FeiletProsessTaskStatusEnum naaVaaerendeStatus) {
this.naaVaaerendeStatus = naaVaaerendeStatus;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
package no.nav.vedtak.felles.prosesstask.rest.dto;

import jakarta.validation.Valid;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
import jakarta.validation.constraints.Size;

import com.fasterxml.jackson.annotation.JsonAlias;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
Expand All @@ -14,6 +13,7 @@
import com.fasterxml.jackson.annotation.JsonProperty;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.ws.rs.PathParam;

@JsonIgnoreProperties(ignoreUnknown = true)
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
Expand All @@ -25,14 +25,14 @@ public class ProsessTaskSetFerdigInputDto {
@Min(0)
@Max(Long.MAX_VALUE)
@NotNull
@PathParam("prosessTaskId")
private Long prosessTaskId;

@JsonAlias(value = { "naaVaarendeStatus" })
@JsonProperty(value = "inneværendeStatus", required = true)
@Schema(description = "Nåværende status. Angis hviss prosessen som skal restartes har en annen status enn KLAR.", allowableValues = "FEILET, VENTER_SVAR, SUSPENDERT, VETO, KLAR")
@Size(max = 15)
@Pattern(regexp = "FEILET|VENTER_SVAR|SUSPENDERT|VETO|KLAR")
private String naaVaaerendeStatus;
@Valid
@PathParam("prosessTaskStatus")
private IkkeFerdigProsessTaskStatusEnum naaVaaerendeStatus;

public ProsessTaskSetFerdigInputDto() {
// Jackson
Expand All @@ -46,11 +46,11 @@ public void setProsessTaskId(Long prosessTaskId) {
this.prosessTaskId = prosessTaskId;
}

public String getNaaVaaerendeStatus() {
public IkkeFerdigProsessTaskStatusEnum getNaaVaaerendeStatus() {
return naaVaaerendeStatus;
}

public void setNaaVaaerendeStatus(String naaVaaerendeStatus) {
public void setNaaVaaerendeStatus(IkkeFerdigProsessTaskStatusEnum naaVaaerendeStatus) {
this.naaVaaerendeStatus = naaVaaerendeStatus;
}
}
Loading

0 comments on commit 443fe4a

Please sign in to comment.