1
|
|
|
import {CloudTasksClient} from '@google-cloud/tasks'; |
2
|
|
|
import {google} from '@google-cloud/tasks/build/protos/protos'; |
3
|
|
|
import {PollForm, TaskEvent} from './interfaces'; |
4
|
|
|
|
5
|
|
|
const client = new CloudTasksClient(); |
6
|
|
|
|
7
|
|
|
export async function createTask(payload: string, scheduleInSeconds: number) { |
8
|
|
|
const project = process.env.GCP_PROJECT; |
9
|
|
|
const queue = process.env.QUEUE_NAME; |
10
|
|
|
const location = process.env.FUNCTION_REGION; |
11
|
|
|
if (!project || !queue || !location) { |
12
|
|
|
throw new Error('Missing required environment variables'); |
13
|
|
|
} |
14
|
|
|
const url = `https://${location}-${project}.cloudfunctions.net/app`; |
15
|
|
|
// Construct the fully qualified queue name. |
16
|
|
|
const parent = client.queuePath(project, location, queue); |
17
|
|
|
|
18
|
|
|
const task: google.cloud.tasks.v2.ITask = { |
19
|
|
|
httpRequest: { |
20
|
|
|
headers: { |
21
|
|
|
'Content-Type': 'application/json', // Set content type to ensure compatibility your application's request parsing |
22
|
|
|
}, httpMethod: 'POST', url, |
23
|
|
|
}, |
24
|
|
|
}; |
25
|
|
|
|
26
|
|
|
task.httpRequest!.body = Buffer.from(payload).toString('base64'); |
27
|
|
|
|
28
|
|
|
// The time when the task is scheduled to be attempted. |
29
|
|
|
task.scheduleTime = { |
30
|
|
|
seconds: scheduleInSeconds / 1000, |
31
|
|
|
}; |
32
|
|
|
|
33
|
|
|
const request: google.cloud.tasks.v2.ICreateTaskRequest = {parent: parent, task: task}; |
34
|
|
|
const [response] = await client.createTask(request); |
35
|
|
|
console.log(`Created task ${response.name}`); |
36
|
|
|
return response; |
37
|
|
|
} |
38
|
|
|
|
39
|
|
|
export async function createAutoCloseTask(config: PollForm, messageId: string) { |
40
|
|
|
if (config.autoClose && config.closedTime) { |
41
|
|
|
const taskPayload: TaskEvent = {'id': messageId, 'action': 'close_poll', 'type': 'TASK'}; |
42
|
|
|
await createTask(JSON.stringify(taskPayload), config.closedTime); |
43
|
|
|
if (config.autoMention) { |
44
|
|
|
const taskPayload: TaskEvent = {'id': messageId, 'action': 'remind_all', 'type': 'TASK'}; |
45
|
|
|
await createTask(JSON.stringify(taskPayload), config.closedTime - 420000); |
46
|
|
|
} |
47
|
|
|
} |
48
|
|
|
} |
49
|
|
|
|