chore: Fix merge conflicts with master

This commit is contained in:
olivermrbl
2023-03-12 12:53:07 +01:00
29 changed files with 471 additions and 56 deletions
+5
View File
@@ -0,0 +1,5 @@
---
"@medusajs/medusa": patch
---
chores(medusa): Improve draft order creation perf flow
+1 -1
View File
@@ -3917,7 +3917,7 @@ Then, in your `.env` file add the API key you created earlier as well as the sen
```bash
SENDGRID_API_KEY=<API_KEY>
SENDGRID_FROM=<YOUR_SEND_FROM>
SENDGRID_FROM=<SEND_FROM_EMAIL>
```
Make sure to replace the `<API_KEY>` with the SendGrid API key and the `<SEND_FROM_EMAIL>` with the email youre using in SendGrid as the single sender.
@@ -7,7 +7,7 @@ addHowToData: true
In this document, youll learn how to create a [Migration](overview.md) using [Typeorm](https://typeorm.io) on your Medusa server.
## Create Migration File
## Step 1: Create Migration File
To create a migration that makes changes to your Medusa schema, run the following command:
@@ -19,15 +19,62 @@ This will create the migration file in the path you specify. You can use this wi
The migration file must be inside the `src/migrations` directory. When you run the build command, it will be transpiled into the directory `dist/migrations`. The `migrations run` command can only pick up migrations under the `dist/migrations` directory on a Medusa server. This applies to migrations created in a Medusa server, and not in a Medusa plugin. For plugins, check out the [Plugin's Structure section](../plugins/create.md).
:::tip
<details>
<summary>Generating Migrations for Entities</summary>
You can alternatively use Typeorm's `generate` command to generate a Migration file from existing database tables, which requires setting up a data source in Typeorm. Check out Typeorm's documentation to learn [how to create a data source](https://typeorm.io/data-source#creating-a-new-datasource), then use the [generate command](https://typeorm.io/using-cli#generate-a-migration-from-existing-table-schema).
You can alternatively use Typeorm's `generate` command to generate a Migration file from existing entity classes. As Medusa uses v0.2.45 of Typeorm, you have to create a `ormconfig.json` first before using the `generate` command.
:::note
Typeorm will be updated to the latest version in v1.8.0 of Medusa.
:::
For example, create the file `ormconfig.json` in the root of your Medusa server with the following content:
```json
{
"type": "postgres",
"host": "localhost",
"port": 5432,
"username": "<YOUR_DB_USERNAME>",
"password": "<YOUR_DB_PASSWORD>",
"database": "<YOUR_DB_NAME>",
"synchronize": true,
"logging": false,
"entities": [
"dist/models/**/*.js"
],
"migrations": [
"dist/migrations/**/*.js"
],
"cli": {
"entitiesDir": "src/models",
"migrationsDir": "src/migrations"
}
}
```
Make sure to replace `<YOUR_DB_USERNAME>`, `<YOUR_DB_PASSWORD>`, and `<YOUR_DB_NAME>` with the necessary values for your database connection.
Then, after creating your entity, run the `build` command:
```bash npm2yarn
npm run build
```
Finally, run the following command to generate a Migration for your new entity:
```bash
npx typeorm@0.2.45 migration:generate -n PostCreate
```
Where `PostCreate` is just an example of the name of the migration to generate. The migration will then be generated in `src/migrations/<TIMESTAMP>-PostCreate.ts`. You can then skip to step 3 of this guide.
</details>
---
## Write Migration File
## Step 2: Write Migration File
The migration file contains the necessary commands to create the database columns, foreign keys, and more.
@@ -35,7 +82,7 @@ You can learn more about writing the migration file in You can learn more about
---
## Build Files
## Step 3: Build Files
Before you can run the migrations you need to run the build command to transpile the TypeScript files to JavaScript files:
@@ -45,7 +92,7 @@ npm run build
---
## Run Migration
## Step 4: Run Migration
The last step is to run the migration with the command detailed earlier
@@ -1,5 +1,5 @@
---
sidebar_position: 8
sidebar_position: 9
description: 'Actions Required for v.1.3.0'
---
@@ -1,5 +1,5 @@
---
sidebar_position: 7
sidebar_position: 8
description: 'Actions Required for v.1.3.0'
---
@@ -1,5 +1,5 @@
---
sidebar_position: 6
sidebar_position: 7
description: 'Actions Required for v.1.3.0'
---
@@ -1,5 +1,5 @@
---
sidebar_position: 5
sidebar_position: 6
description: 'Actions Required for v.1.6.1'
---
@@ -1,5 +1,5 @@
---
sidebar_position: 4
sidebar_position: 5
description: 'Actions Required for v.1.7.0'
---
@@ -1,5 +1,5 @@
---
sidebar_position: 3
sidebar_position: 4
description: 'Actions Required for v.1.7.1'
---
@@ -0,0 +1,22 @@
---
sidebar_position: 1
description: 'Actions Required for v.1.7.12'
---
# v1.7.12
Version 1.7.12 of Medusa introduces some database schema changes which require running the migrations command.
## Overview
This release contains a migration to ensure that the `product_variant_inventory` table is in its correct state. This is due to a mistake in a previous version where a column name was renamed in an already released migration. This could lead to errors if the migration was applied before the renaming of the column.
## Actions Required
### Run Migrations
After updating your Medusa server and before running it, run the following command to run the latest migrations:
```bash
medusa migrations run
```
@@ -1,5 +1,5 @@
---
sidebar_position: 2
sidebar_position: 3
description: 'Actions Required for v.1.7.3'
---
@@ -1,5 +1,5 @@
---
sidebar_position: 1
sidebar_position: 2
description: 'Actions Required for v.1.7.6'
---
+7
View File
@@ -1,5 +1,12 @@
# @medusajs/inventory
## 1.0.9
### Patch Changes
- Updated dependencies [[`ce577f269`](https://github.com/medusajs/medusa/commit/ce577f2696aa2181bef8f3096b1a639feabe2714), [`aa0d1f321`](https://github.com/medusajs/medusa/commit/aa0d1f32153f82c6219efe5cfc08862db5e5a129), [`9f508c8bd`](https://github.com/medusajs/medusa/commit/9f508c8bd8bee63677504cc8b86f1643579945d8)]:
- @medusajs/medusa@1.7.12
## 1.0.8
### Patch Changes
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@medusajs/inventory",
"version": "1.0.8",
"version": "1.0.9",
"description": "Inventory Module for Medusa",
"main": "dist/index.js",
"repository": {
@@ -35,7 +35,7 @@
"test:unit": "jest --passWithNoTests"
},
"peerDependencies": {
"@medusajs/medusa": "1.7.11",
"@medusajs/medusa": "1.7.12",
"typeorm": "^0.3.11"
}
}
+10
View File
@@ -1,5 +1,15 @@
# Change Log
## 1.7.12
### Patch Changes
- [#3394](https://github.com/medusajs/medusa/pull/3394) [`ce577f269`](https://github.com/medusajs/medusa/commit/ce577f2696aa2181bef8f3096b1a639feabe2714) Thanks [@olivermrbl](https://github.com/olivermrbl)! - feat(medusa): Add global job options for events
- [#3388](https://github.com/medusajs/medusa/pull/3388) [`aa0d1f321`](https://github.com/medusajs/medusa/commit/aa0d1f32153f82c6219efe5cfc08862db5e5a129) Thanks [@olivermrbl](https://github.com/olivermrbl)! - fix(medusa): Remove default job age option from EventBus
- [#3384](https://github.com/medusajs/medusa/pull/3384) [`9f508c8bd`](https://github.com/medusajs/medusa/commit/9f508c8bd8bee63677504cc8b86f1643579945d8) Thanks [@pKorsholm](https://github.com/pKorsholm)! - Fix(medusa): Column naming on migrations
## 1.7.11
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@medusajs/medusa",
"version": "1.7.11",
"version": "1.7.12",
"description": "E-commerce for JAMstack",
"main": "dist/index.js",
"bin": "./cli.js",
@@ -14,7 +14,7 @@ export class multiLocation1671711415179 implements MigrationInterface {
`CREATE INDEX "IDX_c2203162ca946a71aeb98390b0" ON "sales_channel_location" ("location_id") `
)
await queryRunner.query(
`CREATE TABLE "product_variant_inventory_item" ("id" character varying NOT NULL, "created_at" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "updated_at" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "inventory_item_id" text NOT NULL, "variant_id" text NOT NULL, "required_quantity" integer NOT NULL DEFAULT '1', CONSTRAINT "UQ_c9be7c1b11a1a729eb51d1b6bca" UNIQUE ("variant_id", "inventory_item_id"), CONSTRAINT "PK_9a1188b8d36f4d198303b4f7efa" PRIMARY KEY ("id"))`
`CREATE TABLE "product_variant_inventory_item" ("id" character varying NOT NULL, "created_at" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "updated_at" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "inventory_item_id" text NOT NULL, "variant_id" text NOT NULL, "quantity" integer NOT NULL DEFAULT '1', CONSTRAINT "UQ_c9be7c1b11a1a729eb51d1b6bca" UNIQUE ("variant_id", "inventory_item_id"), CONSTRAINT "PK_9a1188b8d36f4d198303b4f7efa" PRIMARY KEY ("id"))`
)
await queryRunner.query(
`CREATE INDEX "IDX_c74e8c2835094a37dead376a3b" ON "product_variant_inventory_item" ("inventory_item_id") `
@@ -0,0 +1,31 @@
import { MigrationInterface, QueryRunner } from "typeorm"
export class ensureRequiredQuantity1678093365811 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`
DO
$$
BEGIN
ALTER TABLE product_variant_inventory_item
RENAME COLUMN quantity TO required_quantity;
EXCEPTION
WHEN undefined_column THEN
END;
$$;
`)
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`
DO
$$
BEGIN
ALTER TABLE product_variant_inventory_item
RENAME COLUMN required_quantity TO quantity;
EXCEPTION
WHEN undefined_column THEN
END;
$$;
`)
}
}
@@ -1,5 +1,5 @@
import CustomShippingOptionService from "../custom-shipping-option"
import { MockManager, MockRepository } from "medusa-test-utils"
import CustomShippingOptionService from "../custom-shipping-option"
describe("CustomShippingOptionService", () => {
describe("list", () => {
@@ -118,19 +118,17 @@ describe("CustomShippingOptionService", () => {
cart_id: "test-cso-cart",
shipping_option_id: "test-so",
price: 30,
metadata: undefined,
},
])
expect(customShippingOptionRepository.save).toHaveBeenCalledTimes(1)
expect(customShippingOptionRepository.save).toHaveBeenCalledWith({
id: "test-cso",
0: {
cart_id: "test-cso-cart",
shipping_option_id: "test-so",
price: 30,
metadata: undefined,
},
id: "test-cso",
})
})
})
@@ -141,6 +141,149 @@ describe("EventBusService", () => {
expect(eventBus.queue_.add).toHaveBeenCalled()
})
})
describe("successfully adds job to queue with local options", () => {
beforeAll(() => {
jest.resetAllMocks()
const stagedJobRepository = MockRepository({
find: () => Promise.resolve([]),
})
eventBus = new EventBusService({
logger: loggerMock,
manager: MockManager,
stagedJobRepository,
})
eventBus.queue_.add.mockImplementationOnce(() => "hi")
job = eventBus.emit(
"eventName",
{ hi: "1234" },
{ removeOnComplete: 100 }
)
})
afterAll(async () => {
await eventBus.stopEnqueuer()
})
it("calls queue.add", () => {
expect(eventBus.queue_.add).toHaveBeenCalled()
expect(eventBus.queue_.add).toHaveBeenCalledWith(
{ eventName: "eventName", data: { hi: "1234" } },
{ removeOnComplete: 100 }
)
})
})
describe("successfully adds job to queue with global options", () => {
beforeAll(() => {
jest.resetAllMocks()
const stagedJobRepository = MockRepository({
find: () => Promise.resolve([]),
})
eventBus = new EventBusService(
{
logger: loggerMock,
manager: MockManager,
stagedJobRepository,
},
{
projectConfig: { event_options: { removeOnComplete: 10 } },
}
)
eventBus.queue_.add.mockImplementationOnce(() => "hi")
job = eventBus.emit("eventName", { hi: "1234" })
})
afterAll(async () => {
await eventBus.stopEnqueuer()
})
it("calls queue.add", () => {
expect(eventBus.queue_.add).toHaveBeenCalled()
expect(eventBus.queue_.add).toHaveBeenCalledWith(
{ eventName: "eventName", data: { hi: "1234" } },
{ removeOnComplete: 10, attempts: 1 }
)
})
})
describe("successfully adds job to queue with default options", () => {
beforeAll(() => {
jest.resetAllMocks()
const stagedJobRepository = MockRepository({
find: () => Promise.resolve([]),
})
eventBus = new EventBusService({
logger: loggerMock,
manager: MockManager,
stagedJobRepository,
})
eventBus.queue_.add.mockImplementationOnce(() => "hi")
job = eventBus.emit("eventName", { hi: "1234" })
})
afterAll(async () => {
await eventBus.stopEnqueuer()
})
it("calls queue.add", () => {
expect(eventBus.queue_.add).toHaveBeenCalled()
expect(eventBus.queue_.add).toHaveBeenCalledWith(
{ eventName: "eventName", data: { hi: "1234" } },
{ removeOnComplete: true, attempts: 1 }
)
})
})
describe("successfully adds job to queue with local options and global options merged", () => {
beforeAll(() => {
jest.resetAllMocks()
const stagedJobRepository = MockRepository({
find: () => Promise.resolve([]),
})
eventBus = new EventBusService(
{
logger: loggerMock,
manager: MockManager,
stagedJobRepository,
},
{
projectConfig: { event_options: { removeOnComplete: 10 } },
}
)
eventBus.queue_.add.mockImplementationOnce(() => "hi")
job = eventBus.emit(
"eventName",
{ hi: "1234" },
{ attempts: 10, delay: 1000, backoff: { type: "exponential" } }
)
})
afterAll(async () => {
await eventBus.stopEnqueuer()
})
it("calls queue.add", () => {
expect(eventBus.queue_.add).toHaveBeenCalled()
expect(eventBus.queue_.add).toHaveBeenCalledWith(
{ eventName: "eventName", data: { hi: "1234" } },
{
removeOnComplete: 10, // global option
attempts: 10, // local option
delay: 1000, // local option
backoff: { type: "exponential" }, // local option
}
)
})
})
})
describe("worker", () => {
+21 -21
View File
@@ -1,6 +1,26 @@
import { isEmpty, isEqual } from "lodash"
import { isDefined, MedusaError } from "medusa-core-utils"
import { DeepPartial, EntityManager, In, IsNull, Not } from "typeorm"
import {
CustomerService,
CustomShippingOptionService,
DiscountService,
EventBusService,
GiftCardService,
LineItemAdjustmentService,
LineItemService,
NewTotalsService,
PaymentProviderService,
ProductService,
ProductVariantInventoryService,
ProductVariantService,
RegionService,
SalesChannelService,
ShippingOptionService,
StoreService,
TaxProviderService,
TotalsService,
} from "."
import { IPriceSelectionStrategy, TransactionBaseService } from "../interfaces"
import SalesChannelFeatureFlag from "../loaders/feature-flags/sales-channels"
import {
@@ -36,30 +56,10 @@ import {
TotalField,
WithRequiredProperty,
} from "../types/common"
import { PaymentSessionInput } from "../types/payment"
import { buildQuery, isString, setMetadata } from "../utils"
import { FlagRouter } from "../utils/flag-router"
import { validateEmail } from "../utils/is-email"
import { PaymentSessionInput } from "../types/payment"
import {
CustomerService,
CustomShippingOptionService,
DiscountService,
EventBusService,
GiftCardService,
LineItemAdjustmentService,
LineItemService,
NewTotalsService,
PaymentProviderService,
ProductService,
ProductVariantInventoryService,
ProductVariantService,
RegionService,
SalesChannelService,
ShippingOptionService,
StoreService,
TaxProviderService,
TotalsService,
} from "."
type InjectedDependencies = {
manager: EntityManager
@@ -1,12 +1,11 @@
import { MedusaError } from "medusa-core-utils"
import { EntityManager } from "typeorm"
import { DeepPartial, EntityManager } from "typeorm"
import { TransactionBaseService } from "../interfaces"
import { CustomShippingOption } from "../models"
import { CustomShippingOptionRepository } from "../repositories/custom-shipping-option"
import { FindConfig, Selector } from "../types/common"
import { CreateCustomShippingOptionInput } from "../types/shipping-options"
import { buildQuery } from "../utils"
import { DeepPartial } from "typeorm/common/DeepPartial"
type InjectedDependencies = {
manager: EntityManager
@@ -87,7 +86,6 @@ class CustomShippingOptionService extends TransactionBaseService {
const customShippingOptionRepo = this.activeManager_.withRepository(
this.customShippingOptionRepository_
)
const data_ = (
Array.isArray(data) ? data : [data]
) as DeepPartial<CustomShippingOption>[]
+2 -2
View File
@@ -21,6 +21,7 @@ import { OrderRepository } from "../repositories/order"
import { PaymentRepository } from "../repositories/payment"
import { FindConfig } from "../types/common"
import { DraftOrderCreateProps } from "../types/draft-orders"
import { GenerateInputData } from "../types/line-item"
import { buildQuery } from "../utils"
import CartService from "./cart"
import CustomShippingOptionService from "./custom-shipping-option"
@@ -28,7 +29,6 @@ import EventBusService from "./event-bus"
import LineItemService from "./line-item"
import ProductVariantService from "./product-variant"
import ShippingOptionService from "./shipping-option"
import { GenerateInputData } from "../types/line-item"
type InjectedDependencies = {
manager: EntityManager
@@ -352,7 +352,7 @@ class DraftOrderService extends TransactionBaseService {
cart_id: createdCart.id,
}))
itemsToCreate.push(...toCreate)
promises.push(lineItemServiceTx.create(toCreate))
}
// custom line items can be added to a draft order
+8 -5
View File
@@ -49,8 +49,6 @@ export type EmitOptions = {
}
} & JobOptions
const COMPLETED_JOB_TTL = 10000
/**
* Can keep track of multiple subscribers to different events and run the
* subscribers when events happen. Events will run asynchronously.
@@ -227,10 +225,15 @@ export default class EventBusService {
data: T,
options: Record<string, unknown> & EmitOptions = { attempts: 1 }
): Promise<StagedJob | void> {
const globalEventOptions = this.config_?.projectConfig?.event_options ?? {}
// The order of precedence for job options is:
// 1. local options
// 2. global options
// 3. default options
const opts: EmitOptions = {
removeOnComplete: {
age: COMPLETED_JOB_TTL,
},
removeOnComplete: true,
...globalEventOptions,
...options,
}
+20
View File
@@ -7,6 +7,7 @@ import { Request } from "express"
import { LoggerOptions } from "typeorm"
import { Logger as _Logger } from "winston"
import { Customer, User } from "../models"
import { EmitOptions } from "../services/event-bus"
import { FindConfig, RequestQueryFields } from "./common"
declare global {
@@ -58,6 +59,25 @@ export type ConfigModule = {
projectConfig: {
redis_url?: string
/**
* Global options passed to all `EventBusService.emit` in the core as well as your own emitters. The options are forwarded to Bull's `Queue.add` method.
*
* The global options can be overridden by passing options to `EventBusService.emit` directly.
*
* Note: This will be deprecated as we move to Event Bus module in 1.8
*
*
* Example
* ```js
* {
* removeOnComplete: { age: 10 },
* }
* ```
*
* @see https://github.com/OptimalBits/bull/blob/develop/REFERENCE.md#queueadd
*/
event_options?: Record<string, unknown> & EmitOptions
session_options?: SessionOptions
jwt_secret?: string
+1 -1
View File
@@ -1 +1 @@
{"id":"https://github.com/medusajs/medusa/releases/tag/v1.7.11","content":"v1.7.11 is out","isCloseable":true}
{}
+11
View File
@@ -0,0 +1,11 @@
#!/bin/bash
current_branch=$(git branch --show-current)
if [[ "$VERCEL_DEPLOY_BRANCHES" == *"$current_branch"* ]]; then
echo "Branch allowed to deploy"
exit 1;
else
echo "Branch not allowed to deploy"
exit 0;
fi
+120
View File
@@ -0,0 +1,120 @@
{
"redirects": [
{
"source": "/api",
"destination": "/api/store"
},
{
"source": "/api/store/auth/(.*)",
"destination": "/api/store/#tag/Auth"
},
{
"source": "/api/store/cart/(.*)",
"destination": "/api/store/#tag/Cart"
},
{
"source": "/api/store/collection/(.*)",
"destination": "/api/store/#tag/Collection"
},
{
"source": "/api/store/product/(.*)",
"destination": "/api/store/#tag/Product"
},
{
"source": "/api/admin/auth/(.*)",
"destination": "/api/admin/#tag/Auth"
},
{
"source": "/api/admin/users/(.*)",
"destination": "/api/admin/#tag/User"
},
{
"source": "/how-to/headless-ecommerce-store-with-gatsby-contentful-medusa",
"destination": "/add-plugins/contentful"
},
{
"source": "/how-to/deploying-on-heroku",
"destination": "/deployments/server/deploying-on-heroku"
},
{
"source": "/admin/introduction",
"destination": "/admin/quickstart"
},
{
"source": "/admin/quickstart/quick-start",
"destination": "/admin/quickstart"
},
{
"source": "/admin/quickstart",
"destination": "/admin/quickstart"
},
{
"source": "/quickstart/starters/nextjs-medusa-starter",
"destination": "/starters/nextjs-medusa-starter"
},
{
"source": "/quickstart/starters/gatsby-medusa-starter",
"destination": "/starters/gatsby-medusa-starter"
},
{
"source": "/how-to/create-medusa-app",
"destination": "/usage/create-medusa-app"
},
{
"source": "/guides/plugins",
"destination": "/advanced/backend/plugins/overview"
},
{
"source": "/how-to/deploying-admin-on-netlify",
"destination": "/deployments/admin/deploying-on-netlify"
},
{
"source": "/how-to/deploying-on-digital-ocean/",
"destination": "/deployments/server/deploying-on-digital-ocean"
},
{
"source": "/how-to/deploying-on-qovery/",
"destination": "/deployments/server/deploying-on-qovery"
},
{
"source": "/guides/fulfillment-api",
"destination": "/advanced/backend/shipping/add-fulfillment-provider"
},
{
"source": "/guides/checkouts",
"destination": "/advanced/storefront/how-to-implement-checkout-flow"
},
{
"source": "/guides/checkouts",
"destination": "/advanced/storefront/how-to-implement-checkout-flow"
},
{
"source": "/advanced/backend/upgrade-guides/1-7-3",
"destination": "/advanced/backend/upgrade-guides/medusa-core/1-7-3"
},
{
"source": "/advanced/backend/upgrade-guides/1-7-1",
"destination": "/advanced/backend/upgrade-guides/medusa-core/1-7-1"
},
{
"source": "/advanced/backend/upgrade-guides/1-7-0",
"destination": "/advanced/backend/upgrade-guides/medusa-core/1-7-0"
},
{
"source": "/advanced/backend/upgrade-guides/1-6-1",
"destination": "/advanced/backend/upgrade-guides/medusa-core/1-6-1"
},
{
"source": "/advanced/backend/upgrade-guides/1-3-8",
"destination": "/advanced/backend/upgrade-guides/medusa-core/1-3-8"
},
{
"source": "/advanced/backend/upgrade-guides/1-3-6",
"destination": "/advanced/backend/upgrade-guides/medusa-core/1-3-6"
},
{
"source": "/advanced/backend/upgrade-guides/1-3-0",
"destination": "/advanced/backend/upgrade-guides/medusa-core/1-3-0"
}
]
}
+1 -1
View File
@@ -5734,7 +5734,7 @@ __metadata:
typeorm: ^0.3.11
typescript: ^4.4.4
peerDependencies:
"@medusajs/medusa": 1.7.11
"@medusajs/medusa": 1.7.12
typeorm: ^0.3.11
languageName: unknown
linkType: soft