Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Vendor panel orders #42

Merged
merged 8 commits into from
Dec 30, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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