Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(datastore): remove typename from ModelMetadata #2122

Merged
merged 36 commits into from Nov 23, 2022
Merged
Show file tree
Hide file tree
Changes from 21 commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
41d6bf4
fix(datastore): remove typename from ModelMetadata
lawmicha Nov 2, 2022
eae9cb0
Test a potential fix
mikschn-aws Nov 17, 2022
4e80b0c
Test a potential fix
mikschn-aws Nov 17, 2022
587826e
fix: callbacks not invoked when attached using getTransfer api (#2111)
sdhuka Nov 15, 2022
4a8b65f
Prevent attempting to read backed up EncryptedSharedPreferences that …
tylerjroach Nov 15, 2022
f719338
fix(auth): device metadata migration (#2114)
div5yesh Nov 15, 2022
ce66096
Number of attributes being too high is not retryable (#2112)
tjleing Nov 16, 2022
51d0492
Change errors returned on some apis while federated (#2116)
tylerjroach Nov 16, 2022
73df9a3
release: Amplify Android 2.0.0 (#2115)
sktimalsina Nov 16, 2022
009d069
fix(datastore): remove typename from ModelMetadata
lawmicha Nov 2, 2022
2d6bf49
fix(datastore): remove typename from ModelMetadata
lawmicha Nov 2, 2022
a5591e5
Merge branch 'mikschn/fix-remove-typename' of https://github.com/aws-…
mikschn-aws Nov 18, 2022
dd79133
remove unneeded file
mikschn-aws Nov 18, 2022
8304c30
Merge branch 'main' into mikschn/fix-remove-typename
mikepschneider Nov 19, 2022
b56bf68
small cleanup
mikschn-aws Nov 19, 2022
1b51d27
remove print statements
mikschn-aws Nov 19, 2022
82c9c65
fix comment
mikschn-aws Nov 21, 2022
43bcfcd
force tests
mikschn-aws Nov 21, 2022
312e508
force tests
mikschn-aws Nov 22, 2022
e3bf22d
force tests
mikschn-aws Nov 22, 2022
f553c52
Merge branch 'main' into mikschn/fix-remove-typename
mikepschneider Nov 22, 2022
070ce3a
fix(datastore): remove typename from ModelMetadata
lawmicha Nov 2, 2022
3f0098c
force tests
mikschn-aws Nov 21, 2022
6ce1c48
force tests
mikschn-aws Nov 22, 2022
c52f450
force tests
mikschn-aws Nov 22, 2022
e581ebf
fix merge errors
mikschn-aws Nov 23, 2022
05a3942
Merge fix
mikschn-aws Nov 17, 2022
bb262f5
small cleanup
mikschn-aws Nov 19, 2022
937ae62
remove print statements
mikschn-aws Nov 19, 2022
8e16f77
force tests
mikschn-aws Nov 21, 2022
04853c4
force tests
mikschn-aws Nov 22, 2022
8fa7019
force tests
mikschn-aws Nov 22, 2022
fed2a36
remove file which should not be checked in
mikschn-aws Nov 23, 2022
13088cd
force tests
mikschn-aws Nov 23, 2022
7f256a9
fix typo
mikschn-aws Nov 23, 2022
2bc6be3
fix typos
mikschn-aws Nov 23, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -39,27 +39,23 @@ public final class ModelMetadata implements Model {
private final @ModelField(targetType = "Boolean") Boolean _deleted;
private final @ModelField(targetType = "Int") Integer _version;
private final @ModelField(targetType = "AWSTimestamp") Temporal.Timestamp _lastChangedAt;
private final @ModelField(targetType = "String") String __typename;

/**
* Constructor for this metadata model.
* @param id The identifier of the object this is holding the metadata for (also this object's own identifier)
* @param deleted Whether this object was deleted since the last sync time specified
* @param version What version this object was last seen at
* @param lastChangedAt When was this object last changed
* @param typename The type name of the model.
*/
public ModelMetadata(
@NonNull String id,
@Nullable Boolean deleted,
@Nullable Integer version,
@Nullable Temporal.Timestamp lastChangedAt,
@Nullable String typename) {
@Nullable Temporal.Timestamp lastChangedAt) {
this.id = Objects.requireNonNull(id);
this._deleted = deleted;
this._version = version;
this._lastChangedAt = lastChangedAt;
this.__typename = typename;
}

/**
Expand Down Expand Up @@ -95,7 +91,7 @@ public Integer getVersion() {
*/
@Nullable
public String getTypename() {
return __typename;
return id.split("\\|")[0];
}

/**
Expand Down Expand Up @@ -136,7 +132,6 @@ public int hashCode() {
result = 31 * result + (_deleted != null ? _deleted.hashCode() : 0);
result = 31 * result + (_version != null ? _version.hashCode() : 0);
result = 31 * result + (_lastChangedAt != null ? _lastChangedAt.hashCode() : 0);
result = 31 * result + (__typename != null ? __typename.hashCode() : 0);
return result;
}

Expand All @@ -147,7 +142,6 @@ public String toString() {
", _deleted=" + _deleted +
", _version=" + _version +
", _lastChangedAt=" + _lastChangedAt +
", __typename=" + __typename +
'}';
}
}
Expand Up @@ -42,7 +42,7 @@ public ModelWithMetadata(@NonNull M model, @NonNull ModelMetadata syncMetadata)
this.syncMetadata = new ModelMetadata(model.getModelName() + "|" + model.getPrimaryKeyString(),
syncMetadata.isDeleted(),
syncMetadata.getVersion(),
syncMetadata.getLastChangedAt(), syncMetadata.getTypename());
syncMetadata.getLastChangedAt());
}

/**
Expand Down
Expand Up @@ -117,10 +117,14 @@ public JsonElement serialize(
// Flatten out the fields of the model and its metadata into a flat key-value map.
// To do this, serialize each individually, and then add the key/value pairs for each
// object into a new container.
JsonObject serializedMetadata = (JsonObject) context.serialize(src.getSyncMetadata());
ModelMetadata modelMetadata = src.getSyncMetadata();
JsonObject serializedMetadata = (JsonObject) context.serialize(modelMetadata);
for (Map.Entry<java.lang.String, JsonElement> entry : serializedMetadata.entrySet()) {
result.add(entry.getKey(), entry.getValue());
}
// Additionally serialize the stored model name as the typename, mirroring the deserialization process.
result.addProperty(TYPE_NAME, modelMetadata.getTypename());

JsonObject serializedModel = (JsonObject) context.serialize(src.getModel());
for (Map.Entry<java.lang.String, JsonElement> entry : serializedModel.entrySet()) {
result.add(entry.getKey(), entry.getValue());
Expand Down
Expand Up @@ -68,7 +68,7 @@ public void setup() {
public void adapterCanSerializeMwm() throws JSONException {
Temporal.Timestamp lastChangedAt = Temporal.Timestamp.now();
String modelId = UUID.randomUUID().toString();
ModelMetadata metadata = new ModelMetadata(modelId, false, 4, lastChangedAt, "BlogOwner");
ModelMetadata metadata = new ModelMetadata(modelId, false, 4, lastChangedAt);
BlogOwner model = BlogOwner.builder()
.name("Blog Owner")
.build();
Expand All @@ -80,7 +80,7 @@ public void adapterCanSerializeMwm() throws JSONException {
.put("_lastChangedAt", metadata.getLastChangedAt().getSecondsSinceEpoch())
.put("_deleted", metadata.isDeleted())
.put("_version", metadata.getVersion())
.put("__typename", metadata.getTypename())
.put("__typename", mwm.getSyncMetadata().getTypename())
.toString();
String actual = gson.toJson(mwm);
JSONAssert.assertEquals(expected, actual, true);
Expand All @@ -97,7 +97,7 @@ public void adapterCanDeserializeJsonIntoMwm() {
.id("45a5f600-8aa8-41ac-a529-aed75036f5be")
.build();
Temporal.Timestamp lastChangedAt = new Temporal.Timestamp(1594858827, TimeUnit.SECONDS);
ModelMetadata metadata = new ModelMetadata(model.getId(), false, 3, lastChangedAt, model.getModelName());
ModelMetadata metadata = new ModelMetadata(model.getId(), false, 3, lastChangedAt);
ModelWithMetadata<BlogOwner> expected = new ModelWithMetadata<>(model, metadata);

// Arrange some JSON, and then try to deserialize it
Expand Down Expand Up @@ -133,15 +133,14 @@ public void adapterCanDeserializeJsonOfSerializedModelIntoMwm() throws AmplifyEx
.serializedData(postSerializedData)
.build();
Temporal.Timestamp lastChangedAt = new Temporal.Timestamp(1594858827, TimeUnit.SECONDS);
ModelMetadata metadata = new ModelMetadata(model.getPrimaryKeyString(), false, 3, lastChangedAt,
model.getModelName());
ModelMetadata metadata = new ModelMetadata(model.getPrimaryKeyString(), false, 3, lastChangedAt);
ModelWithMetadata<SerializedModel> expected = new ModelWithMetadata<>(model, metadata);

// Arrange some JSON, and then try to deserialize it
String json = Resources.readAsString("serialized-model-with-metadata.json");
Type type = TypeMaker.getParameterizedType(ModelWithMetadata.class, SerializedModel.class);
ModelWithMetadata<SerializedModel> actual = gson.fromJson(json, type);

// Assert that the deserialized output matches out expected value
Assert.assertEquals(expected, actual);
}
Expand Down
Expand Up @@ -231,8 +231,7 @@ public void clearStopsSyncAndDeletesDatabase() throws AmplifyException, JSONExce
int indexOfResponseConsumer = 1;
Consumer<GraphQLResponse<ModelWithMetadata<Person>>> onResponse =
invocation.getArgument(indexOfResponseConsumer);
ModelMetadata modelMetadata = new ModelMetadata(person1.getId(), false, 1, Temporal.Timestamp.now(),
"Person");
ModelMetadata modelMetadata = new ModelMetadata(person1.getId(), false, 1, Temporal.Timestamp.now());
ModelWithMetadata<Person> modelWithMetadata = new ModelWithMetadata<>(person1, modelMetadata);
onResponse.accept(new GraphQLResponse<>(modelWithMetadata, Collections.emptyList()));
return mock(GraphQLOperation.class);
Expand All @@ -256,7 +255,7 @@ public void clearStopsSyncAndDeletesDatabase() throws AmplifyException, JSONExce
Consumer<GraphQLResponse<ModelWithMetadata<Person>>> onResponse =
invocation.getArgument(indexOfResponseConsumer);
ModelMetadata modelMetadata = new ModelMetadata(person2.getId(), false, 1,
Temporal.Timestamp.now(), "Person");
Temporal.Timestamp.now());
ModelWithMetadata<Person> modelWithMetadata = new ModelWithMetadata<>(person2, modelMetadata);
onResponse.accept(new GraphQLResponse<>(modelWithMetadata, Collections.emptyList()));
return mock(GraphQLOperation.class);
Expand Down Expand Up @@ -325,7 +324,7 @@ public void stopStopsSyncUntilNextInteraction() throws AmplifyException, JSONExc
Consumer<GraphQLResponse<ModelWithMetadata<Person>>> onResponse =
invocation.getArgument(indexOfResponseConsumer);
ModelMetadata modelMetadata = new ModelMetadata(person1.getPrimaryKeyString(), false, 1,
Temporal.Timestamp.now(), "Person");
Temporal.Timestamp.now());
ModelWithMetadata<Person> modelWithMetadata = new ModelWithMetadata<>(person1, modelMetadata);
onResponse.accept(new GraphQLResponse<>(modelWithMetadata, Collections.emptyList()));
return mock(GraphQLOperation.class);
Expand All @@ -349,7 +348,7 @@ public void stopStopsSyncUntilNextInteraction() throws AmplifyException, JSONExc
Consumer<GraphQLResponse<ModelWithMetadata<Person>>> onResponse =
invocation.getArgument(indexOfResponseConsumer);
ModelMetadata modelMetadata = new ModelMetadata(person2.getPrimaryKeyString(), false, 1,
Temporal.Timestamp.now(), "Person");
Temporal.Timestamp.now());
ModelWithMetadata<Person> modelWithMetadata = new ModelWithMetadata<>(person2, modelMetadata);
onResponse.accept(new GraphQLResponse<>(modelWithMetadata, Collections.emptyList()));
return mock(GraphQLOperation.class);
Expand Down
Expand Up @@ -191,8 +191,7 @@ private Person setupApiMock(CountDownLatch latch, ApiCategory mockApiCategory) {
int indexOfResponseConsumer = 1;
Consumer<GraphQLResponse<ModelWithMetadata<Person>>> onResponse =
invocation.getArgument(indexOfResponseConsumer);
ModelMetadata modelMetadata = new ModelMetadata(person1.getId(), false, 1, Temporal.Timestamp.now(),
"Person");
ModelMetadata modelMetadata = new ModelMetadata(person1.getId(), false, 1, Temporal.Timestamp.now());
ModelWithMetadata<Person> modelWithMetadata = new ModelWithMetadata<>(person1, modelMetadata);
onResponse.accept(new GraphQLResponse<>(modelWithMetadata, Collections.emptyList()));
verify(mockApiCategory, atLeast(2)).mutate(argThat(getMatcherFor(person1)),
Expand All @@ -207,7 +206,7 @@ private Person setupApiMock(CountDownLatch latch, ApiCategory mockApiCategory) {
doAnswer(invocation -> {
int indexOfResponseConsumer = 1;
ModelMetadata modelMetadata = new ModelMetadata(person1.getId(), false, 1,
Temporal.Timestamp.now(), "Person");
Temporal.Timestamp.now());
ModelWithMetadata<Person> modelWithMetadata = new ModelWithMetadata<>(person1, modelMetadata);
// Mock the API emitting an ApiEndpointStatusChangeEvent event.
Consumer<GraphQLResponse<PaginatedResult<ModelWithMetadata<Person>>>> onResponse =
Expand All @@ -221,7 +220,7 @@ private Person setupApiMock(CountDownLatch latch, ApiCategory mockApiCategory) {
}).doAnswer(invocation -> {
int indexOfResponseConsumer = 1;
Car car = Car.builder().build();
ModelMetadata modelMetadata = new ModelMetadata(car.getId(), false, 1, Temporal.Timestamp.now(), "Person");
ModelMetadata modelMetadata = new ModelMetadata(car.getId(), false, 1, Temporal.Timestamp.now());
ModelWithMetadata<Car> modelWithMetadata = new ModelWithMetadata<>(car, modelMetadata);
Consumer<GraphQLResponse<PaginatedResult<ModelWithMetadata<Car>>>> onResponse =
invocation.getArgument(indexOfResponseConsumer);
Expand Down
Expand Up @@ -167,8 +167,7 @@ private Person setupApiMock(CountDownLatch latch, ApiCategory mockApiCategory) {
int indexOfResponseConsumer = 1;
Consumer<GraphQLResponse<ModelWithMetadata<Person>>> onResponse =
invocation.getArgument(indexOfResponseConsumer);
ModelMetadata modelMetadata = new ModelMetadata(person1.getId(), false, 1, Temporal.Timestamp.now(),
"Person");
ModelMetadata modelMetadata = new ModelMetadata(person1.getId(), false, 1, Temporal.Timestamp.now());
ModelWithMetadata<Person> modelWithMetadata = new ModelWithMetadata<>(person1, modelMetadata);
onResponse.accept(new GraphQLResponse<>(modelWithMetadata, Collections.emptyList()));
verify(mockApiCategory, atLeast(2)).mutate(argThat(getMatcherFor(person1)),
Expand All @@ -183,7 +182,7 @@ private Person setupApiMock(CountDownLatch latch, ApiCategory mockApiCategory) {
doAnswer(invocation -> {
int indexOfResponseConsumer = 1;
ModelMetadata modelMetadata = new ModelMetadata(person1.getId(), false, 1,
Temporal.Timestamp.now(), "Person");
Temporal.Timestamp.now());
ModelWithMetadata<Person> modelWithMetadata = new ModelWithMetadata<>(person1, modelMetadata);
// Mock the API emitting an ApiEndpointStatusChangeEvent event.
Consumer<GraphQLResponse<PaginatedResult<ModelWithMetadata<Person>>>> onResponse =
Expand All @@ -197,7 +196,7 @@ private Person setupApiMock(CountDownLatch latch, ApiCategory mockApiCategory) {
}).doAnswer(invocation -> {
int indexOfResponseConsumer = 1;
Car car = Car.builder().build();
ModelMetadata modelMetadata = new ModelMetadata(car.getId(), false, 1, Temporal.Timestamp.now(), "Person");
ModelMetadata modelMetadata = new ModelMetadata(car.getId(), false, 1, Temporal.Timestamp.now());
ModelWithMetadata<Car> modelWithMetadata = new ModelWithMetadata<>(car, modelMetadata);
Consumer<GraphQLResponse<PaginatedResult<ModelWithMetadata<Car>>>> onResponse =
invocation.getArgument(indexOfResponseConsumer);
Expand Down
Expand Up @@ -38,7 +38,7 @@ public void createUnhandledConflictError() {
.name("Blogger Tony")
.build();
Temporal.Timestamp lastChangedAt = new Temporal.Timestamp(1602732606L, TimeUnit.SECONDS);
ModelMetadata metadata = new ModelMetadata(model.getPrimaryKeyString(), true, 6, lastChangedAt, "BlogOwner");
ModelMetadata metadata = new ModelMetadata(model.getPrimaryKeyString(), true, 6, lastChangedAt);
ModelWithMetadata<BlogOwner> serverData = new ModelWithMetadata<>(model, metadata);
AppSyncConflictUnhandledError<BlogOwner> error =
AppSyncConflictUnhandledErrorFactory.createUnhandledConflictError(serverData);
Expand Down
Expand Up @@ -124,7 +124,7 @@ public void conflictErrorExtractedIfPresent() {
assertEquals(
new ModelWithMetadata<>(
new Note("KoolId22", "Resurecting the dataz"),
new ModelMetadata("KoolId22", true, 7, lastChangedAt, "Note")
new ModelMetadata("KoolId22", true, 7, lastChangedAt)
),
conflictUnhandledError.getServerVersion()
);
Expand Down
Expand Up @@ -204,8 +204,7 @@ public <T extends Model> CreateConfigurator mockSuccessResponse(
*/
@NonNull
public <T extends Model> CreateConfigurator mockSuccessResponse(@NonNull T model) {
ModelMetadata metadata = new ModelMetadata(model.getPrimaryKeyString(), false, 1, Temporal.Timestamp.now(),
model.getModelName());
ModelMetadata metadata = new ModelMetadata(model.getPrimaryKeyString(), false, 1, Temporal.Timestamp.now());
ModelWithMetadata<T> modelWithMetadata = new ModelWithMetadata<>(model, metadata);
return mockSuccessResponse(model, modelWithMetadata);
}
Expand Down Expand Up @@ -313,7 +312,7 @@ public <T extends Model> UpdateConfigurator mockSuccessResponse(
public <T extends Model> UpdateConfigurator mockSuccessResponse(@NonNull T model, int version) {
Temporal.Timestamp lastChangedAt = Temporal.Timestamp.now();
ModelMetadata metadata = new ModelMetadata(model.getPrimaryKeyString(), false, version + 1,
lastChangedAt, model.getModelName());
lastChangedAt);
ModelWithMetadata<T> modelWithMetadata = new ModelWithMetadata<>(model, metadata);
return mockSuccessResponse(model, version, modelWithMetadata);
}
Expand Down Expand Up @@ -426,7 +425,7 @@ public <T extends Model> DeleteConfigurator mockSuccessResponse(
public <T extends Model> DeleteConfigurator mockSuccessResponse(@NonNull T model, int version) {
Temporal.Timestamp lastChangedAt = Temporal.Timestamp.now();
ModelMetadata metadata = new ModelMetadata(model.getPrimaryKeyString(), true, version + 1,
lastChangedAt, model.getModelName());
lastChangedAt);
ModelWithMetadata<T> modelWithMetadata = new ModelWithMetadata<>(model, metadata);
return mockSuccessResponse(model, version, modelWithMetadata);
}
Expand Down
Expand Up @@ -170,7 +170,7 @@ public void mockErrorResponseForCreate() {
public void mockSuccessResponseForUpdate() {
ModelMetadata updatedMetadata =
new ModelMetadata(StrawMen.TONY_MODEL.getPrimaryKeyString(), false, 2, StrawMen.JOE_METADATA
.getLastChangedAt(), StrawMen.TONY_MODEL.getModelName());
.getLastChangedAt());
ModelWithMetadata<BlogOwner> tonyWithUpdatedMetadata =
new ModelWithMetadata<>(StrawMen.TONY_MODEL, updatedMetadata);
AppSyncMocking.update(appSync)
Expand Down Expand Up @@ -218,7 +218,7 @@ public void mockErrorResponseForUpdate() {
public void mockSuccessResponseForDelete() {
ModelMetadata deletedMetadata =
new ModelMetadata(StrawMen.TONY_MODEL.getPrimaryKeyString(), true, 2,
StrawMen.JOE_METADATA.getLastChangedAt(), StrawMen.TONY_MODEL.getModelName());
StrawMen.JOE_METADATA.getLastChangedAt());
ModelWithMetadata<BlogOwner> tonyWithDeleteMetadata =
new ModelWithMetadata<>(StrawMen.TONY_MODEL, deletedMetadata);
AppSyncMocking.delete(appSync)
Expand Down Expand Up @@ -335,17 +335,15 @@ static final class StrawMen {
.name("Joe")
.build();
static final ModelMetadata JOE_METADATA =
new ModelMetadata(JOE_MODEL.getPrimaryKeyString(), false, 1, Temporal.Timestamp.now(),
JOE_MODEL.getModelName());
new ModelMetadata(JOE_MODEL.getPrimaryKeyString(), false, 1, Temporal.Timestamp.now());
static final ModelWithMetadata<BlogOwner> JOE =
new ModelWithMetadata<>(JOE_MODEL, JOE_METADATA);

static final BlogOwner TONY_MODEL = BlogOwner.builder()
.name("Tony")
.build();
static final ModelMetadata TONY_METADATA =
new ModelMetadata(TONY_MODEL.getPrimaryKeyString(), false, 1, Temporal.Timestamp.now(),
TONY_MODEL.getModelName());
new ModelMetadata(TONY_MODEL.getPrimaryKeyString(), false, 1, Temporal.Timestamp.now());
static final ModelWithMetadata<BlogOwner> TONY =
new ModelWithMetadata<>(TONY_MODEL, TONY_METADATA);

Expand Down
Expand Up @@ -422,8 +422,6 @@ public void validateMutationGenerationOnCreateItemWithCustomForeignKeyAndSortKey
ModelSchema schema = ModelSchema.fromModelClass(OtherBlog.class);
String expected = Resources.readAsString("create-other-blog.txt");
String actual = AppSyncRequestFactory.buildCreationRequest(schema, blog, DEFAULT_STRATEGY).getContent();
System.out.println(" Actual: " + actual);
System.out.println("Expected: " + expected);
JSONAssert.assertEquals(
expected,
actual,
Expand Down