Skip to content

Commit

Permalink
feat: Vendor panel orders (#42)
Browse files Browse the repository at this point in the history
* update order page

* add vendor orders model logic

* no data available when 0 orders

* add order details dialog

* docs: Add codegen step

* fix: List orders payments

* migrate to page first architecture

* add order details dialog
  • Loading branch information
vholik authored Dec 30, 2024
1 parent c9577a0 commit 77917d0
Show file tree
Hide file tree
Showing 135 changed files with 4,059 additions and 371 deletions.
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,9 @@ cp .env.template .env
# Setup database and run migrations
yarn medusa db:create && yarn medusa db:migrate && yarn run seed

# Generate OpenAPI client
yarn codegen

# Go to root folder
cd ../..

Expand Down
28 changes: 15 additions & 13 deletions apps/backend/src/api/vendor/orders/[id]/route.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { AuthenticatedMedusaRequest, MedusaResponse } from '@medusajs/framework'
import { ContainerRegistrationKeys } from '@medusajs/framework/utils'
import { OrderDTO } from '@medusajs/framework/types'
import { getOrdersListWorkflow } from '@medusajs/medusa/core-flows'

/**
* @oas [get] /vendor/orders/{id}
Expand All @@ -22,7 +23,7 @@ import { ContainerRegistrationKeys } from '@medusajs/framework/utils'
* schema:
* type: object
* properties:
* member:
* order:
* $ref: "#/components/schemas/VendorOrderDetails"
* tags:
* - Order
Expand All @@ -34,19 +35,20 @@ export const GET = async (
req: AuthenticatedMedusaRequest,
res: MedusaResponse
) => {
const query = req.scope.resolve(ContainerRegistrationKeys.QUERY)

const { id } = req.params
const {
data: [order]
} = await query.graph(
{
entity: 'order',

const { result } = await getOrdersListWorkflow(req.scope).run({
input: {
fields: req.remoteQueryConfig.fields,
filters: { id: id }
},
{ throwIfKeyNotFound: true }
)
variables: {
filters: {
id
}
}
}
})

const [order] = result as OrderDTO[]

res.json({ order })
}
20 changes: 10 additions & 10 deletions apps/backend/src/api/vendor/orders/middlewares.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,7 @@ import {

import sellerOrderLink from '../../../links/seller-order'
import sellerLocationLink from '../../../links/seller-stock-location'
import {
checkResourceOwnershipByResourceId,
filterBySellerId
} from '../../../shared/infra/http/middlewares'
import { checkResourceOwnershipByResourceId } from '../../../shared/infra/http/middlewares'
import { vendorOrderQueryConfig } from './query-config'
import {
VendorCreateFulfillment,
Expand All @@ -26,8 +23,7 @@ export const vendorOrderMiddlewares: MiddlewareRoute[] = [
validateAndTransformQuery(
VendorGetOrderParams,
vendorOrderQueryConfig.list
),
filterBySellerId()
)
]
},
{
Expand All @@ -39,7 +35,8 @@ export const vendorOrderMiddlewares: MiddlewareRoute[] = [
vendorOrderQueryConfig.retrieve
),
checkResourceOwnershipByResourceId({
entryPoint: sellerOrderLink.entryPoint
entryPoint: sellerOrderLink.entryPoint,
filterField: 'order_id'
})
]
},
Expand All @@ -52,7 +49,8 @@ export const vendorOrderMiddlewares: MiddlewareRoute[] = [
vendorOrderQueryConfig.retrieve
),
checkResourceOwnershipByResourceId({
entryPoint: sellerOrderLink.entryPoint
entryPoint: sellerOrderLink.entryPoint,
filterField: 'order_id'
})
]
},
Expand All @@ -65,7 +63,8 @@ export const vendorOrderMiddlewares: MiddlewareRoute[] = [
vendorOrderQueryConfig.retrieve
),
checkResourceOwnershipByResourceId({
entryPoint: sellerOrderLink.entryPoint
entryPoint: sellerOrderLink.entryPoint,
filterField: 'order_id'
})
]
},
Expand All @@ -75,7 +74,8 @@ export const vendorOrderMiddlewares: MiddlewareRoute[] = [
middlewares: [
validateAndTransformBody(VendorCreateFulfillment),
checkResourceOwnershipByResourceId({
entryPoint: sellerOrderLink.entryPoint
entryPoint: sellerOrderLink.entryPoint,
filterField: 'order_id'
}),
checkResourceOwnershipByResourceId({
entryPoint: sellerLocationLink.entryPoint,
Expand Down
38 changes: 16 additions & 22 deletions apps/backend/src/api/vendor/orders/query-config.ts
Original file line number Diff line number Diff line change
@@ -1,29 +1,20 @@
export const vendorListOrderFields = [
export const vendorOrderFields = [
'id',
'status',
'summary',
'display_id',
'total',
'status',
'email',
'currency_code',
'version',
'summary',
'metadata',
'created_at',
'updated_at',
'*seller'
]

export const vendorRetrieveOrderFields = [
'id',
'status',
'summary',
'currency_code',
'display_id',
'region_id',
'email',
'total',
'subtotal',
'tax_total',
'order_change',
'discount_total',
'discount_subtotal',
'discount_tax_total',
'original_total',
'original_tax_total',
Expand All @@ -39,26 +30,29 @@ export const vendorRetrieveOrderFields = [
'original_shipping_tax_total',
'original_shipping_subtotal',
'original_shipping_total',
'created_at',
'updated_at',
'*items',
'*items.detail',
'*items.tax_lines',
'*items.adjustments',
'*items.variant',
'*items.variant.product',
'*items.detail',
'*shipping_address',
'*billing_address',
'*shipping_methods',
'*payment_collections',
'*seller'
'*shipping_methods.tax_lines',
'*shipping_methods.adjustments',
'*fulfillments',
'*fulfillments.items',
'*fulfillments.labels'
]

export const vendorOrderQueryConfig = {
list: {
defaults: vendorListOrderFields,
defaults: vendorOrderFields,
isList: true
},
retrieve: {
defaults: vendorRetrieveOrderFields,
defaults: vendorOrderFields,
isList: false
}
}
82 changes: 72 additions & 10 deletions apps/backend/src/api/vendor/orders/route.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
import { MedusaRequest, MedusaResponse } from '@medusajs/framework'
import sellerOrderLink from '#/links/seller-order'
import { fetchSellerByAuthActorId } from '#/shared/infra/http/utils'

import { AuthenticatedMedusaRequest, MedusaResponse } from '@medusajs/framework'
import { OrderDTO } from '@medusajs/framework/types'
import { ContainerRegistrationKeys } from '@medusajs/framework/utils'
import { getOrdersListWorkflow } from '@medusajs/medusa/core-flows'

import { VendorGetOrderParamsType } from './validators'

Expand Down Expand Up @@ -34,6 +39,41 @@ import { VendorGetOrderParamsType } from './validators'
* type: string
* required: false
* description: The order of the returned items.
* - name: created_at
* in: query
* schema:
* type: object
* required: false
* description: Filter by created at date range
* - name: status
* in: query
* schema:
* oneOf:
* - type: string
* - type: array
* items:
* type: string
* - type: object
* required: false
* description: Filter by order status
* - name: fulfillment_status
* in: query
* schema:
* type: string
* required: false
* description: Filter by fulfillment status
* - name: payment_status
* in: query
* schema:
* type: string
* required: false
* description: Filter by payment status
* - name: q
* in: query
* schema:
* type: string
* required: false
* description: Search query for filtering orders
* responses:
* "200":
* description: OK
Expand All @@ -42,7 +82,7 @@ import { VendorGetOrderParamsType } from './validators'
* schema:
* type: object
* properties:
* products:
* orders:
* type: array
* items:
* $ref: "#/components/schemas/VendorOrderDetails"
Expand All @@ -62,22 +102,44 @@ import { VendorGetOrderParamsType } from './validators'
* - cookie_auth: []
*/
export const GET = async (
req: MedusaRequest<VendorGetOrderParamsType>,
req: AuthenticatedMedusaRequest<VendorGetOrderParamsType>,
res: MedusaResponse
) => {
const query = req.scope.resolve(ContainerRegistrationKeys.QUERY)

const { data: orders, metadata } = await query.graph({
entity: 'order',
fields: req.remoteQueryConfig.fields,
filters: req.filterableFields,
pagination: {
...req.remoteQueryConfig.pagination
const seller = await fetchSellerByAuthActorId(
req.auth_context.actor_id,
req.scope
)

const { data: orderRelations } = await query.graph({
entity: sellerOrderLink.entryPoint,
fields: ['order_id'],
filters: {
seller_id: seller.id
}
})

const { result } = await getOrdersListWorkflow(req.scope).run({
input: {
fields: req.remoteQueryConfig.fields,
variables: {
filters: {
...req.filterableFields,
id: orderRelations.map((relation) => relation.order_id)
},
...req.remoteQueryConfig.pagination
}
}
})

const { rows, metadata } = result as {
rows: OrderDTO[]
metadata: any
}

res.json({
members: orders,
orders: rows,
count: metadata!.count,
offset: metadata!.skip,
limit: metadata!.take
Expand Down
17 changes: 15 additions & 2 deletions apps/backend/src/api/vendor/orders/validators.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,25 @@
import * as z from 'zod'

import { createFindParams } from '@medusajs/medusa/api/utils/validators'
import {
createFindParams,
createOperatorMap
} from '@medusajs/medusa/api/utils/validators'

export type VendorGetOrderParamsType = z.infer<typeof VendorGetOrderParams>
export const VendorGetOrderParams = createFindParams({
offset: 0,
limit: 50
})
}).merge(
z.object({
created_at: createOperatorMap().optional(),
status: z
.union([z.string(), z.array(z.string()), createOperatorMap()])
.optional(),
fulfillment_status: z.string().optional(),
payment_status: z.string().optional(),
q: z.string().optional()
})
)

/**
* @schema VendorCreateFulfillment
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -221,9 +221,10 @@ export const splitAndCompleteCartWorkflow = createWorkflow(
{
createdOrders,
sellers,
orderSet
orderSet,
cart
},
({ createdOrders, sellers, orderSet }) => {
({ createdOrders, sellers, orderSet, cart }) => {
const sellerOrderLinks = createdOrders.map((order, index) => ({
[SELLER_MODULE]: {
seller_id: sellers[index]
Expand All @@ -242,7 +243,20 @@ export const splitAndCompleteCartWorkflow = createWorkflow(
}
}))

return [...sellerOrderLinks, ...orderSetOrderLinks]
const orderPaymentLinks = createdOrders.map((order) => ({
[Modules.ORDER]: {
order_id: order.id
},
[Modules.PAYMENT]: {
payment_collection_id: cart.payment_collection.id
}
}))

return [
...sellerOrderLinks,
...orderSetOrderLinks,
...orderPaymentLinks
]
}
)

Expand Down
3 changes: 2 additions & 1 deletion apps/vendor/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,14 @@
"@tanstack/react-query": "^5.62.2",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"date-fns": "^4.1.0",
"dayjs": "^1.11.13",
"lucide-react": "^0.468.0",
"next-themes": "^0.4.3",
"react": "^18.3.1",
"react-day-picker": "8.10.1",
"react-dom": "^18.3.1",
"react-hook-form": "^7.54.1",
"recharts": "^2.15.0",
"sonner": "^1.7.0",
"tailwind-merge": "^2.5.5",
"tailwindcss-animate": "^1.0.7",
Expand Down
Loading

0 comments on commit 77917d0

Please sign in to comment.