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

refactor(datastore): storage adapters #11073

Merged
merged 2 commits into from
Mar 15, 2023

Conversation

iartemiev
Copy link
Member

@iartemiev iartemiev commented Mar 10, 2023

Description of changes

Adds an abstract base class - StorageAdapterBase that encapsulates common storage adapter business logic.
Individual storage adapters, e.g. IndexedDBStorageAdapter extend the base class and only implement platform-specific business logic

This PR migrates IndexedDB and AsyncStorage to this pattern. I would like to get a sanity check from the team on the soundness of this approach before migrating the remaining 2 adapters (SQLite and Expo SQLite)

Description of how you validated changes

  • unit tests
  • manual testing

Checklist

  • PR description included
  • yarn test passes
  • Tests are changed or added
  • Relevant documentation is changed or added (and PR referenced)

By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.

@iartemiev iartemiev requested a review from a team as a code owner March 10, 2023 17:29
@codecov-commenter
Copy link

codecov-commenter commented Mar 10, 2023

Codecov Report

Merging #11073 (8fcc68e) into main (b7f35a4) will decrease coverage by 0.08%.
The diff coverage is n/a.

📣 This organization is not using Codecov’s GitHub App Integration. We recommend you install it so Codecov can continue to function properly for your repositories. Learn more

@@            Coverage Diff             @@
##             main   #11073      +/-   ##
==========================================
- Coverage   82.24%   82.16%   -0.08%     
==========================================
  Files         193      194       +1     
  Lines       19367    19355      -12     
  Branches     4185     4204      +19     
==========================================
- Hits        15928    15903      -25     
- Misses       3151     3166      +15     
+ Partials      288      286       -2     

see 17 files with indirect coverage changes

📣 We’re building smart automated test selection to slash your CI/CD build times. Learn more

@iartemiev iartemiev force-pushed the ds-storage-adapter-refactor branch 4 times, most recently from d7d8da6 to 9c4ab94 Compare March 10, 2023 21:28
@dpilch
Copy link
Member

dpilch commented Mar 14, 2023

The approach looks sound to me. IMO it is safe to move forward with the other adapters.

I think there are some other areas to be DRYer (although I'm not sure it is worth the effort).

index 121a2bc44..aa62b9cb6 100644
--- a/packages/datastore/src/storage/adapter/AsyncStorageAdapter.ts
+++ b/packages/datastore/src/storage/adapter/AsyncStorageAdapter.ts
@@ -46,11 +46,8 @@ export class AsyncStorageAdapter extends StorageAdapterBase {
                return db;
        }
 
-       async clear(): Promise<void> {
+       async _clear(): Promise<void> {
                await this.db.clear();
-
-               this.db = undefined!;
-               this.initPromise = undefined!;
        }
 
        async batchSave<T extends PersistentModel>(
diff --git a/packages/datastore/src/storage/adapter/IndexedDBAdapter.ts b/packages/datastore/src/storage/adapter/IndexedDBAdapter.ts
index 24cca6f33..c42be7117 100644
--- a/packages/datastore/src/storage/adapter/IndexedDBAdapter.ts
+++ b/packages/datastore/src/storage/adapter/IndexedDBAdapter.ts
@@ -198,14 +198,11 @@ class IndexedDBAdapter extends StorageAdapterBase {
                return <T>result;
        }
 
-       async clear(): Promise<void> {
+       async _clear(): Promise<void> {
                await this.checkPrivate();
 
                this.db?.close();
                await idb.deleteDB(this.dbName);
-
-               this.db = undefined!;
-               this.initPromise = undefined!;
        }
 
        async save<T extends PersistentModel>(
diff --git a/packages/datastore/src/storage/adapter/StorageAdapterBase.ts b/packages/datastore/src/storage/adapter/StorageAdapterBase.ts
index bdfa56aa1..88cb2badc 100644
--- a/packages/datastore/src/storage/adapter/StorageAdapterBase.ts
+++ b/packages/datastore/src/storage/adapter/StorageAdapterBase.ts
@@ -108,7 +108,14 @@ export abstract class StorageAdapterBase implements Adapter {
         * Not enough implementation similarities between the adapters
         * to consolidate in the base class
         */
-       public abstract clear(): Promise<void>;
+       public clear(): Promise<void> {
+               return this._clear().then(() => {
+                       this.db = undefined!;
+                       this.initPromise = undefined!;
+               });
+       }
+
+       protected abstract _clear(): Promise<void>;
 
        public abstract save<T extends PersistentModel>(
                model: T,

svidgen
svidgen previously approved these changes Mar 15, 2023
Copy link
Member

@svidgen svidgen left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Setting a good direction, IMO. As we discussed offline, I think there's more we can do moving some of the delete traversal up, etc.. But, a good direction! Thanks!

@iartemiev iartemiev merged commit 485560d into aws-amplify:main Mar 15, 2023
@iartemiev iartemiev deleted the ds-storage-adapter-refactor branch March 15, 2023 17:13
cshfang added a commit to cshfang/amplify-js that referenced this pull request Mar 28, 2023
* feat(cognito): remove required domain param when create CookieStorage

* test: enable integ test

* test(cognito): update unit test

* Revert "test: enable integ test"

This reverts commit e3db965.

* feat(cognito): make cookiestorage constructor parameter optional

* chore: Docs updates (aws-amplify#11082)

* chore(release): Publish [ci skip]

 - @aws-amplify/analytics@6.0.19
 - @aws-amplify/api-graphql@3.1.7
 - @aws-amplify/api-rest@3.0.19
 - @aws-amplify/api@5.0.19
 - @aws-amplify/auth@5.1.13
 - aws-amplify@5.0.19
 - @aws-amplify/cache@5.0.19
 - @aws-amplify/core@5.1.2
 - @aws-amplify/datastore-storage-adapter@2.0.19
 - @aws-amplify/datastore@4.1.1
 - @aws-amplify/geo@2.0.19
 - @aws-amplify/interactions@5.0.19
 - @aws-amplify/notifications@1.0.19
 - @aws-amplify/predictions@5.0.19
 - @aws-amplify/pubsub@5.1.2
 - @aws-amplify/pushnotification@5.0.19
 - @aws-amplify/storage@5.1.9
 - @aws-amplify/xr@4.0.19

* chore(release): update version.ts [ci skip]

* refactor(datastore): storage adapters (aws-amplify#11073)

* chore: Docs updates (aws-amplify#11091)

* chore: Tweaked `main` pre-id. (aws-amplify#11093)

* chore(deps): bump activesupport from 6.1.7.2 to 7.0.4.3 in /docs

Bumps [activesupport](https://github.com/rails/rails) from 6.1.7.2 to 7.0.4.3.
- [Release notes](https://github.com/rails/rails/releases)
- [Changelog](https://github.com/rails/rails/blob/v7.0.4.3/activesupport/CHANGELOG.md)
- [Commits](rails/rails@v6.1.7.2...v7.0.4.3)

---
updated-dependencies:
- dependency-name: activesupport
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

* chore(release): Publish [ci skip]

 - @aws-amplify/analytics@6.0.20
 - @aws-amplify/api-graphql@3.1.8
 - @aws-amplify/api-rest@3.0.20
 - @aws-amplify/api@5.0.20
 - @aws-amplify/auth@5.1.14
 - aws-amplify@5.0.20
 - @aws-amplify/cache@5.0.20
 - @aws-amplify/core@5.1.3
 - @aws-amplify/datastore-storage-adapter@2.0.20
 - @aws-amplify/datastore@4.1.2
 - @aws-amplify/geo@2.0.20
 - @aws-amplify/interactions@5.0.20
 - @aws-amplify/notifications@1.0.20
 - @aws-amplify/predictions@5.0.20
 - @aws-amplify/pubsub@5.1.3
 - @aws-amplify/pushnotification@5.0.20
 - @aws-amplify/storage@5.1.10
 - @aws-amplify/xr@4.0.20

* chore(release): update version.ts [ci skip]

* chore(@aws-amplify/datastore): initial decomposition of test helpers (aws-amplify#11096)

* moved test helpers to folder

* first pass, rough decomposition of test helpers file

* added readme for helpers

* test helpers readme typo

* Update packages/datastore/__tests__/helpers/README.md

Co-authored-by: Ivan Artemiev <29709626+iartemiev@users.noreply.github.com>

---------

Co-authored-by: Ivan Artemiev <29709626+iartemiev@users.noreply.github.com>

* fix: add warning message when trying to use SQLite with CPK enabled (aws-amplify#11027)

* fix(data): update SQLite utils to use 'instr' instead of 'like' when constructing WHERE conditions from predicates (aws-amplify#11108)

* chore: Docs updates (aws-amplify#11111)

* docs(cognito): excluding subdomains when domain cookie attr is omitted

* chore(release): Publish [ci skip]

 - @aws-amplify/analytics@6.0.21
 - @aws-amplify/api-graphql@3.1.9
 - @aws-amplify/api-rest@3.0.21
 - @aws-amplify/api@5.0.21
 - @aws-amplify/auth@5.1.15
 - aws-amplify@5.0.21
 - @aws-amplify/cache@5.0.21
 - @aws-amplify/core@5.1.4
 - @aws-amplify/datastore-storage-adapter@2.0.21
 - @aws-amplify/datastore@4.1.3
 - @aws-amplify/geo@2.0.21
 - @aws-amplify/interactions@5.0.21
 - @aws-amplify/notifications@1.0.21
 - @aws-amplify/predictions@5.0.21
 - @aws-amplify/pubsub@5.1.4
 - @aws-amplify/pushnotification@5.0.21
 - @aws-amplify/storage@5.1.11
 - @aws-amplify/xr@4.0.21

* chore(release): update version.ts [ci skip]

* test: increase coverage for delete connection by model field (aws-amplify#11099)

* Update config.yml

Removes `Usage Question` link that sends users to an old 404 page for discussions

* fix(datastore): stale observeQuery snapshot with sort param (aws-amplify#11119)

* chore(notifications): Integrate refactored Android common utils

* chore: Docs updates

* Update config.yml

Switched usage question to point at discord rather than deleting it

* chore(release): Publish [ci skip]

 - amazon-cognito-identity-js@6.2.0
 - @aws-amplify/analytics@6.0.22
 - @aws-amplify/api-graphql@3.1.10
 - @aws-amplify/api-rest@3.0.22
 - @aws-amplify/api@5.0.22
 - @aws-amplify/auth@5.2.0
 - aws-amplify@5.0.22
 - @aws-amplify/cache@5.0.22
 - @aws-amplify/core@5.1.5
 - @aws-amplify/datastore-storage-adapter@2.0.22
 - @aws-amplify/datastore@4.1.4
 - @aws-amplify/geo@2.0.22
 - @aws-amplify/interactions@5.0.22
 - @aws-amplify/notifications@1.0.22
 - @aws-amplify/predictions@5.0.22
 - @aws-amplify/pubsub@5.1.5
 - @aws-amplify/pushnotification@5.0.22
 - @aws-amplify/storage@5.1.12
 - @aws-amplify/xr@4.0.22

* chore(release): update version.ts [ci skip]

* fix(@aws-amplify/datastore): mutation hub event drops during reconnect (aws-amplify#11132)

* fix(@aws-amplify/datastore): fixes mutation hub event dropped during races with reconnect

* add explicit observer completion, expanded test coverage

* fix(@aws-amplify/datastore): adds serialization for empty predicates (aws-amplify#11133)

adds serialization for empty predicates

* test(notifications): Add native Android unit tests (aws-amplify#11139)

* test(notifications): Add native Android unit tests

* Disable android tests from being automatically run in CI

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Allan Zheng <zheallan@amazon.com>
Co-authored-by: aws-amplify-bot <aws@amazon.com>
Co-authored-by: Ivan Artemiev <29709626+iartemiev@users.noreply.github.com>
Co-authored-by: Jim Blanchard <jim.l.blanchard@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Jon Wire <iambipedal@gmail.com>
Co-authored-by: Dane Pilcher <dppilche@amazon.com>
Co-authored-by: David McAfee <mcafd@amazon.com>
Co-authored-by: Olya Balashova <42189299+helgabalashova@users.noreply.github.com>
Co-authored-by: Bannon Tanner <bannonta@amazon.com>
Co-authored-by: helgabalashova <helga.stolyarova@gmail.com>
Co-authored-by: Aaron S <94858815+stocaaro@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants