feat: Capture payment (#6601)

* feat: Capture payment

* add amount to workflow input
This commit is contained in:
Oli Juhl authored and GitHub committed 2024-03-07 11:02:26 +01:00
1 parent 12b035cb18
commit 3d0da980cf
23 files changed
+584 -86

No files matched your search

@@ -0,0 +1,42 @@
import { capturePaymentWorkflow } from "@medusajs/core-flows"
import { Modules } from "@medusajs/modules-sdk"
import {
ContainerRegistrationKeys,
remoteQueryObjectFromString,
} from "@medusajs/utils"
import {
AuthenticatedMedusaRequest,
MedusaResponse,
} from "../../../../../types/routing"
import { defaultAdminPaymentFields } from "../../query-config"
export const POST = async (
req: AuthenticatedMedusaRequest,
res: MedusaResponse
) => {
const remoteQuery = req.scope.resolve(ContainerRegistrationKeys.REMOTE_QUERY)
const { id } = req.params
const { errors } = await capturePaymentWorkflow(req.scope).run({
input: {
payment_id: id,
captured_by: req.auth?.actor_id,
},
throwOnError: false,
})
if (Array.isArray(errors) && errors[0]) {
throw errors[0].error
}
const query = remoteQueryObjectFromString({
entryPoint: Modules.PAYMENT,
variables: { id },
fields: defaultAdminPaymentFields,
})
const [payment] = await remoteQuery(query)
res.status(200).json({ payment })
}
@@ -0,0 +1,28 @@
import { Modules } from "@medusajs/modules-sdk"
import {
ContainerRegistrationKeys,
remoteQueryObjectFromString,
} from "@medusajs/utils"
import {
AuthenticatedMedusaRequest,
MedusaResponse,
} from "../../../../types/routing"
export const GET = async (
req: AuthenticatedMedusaRequest,
res: MedusaResponse
) => {
const remoteQuery = req.scope.resolve(ContainerRegistrationKeys.REMOTE_QUERY)
const { id } = req.params
const query = remoteQueryObjectFromString({
entryPoint: Modules.PAYMENT,
variables: { id },
fields: req.retrieveConfig.select as string[],
})
const [payment] = await remoteQuery(query)
res.status(200).json({ payment })
}
@@ -0,0 +1,44 @@
import { transformQuery } from "../../../api/middlewares"
import { MiddlewareRoute } from "../../../types/middlewares"
import { authenticate } from "../../../utils/authenticate-middleware"
import * as queryConfig from "./query-config"
import { AdminGetPaymentsParams } from "./validators"
export const adminPaymentRoutesMiddlewares: MiddlewareRoute[] = [
{
method: "ALL",
matcher: "/admin/payments",
middlewares: [authenticate("admin", ["session", "bearer"])],
},
{
method: ["GET"],
matcher: "/admin/payments",
middlewares: [
transformQuery(
AdminGetPaymentsParams,
queryConfig.listTransformQueryConfig
),
],
},
{
method: ["GET"],
matcher: "/admin/payments/:id",
middlewares: [
transformQuery(
AdminGetPaymentsParams,
queryConfig.retrieveTransformQueryConfig
),
],
},
{
method: ["POST"],
matcher: "/admin/payments/:id/capture",
middlewares: [],
},
// TODO: Add in follow-up PR
// {
// method: ["POST"],
// matcher: "/admin/payments/:id/refund",
// middlewares: [],
// },
]
@@ -0,0 +1,25 @@
export const defaultAdminPaymentFields = [
"id",
"currency_code",
"amount",
"payment_collection_id",
"payment_session_id",
]
export const defaultAdminPaymentRelations = ["captures", "refunds"]
export const allowedAdminPaymentRelations = ["captures", "refunds"]
export const listTransformQueryConfig = {
defaultFields: defaultAdminPaymentFields,
defaultRelations: defaultAdminPaymentRelations,
allowedRelations: allowedAdminPaymentRelations,
isList: true,
}
export const retrieveTransformQueryConfig = {
defaultFields: defaultAdminPaymentFields,
defaultRelations: defaultAdminPaymentRelations,
allowedRelations: allowedAdminPaymentRelations,
isList: false,
}
@@ -0,0 +1,36 @@
import { Modules } from "@medusajs/modules-sdk"
import {
ContainerRegistrationKeys,
remoteQueryObjectFromString,
} from "@medusajs/utils"
import {
AuthenticatedMedusaRequest,
MedusaResponse,
} from "../../../types/routing"
export const GET = async (
req: AuthenticatedMedusaRequest,
res: MedusaResponse
) => {
const remoteQuery = req.scope.resolve(ContainerRegistrationKeys.REMOTE_QUERY)
const query = remoteQueryObjectFromString({
entryPoint: Modules.PAYMENT,
variables: {
filters: req.filterableFields,
order: req.listConfig.order,
skip: req.listConfig.skip,
take: req.listConfig.take,
},
fields: req.listConfig.select as string[],
})
const { rows: payments, metadata } = await remoteQuery(query)
res.status(200).json({
payments,
count: metadata.count,
offset: metadata.skip,
limit: metadata.take,
})
}
@@ -0,0 +1,46 @@
import { Type } from "class-transformer"
import { IsOptional, ValidateNested } from "class-validator"
import {
DateComparisonOperator,
FindParams,
extendedFindParamsMixin,
} from "../../../types/common"
import { IsType } from "../../../utils"
export class AdminGetPaymentsPaymentParams extends FindParams {}
export class AdminGetPaymentsParams extends extendedFindParamsMixin({
limit: 20,
offset: 0,
}) {
/**
* IDs to filter users by.
*/
@IsOptional()
@IsType([String, [String]])
id?: string | string[]
/**
* Date filters to apply on the users' `update_at` date.
*/
@IsOptional()
@ValidateNested()
@Type(() => DateComparisonOperator)
updated_at?: DateComparisonOperator
/**
* Date filters to apply on the customer users' `created_at` date.
*/
@IsOptional()
@ValidateNested()
@Type(() => DateComparisonOperator)
created_at?: DateComparisonOperator
/**
* Date filters to apply on the users' `deleted_at` date.
*/
@IsOptional()
@ValidateNested()
@Type(() => DateComparisonOperator)
deleted_at?: DateComparisonOperator
}
@@ -5,6 +5,7 @@ import { adminCurrencyRoutesMiddlewares } from "./admin/currencies/middlewares"
import { adminCustomerGroupRoutesMiddlewares } from "./admin/customer-groups/middlewares"
import { adminCustomerRoutesMiddlewares } from "./admin/customers/middlewares"
import { adminInviteRoutesMiddlewares } from "./admin/invites/middlewares"
import { adminPaymentRoutesMiddlewares } from "./admin/payments/middlewares"
import { adminPriceListsRoutesMiddlewares } from "./admin/price-lists/middlewares"
import { adminProductRoutesMiddlewares } from "./admin/products/middlewares"
import { adminPromotionRoutesMiddlewares } from "./admin/promotions/middlewares"
@@ -44,6 +45,7 @@ export const config: MiddlewaresConfig = {
...adminCurrencyRoutesMiddlewares,
...storeCurrencyRoutesMiddlewares,
...adminProductRoutesMiddlewares,
...adminPaymentRoutesMiddlewares,
...adminPriceListsRoutesMiddlewares,
],
}