Using services in custom medusa routes

I'm a full-stack developer from South Africa 🇿🇦. I love writing about JavaScript, HTML and CSS.
Search for a command to run...

I'm a full-stack developer from South Africa 🇿🇦. I love writing about JavaScript, HTML and CSS.
No comments yet. Be the first to comment.
Most of you know me for my consistency, a golden arrow in my blog series. I've written 1000 articles in 1008 days! Almost an article a day, and my honeymoon was the only holiday I ever took. I'm super proud of this achievement; it has been a fantasti...

It's not the first time I'll be talking about community. I think it's an essential aspect of any successful tool. This shows in my previous explorations of Astro, Medusa, and now Vendure as well. All these products thrive in a super open, welcoming, ...

The cool part about Vendure is how easy it is to set up and how abstract each layer is. Basically, we get the following elements: External database Server Worker Admin UI Frontend While this is amazing, it also brings a bit of complexity when it co...

The previous article looked at customizing Vendure on a data and process level. In this article, we'll look at customizing emails, as they are often a big part of a webshop system. We'll be looking at two different layers of customization for customi...

Even though Vendure is a pretty significant project out of the box, in some cases, we might want to go in and modify some elements to work to our specific use case. In this article, I'll take a high-level look at some elements we can customize within...

Another cool part about medusa is that we can use services to interact with existing functionality.
For instance, we can access the ProductService from there. We can retrieve products but also create and update them.
Let's see how we can use these services inside our custom routes.
For this example, I'll be using the ProductService. First, we'll want to add a custom route endpoint.
Inside our custom route, we can start by assigning this service like this.
const productService = req.scope.resolve('productService');
Let's say we want to list all products. We can easily do that with the following command.
router.get('/store/test', async (req, res) => {
const productService = req.scope.resolve('productService');
productService.list().then((products) => {
res.json(products);
});
});
If you now restart your server and query this endpoint, you should be able to see a list of your products. (My database only has one effect).

This is, of course, not super beneficial as we already have an endpoint to retrieve precisely this information. The cool part is that we can choose to manipulate this data. Let's say we only want items that have stock.
router.get('/store/test', async (req, res) => {
const productService = req.scope.resolve('productService');
productService.list({}, { relations: ['variants'] }).then((products) => {
res.json(
products.filter((product) =>
product.variants.some((variant) => variant.inventory_quantity >= 0)
)
);
});
});
We have quite a few changes here. Let's take a closer look. The first one is that we pass arguments to the products list function. These arguments are as follows:
{}: The first option is the params to query on. In our case, nothing in particular{relations:['variants']}: This can be used to add specific options to the query. We want to add the variantsOnce we have this, we filter all products and only return products where at least one variant has stock.
You can play with adjusting the stock levels in the query.
And that's it, we super powerful way of querying from service in medusa.
Thank you for reading my blog. Feel free to subscribe to my email newsletter and connect on Facebook or Twitter