0.1.3 • Published 10 months ago

payload-plugin-scheduler v0.1.3

Weekly downloads
-
License
MIT
Repository
github
Last release
10 months ago

payload-plugin-scheduler

Payload plugin that enables scheduled publishing for draft-enabled collections, inspired by wordpress post scheduler.

ci status

Installation

npm i payload-plugin-scheduler

Usage

// payload.config.ts

import { buildConfig } from 'payload/config'
import { ScheduledPostPlugin } from 'payload-plugin-scheduler'
import Pages from './collections/Pages'
import Posts from './collections/Posts'
import Home from './globals/Home'

export default buildConfig({
  collections: [Pages, Posts],
  globals: [Home],
  plugins: [
    ScheduledPostPlugin({
      collections: ['pages', 'posts'],
      globals: ['home'],
      interval: 10,
    })
  ]
  // ...more config
})

Options

At least one collection / global is required.

collections?: string[]

An array of collection slugs. All collections must have drafts enabled.

globals?: string[]

An array of global slugs. All globals must have drafts enabled.

interval?: number

Specify how frequently to check for scheduled posts (in minutes). This value will also be passed to the DatePicker component. Defaults to 5 mins.

scheduledPosts?: Partial<CollectionConfig>

Custom configuration for the scheduled posts collection that gets merged with the defaults.

Utils

SafeRelationship

Drop-in replacement for the default relationship field to prevent users from publishing documents that have references to other docs that are still in draft / scheduled mode.

import type { Field } from 'payload'
import { SafeRelationship } from 'payload-plugin-scheduler'

const example: Field = SafeRelationship({
  name: 'featured_content',
  relationTo: ['posts', 'pages'],
  hasMany: true,
})

Approach

In a nutshell, the plugin creates a publish_date field that it uses to determine whether a pending draft update needs to be scheduled. If a draft document is saved with a publish_date that's in the future, it will be scheduled and automatically published on that date.

publish_date

Datetime field added to enabled collections. Custom Field and Cell components display the schedule status in the client-side UI.

scheduled_posts

Collection added by the plugin to store pending schedule updates. Can be customized via scheduledPosts option.

Cron

A configurable timer checks for any posts to be scheduled in the upcoming interval window. For each hit, it creates a separate job that's fired at that document's publish_date (via node-schedule). The idea here is that you can configure your interval window to avoid super long running tasks that are more prone to flaking.

Caveats

  • This plugin doesn't support Payload 3.0 beta. I intend to update it once 3.0 is stable, but it'll require substantial re-architecting to work in a serverless environment.

  • There's no logic in place to dedupe schedules across multiple instances of a single app (see https://github.com/wkentdag/payload-plugin-scheduler/issues/9)

  • There's no logic in place to automatically publish any pending scheduled posts that weren't published due to server downtime.

0.1.0

10 months ago

0.1.2

10 months ago

0.1.1

10 months ago

0.1.3

10 months ago

0.0.5

12 months ago

0.0.4

1 year ago

0.0.6

12 months ago

0.0.3

1 year ago

0.0.2

1 year ago

0.0.1

1 year ago