no-service-mutations-in-api-route - ESLint plugin rules
This rule disallows calling service mutation methods directly from an API route handler.
Severity#
warn. This rule is enabled in the recommended preset.
What it Targets#
This rule targets route.ts and route.js files in your project's src/api directory. It reports calls to mutation methods, such as create, update, or delete methods, on a service resolved from the container.
The following code is reported by the rule:
export const POST = async (req, res) => {
const productModule = req.scope.resolve(Modules.PRODUCT)
await productModule.createProducts(req.body)
res.status(200).json({})
}
Instead, move the mutation into a workflow and run it:
export const POST = async (req, res) => {
await createProductWorkflow(req.scope).run({
input: req.body,
})
res.status(200).json({})
}
Why it's Important#
Workflows provide rollback, error handling, and a single place to maintain business logic. Calling service mutations directly in a route bypasses these benefits and makes the logic harder to reuse.
Learn more in the Workflows documentation.
Fixable#
This rule isn't auto-fixable.
Turn it Off#
To turn off this rule, set it to off in your ESLint configuration:
import { defineConfig } from "eslint/config"
import medusa from "@medusajs/eslint-plugin"
export default defineConfig([
...medusa.configs.recommended,
{
rules: {
"@medusajs/no-service-mutations-in-api-route": "off",
},
},
])
Or disable it for a single line using an inline comment:
// eslint-disable-next-line @medusajs/no-service-mutations-in-api-route
await productModule.createProducts(req.body)