From ccb33b4c64b79f188fb02265d00e98209417f1e4 Mon Sep 17 00:00:00 2001 From: Jonathan Christison Date: Thu, 6 Jul 2023 23:27:06 +0100 Subject: [PATCH] Add email patch method Annotate Getters and Hibernate and Jackson weren't playing nice resulting in errors like - ``` com.fasterxml.jackson.databind.JsonMappingException: Unable to perform requested lazy initialization [com.redhat.pctsec.model.ScanRequests.globalScanProperties] - session is closed and settings disallow loading outside the Session (through reference chain: com.redhat.pctsec.model.Scan["scanRequests"]->com.redhat.pctsec.model.ScanRequests["globalScanProperties"]) ``` Rearrange fields above methods in Scan --- .../java/com/redhat/pctsec/model/Scan.java | 96 ++++++++++--------- .../com/redhat/pctsec/model/ScanRequests.java | 11 ++- .../pctsec/rest/v1alpha1/ScanResource.java | 14 +++ 3 files changed, 76 insertions(+), 45 deletions(-) diff --git a/src/main/java/com/redhat/pctsec/model/Scan.java b/src/main/java/com/redhat/pctsec/model/Scan.java index a1e3daa..8e16131 100644 --- a/src/main/java/com/redhat/pctsec/model/Scan.java +++ b/src/main/java/com/redhat/pctsec/model/Scan.java @@ -1,6 +1,7 @@ package com.redhat.pctsec.model; import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; import jakarta.persistence.*; import jakarta.transaction.Transactional; import jakarta.validation.constraints.Email; @@ -17,6 +18,50 @@ enum ScanState { @Entity public class Scan { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + public UUID id; + + + /* + @OneToOne + @NotNull + @JoinColumn(name = "product_id", referencedColumnName = "id") + private String productName; + */ + @Column(name="proudct_name") + private String productName; + + //@Temporal(TemporalType.TIMESTAMP) + + @CreationTimestamp + @JsonIgnore + @Column(name="creation_timestamp") + //@NotNull + private Instant creationTimestamp; + + @UpdateTimestamp + @JsonIgnore + @Column(name="update_timestamp") + //@NotNull + private Instant updateTimestamp; + + @Column(name="state") + @Enumerated(EnumType.STRING) + private ScanState state; + + @Column(name="requestor") + @NotNull + private String requestor; + + @Column(name="report_email") + @Email + private String email; + + @OneToOne(cascade = CascadeType.ALL, fetch=FetchType.LAZY) + @JoinColumn(name = "scan_requests_id", referencedColumnName = "id") + public ScanRequests scanRequests; + public Scan() { this.scanRequests = new ScanRequests(); } @@ -53,7 +98,14 @@ public class Scan { this.requestor = requestor; } + @JsonProperty("email") + @Access(AccessType.PROPERTY) + @Email public String getEmail() { + if(email != null) + return email; + if(getRequestor() != null) + return getRequestor() + "@redhat.com"; return email; } @@ -69,48 +121,4 @@ public class Scan { public void setScanRequests(ScanRequests scanRequests) { this.scanRequests = scanRequests; } - - @Id - @GeneratedValue(strategy = GenerationType.AUTO) - public UUID id; - - - /* - @OneToOne - @NotNull - @JoinColumn(name = "product_id", referencedColumnName = "id") - private String productName; - */ - @Column(name="proudct_name") - private String productName; - - //@Temporal(TemporalType.TIMESTAMP) - - @CreationTimestamp - @JsonIgnore - @Column(name="creation_timestamp") - //@NotNull - private Instant creationTimestamp; - - @UpdateTimestamp - @JsonIgnore - @Column(name="update_timestamp") - //@NotNull - private Instant updateTimestamp; - - @Column(name="state") - @Enumerated(EnumType.STRING) - private ScanState state; - - @Column(name="requestor") - @NotNull - private String requestor; - - @Column(name="report_email") - @Email - private String email; - - @OneToOne(cascade = CascadeType.ALL, fetch=FetchType.LAZY) - @JoinColumn(name = "scan_requests_id", referencedColumnName = "id") - public ScanRequests scanRequests; } diff --git a/src/main/java/com/redhat/pctsec/model/ScanRequests.java b/src/main/java/com/redhat/pctsec/model/ScanRequests.java index cc510e2..2b01b0b 100644 --- a/src/main/java/com/redhat/pctsec/model/ScanRequests.java +++ b/src/main/java/com/redhat/pctsec/model/ScanRequests.java @@ -1,5 +1,7 @@ package com.redhat.pctsec.model; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; import com.redhat.pctsec.model.api.request.pssaas; import com.redhat.pctsec.model.api.request.scanChain; import io.vertx.mutiny.core.eventbus.EventBus; @@ -19,15 +21,18 @@ public class ScanRequests { @GeneratedValue protected UUID id; - @OneToMany(fetch=FetchType.EAGER, cascade = CascadeType.ALL) + @JsonIgnore + @OneToMany(fetch=FetchType.LAZY, cascade = CascadeType.ALL) @JoinColumn(name = "scan_request_id", referencedColumnName = "id") private Set scanRequests;// = new HashSet<>(); @Column(name="scan_properties") + @JsonIgnore private String globalScanProperties; @Column(name="scan_metadata") + @JsonIgnore private String scanMetadata; @@ -88,6 +93,7 @@ public class ScanRequests { */ } + @JsonProperty("scanRequests") public Set getScanRequests() { return scanRequests; } @@ -96,6 +102,7 @@ public class ScanRequests { this.scanRequests = scanRequests; } + @JsonProperty("globalScanProperties") public String getGlobalScanProperties() { return globalScanProperties; } @@ -104,6 +111,8 @@ public class ScanRequests { this.globalScanProperties = globalScanProperties; } + + @JsonProperty("scanMetadata") public String getScanMetadata() { return scanMetadata; } diff --git a/src/main/java/com/redhat/pctsec/rest/v1alpha1/ScanResource.java b/src/main/java/com/redhat/pctsec/rest/v1alpha1/ScanResource.java index 610c328..60e38bc 100644 --- a/src/main/java/com/redhat/pctsec/rest/v1alpha1/ScanResource.java +++ b/src/main/java/com/redhat/pctsec/rest/v1alpha1/ScanResource.java @@ -10,6 +10,7 @@ import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; import jakarta.transaction.Transactional; import jakarta.validation.Valid; +import jakarta.validation.constraints.Email; import jakarta.ws.rs.*; import org.jboss.resteasy.reactive.RestQuery; @@ -106,6 +107,19 @@ public class ScanResource { return s.scanRequests.execute(bus); } + @PATCH + @Path("{id}/{email}") + @Consumes({"application/octet-stream"}) + @Produces({"application/json"}) + @Authenticated + @Transactional + public Scan patchScanEmail(String id, @Email String email) + { + Scan s = sr.findById(UUID.fromString(id)); + s.setEmail(email); + sr.persist(s); + return s; + } @GET @Path("single/git")