fix: allow specifying queue (#9151)

Allows user to specify a queue when calling `payload.jobs.queue()`.
Closes #9133
This commit is contained in:
James Mikrut
2024-11-12 15:00:32 -05:00
committed by GitHub
parent 6bb4067bb3
commit e0309a1dd0
4 changed files with 21 additions and 9 deletions

View File

@@ -13,14 +13,8 @@ export const getDefaultJobsCollection: (config: Config) => CollectionConfig | nu
const workflowSlugs: Set<string> = new Set() const workflowSlugs: Set<string> = new Set()
const taskSlugs: Set<string> = new Set(['inline']) const taskSlugs: Set<string> = new Set(['inline'])
const queueNames: Set<string> = new Set(['default'])
config.jobs?.workflows.forEach((workflow) => { config.jobs?.workflows.forEach((workflow) => {
workflowSlugs.add(workflow.slug) workflowSlugs.add(workflow.slug)
if (workflow.queue) {
queueNames.add(workflow.queue)
}
}) })
config.jobs.tasks.forEach((task) => { config.jobs.tasks.forEach((task) => {
@@ -168,13 +162,12 @@ export const getDefaultJobsCollection: (config: Config) => CollectionConfig | nu
}, },
{ {
name: 'queue', name: 'queue',
type: 'select', type: 'text',
admin: { admin: {
position: 'sidebar', position: 'sidebar',
}, },
defaultValue: 'default', defaultValue: 'default',
index: true, index: true,
options: [...queueNames],
}, },
{ {
name: 'waitUntil', name: 'waitUntil',

View File

@@ -108,8 +108,9 @@ export type WorkflowConfig<TWorkflowSlugOrInput extends keyof TypedJobs['workflo
*/ */
label?: string label?: string
/** /**
* Optionally, define the queue name that this workflow should be tied to. * Optionally, define the default queue name that this workflow should be tied to.
* Defaults to "default". * Defaults to "default".
* Can be overridden when queuing jobs via Local API.
*/ */
queue?: string queue?: string
/** /**

View File

@@ -17,6 +17,7 @@ export const getJobsLocalAPI = (payload: Payload) => ({
args: args:
| { | {
input: TypedJobs['tasks'][TTaskOrWorkflowSlug]['input'] input: TypedJobs['tasks'][TTaskOrWorkflowSlug]['input']
queue?: string
req?: PayloadRequest req?: PayloadRequest
// TTaskOrWorkflowlug with keyof TypedJobs['workflows'] removed: // TTaskOrWorkflowlug with keyof TypedJobs['workflows'] removed:
task: TTaskOrWorkflowSlug extends keyof TypedJobs['tasks'] ? TTaskOrWorkflowSlug : never task: TTaskOrWorkflowSlug extends keyof TypedJobs['tasks'] ? TTaskOrWorkflowSlug : never
@@ -24,6 +25,7 @@ export const getJobsLocalAPI = (payload: Payload) => ({
} }
| { | {
input: TypedJobs['workflows'][TTaskOrWorkflowSlug]['input'] input: TypedJobs['workflows'][TTaskOrWorkflowSlug]['input']
queue?: string
req?: PayloadRequest req?: PayloadRequest
task?: never task?: never
workflow: TTaskOrWorkflowSlug extends keyof TypedJobs['workflows'] workflow: TTaskOrWorkflowSlug extends keyof TypedJobs['workflows']
@@ -35,10 +37,25 @@ export const getJobsLocalAPI = (payload: Payload) => ({
? RunningJob<TTaskOrWorkflowSlug> ? RunningJob<TTaskOrWorkflowSlug>
: RunningJobFromTask<TTaskOrWorkflowSlug> : RunningJobFromTask<TTaskOrWorkflowSlug>
> => { > => {
let queue: string
// If user specifies queue, use that
if (args.queue) {
queue = args.queue
} else if (args.workflow) {
// Otherwise, if there is a workflow specified, and it has a default queue to use,
// use that
const workflow = payload.config.jobs?.workflows?.find(({ slug }) => slug === args.workflow)
if (workflow?.queue) {
queue = workflow.queue
}
}
return (await payload.create({ return (await payload.create({
collection: 'payload-jobs', collection: 'payload-jobs',
data: { data: {
input: args.input, input: args.input,
queue,
taskSlug: 'task' in args ? args.task : undefined, taskSlug: 'task' in args ? args.task : undefined,
workflowSlug: 'workflow' in args ? args.workflow : undefined, workflowSlug: 'workflow' in args ? args.workflow : undefined,
}, },

View File

@@ -153,6 +153,7 @@ describe('Queues', () => {
it('ensure job retrying works', async () => { it('ensure job retrying works', async () => {
const job = await payload.jobs.queue({ const job = await payload.jobs.queue({
workflow: 'retriesTest', workflow: 'retriesTest',
queue: 'default',
input: { input: {
message: 'hello', message: 'hello',
}, },