TarotMaster’s codebase was a mess until i learned about the proper way to use the metadata object provided by the APIs that we depend on.
Metadata in an API request provides an additional information about the data that is being transmitted.
At TarotMaster, I work with a lot of APIs, and most of them have only limited request-body properties.
So, when I mistakenly or maliciously want to pass a payload that sometimes, I do not get any errors from those requests because such payloads are whitelisted.
TLDR;
I the following procedures to allow users purchase credits or subsctiptions, and assign them appropriate roles based on what they paid for.
Here’s how i solved that problem in the past — without using the Metadata object.
…. Incase you encountered any difficulty while trying to understand what i was doing, here’s the thing:
If a user wants to purchase a one-off deal, a subscription, or anything we had in the time of writing this, we create a unique checkout url for them.
Upon a successful payment, we get a webhook from our payment provider — Stripe in this case with the data related to the item that the user purchased.
We then proceed to give the user some permissions based on the purchase they made.
For example, a subscription would get a user unlimited number of credits, while one-off payments would have a limited number of credits, depending on their prices.
If you looked at the image, you’ll see a productId.ts file somewhere around the codebase, that has an object of productIds with their respective creits. because
e.g if a user buys a product that has an id of prod_123 , since we get that infomation from the webhook, we simply index the object in productId.ts file by the product_id so that we get the credits that should get assigned to them.
And.. that wasn’t a scalable solution for a couple of reasons.
Because, if we needed to add more price tiers to the application, we would have to update productId.ts file with the new product which we just added, which would suck when you’re working in seperate environments.
When you’re working in seperate environments, making sure to add the product ids for each environment can be a nightmare. 😅
So.. I started to learn about metadata, and i realized that there’s a really simple way to solve the problem
I then adopted this pattern:
This is almost similar to what i had before, but with a little change in constructing the checkout URL because i now have to include the benefits that they get from that price tier inside the metadata.
This helps me add an infinite number of price tiers to the application without being bothered about updating any external file to get the benefits that each product id has.
From here, i can take things to the next level by adding some more information about the product and using that to update the users record when we receive a webhook.
Ehmm.. maybe i should have said this earlier 🤔
The choice of using a metadata to pass additional information would depend on the API that you use.
While most APIs offers you a metadata object, some of them does not.
~~
If you have tried to use the metadata provided by an API before now, I’d love to hear about your experience 🙏
⚡️I keep writing about the stuffs i learn daily. if you wanna learn, please follow along!