From 99e3e9287f0ea09778f0a29212a902b447ee880d Mon Sep 17 00:00:00 2001 From: olivermrbl Date: Sun, 21 Feb 2021 10:43:56 +0100 Subject: [PATCH] add admin_only to shipping options --- .../admin/draft-orders/create-draft-order.js | 9 ++--- .../__tests__/create-shipping-option.js | 1 + .../__tests__/list-shipping-options.js | 1 + .../create-shipping-option.js | 1 + .../routes/admin/shipping-options/index.js | 1 + .../shipping-options/list-shipping-options.js | 2 +- .../update-shipping-option.js | 1 + .../__tests__/list-options.js | 1 + .../store/shipping-options/list-options.js | 2 ++ ...613896971521-shipping_option_admin_only.ts | 18 ++++++++++ packages/medusa/src/models/shipping-option.ts | 3 ++ packages/medusa/src/services/draft-order.js | 33 ++++++++----------- .../medusa/src/services/shipping-option.js | 4 +++ .../medusa/src/services/shipping-profile.js | 1 + 14 files changed, 50 insertions(+), 28 deletions(-) create mode 100644 packages/medusa/src/migrations/1613896971521-shipping_option_admin_only.ts diff --git a/packages/medusa/src/api/routes/admin/draft-orders/create-draft-order.js b/packages/medusa/src/api/routes/admin/draft-orders/create-draft-order.js index 6108d32547..a9569e1ef6 100644 --- a/packages/medusa/src/api/routes/admin/draft-orders/create-draft-order.js +++ b/packages/medusa/src/api/routes/admin/draft-orders/create-draft-order.js @@ -40,9 +40,8 @@ export default async (req, res) => { .allow(0) .optional(), }) - .optional(), + .required(), metadata: Validator.object().optional(), - requires_shipping: Validator.boolean().default(true), }) const { value, error } = schema.validate(req.body) @@ -52,11 +51,7 @@ export default async (req, res) => { try { const draftOrderService = req.scope.resolve("draftOrderService") - - const requiresShipping = value.requires_shipping - delete value.requires_shipping - - let draftOrder = await draftOrderService.create(value, requiresShipping) + let draftOrder = await draftOrderService.create(value) draftOrder = await draftOrderService.retrieve(draftOrder.id, { relations: defaultRelations, diff --git a/packages/medusa/src/api/routes/admin/shipping-options/__tests__/create-shipping-option.js b/packages/medusa/src/api/routes/admin/shipping-options/__tests__/create-shipping-option.js index f8a8a0e378..71cbf994b0 100644 --- a/packages/medusa/src/api/routes/admin/shipping-options/__tests__/create-shipping-option.js +++ b/packages/medusa/src/api/routes/admin/shipping-options/__tests__/create-shipping-option.js @@ -39,6 +39,7 @@ describe("POST /admin/shipping-options", () => { expect(ShippingOptionServiceMock.create).toHaveBeenCalledTimes(1) expect(ShippingOptionServiceMock.create).toHaveBeenCalledWith({ is_return: false, + admin_only: false, name: "Test option", region_id: "testregion", provider_id: "test_provider", diff --git a/packages/medusa/src/api/routes/admin/shipping-options/__tests__/list-shipping-options.js b/packages/medusa/src/api/routes/admin/shipping-options/__tests__/list-shipping-options.js index 65d645f0da..0c163a3c40 100644 --- a/packages/medusa/src/api/routes/admin/shipping-options/__tests__/list-shipping-options.js +++ b/packages/medusa/src/api/routes/admin/shipping-options/__tests__/list-shipping-options.js @@ -11,6 +11,7 @@ const defaultFields = [ "price_type", "amount", "is_return", + "admin_only", "data", "created_at", "updated_at", diff --git a/packages/medusa/src/api/routes/admin/shipping-options/create-shipping-option.js b/packages/medusa/src/api/routes/admin/shipping-options/create-shipping-option.js index dc1034a6ce..9df2d6402c 100644 --- a/packages/medusa/src/api/routes/admin/shipping-options/create-shipping-option.js +++ b/packages/medusa/src/api/routes/admin/shipping-options/create-shipping-option.js @@ -23,6 +23,7 @@ export default async (req, res) => { ) .optional(), is_return: Validator.boolean().default(false), + admin_only: Validator.boolean().default(false), }) const { value, error } = schema.validate(req.body) diff --git a/packages/medusa/src/api/routes/admin/shipping-options/index.js b/packages/medusa/src/api/routes/admin/shipping-options/index.js index b51632da78..84dbfcde6d 100644 --- a/packages/medusa/src/api/routes/admin/shipping-options/index.js +++ b/packages/medusa/src/api/routes/admin/shipping-options/index.js @@ -34,6 +34,7 @@ export const defaultFields = [ "price_type", "amount", "is_return", + "admin_only", "data", "created_at", "updated_at", diff --git a/packages/medusa/src/api/routes/admin/shipping-options/list-shipping-options.js b/packages/medusa/src/api/routes/admin/shipping-options/list-shipping-options.js index e6f6bbabfa..36f936f9ca 100644 --- a/packages/medusa/src/api/routes/admin/shipping-options/list-shipping-options.js +++ b/packages/medusa/src/api/routes/admin/shipping-options/list-shipping-options.js @@ -3,7 +3,7 @@ import { defaultFields, defaultRelations } from "./" export default async (req, res) => { try { - const query = _.pick(req.query, ["region_id", "is_return"]) + const query = _.pick(req.query, ["region_id", "is_return", "admin_only"]) const optionService = req.scope.resolve("shippingOptionService") const data = await optionService.list(query, { diff --git a/packages/medusa/src/api/routes/admin/shipping-options/update-shipping-option.js b/packages/medusa/src/api/routes/admin/shipping-options/update-shipping-option.js index d64e6202c4..577a3dbe82 100644 --- a/packages/medusa/src/api/routes/admin/shipping-options/update-shipping-option.js +++ b/packages/medusa/src/api/routes/admin/shipping-options/update-shipping-option.js @@ -20,6 +20,7 @@ export default async (req, res) => { }) ) .optional(), + admin_only: Validator.boolean().optional(), metadata: Validator.object().optional(), }) diff --git a/packages/medusa/src/api/routes/store/shipping-options/__tests__/list-options.js b/packages/medusa/src/api/routes/store/shipping-options/__tests__/list-options.js index 32c8a806e7..e3e0b7e3bc 100644 --- a/packages/medusa/src/api/routes/store/shipping-options/__tests__/list-options.js +++ b/packages/medusa/src/api/routes/store/shipping-options/__tests__/list-options.js @@ -26,6 +26,7 @@ describe("GET /store/shipping-options", () => { expect(ShippingOptionServiceMock.list).toHaveBeenCalledTimes(1) expect(ShippingOptionServiceMock.list).toHaveBeenCalledWith( { + admin_only: false, profile_id: [undefined, undefined], region_id: "test-region", }, diff --git a/packages/medusa/src/api/routes/store/shipping-options/list-options.js b/packages/medusa/src/api/routes/store/shipping-options/list-options.js index 704abda25e..475925871c 100644 --- a/packages/medusa/src/api/routes/store/shipping-options/list-options.js +++ b/packages/medusa/src/api/routes/store/shipping-options/list-options.js @@ -13,6 +13,8 @@ export default async (req, res) => { query.region_id = regionId } + query.admin_only = false + if (productIds.length) { const prods = await productService.list({ id: productIds }) query.profile_id = prods.map(p => p.profile_id) diff --git a/packages/medusa/src/migrations/1613896971521-shipping_option_admin_only.ts b/packages/medusa/src/migrations/1613896971521-shipping_option_admin_only.ts new file mode 100644 index 0000000000..450bf01f1a --- /dev/null +++ b/packages/medusa/src/migrations/1613896971521-shipping_option_admin_only.ts @@ -0,0 +1,18 @@ +import { MigrationInterface, QueryRunner } from "typeorm" + +export class shippingOptionAdminOnly1613896971521 + implements MigrationInterface { + name = "shippingOptionAdminOnly1613896971521" + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "shipping_option" ADD "admin_only" boolean NOT NULL DEFAULT false` + ) + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE "shipping_option" DROP COLUMN "admin_only"` + ) + } +} diff --git a/packages/medusa/src/models/shipping-option.ts b/packages/medusa/src/models/shipping-option.ts index 63a22b1722..4d5f0490f8 100644 --- a/packages/medusa/src/models/shipping-option.ts +++ b/packages/medusa/src/models/shipping-option.ts @@ -70,6 +70,9 @@ export class ShippingOption { @Column({ default: false }) is_return: boolean + @Column({ default: false }) + admin_only: boolean + @OneToMany( () => ShippingOptionRequirement, req => req.shipping_option, diff --git a/packages/medusa/src/services/draft-order.js b/packages/medusa/src/services/draft-order.js index 9de3d2d12a..1d349a15d6 100644 --- a/packages/medusa/src/services/draft-order.js +++ b/packages/medusa/src/services/draft-order.js @@ -229,7 +229,7 @@ class DraftOrderService extends BaseService { * @param {boolean} shippingRequired - needs shipping flag * @return {Promise} the created draft order */ - async create(data, shippingRequired = true) { + async create(data) { return this.atomicPhase_(async manager => { const draftOrderRepo = manager.getCustomRepository( this.draftOrderRepository_ @@ -265,23 +265,21 @@ class DraftOrderService extends BaseService { }) let shippingMethods = [] - let profiles = [] - if (shippingRequired) { - for (const method of shipping_methods) { - const m = await this.shippingOptionService_ - .withTransaction(manager) - .createShippingMethod(method.option_id, method.data, { - cart: createdCart, - }) - shippingMethods.push(m) - } + for (const method of shipping_methods) { + const m = await this.shippingOptionService_ + .withTransaction(manager) + .createShippingMethod(method.option_id, method.data, { + cart: createdCart, + }) - profiles = shippingMethods.map( - ({ shipping_option }) => shipping_option.profile_id - ) + shippingMethods.push(m) } + const profiles = shippingMethods.map( + ({ shipping_option }) => shipping_option.profile_id + ) + for (const item of items) { if (item.variant_id) { const line = await this.lineItemService_ @@ -299,12 +297,7 @@ class DraftOrderService extends BaseService { .retrieve(item.variant_id) const itemProfile = variant.product.profile_id - let hasShipping = true - - // if shipping is required, ensure items can be shipped - if (shippingRequired) { - hasShipping = profiles.includes(itemProfile) - } + const hasShipping = profiles.includes(itemProfile) await this.lineItemService_.withTransaction(manager).create({ cart_id: createdCart.id, diff --git a/packages/medusa/src/services/shipping-option.js b/packages/medusa/src/services/shipping-option.js index 6a2797f9e4..c4657cb527 100644 --- a/packages/medusa/src/services/shipping-option.js +++ b/packages/medusa/src/services/shipping-option.js @@ -468,6 +468,10 @@ class ShippingOptionService extends BaseService { option.name = update.name } + if ("admin_only" in update) { + option.admin_only = update.admin_only + } + const optionRepo = manager.getCustomRepository(this.optionRepository_) const result = await optionRepo.save(option) return result diff --git a/packages/medusa/src/services/shipping-profile.js b/packages/medusa/src/services/shipping-profile.js index 095a5868e8..950bb541bb 100644 --- a/packages/medusa/src/services/shipping-profile.js +++ b/packages/medusa/src/services/shipping-profile.js @@ -418,6 +418,7 @@ class ShippingProfileService extends BaseService { const rawOpts = await this.shippingOptionService_.list( { profile_id: profileIds, + admin_only: false, }, { relations: ["requirements", "profile"] } )