feat(medusa,workflows) Create cart workflow (#4685)

* chore: add baseline test for create cart

* chore: add basic paths into handlers + make first tests pass

* chore: move input alias to cart specific workflow

* chore: move data around into buckets

* chore: normalize handlers and introduce types

* chore: move aliases to handlers concern

* chore: add compensation step for create cart

* chore: merge with latest develop

* chore: handle error manually + type inputs

* chore: handle error manually

* chore: added types for each handler

* chore: remove addresses

* chore: added changset

* chore: undo package changes

* chore: added config settings to retreieve, cleanup of types

* chore: capitalize cart handlers

* chore: rename todo

* chore: add feature flag for workflow

* chore: reorder handlers

* chore: add logger to route handler

* chore: removed weird vscode moving around things

* chore: refactor handlers

* chore: refactor compensate step

* chore: changed poistion

* chore: aggregate config data

* chore: moved handlers to their own domain + pr review addressing

* chore: address pr reviews

* chore: move types to type package

* chore: update type to include config

* chore: remove error scoping
This commit is contained in:
Riqwan Thamir
2023-08-08 12:10:27 +02:00
committed by GitHub
parent a42c41e8ab
commit 281b0746cf
35 changed files with 1140 additions and 13 deletions
@@ -1,3 +1,8 @@
import { MedusaContainer } from "@medusajs/modules-sdk"
import {
Workflows,
createCart as createCartWorkflow,
} from "@medusajs/workflows"
import { Type } from "class-transformer"
import {
IsArray,
@@ -7,10 +12,11 @@ import {
IsString,
ValidateNested,
} from "class-validator"
import { isDefined, MedusaError } from "medusa-core-utils"
import { MedusaError, isDefined } from "medusa-core-utils"
import reqIp from "request-ip"
import { EntityManager } from "typeorm"
import { Logger } from "@medusajs/types"
import { defaultStoreCartFields, defaultStoreCartRelations } from "."
import SalesChannelFeatureFlag from "../../../../loaders/feature-flags/sales-channels"
import { Cart, LineItem } from "../../../../models"
@@ -75,18 +81,56 @@ import { FlagRouter } from "../../../../utils/flag-router"
* $ref: "#/components/responses/500_error"
*/
export default async (req, res) => {
const entityManager: EntityManager = req.scope.resolve("manager")
const featureFlagRouter: FlagRouter = req.scope.resolve("featureFlagRouter")
const validated = req.validatedBody as StorePostCartReq
const logger: Logger = req.scope.resolve("logger")
const reqContext = {
ip: reqIp.getClientIp(req),
user_agent: req.get("user-agent"),
}
const isWorkflowEnabled = featureFlagRouter.isFeatureEnabled({
workflows: Workflows.CreateCart,
})
if (isWorkflowEnabled) {
const cartWorkflow = createCartWorkflow(req.scope as MedusaContainer)
const input = {
...validated,
publishableApiKeyScopes: req.publishableApiKeyScopes,
context: {
...reqContext,
...validated.context,
},
config: {
retrieveConfig: {
select: defaultStoreCartFields,
relations: defaultStoreCartRelations,
},
},
}
const { result, errors } = await cartWorkflow.run({
input,
context: {
manager: entityManager,
},
throwOnError: false,
})
if (Array.isArray(errors)) {
if (isDefined(errors[0])) {
throw errors[0].error
}
}
return res.status(200).json({ cart: cleanResponseData(result, []) })
}
const lineItemService: LineItemService = req.scope.resolve("lineItemService")
const cartService: CartService = req.scope.resolve("cartService")
const regionService: RegionService = req.scope.resolve("regionService")
const entityManager: EntityManager = req.scope.resolve("manager")
const featureFlagRouter: FlagRouter = req.scope.resolve("featureFlagRouter")
let regionId!: string
if (isDefined(validated.region_id)) {