Files
payload/packages/plugin-stripe/src/webhooks/handleDeleted.ts
2023-10-22 17:39:30 -04:00

83 lines
2.6 KiB
TypeScript

import type { SanitizedStripeConfig, StripeWebhookHandler } from '../types'
type HandleDeleted = (
args: Parameters<StripeWebhookHandler>[0] & {
resourceType: string
syncConfig: SanitizedStripeConfig['sync'][0]
},
) => void
export const handleDeleted: HandleDeleted = async (args) => {
const { event, payload, resourceType, stripeConfig, syncConfig } = args
const { logs } = stripeConfig || {}
const collectionSlug = syncConfig?.collection
const {
id: stripeID,
object: eventObject, // use this to determine if this is a nested field
}: any = event?.data?.object || {}
// if the event object and resource type don't match, this deletion was not top-level
const isNestedDelete = eventObject !== resourceType
if (isNestedDelete) {
if (logs)
payload.logger.info(
`- This deletion occurred on a nested field of ${resourceType}. Nested fields are not yet supported.`,
)
}
if (!isNestedDelete) {
if (logs)
payload.logger.info(
`- A '${resourceType}' resource was deleted in Stripe, now deleting '${collectionSlug}' document in Payload with Stripe ID: '${stripeID}'...`,
)
try {
const payloadQuery = await payload.find({
collection: collectionSlug,
where: {
stripeID: {
equals: stripeID,
},
},
})
const foundDoc = payloadQuery.docs[0] as any
if (!foundDoc) {
if (logs)
payload.logger.info(
`- Nothing to delete, no existing document found with Stripe ID: '${stripeID}'.`,
)
}
if (foundDoc) {
if (logs) payload.logger.info(`- Deleting Payload document with ID: '${foundDoc.id}'...`)
try {
payload.delete({
id: foundDoc.id,
collection: collectionSlug,
})
// NOTE: the `afterDelete` hook will trigger, which will attempt to delete the document from Stripe and safely error out
// There is no known way of preventing this from happening. In other hooks we use the `skipSync` field, but here the document is already deleted.
if (logs)
payload.logger.info(
`- ✅ Successfully deleted Payload document with ID: '${foundDoc.id}'.`,
)
} catch (error: unknown) {
const msg = error instanceof Error ? error.message : error
if (logs) payload.logger.error(`Error deleting document: ${msg}`)
}
}
} catch (error: unknown) {
const msg = error instanceof Error ? error.message : error
if (logs) payload.logger.error(`Error deleting document: ${msg}`)
}
}
}