-
Notifications
You must be signed in to change notification settings - Fork 111
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
[PAY-2597] Test migration of a single endpoint from apiclient -> SDK #8091
Conversation
|
@@ -100,3 +109,54 @@ export type UserMultihash = Pick< | |||
User, | |||
'metadata_multihash' | 'creator_node_endpoint' | |||
> | |||
|
|||
/** Converts a SDK `full.UserFull` response to a UserMetadata. Note: Will _not_ include the "current user" fields as those aren't returned by the Users API */ | |||
export const userMetadataFromSDK = ( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Open to debate on this pattern. I'm considering just writing zod schemas and using those to parse here instead.
The goal is to transform a SDK object into the model we have here so that calls to a migrated endpoint return the exact same shape as the previous AudiusAPIClient call. We can do another pass later to decide if we want to start using SDK types directly.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is it possible to use some of the code here?
Like I was able to here in this similar migration: https://github.com/AudiusProject/audius-protocol/pull/7679/files#diff-6e3ceda6d3e1ae1c8d1a863361c7a1f157a166bf822833689bb2e1ebc88f487fR117
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I started with that approach and abandoned it for a few reasons:
- Input to response adapters requires objects that are the same shape as the models defined for APIClient, which differs from what is returned by SDK (mostly do to the undefined vs. null issue).
- The ResponseAdapter has logic to default initialize number fields, which the SDK types say will always have valid values. So I think this caught some unnecessary logic in our response adapters.
- I was hoping that part of the SDK migration would be removing ResponseAdapters in favor of the model classes having local functions meant to initialize an instance.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fair enough! I think #3 is something I would generally agree with, but that will also be a decent tack on of work
Preview this change https://demo.audius.co/rs-migrate-api-client |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is a very "safe" way of going about this, which I think is good because we are going to be touching so much surface area.
In a way it feels like we are taking something really polished and trying to fit it onto something unpolished. Perhaps ripping the bandaid off so to speak would be less time consuming.
But I'm definitely on board with your approach because it's the only way we will have any sense of certainty if things broke
packages/common/package.json
Outdated
@@ -48,6 +48,7 @@ | |||
"async-retry": "1.3.3", | |||
"bn.js": "5.1.0", | |||
"dayjs": "1.10.7", | |||
"deep-object-diff": "^1.1.9", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
📍
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ah thanks for the reminder
|
||
export type UserMetadata = { | ||
album_count: number | ||
allow_ai_attribution?: boolean | ||
artist_pick_track_id: Nullable<number> | ||
bio: Nullable<string> | ||
blocknumber: number | ||
collectibleList?: Collectible[] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I've been wondering if we should make a lint rule for object key alphabetization
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I would certainly appreciate that. Our models are often kind of hard to read through.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
+1
`DIFF ${apiName} FAILED. Migrated response was error: `, | ||
migrated | ||
) | ||
} else if (migrated == null) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Could there be cases where the legacy response is null?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oops I had thought that apiclient guaranteed a value. But you're right, there is at least one function that could return null/undefined. So I'll update this to do a direct comparison for things which are not an instance of object/array
I hear you and appreciate the perspective. This pattern is also going to be used for the AudiusBackend part of things where it's not so straightforward. It is a little bit more upfront work than just migrating things. But given that we have no existing tests and so many edge cases in how data gets returned (some things are optional/nullable and only used by a portion of users), this feels like a better way to get a signal on safety of a migration. |
Preview this change https://demo.audius.co/rs-migrate-api-client |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I do agree w/ @sliptype that this is a heavy weight approach, more than I would personally advocate for. But, all good with me. Let's be careful that it doesn't end up giving us false positives. part of the migration may actually help us discovery other data inconsistencies.
|
||
export type UserMetadata = { | ||
album_count: number | ||
allow_ai_attribution?: boolean | ||
artist_pick_track_id: Nullable<number> | ||
bio: Nullable<string> | ||
blocknumber: number | ||
collectibleList?: Collectible[] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
+1
@@ -100,3 +109,54 @@ export type UserMultihash = Pick< | |||
User, | |||
'metadata_multihash' | 'creator_node_endpoint' | |||
> | |||
|
|||
/** Converts a SDK `full.UserFull` response to a UserMetadata. Note: Will _not_ include the "current user" fields as those aren't returned by the Users API */ | |||
export const userMetadataFromSDK = ( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is it possible to use some of the code here?
Like I was able to here in this similar migration: https://github.com/AudiusProject/audius-protocol/pull/7679/files#diff-6e3ceda6d3e1ae1c8d1a863361c7a1f157a166bf822833689bb2e1ebc88f487fR117
} | ||
// Both object-like, perform deep diff | ||
if (typeof legacy === 'object' && typeof migrated === 'object') { | ||
const diffValue = detailedDiff(legacy, migrated) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
we can just use lodash here instead right? isEqual
performs deep comparison and we aren't using the added/deleted/updated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If we just want a "are they both equal" approach, yes very true.
There's an updated implementation of this, but the short answer is that those fields are used in examining what is actually different between two responses vs. having to hunt through them property by property on every level to determine what the difference is. They just aren't used programmatically.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
yeah... if they aren't used programmatically though, I don't think the future reader would understand why. Don't love adding another package just for this (600 bytes is small, fair enough). can we report it to sentry? or keep it in as a debug tool? or add some console.debugs?
just trying to be devil's advocate in a world where decreasing bundle size is a big goal
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I appreciate it! We do send the diff up to sentry now. That was a change I added after opening the PR
|
* origin/main: (24 commits) Fix missing isTrack dependency (lint change) (#8096) ddex: limit publisher to 3 retries (#8062) Bump version to 0.6.80 remove unused import (#8098) [C-4268] Fix player sagas prev functionality for premium track previews (#8094) Disable play e2e test (#8095) [PAY-2652] Album purchase/sale notifications (#8085) [DVRL-25] - Using Wallet Connect on the Protocol Dashboard (#8089) [C-4252] Update search screen navigation to clear search on mobile (#8092) Unrevert fetch-nft (#8080) PROTO-1711: acdc tip notification reactions (#8026) Bump version to 0.6.79 [C-4226] Remove lossless toggle in upload flow and download section on track (#8083) [PAY-2677] Retries for Discovery Solana Relay (#8087) [PAY-2684] Fix wrap on audio wallet actions (#8073) [PAY-2685] Render TrackAddedToPurchasedAlbumNotification on mobile (#8084) [PAY-2585] Premium album edit feature (#8071) Standardize ddex envs to work with audius-docker-compose better (#8078) [PROTO-1754] Fix DDEX albums being editable, fields not persisting (#8077) [C-4260] Improve icon a11y (#8075) ...
|
GitGuardian id | GitGuardian status | Secret | Commit | Filename | |
---|---|---|---|---|---|
8818104 | Triggered | Generic High Entropy Secret | 835c9ed | packages/embed/.env.dev | View secret |
8818104 | Triggered | Generic High Entropy Secret | 835c9ed | packages/embed/.env.stage | View secret |
8818104 | Triggered | Generic High Entropy Secret | 835c9ed | packages/embed/.env.prod | View secret |
🛠 Guidelines to remediate hardcoded secrets
- Understand the implications of revoking this secret by investigating where it is used in your code.
- Replace and store your secrets safely. Learn here the best practices.
- Revoke and rotate these secrets.
- If possible, rewrite git history. Rewriting git history is not a trivial act. You might completely break other contributing developers' workflow and you risk accidentally deleting legitimate data.
To avoid such incidents in the future consider
- following these best practices for managing and storing secrets including API keys and other credentials
- install secret detection on pre-commit to catch secret before it leaves your machine and ease remediation.
🦉 GitGuardian detects secrets in your source code to help developers and security teams secure the modern development process. You are seeing this because you or someone else with access to this repository has authorized GitGuardian to scan your pull request.
Our GitHub checks need improvements? Share your feedbacks!
Preview this change https://demo.audius.co/rs-migrate-api-client |
} | ||
} | ||
// Not object like, perform strict equals | ||
if (legacy !== migrated) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
should this be an else if
? don't we only want to do strict equals if they're not objects?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oh jeez, I definitely happy-pathed this function. Good catch.
Preview this change https://demo.audius.co/rs-migrate-api-client |
Preview this change https://demo.audius.co/rs-migrate-api-client |
Preview this change https://demo.audius.co/rs-migrate-api-client |
Preview this change https://demo.audius.co/rs-migrate-api-client |
* origin/main: (167 commits) Use docker image tags to control versioning (#8103) [C-3949] Fix infinite library bug (#8107) ACDC tip notifs: encode hash id (#8101) [PAY-2597] Test migration of a single endpoint from apiclient -> SDK (#8091) Fix preview start and end point parsing (#8106) [PROTO-1515] Hide modification buttons for ddex tracks and albums (#8097) Bump version to 0.6.81 v1.5.76 [PAY-2689] Send tips via SDK (behind feature flag) (#8090) require handle_lc in users query (#8102) [PAY-2687] E2E tests for premium album edits (#8082) Fix missing isTrack dependency (lint change) (#8096) ddex: limit publisher to 3 retries (#8062) Bump version to 0.6.80 remove unused import (#8098) [C-4268] Fix player sagas prev functionality for premium track previews (#8094) Disable play e2e test (#8095) [PAY-2652] Album purchase/sale notifications (#8085) [DVRL-25] - Using Wallet Connect on the Protocol Dashboard (#8089) [C-4252] Update search screen navigation to clear search on mobile (#8092) ...
[eca7b4e] [PAY-2698] Add purchase button do album DMs (mobile) (#8134) Andrew Mendelsohn [283163b] Upgrade native version to 1.1.94 (#8137) Dylan Jeffers [863aed6] [INF-690] Delete sdk release job (#8130) Sebastian Klingler [296c98c] [C-4279] Don't log not found errors to sentry (#8131) Andrew Mendelsohn [e362ec7] [PAY-2617] Buy button for tracklist in albums (#8111) JD Francis [b90390c] Convert tier badges back to png from svg [C-1337] (#8105) nicoback2 [5426358] Fixes close icon color on artist dashboard (#8133) Randy Schott [7544a26] Support coinflow relay on client (#8088) Raymond Jacobson [c54acb9] Fix premium album uploads (#8129) JD Francis [fcf9757] [PAY-2697] Add purchase button to album DM unfurl (#8113) Andrew Mendelsohn [aae5184] [INF-674] Add changesets (#8036) Sebastian Klingler [5e1ceb4] [PAY-2661] Add collection card (#8100) Dylan Jeffers [f3716b5] Fix nft undefined bug (#8121) Saliou Diallo [bfe784b] Add react-router-v5-compat (#8110) Dylan Jeffers [6cb5cbc] Fix collection screen types (#8124) Dylan Jeffers [99bce8a] [PAY-2626] Warning modal when removing track from premium album (#8093) JD Francis [a685aab] Fix metro support for @metaplex-foundation/umi (#8123) Sebastian Klingler [c2d7d24] Make collectibles grid virtualized (#8009) Raymond Jacobson [26f85aa] [C-4278] Fix native search collections (#8117) Dylan Jeffers [05ad52b] Lint fixes for main (#8114) Andrew Mendelsohn [32ad757] [C-4276] Add skeleton and artwork to harmony (#8108) Dylan Jeffers [b54a2cd] [C-3949] Fix infinite library bug (#8107) Kyle Shanks [1b400a4] ACDC tip notifs: encode hash id (#8101) alecsavvy [e19037a] [PAY-2597] Test migration of a single endpoint from apiclient -> SDK (#8091) Randy Schott [2da0d76] [PROTO-1515] Hide modification buttons for ddex tracks and albums (#8097) Theo Ilie
[189834b] Revert version bump pt 2 sliptype [33d1cb1] Revert version bump sliptype [81e664d] v1.5.197 audius-infra [5b08941] v1.5.196 audius-infra [653fb4f] v1.5.195 audius-infra [daa66c1] v1.5.194 audius-infra [12c3493] v1.5.193 audius-infra [4ea47f3] v1.5.192 audius-infra [eae7c9c] v1.5.191 audius-infra [6fcce3a] v1.5.190 audius-infra [0e31639] v1.5.189 audius-infra [bc8299f] v1.5.188 audius-infra [33ad216] v1.5.187 audius-infra [9d22f29] v1.5.186 audius-infra [2d07d10] v1.5.185 audius-infra [46745f7] v1.5.184 audius-infra [7f643c6] v1.5.183 audius-infra [1661499] v1.5.182 audius-infra [96fc23d] v1.5.181 audius-infra [e2b81f0] v1.5.180 audius-infra [b3326ba] v1.5.179 audius-infra [690168d] v1.5.178 audius-infra [044f20f] v1.5.177 audius-infra [6d9836b] v1.5.176 audius-infra [fc6a40c] v1.5.175 audius-infra [0ec4587] v1.5.174 audius-infra [e8e9511] v1.5.173 audius-infra [5f90c9a] v1.5.172 audius-infra [781e5b4] v1.5.171 audius-infra [6445c36] v1.5.170 audius-infra [a65f44f] v1.5.169 audius-infra [5f9927b] v1.5.168 audius-infra [f6d8b3d] v1.5.167 audius-infra [bfe984d] v1.5.166 audius-infra [c9d6d6b] v1.5.165 audius-infra [5ef3c96] v1.5.164 audius-infra [8a84a3c] v1.5.163 audius-infra [38d92b2] v1.5.162 audius-infra [08e0825] v1.5.161 audius-infra [9fb76bb] v1.5.160 audius-infra [232e39c] v1.5.159 audius-infra [45d3f65] v1.5.158 audius-infra [cf1fe12] v1.5.157 audius-infra [d9d1e5a] v1.5.156 audius-infra [c42aae3] v1.5.155 audius-infra [b11061c] v1.5.154 audius-infra [e46e26a] v1.5.153 audius-infra [2a9e030] v1.5.152 audius-infra [38c9239] v1.5.151 audius-infra [5c6a81b] v1.5.150 audius-infra [f3b63bd] v1.5.149 audius-infra [aa9380a] v1.5.148 audius-infra [9926f1e] v1.5.147 audius-infra [0a72ffa] v1.5.146 audius-infra [e1d8de3] v1.5.145 audius-infra [342a44c] v1.5.144 audius-infra [97c0f34] v1.5.143 audius-infra [d9ac347] v1.5.142 audius-infra [eea4191] v1.5.141 audius-infra [065ee82] v1.5.140 audius-infra [8de980b] v1.5.139 audius-infra [0afb9ce] v1.5.138 audius-infra [7747f6b] v1.5.137 audius-infra [8af8cca] v1.5.136 audius-infra [85162c7] v1.5.135 audius-infra [58f911b] v1.5.134 audius-infra [a6d63bc] v1.5.133 audius-infra [ba95ddc] v1.5.132 audius-infra [c8b8ee2] v1.5.131 audius-infra [08dce07] v1.5.130 audius-infra [04037bd] v1.5.129 audius-infra [149dd62] v1.5.128 audius-infra [b67c590] v1.5.127 audius-infra [2594c8b] v1.5.126 audius-infra [cd4ceae] v1.5.125 audius-infra [2a76eb2] v1.5.124 audius-infra [eaa2e49] v1.5.123 audius-infra [2748b4b] v1.5.122 audius-infra [ffaae4c] v1.5.121 audius-infra [3dcce94] v1.5.120 audius-infra [57886e0] v1.5.119 audius-infra [d2bb663] v1.5.118 audius-infra [ef095cc] v1.5.117 audius-infra [d30635a] v1.5.116 audius-infra [d4dc291] v1.5.115 audius-infra [0a96677] v1.5.114 audius-infra [d63f1e2] v1.5.113 audius-infra [3a34a50] v1.5.112 audius-infra [054c0af] v1.5.111 audius-infra [9c0436e] v1.5.110 audius-infra [2bc96b7] v1.5.109 audius-infra [38cffa9] v1.5.108 audius-infra [e60e1fc] v1.5.107 audius-infra [708b371] v1.5.106 audius-infra [cda2846] v1.5.105 audius-infra [8dc235e] v1.5.104 audius-infra [cc20c06] v1.5.103 audius-infra [3ca0423] v1.5.102 audius-infra [d6f4993] v1.5.101 audius-infra [88b1235] v1.5.100 audius-infra [5f10b8f] v1.5.99 audius-infra [9dd5cb1] v1.5.98 audius-infra [140b332] v1.5.97 audius-infra [4119352] v1.5.96 audius-infra [93ee1be] v1.5.95 audius-infra [e62a84d] v1.5.94 audius-infra [aee1403] v1.5.93 audius-infra [074e133] v1.5.92 audius-infra [3ca80d4] v1.5.91 audius-infra [ea47f05] v1.5.90 audius-infra [56b92fd] v1.5.89 audius-infra [bf933fb] v1.5.88 audius-infra [54e2ab9] v1.5.87 audius-infra [7635463] v1.5.86 audius-infra [2aba710] v1.5.85 audius-infra [67d7387] v1.5.84 audius-infra [97dff7a] v1.5.83 audius-infra [fb7629f] v1.5.82 audius-infra [2c82d08] v1.5.81 audius-infra [feb2503] v1.5.80 audius-infra [8036d7b] v1.5.79 audius-infra [7a78b19] v1.5.78 audius-infra [4924c0f] v1.5.77 audius-infra [eca7b4e] [PAY-2698] Add purchase button do album DMs (mobile) (#8134) Andrew Mendelsohn [283163b] Upgrade native version to 1.1.94 (#8137) Dylan Jeffers [863aed6] [INF-690] Delete sdk release job (#8130) Sebastian Klingler [296c98c] [C-4279] Don't log not found errors to sentry (#8131) Andrew Mendelsohn [e362ec7] [PAY-2617] Buy button for tracklist in albums (#8111) JD Francis [b90390c] Convert tier badges back to png from svg [C-1337] (#8105) nicoback2 [5426358] Fixes close icon color on artist dashboard (#8133) Randy Schott [7544a26] Support coinflow relay on client (#8088) Raymond Jacobson [c54acb9] Fix premium album uploads (#8129) JD Francis [fcf9757] [PAY-2697] Add purchase button to album DM unfurl (#8113) Andrew Mendelsohn [aae5184] [INF-674] Add changesets (#8036) Sebastian Klingler [5e1ceb4] [PAY-2661] Add collection card (#8100) Dylan Jeffers [f3716b5] Fix nft undefined bug (#8121) Saliou Diallo [bfe784b] Add react-router-v5-compat (#8110) Dylan Jeffers [6cb5cbc] Fix collection screen types (#8124) Dylan Jeffers [99bce8a] [PAY-2626] Warning modal when removing track from premium album (#8093) JD Francis [a685aab] Fix metro support for @metaplex-foundation/umi (#8123) Sebastian Klingler [c2d7d24] Make collectibles grid virtualized (#8009) Raymond Jacobson [26f85aa] [C-4278] Fix native search collections (#8117) Dylan Jeffers [05ad52b] Lint fixes for main (#8114) Andrew Mendelsohn [32ad757] [C-4276] Add skeleton and artwork to harmony (#8108) Dylan Jeffers [b54a2cd] [C-3949] Fix infinite library bug (#8107) Kyle Shanks [1b400a4] ACDC tip notifs: encode hash id (#8101) alecsavvy [e19037a] [PAY-2597] Test migration of a single endpoint from apiclient -> SDK (#8091) Randy Schott [2da0d76] [PROTO-1515] Hide modification buttons for ddex tracks and albums (#8097) Theo Ilie
[e74455d] [PAY-2688] Add prototype foundation for manager mode (#8154) Randy Schott [6825c33] [PAY-2709, PAY-2710, PAY-2708] Various CollectionTile fixes (#8145) Andrew Mendelsohn [7ad1e89] [C-4289] Make verify call lint instead of lint:fix (#8152) Sebastian Klingler [d9420a9] [PAY-2666] Only show withdrawals on withdrawals tab (#8142) Marcus Pasell [5249858] [ONC-74] Fix social account association (#8162) Marcus Pasell [d66d393] Make another ddex delivery work (different URL) (#8161) Theo Ilie [a50c773] [C-4247] Add cumulative rewards UI to web (#8143) Saliou Diallo [5bce1aa] Add target for iOS privacy manifest (#8155) Sebastian Klingler [d3510d1] Revert "Test figma code-connect (#8139)" (#8151) Dylan Jeffers [8c91e4e] fix: Minor copy change in album upload flow (#8150) JD Francis [bc84708] Test figma code-connect (#8139) Dylan Jeffers [e6335ba] Allow audio/x-flac mime type (#8141) Steve Perkins [e467cbe] [PAY-2695] Add hidden and premium collection card variants (#8135) Dylan Jeffers [7182221] [PROTO-1726] Start simple entrypoint for distro (#8104) Raymond Jacobson [eca7b4e] [PAY-2698] Add purchase button do album DMs (mobile) (#8134) Andrew Mendelsohn [283163b] Upgrade native version to 1.1.94 (#8137) Dylan Jeffers [863aed6] [INF-690] Delete sdk release job (#8130) Sebastian Klingler [296c98c] [C-4279] Don't log not found errors to sentry (#8131) Andrew Mendelsohn [e362ec7] [PAY-2617] Buy button for tracklist in albums (#8111) JD Francis [b90390c] Convert tier badges back to png from svg [C-1337] (#8105) nicoback2 [5426358] Fixes close icon color on artist dashboard (#8133) Randy Schott [7544a26] Support coinflow relay on client (#8088) Raymond Jacobson [c54acb9] Fix premium album uploads (#8129) JD Francis [fcf9757] [PAY-2697] Add purchase button to album DM unfurl (#8113) Andrew Mendelsohn [aae5184] [INF-674] Add changesets (#8036) Sebastian Klingler [5e1ceb4] [PAY-2661] Add collection card (#8100) Dylan Jeffers [f3716b5] Fix nft undefined bug (#8121) Saliou Diallo [bfe784b] Add react-router-v5-compat (#8110) Dylan Jeffers [6cb5cbc] Fix collection screen types (#8124) Dylan Jeffers [99bce8a] [PAY-2626] Warning modal when removing track from premium album (#8093) JD Francis [a685aab] Fix metro support for @metaplex-foundation/umi (#8123) Sebastian Klingler [c2d7d24] Make collectibles grid virtualized (#8009) Raymond Jacobson [26f85aa] [C-4278] Fix native search collections (#8117) Dylan Jeffers [05ad52b] Lint fixes for main (#8114) Andrew Mendelsohn [32ad757] [C-4276] Add skeleton and artwork to harmony (#8108) Dylan Jeffers [b54a2cd] [C-3949] Fix infinite library bug (#8107) Kyle Shanks [1b400a4] ACDC tip notifs: encode hash id (#8101) alecsavvy [e19037a] [PAY-2597] Test migration of a single endpoint from apiclient -> SDK (#8091) Randy Schott [2da0d76] [PROTO-1515] Hide modification buttons for ddex tracks and albums (#8097) Theo Ilie
Description
This change is establishing a shadow pattern for future migrations to SDK.
The goal was to create a pattern that can easily be applied to existing call sites of
AudiusAPIClient
functions to transform them in to parallel "shadow" calls which will test and log a migrated version of a response without impacting the existing code.I plan to upgrade this pattern (either in this PR or a future one) to use a feature flag for deployment to a small percentage of audiences and logging diff errors to Sentry so we can keep track of them.
Thus the rollout plan becomes:
How Has This Been Tested?
Tested locally against staging. Will triple verify that errors don't actually interrupt the original request flow.