This is an automated email from the ASF dual-hosted git repository. danhaywood pushed a commit to branch CAUSEWAY-3362 in repository https://gitbox.apache.org/repos/asf/causeway.git
commit 5bd0c9f9a93151cfa14e9b09265b1e1f553a3ac8 Author: danhaywood <[email protected]> AuthorDate: Fri Feb 17 07:25:27 2023 +0000 CAUSEWAY-3362: adds queries for AuditTrailEntry, by username --- .../audittrail/applib/dom/AuditTrailEntry.java | 9 +++ .../applib/dom/AuditTrailEntryRepository.java | 81 +++++++++++++++++++++- .../audittrail/jdo/dom/AuditTrailEntry.java | 69 +++++++++++++++++- .../audittrail/jpa/dom/AuditTrailEntry.java | 68 +++++++++++++++++- 4 files changed, 224 insertions(+), 3 deletions(-) diff --git a/extensions/security/audittrail/applib/src/main/java/org/apache/causeway/extensions/audittrail/applib/dom/AuditTrailEntry.java b/extensions/security/audittrail/applib/src/main/java/org/apache/causeway/extensions/audittrail/applib/dom/AuditTrailEntry.java index 8bf817eafc..fd04a01568 100644 --- a/extensions/security/audittrail/applib/src/main/java/org/apache/causeway/extensions/audittrail/applib/dom/AuditTrailEntry.java +++ b/extensions/security/audittrail/applib/src/main/java/org/apache/causeway/extensions/audittrail/applib/dom/AuditTrailEntry.java @@ -86,6 +86,15 @@ public abstract class AuditTrailEntry implements DomainChangeRecord, Comparable< public static final String FIND_BY_TIMESTAMP_BEFORE = "findByTimestampBefore"; public static final String FIND = "find"; public static final String FIND_MOST_RECENT = LOGICAL_TYPE_NAME + ".findMostRecent"; + public static final String FIND_BY_USERNAME_AND_TIMESTAMP_BETWEEN = "findByUsernameAndTimestampBetween"; + public static final String FIND_BY_USERNAME_AND_TIMESTAMP_AFTER = "findByUsernameAndTimestampAfter"; + public static final String FIND_BY_USERNAME_AND_TIMESTAMP_BEFORE = "findByUsernameAndTimestampBefore"; + public static final String FIND_BY_USERNAME = "findByUsername"; + public static final String FIND_BY_USERNAME_AND_TARGET_AND_TIMESTAMP_BETWEEN = "findByUsernameAndTargetAndTimestampBetween"; + public static final String FIND_BY_USERNAME_AND_TARGET_AND_TIMESTAMP_AFTER = "findByUsernameAndTargetAndTimestampAfter"; + public static final String FIND_BY_USERNAME_AND_TARGET_AND_TIMESTAMP_BEFORE = "findByUsernameAndTargetAndTimestampBefore"; + public static final String FIND_BY_USERNAME_AND_TARGET = "findByUsernameAndTarget"; + public static final String FIND_RECENT_BY_USERNAME = LOGICAL_TYPE_NAME + ".findRecentByUsername"; } // -- UI & DOMAIN EVENTS diff --git a/extensions/security/audittrail/applib/src/main/java/org/apache/causeway/extensions/audittrail/applib/dom/AuditTrailEntryRepository.java b/extensions/security/audittrail/applib/src/main/java/org/apache/causeway/extensions/audittrail/applib/dom/AuditTrailEntryRepository.java index af20723c32..a1bd645a5a 100644 --- a/extensions/security/audittrail/applib/src/main/java/org/apache/causeway/extensions/audittrail/applib/dom/AuditTrailEntryRepository.java +++ b/extensions/security/audittrail/applib/src/main/java/org/apache/causeway/extensions/audittrail/applib/dom/AuditTrailEntryRepository.java @@ -115,7 +115,6 @@ public abstract class AuditTrailEntryRepository<E extends AuditTrailEntry> { .withParameter("to", toTs); } else { query = Query.named(auditTrailEntryClass, AuditTrailEntry.Nq.FIND_BY_TARGET_AND_TIMESTAMP_AFTER) - .withParameter("target", target) .withParameter("target", target) .withParameter("from", fromTs); } @@ -176,6 +175,86 @@ public abstract class AuditTrailEntryRepository<E extends AuditTrailEntry> { Query.named(auditTrailEntryClass, AuditTrailEntry.Nq.FIND_MOST_RECENT).withLimit(limit)); } + public List<E> findByUsernameAndFromAndTo( + final String username, + final LocalDate from, + final LocalDate to) { + val fromTs = toTimestampStartOfDayWithOffset(from, 0); + val toTs = toTimestampStartOfDayWithOffset(to, 1); + + final Query<E> query; + if(from != null) { + if(to != null) { + query = Query.named(auditTrailEntryClass, AuditTrailEntry.Nq.FIND_BY_USERNAME_AND_TIMESTAMP_BETWEEN) + .withParameter("username", username) + .withParameter("from", fromTs) + .withParameter("to", toTs); + } else { + query = Query.named(auditTrailEntryClass, AuditTrailEntry.Nq.FIND_BY_USERNAME_AND_TIMESTAMP_AFTER) + .withParameter("username", username) + .withParameter("from", fromTs); + } + } else { + if(to != null) { + query = Query.named(auditTrailEntryClass, AuditTrailEntry.Nq.FIND_BY_USERNAME_AND_TIMESTAMP_BEFORE) + .withParameter("username", username) + .withParameter("to", toTs); + } else { + query = Query.named(auditTrailEntryClass, AuditTrailEntry.Nq.FIND_BY_USERNAME) + .withParameter("username", username) + ; + } + } + return repositoryService.allMatches(query); + } + + public List<E> findByUsernameAndTargetAndFromAndTo( + final String username, + final Bookmark target, + final LocalDate from, + final LocalDate to) { + val fromTs = toTimestampStartOfDayWithOffset(from, 0); + val toTs = toTimestampStartOfDayWithOffset(to, 1); + + final Query<E> query; + if(from != null) { + if(to != null) { + query = Query.named(auditTrailEntryClass, AuditTrailEntry.Nq.FIND_BY_USERNAME_AND_TARGET_AND_TIMESTAMP_BETWEEN) + .withParameter("username", username) + .withParameter("target", target) + .withParameter("from", fromTs) + .withParameter("to", toTs); + } else { + query = Query.named(auditTrailEntryClass, AuditTrailEntry.Nq.FIND_BY_USERNAME_AND_TARGET_AND_TIMESTAMP_AFTER) + .withParameter("username", username) + .withParameter("target", target) + .withParameter("from", fromTs); + } + } else { + if(to != null) { + query = Query.named(auditTrailEntryClass, AuditTrailEntry.Nq.FIND_BY_USERNAME_AND_TARGET_AND_TIMESTAMP_BEFORE) + .withParameter("username", username) + .withParameter("target", target) + .withParameter("to", toTs); + } else { + query = Query.named(auditTrailEntryClass, AuditTrailEntry.Nq.FIND_BY_USERNAME_AND_TARGET) + .withParameter("username", username) + .withParameter("target", target) + ; + } + } + return repositoryService.allMatches(query); + } + + + public List<E> findRecentByUsername(final String username) { + return repositoryService.allMatches( + Query.named(auditTrailEntryClass, AuditTrailEntry.Nq.FIND_RECENT_BY_USERNAME) + .withParameter("username", username) + .withLimit(100) + ); + } + /** diff --git a/extensions/security/audittrail/persistence-jdo/src/main/java/org/apache/causeway/extensions/audittrail/jdo/dom/AuditTrailEntry.java b/extensions/security/audittrail/persistence-jdo/src/main/java/org/apache/causeway/extensions/audittrail/jdo/dom/AuditTrailEntry.java index adc67fdf9d..2455458546 100644 --- a/extensions/security/audittrail/persistence-jdo/src/main/java/org/apache/causeway/extensions/audittrail/jdo/dom/AuditTrailEntry.java +++ b/extensions/security/audittrail/persistence-jdo/src/main/java/org/apache/causeway/extensions/audittrail/jdo/dom/AuditTrailEntry.java @@ -141,7 +141,74 @@ import lombok.Setter; + " WHERE target == :target " + " && propertyId == :propertyId " + " ORDER BY timestamp DESC " - + " RANGE 0,30") + + " RANGE 0,30"), + @Query( + name = Nq.FIND_BY_USERNAME_AND_TIMESTAMP_BETWEEN, + value = "SELECT " + + " FROM " + AuditTrailEntry.FQCN + " " + + " WHERE username == :username " + + " && timestamp >= :from " + + " && timestamp <= :to " + + "ORDER BY timestamp DESC"), + @Query( + name = Nq.FIND_BY_USERNAME_AND_TIMESTAMP_AFTER, + value = "SELECT " + + " FROM " + AuditTrailEntry.FQCN + " " + + " WHERE username == :username " + + " && timestamp >= :from " + + " ORDER BY timestamp DESC"), + @Query( + name = Nq.FIND_BY_USERNAME_AND_TIMESTAMP_BEFORE, + value = "SELECT " + + " FROM " + AuditTrailEntry.FQCN + " " + + " WHERE username == :username " + + " && timestamp <= :to " + + " ORDER BY timestamp DESC"), + @Query( + name = Nq.FIND_BY_USERNAME, + value = "SELECT " + + " FROM " + AuditTrailEntry.FQCN + " " + + " WHERE username == :username " + + " ORDER BY timestamp DESC"), + @Query( + name = Nq.FIND_BY_USERNAME_AND_TARGET_AND_TIMESTAMP_BETWEEN, + value = "SELECT " + + " FROM " + AuditTrailEntry.FQCN + " " + + " WHERE username == :username " + + " && target == :target " + + " && timestamp >= :from " + + " && timestamp <= :to " + + "ORDER BY timestamp DESC"), + @Query( + name = Nq.FIND_BY_USERNAME_AND_TARGET_AND_TIMESTAMP_AFTER, + value = "SELECT " + + " FROM " + AuditTrailEntry.FQCN + " " + + " WHERE username == :username " + + " && target == :target " + + " && timestamp >= :from " + + " ORDER BY timestamp DESC"), + @Query( + name = Nq.FIND_BY_USERNAME_AND_TARGET_AND_TIMESTAMP_BEFORE, + value = "SELECT " + + " FROM " + AuditTrailEntry.FQCN + " " + + " WHERE username == :username " + + " && target == :target " + + " && timestamp <= :to " + + " ORDER BY timestamp DESC"), + @Query( + name = Nq.FIND_BY_USERNAME_AND_TARGET, + value = "SELECT " + + " FROM " + AuditTrailEntry.FQCN + " " + + " WHERE username == :username " + + " && target == :target " + + " ORDER BY timestamp DESC"), + @Query( + name = Nq.FIND_RECENT_BY_USERNAME, + value = "SELECT " + + " FROM " + AuditTrailEntry.FQCN + " " + + " WHERE username == :username " + + " ORDER BY timestamp DESC " + + " RANGE 0,100") }) @XmlJavaTypeAdapter(PersistentEntityAdapter.class) @DatastoreIdentity(strategy = IdGeneratorStrategy.IDENTITY, column = "id") diff --git a/extensions/security/audittrail/persistence-jpa/src/main/java/org/apache/causeway/extensions/audittrail/jpa/dom/AuditTrailEntry.java b/extensions/security/audittrail/persistence-jpa/src/main/java/org/apache/causeway/extensions/audittrail/jpa/dom/AuditTrailEntry.java index 7bcd31d3b2..ebaf39729c 100644 --- a/extensions/security/audittrail/persistence-jpa/src/main/java/org/apache/causeway/extensions/audittrail/jpa/dom/AuditTrailEntry.java +++ b/extensions/security/audittrail/persistence-jpa/src/main/java/org/apache/causeway/extensions/audittrail/jpa/dom/AuditTrailEntry.java @@ -138,7 +138,73 @@ import org.apache.causeway.persistence.jpa.integration.typeconverters.java.util. + " FROM AuditTrailEntry e " + " WHERE e.target = :target " + " AND e.propertyId = :propertyId " - + " ORDER BY e.timestamp DESC ") // programmatic limit 0,30 + + " ORDER BY e.timestamp DESC "), // programmatic limit 0,30 + @NamedQuery( + name = Nq.FIND_BY_USERNAME_AND_TIMESTAMP_BETWEEN, + query = "SELECT e " + + " FROM AuditTrailEntry e " + + " WHERE e.username = :username " + + " AND e.timestamp >= :from " + + " AND e.timestamp <= :to " + + " ORDER BY e.timestamp DESC"), + @NamedQuery( + name = Nq.FIND_BY_USERNAME_AND_TIMESTAMP_AFTER, + query = "SELECT e " + + " FROM AuditTrailEntry e " + + " WHERE e.username = :username " + + " AND e.timestamp >= :from " + + " ORDER BY e.timestamp DESC"), + @NamedQuery( + name = Nq.FIND_BY_USERNAME_AND_TIMESTAMP_BEFORE, + query = "SELECT e " + + " FROM AuditTrailEntry e " + + " WHERE e.username = :username " + + " AND e.timestamp <= :to " + + " ORDER BY e.timestamp DESC"), + @NamedQuery( + name = Nq.FIND_BY_USERNAME, + query = "SELECT e " + + " FROM AuditTrailEntry e " + + " WHERE e.username = :username " + + " ORDER BY e.timestamp DESC"), + @NamedQuery( + name = Nq.FIND_BY_USERNAME_AND_TARGET_AND_TIMESTAMP_BETWEEN, + query = "SELECT e " + + " FROM AuditTrailEntry e " + + " WHERE e.username = :username " + + " AND e.target = :target " + + " AND e.timestamp >= :from " + + " AND e.timestamp <= :to " + + " ORDER BY e.timestamp DESC"), + @NamedQuery( + name = Nq.FIND_BY_USERNAME_AND_TARGET_AND_TIMESTAMP_AFTER, + query = "SELECT e " + + " FROM AuditTrailEntry e " + + " WHERE e.username = :username " + + " AND e.target = :target " + + " AND e.timestamp >= :from " + + " ORDER BY e.timestamp DESC"), + @NamedQuery( + name = Nq.FIND_BY_USERNAME_AND_TARGET_AND_TIMESTAMP_BEFORE, + query = "SELECT e " + + " FROM AuditTrailEntry e " + + " WHERE e.username = :username " + + " AND e.target = :target " + + " AND e.timestamp >= :from " + + " ORDER BY e.timestamp DESC"), + @NamedQuery( + name = Nq.FIND_BY_USERNAME_AND_TARGET, + query = "SELECT e " + + " FROM AuditTrailEntry e " + + " WHERE e.username = :username " + + " AND e.target = :target " + + " ORDER BY e.timestamp DESC"), + @NamedQuery( + name = Nq.FIND_RECENT_BY_USERNAME, + query = "SELECT e " + + " FROM AuditTrailEntry e " + + " WHERE e.username = :username " + + " ORDER BY e.timestamp DESC ") // programmatic limit 0,100 }) @EntityListeners(CausewayEntityListener.class) @XmlJavaTypeAdapter(PersistentEntityAdapter.class)
