Files
payload/packages/plugin-cloud/src/plugin.ts
2024-04-18 01:44:20 -04:00

98 lines
3.2 KiB
TypeScript

import type { Config } from 'payload/config'
import type { PluginOptions } from './types.js'
import { payloadCloudEmail } from './email.js'
import { getAfterDeleteHook } from './hooks/afterDelete.js'
import { getBeforeChangeHook } from './hooks/beforeChange.js'
import {
getCacheUploadsAfterChangeHook,
getCacheUploadsAfterDeleteHook,
} from './hooks/uploadCache.js'
import { getStaticHandler } from './staticHandler.js'
export const payloadCloud =
(pluginOptions?: PluginOptions) =>
async (incomingConfig: Config): Promise<Config> => {
let config = { ...incomingConfig }
if (process.env.PAYLOAD_CLOUD !== 'true') {
return config
}
const cachingEnabled =
pluginOptions?.uploadCaching !== false && !!process.env.PAYLOAD_CLOUD_CACHE_KEY
const apiEndpoint = pluginOptions?.endpoint || 'https://cloud-api.payloadcms.com'
// Configure cloud storage
if (pluginOptions?.storage !== false) {
config = {
...config,
collections: (config.collections || []).map((collection) => {
if (collection.upload) {
return {
...collection,
hooks: {
...(collection.hooks || {}),
afterChange: [
...(collection.hooks?.afterChange || []),
...(cachingEnabled
? [getCacheUploadsAfterChangeHook({ endpoint: apiEndpoint })]
: []),
],
afterDelete: [
...(collection.hooks?.afterDelete || []),
getAfterDeleteHook({ collection }),
...(cachingEnabled
? [getCacheUploadsAfterDeleteHook({ endpoint: apiEndpoint })]
: []),
],
beforeChange: [
...(collection.hooks?.beforeChange || []),
getBeforeChangeHook({ collection }),
],
},
upload: {
...(typeof collection.upload === 'object' ? collection.upload : {}),
disableLocalStorage: true,
handlers: [
...(typeof collection.upload === 'object' &&
Array.isArray(collection.upload.handlers)
? collection.upload.handlers
: []),
getStaticHandler({
cachingOptions: pluginOptions?.uploadCaching,
collection,
}),
],
},
}
}
return collection
}),
upload: {
...(config.upload || {}),
useTempFiles: true,
},
}
}
// Configure cloud email
const apiKey = process.env.PAYLOAD_CLOUD_EMAIL_API_KEY
const defaultDomain = process.env.PAYLOAD_CLOUD_DEFAULT_DOMAIN
if (pluginOptions?.email !== false && apiKey && defaultDomain) {
config.email = await payloadCloudEmail({
apiKey,
config,
defaultDomain,
defaultFromAddress: pluginOptions?.email?.defaultFromAddress,
defaultFromName: pluginOptions?.email?.defaultFromName,
skipVerify: pluginOptions?.email?.skipVerify,
})
}
return config
}