Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 58 additions & 0 deletions dl-queue/src/handlers/post-queue-retry.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import { Request, Response } from 'express';
import { Logger } from 'pino';
import { getPool } from '../utils/database';
import { DLRequestStatus } from '../models/dl-request-status';

export interface PostQueueRetryRequestBody {
id: number;
}

export async function postQueueRetryHandler(
req: Request,
res: Response,
logger: Logger,
): Promise<void> {
// Must be Content-Type: application/json
const contentType = req.get('Content-Type');
if (contentType !== 'application/json') {
res.status(400).send('Content-Type must be application/json');
return;
}

const body = req.body as PostQueueRetryRequestBody;
const id = body?.id;
if (!id || typeof id !== 'number') {
res.status(400).send('Invalid or missing field: id (must be a number)');
return;
}

// Fetch the current status of the request
const currentResult = await getPool().query<{ status: string }>(`
SELECT status FROM dl.dl_request WHERE id = $1
`, [id]);

if (currentResult.rows.length === 0) {
res.status(404).send('Request not found');
return;
}

const currentStatus = currentResult.rows[0].status;

// Cannot retry if already PENDING or IN_PROGRESS
if (currentStatus === DLRequestStatus.PENDING || currentStatus === DLRequestStatus.IN_PROGRESS) {
res.status(400).send(`Cannot retry a request with status: ${currentStatus}`);
return;
}

// Update the status to PENDING and set updated to current date
const now = new Date();
await getPool().query(`
UPDATE dl.dl_request
SET status = $1, updated = $2
WHERE id = $3
`, [DLRequestStatus.PENDING, now, id]);

logger.child({ id }).info('Retrying request');

res.status(200).json({ id, status: DLRequestStatus.PENDING, updated: now });
}
6 changes: 6 additions & 0 deletions dl-queue/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { config } from 'dotenv';
import expressAsyncHandler from 'express-async-handler';
import { getQueueHandler } from './handlers/get-queue';
import { postQueueAddHandler } from './handlers/post-queue-add';
import { postQueueRetryHandler } from './handlers/post-queue-retry';
import { getLogger } from './utils/logging';
import { testDatabaseConnection } from './utils/database';
import { allowAllCORS } from './utils/cors';
Expand Down Expand Up @@ -73,6 +74,11 @@ app.post('/queue/add', expressAsyncHandler( async(req, res) => {
await postQueueAddHandler(req, res, logger);
}));

app.post('/queue/retry', expressAsyncHandler( async(req, res) => {
logger.info('POST /queue/retry');
await postQueueRetryHandler(req, res, logger);
}));

logger.info(`Starting server on port ${port} ...`);
app.listen(port, () => {
logger.info(`Server started on port ${port}!`);
Expand Down