v1.7.1
Version 1.7.1
of Medusa introduces the JobSchedulerService
which changes how scheduled/cron jobs are created.
Overview
Version 1.7.1
of Medusa introduces a new service JobSchedulerService
that handles all logic and functionality related to created scheduled (previously named cron jobs).
With this introduction, the previous use of EventBus
to create a cron job has been deprecated of using the JobSchedulerService
.
In addition, this version features some fixes to gift cards that requires running migrations, and changes to how payment providers are implemented.
Actions Required
Run Migrations
In the directory of your Medusa backend, run the following command after updating the server:
medusa migrations run
Run Migration Script
Following the fix gift cards calculation, you also need to run a migration script after updating the backend.
Start by adding the following environment variables in .env
:
TYPEORM_CONNECTION=postgres
TYPEORM_URL=<DATABASE_URL>
TYPEORM_USERNAME=<DATABASE_USERNAME>
TYPEORM_PASSWORD=<DATABASE_PASSWORD>
TYPEORM_DATABASE=<DATABASE_DATABASE>
TYPEORM_ENTITIES=./node_modules/@medusajs/medusa/dist/models/*.js
TYPEORM_MIGRATIONS=./node_modules/@medusajs/medusa/dist/migrations/*.js
Make sure to replace <DATABASE_URL>
, <DATABASE_USERNAME>
, <DATABASE_PASSWORD>
, and <DATABASE_DATABASE>
with your database connection details.
Then, run the following command in the root directory of your Medusa server:
node ./node_modules/@medusajs/medusa/dist/scripts/gift-card-tax-rate-migration.js
Change to JobSchedulerService
In your loader file that creates a cron job, replace the use of eventBus
to jobSchedulerService
:
const myJob = async (container, options) => {
const jobSchedulerService = container.resolve(
"jobSchedulerService"
)
jobSchedulerService.create(
"my-job",
{},
"0 0 * * *",
async () => {
// ...
}
)
}
export default myJob
You can learn more in the How to Create a Scheduled Job documentation.
Change to Payment Provider
This version of Medusa introduces a change in how payment providers are implemented. Mainly, the signature of the createPayment
and updatePayment
methods have changed, and the old signature is now deprecated.
Although this change is currently backwards compatible, it is recommended to change the signature of these methods to the following:
import { Cart, PaymentSessionData, PaymentContext, PaymentSessionResponse } from "@medusajs/medusa"
// ...
class MyPaymentService extends AbstractPaymentService<TransactionBaseService> {
// ...
async createPayment(
context: Cart & PaymentContext
): Promise<PaymentSessionResponse> {
// ...
}
async updatePayment(
paymentSessionData: PaymentSessionData,
context: Cart & PaymentContext
): Promise<PaymentSessionResponse> {
// ...
}
}
Where context
in both createPayment
and updatePayment
is made up of the following properties:
type PaymentContext = {
cart: {
context: Record<string, unknown>
id: string
email: string
shipping_address: Address | null
shipping_methods: ShippingMethod[]
}
currency_code: string
amount: number
resource_id?: string
customer?: Customer
}
So, you can pass the previous cart
parameter inside the new context
paramter.
Furthermore, these methods are now expected to return PaymentSessionResponse
. It is made up of the following properties:
type PaymentSessionResponse = {
update_requests: {
customer_metadata: Record<string, unknown>
}
session_data: Record<string, unknown>
}
Where session_data
would include the previously returned data from these methods. The property update_requests
allows you to pass data from the payment provider plugin to the core to update internal resources. Currently, it can only be used to update the metadata
field of the customer entity.