Skip to content

Commit e782d88

Browse files
committed
Update Metadata File when file is edited, copied, or moved
- No longer updates `lastEditedBy` when the metadata is updated (unless that field is missing)
1 parent 5fe58f0 commit e782d88

4 files changed

Lines changed: 163 additions & 55 deletions

File tree

workspace-server/src/main/java/gov/nasa/jpl/aerie/workspace/server/MetadataUpdates.java

Lines changed: 43 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,10 @@ public class MetadataUpdates {
1111
private final Optional<String> version;
1212
private final Optional<String> createdBy;
1313
private final Optional<Instant> createdAt;
14-
private final String lastEditedBy;
15-
private final Instant lastEditedAt;
14+
private final Optional<String> lastEditedBy;
15+
private final Optional<Instant> lastEditedAt;
16+
private final String metadataLastEditedBy;
17+
private final Instant metadataLastEditedAt;
1618
// User-Managed Fields
1719
private final Optional<Boolean> readOnly;
1820
private final Optional<JsonObject> user;
@@ -21,21 +23,27 @@ private MetadataUpdates(Builder builder){
2123
this.version = Optional.ofNullable(builder.version);
2224
this.createdBy = Optional.ofNullable(builder.createdBy);
2325
this.createdAt = Optional.ofNullable(builder.createdAt);
24-
this.lastEditedBy = builder.lastEditedBy;
25-
this.lastEditedAt = builder.lastEditedAt;
26+
this.lastEditedBy = Optional.ofNullable(builder.lastEditedBy);
27+
this.lastEditedAt = Optional.ofNullable(builder.lastEditedAt);
28+
// Tracked but unwritten fields (currently used for fallbacks)
29+
this.metadataLastEditedBy = builder.metadataLastEditedBy;
30+
this.metadataLastEditedAt = builder.metadataLastEditedAt;
31+
2632
this.readOnly = Optional.ofNullable(builder.readOnly);
2733
this.user = Optional.ofNullable(builder.user);
2834
}
2935

3036
private MetadataUpdates(String userId, Optional<Boolean> readOnly, Optional<JsonObject> user) {
31-
this.lastEditedBy = userId;
32-
this.lastEditedAt = Instant.now();
37+
this.metadataLastEditedBy = userId;
38+
this.metadataLastEditedAt = Instant.now();
3339
this.readOnly = readOnly;
3440
this.user = user;
3541

3642
this.version = Optional.empty();
3743
this.createdBy = Optional.empty();
3844
this.createdAt = Optional.empty();
45+
this.lastEditedBy = Optional.empty();
46+
this.lastEditedAt = Optional.empty();
3947
}
4048

4149
// System-managed fields
@@ -51,14 +59,22 @@ public Optional<Instant> createdAt() {
5159
return createdAt;
5260
}
5361

54-
public String lastEditedBy() {
62+
public Optional<String> lastEditedBy() {
5563
return lastEditedBy;
5664
}
5765

58-
public Instant lastEditedAt() {
66+
public Optional<Instant> lastEditedAt() {
5967
return lastEditedAt;
6068
}
6169

70+
public String metadataLastEditedBy() {
71+
return metadataLastEditedBy;
72+
}
73+
74+
public Instant metadataLastEditedAt() {
75+
return metadataLastEditedAt;
76+
}
77+
6278
// User-managed fields
6379
public Optional<Boolean> readOnly() {
6480
return readOnly;
@@ -140,19 +156,22 @@ public static class Builder {
140156
private String version;
141157
private String createdBy;
142158
private Instant createdAt;
143-
private final String lastEditedBy;
144-
private final Instant lastEditedAt;
159+
private String lastEditedBy;
160+
private Instant lastEditedAt;
161+
private final String metadataLastEditedBy;
162+
private final Instant metadataLastEditedAt;
163+
145164
private Boolean readOnly;
146165
private JsonObject user;
147166

148167
public Builder(String userId) {
149-
this.lastEditedBy = userId;
150-
this.lastEditedAt = Instant.now();
168+
this.metadataLastEditedBy = userId;
169+
this.metadataLastEditedAt = Instant.now();
151170
}
152171

153172
public Builder(String userId, Instant lastEditedAt) {
154-
this.lastEditedBy = userId;
155-
this.lastEditedAt = lastEditedAt;
173+
this.metadataLastEditedBy = userId;
174+
this.metadataLastEditedAt = lastEditedAt;
156175
}
157176

158177
public Builder version(String version) {
@@ -170,6 +189,16 @@ public Builder createdAt(Instant createdAt) {
170189
return this;
171190
}
172191

192+
public Builder lastEditedBy(String lastEditedBy) {
193+
this.lastEditedBy = lastEditedBy;
194+
return this;
195+
}
196+
197+
public Builder lastEditedAt(Instant lastEditedAt) {
198+
this.lastEditedAt = lastEditedAt;
199+
return this;
200+
}
201+
173202
public Builder readOnly(Boolean readOnly) {
174203
this.readOnly = readOnly;
175204
return this;

workspace-server/src/main/java/gov/nasa/jpl/aerie/workspace/server/WorkspaceBindings.java

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -560,7 +560,9 @@ && checkPermissions(context, body.destinationWorkspaceId(), WorkspaceAction.writ
560560
body.destinationPath(),
561561
sourceWorkspace,
562562
body.destinationWorkspaceId(),
563-
body.overwrite());
563+
body.overwrite(),
564+
authorize(context).userId()
565+
);
564566
if(moveResults.response.getValueType() == JsonValue.ValueType.STRING) {
565567
context.status(moveResults.status).result(((JsonString) moveResults.response()).getString());
566568
} else {
@@ -576,7 +578,9 @@ && checkPermissions(context, body.destinationWorkspaceId(), WorkspaceAction.writ
576578
body.destinationPath(),
577579
sourceWorkspace,
578580
body.destinationWorkspaceId(),
579-
body.overwrite());
581+
body.overwrite(),
582+
authorize(context).userId()
583+
);
580584
if (copyResults.response.getValueType() == JsonValue.ValueType.STRING) {
581585
context.status(copyResults.status).result(((JsonString) copyResults.response()).getString());
582586
} else {
@@ -670,7 +674,8 @@ private HandlerResult handleMove(
670674
Path destinationPath,
671675
int sourceWorkspaceId,
672676
int destinationWorkspaceId,
673-
boolean overwrite
677+
boolean overwrite,
678+
String userId
674679
) throws NoSuchWorkspaceException
675680
{
676681
final var errorMsg = "Unable to move '%s' in Workspace %d to '%s' in Workspace %d."
@@ -697,7 +702,7 @@ private HandlerResult handleMove(
697702
return new HandlerResult(500, new FormattedError(errorMsg).toJson());
698703
}
699704
} else {
700-
if (workspaceService.moveFile(sourceWorkspaceId, toMove, destinationWorkspaceId, destinationPath)) {
705+
if (workspaceService.moveFile(sourceWorkspaceId, toMove, destinationWorkspaceId, destinationPath, userId)) {
701706
return new HandlerResult(200, successMsg);
702707
} else {
703708
return new HandlerResult(500, new FormattedError(errorMsg).toJson());
@@ -715,7 +720,8 @@ private HandlerResult handleCopy(
715720
Path destinationPath,
716721
int sourceWorkspaceId,
717722
int destinationWorkspaceId,
718-
boolean overwrite
723+
boolean overwrite,
724+
String userId
719725
) throws NoSuchWorkspaceException
720726
{
721727
final var errorMsg = "Unable to copy '%s' in Workspace %d to '%s' in Workspace %d."
@@ -742,7 +748,7 @@ private HandlerResult handleCopy(
742748
return new HandlerResult(500, new FormattedError(errorMsg).toJson());
743749
}
744750
} else {
745-
if (workspaceService.copyFile(sourceWorkspaceId, toCopy, destinationWorkspaceId, destinationPath)) {
751+
if (workspaceService.copyFile(sourceWorkspaceId, toCopy, destinationWorkspaceId, destinationPath, userId)) {
746752
return new HandlerResult(200, successMsg);
747753
} else {
748754
return new HandlerResult(500, new FormattedError(errorMsg).toJson());
@@ -1054,7 +1060,9 @@ && checkPermissions(context, body.destinationWorkspaceId(), WorkspaceAction.writ
10541060
items,
10551061
sourceWorkspace,
10561062
body.destinationWorkspaceId(),
1057-
body.overwrite());
1063+
body.overwrite(),
1064+
authorize(context).userId()
1065+
);
10581066
context.status(207).json(moveResults.toString());
10591067
}
10601068
case PostActions.COPY -> {
@@ -1067,7 +1075,9 @@ && checkPermissions(context, body.destinationWorkspaceId(), WorkspaceAction.writ
10671075
items,
10681076
sourceWorkspace,
10691077
body.destinationWorkspaceId(),
1070-
body.overwrite());
1078+
body.overwrite(),
1079+
authorize(context).userId()
1080+
);
10711081
context.status(207).json(copyResults.toString());
10721082
}
10731083
default -> context.status(501).json(new FormattedError("Unsupported post action: " + body.action().name()).toJson());
@@ -1078,7 +1088,8 @@ private JsonArray handleBulkMove(
10781088
List<BulkPostItem> toMove,
10791089
int sourceWorkspaceId,
10801090
int destinationWorkspaceId,
1081-
boolean overwrite
1091+
boolean overwrite,
1092+
String userId
10821093
) throws NoSuchWorkspaceException {
10831094
final var responseArray = Json.createArrayBuilder();
10841095
for(final var item : toMove){
@@ -1087,7 +1098,9 @@ private JsonArray handleBulkMove(
10871098
item.newPath(),
10881099
sourceWorkspaceId,
10891100
destinationWorkspaceId,
1090-
overwrite);
1101+
overwrite,
1102+
userId
1103+
);
10911104
final var response = Json.createObjectBuilder()
10921105
.add("item", item.currentLocation().toString())
10931106
.add("status", results.status)
@@ -1101,7 +1114,8 @@ private JsonArray handleBulkCopy(
11011114
List<BulkPostItem> toCopy,
11021115
int sourceWorkspaceId,
11031116
int destinationWorkspaceId,
1104-
boolean overwrite
1117+
boolean overwrite,
1118+
String userId
11051119
) throws NoSuchWorkspaceException {
11061120
final var responseArray = Json.createArrayBuilder();
11071121
for(final var item : toCopy) {
@@ -1110,7 +1124,9 @@ private JsonArray handleBulkCopy(
11101124
item.newPath(),
11111125
sourceWorkspaceId,
11121126
destinationWorkspaceId,
1113-
overwrite);
1127+
overwrite,
1128+
userId
1129+
);
11141130
final var response = Json.createObjectBuilder()
11151131
.add("item", item.currentLocation().toString())
11161132
.add("status", results.status)

0 commit comments

Comments
 (0)