diff --git a/wizard-common/src/main/java/org/cobbzilla/wizard/auth/LoginRequest.java b/wizard-common/src/main/java/org/cobbzilla/wizard/auth/LoginRequest.java index 77abe0c..b1677e7 100644 --- a/wizard-common/src/main/java/org/cobbzilla/wizard/auth/LoginRequest.java +++ b/wizard-common/src/main/java/org/cobbzilla/wizard/auth/LoginRequest.java @@ -32,10 +32,8 @@ public class LoginRequest { @Getter @Setter @JsonProperty private String totpToken; @JsonIgnore public boolean hasTotpToken() { return !empty(totpToken); } - @Getter @Setter private String deviceId; - @JsonIgnore public boolean hasDevice () { return !empty(deviceId); } - - @Getter @Setter private String deviceName; + @Getter @Setter private String device; + @JsonIgnore public boolean hasDevice () { return !empty(device); } // optional - server-side resource can fill this in for other server-side code to use @JsonIgnore @Getter @Setter private String userAgent; @@ -44,7 +42,5 @@ public class LoginRequest { return "{name="+getName()+", password="+mask(password)+", totpToken="+mask(totpToken)+", device="+getDevice()+"}"; } - @JsonIgnore public String getDevice() { return hasDevice() ? deviceId + " ("+deviceName+")" : "NOT-SET"; } - public String mask(String value) { return empty(value) ? "NOT-SET" : "SET"; } } diff --git a/wizard-common/src/main/java/org/cobbzilla/wizard/model/entityconfig/EntityFieldReference.java b/wizard-common/src/main/java/org/cobbzilla/wizard/model/entityconfig/EntityFieldReference.java index 31d9680..d9936ee 100644 --- a/wizard-common/src/main/java/org/cobbzilla/wizard/model/entityconfig/EntityFieldReference.java +++ b/wizard-common/src/main/java/org/cobbzilla/wizard/model/entityconfig/EntityFieldReference.java @@ -2,6 +2,7 @@ package org.cobbzilla.wizard.model.entityconfig; import lombok.*; +import static org.cobbzilla.util.daemon.ZillaRuntime.bool; import static org.cobbzilla.util.daemon.ZillaRuntime.empty; /** @@ -11,9 +12,10 @@ import static org.cobbzilla.util.daemon.ZillaRuntime.empty; @NoArgsConstructor @EqualsAndHashCode(of={"entity", "field"}) @ToString(of={"entity", "field"}) public class EntityFieldReference { - public EntityFieldReference (String entity, String field) { + public EntityFieldReference (String entity, String field, Boolean cascade) { this.entity = entity; this.field = field; + this.cascade = cascade; } /** A special value that can be used by child entities to indicate that the lexically enclosing entity is their parent. */ @@ -36,4 +38,8 @@ public class EntityFieldReference { */ @Getter @Setter private String finder; + /** Should a deletion of an entity cascade to the entity referenced? */ + @Getter @Setter private Boolean cascade; + public boolean cascade() { return bool(cascade); } + } diff --git a/wizard-common/src/main/java/org/cobbzilla/wizard/model/entityconfig/EntityReferences.java b/wizard-common/src/main/java/org/cobbzilla/wizard/model/entityconfig/EntityReferences.java index 6dbd275..758042c 100644 --- a/wizard-common/src/main/java/org/cobbzilla/wizard/model/entityconfig/EntityReferences.java +++ b/wizard-common/src/main/java/org/cobbzilla/wizard/model/entityconfig/EntityReferences.java @@ -85,7 +85,7 @@ public class EntityReferences { Arrays.stream(dependencyOrParent.getDeclaredFields()) .filter(FIELD_HAS_FK) .filter(f -> f.getAnnotation(ECForeignKey.class).entity().equals(entityClass)) - .forEach(f -> refs.add(new EntityFieldReference(dependency.getName(), f.getName()))); + .forEach(f -> refs.add(new EntityFieldReference(dependency.getName(), f.getName(), f.getAnnotation(ECForeignKey.class).cascade()))); refs.addAll(getDependencyRefs(entityClass, dependency, dependencyOrParent.getSuperclass(), refs)); return refs; } diff --git a/wizard-server/src/main/java/org/cobbzilla/wizard/server/config/PgRestServerConfiguration.java b/wizard-server/src/main/java/org/cobbzilla/wizard/server/config/PgRestServerConfiguration.java index af1d1bc..45c4fb5 100644 --- a/wizard-server/src/main/java/org/cobbzilla/wizard/server/config/PgRestServerConfiguration.java +++ b/wizard-server/src/main/java/org/cobbzilla/wizard/server/config/PgRestServerConfiguration.java @@ -347,12 +347,12 @@ public class PgRestServerConfiguration extends RestServerConfiguration implement return reversed; } - private Map, List>> dependencyCache = new ConcurrentHashMap<>(); + private final Map, List>> dependencyCache = new ConcurrentHashMap<>(); public List> getDependencies (Class entityClass) { return dependencyCache.computeIfAbsent(entityClass, c -> getDependentEntities(entityClass, getEntityClassesReverse())); } - private Map, Collection> dependencyDAOCache = new ConcurrentHashMap<>(); + private final Map, Collection> dependencyDAOCache = new ConcurrentHashMap<>(); public Collection dependencyRefs(Class entityClass) { return dependencyDAOCache.computeIfAbsent(entityClass, c -> getDependencyRefs(c, getDependencies(c))); } @@ -364,6 +364,10 @@ public class PgRestServerConfiguration extends RestServerConfiguration implement final Collection excludeDepFields) { dependencyRefs(thing.getClass()).forEach( dep -> { + if (!dep.cascade()) { + log.debug("deleteDependencies("+thing+"): excluding due to cascade=false: "+dep); + return; + } if (excludeDepClasses != null && excludeDepClasses.stream().anyMatch(depClass -> depClass.getName().equals(dep.getEntity()))) { log.debug("deleteDependencies("+thing+"): excluding by dep class: "+dep); return;