Skip to content
This repository was archived by the owner on Feb 3, 2025. It is now read-only.

Commit ab14475

Browse files
committed
feat: reschedule checkChapter jobs on startup. closes #14
1 parent 373fc3b commit ab14475

File tree

4 files changed

+56
-6
lines changed

4 files changed

+56
-6
lines changed

src/server/index.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { ExpressAdapter } from '@bull-board/express';
44
import express, { Request, Response } from 'express';
55
import next from 'next';
66
import { logger } from '../utils/logging';
7-
import { checkChaptersQueue } from './queue/checkChapters';
7+
import { checkChaptersQueue, scheduleAll } from './queue/checkChapters';
88
import { downloadQueue } from './queue/download';
99
import { notificationQueue } from './queue/notify';
1010

@@ -24,6 +24,7 @@ createBullBoard({
2424
(async () => {
2525
try {
2626
await app.prepare();
27+
await scheduleAll();
2728
const server = express();
2829
server.use('/bull/queues', serverAdapter.getRouter()).all('*', (req: Request, res: Response) => {
2930
return handle(req, res);

src/server/queue/checkChapters.ts

+15-4
Original file line numberDiff line numberDiff line change
@@ -119,12 +119,16 @@ export const removeJob = async (title: string) => {
119119
);
120120
};
121121

122-
export const schedule = async (manga: MangaWithLibraryAndMetadata) => {
122+
export const schedule = async (manga: MangaWithLibraryAndMetadata, runImmediately: boolean) => {
123+
await removeJob(manga.title);
124+
125+
if (runImmediately === true) {
126+
await checkChapters(manga);
127+
}
128+
123129
if (manga.interval === 'never') {
124130
return;
125131
}
126-
127-
await removeJob(manga.title);
128132
const jobId = getJobIdFromTitle(manga.title);
129133

130134
await checkChaptersQueue.add(
@@ -140,6 +144,13 @@ export const schedule = async (manga: MangaWithLibraryAndMetadata) => {
140144
},
141145
},
142146
);
147+
};
143148

144-
await checkChapters(manga);
149+
export const scheduleAll = async () => {
150+
const mangaList = await prisma.manga.findMany({ include: { library: true, metadata: true } });
151+
await Promise.all(
152+
mangaList.map(async (manga) => {
153+
await schedule(manga, false);
154+
}),
155+
);
145156
};

src/server/trpc/router/manga.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ export const mangaRouter = t.router({
177177
},
178178
});
179179

180-
schedule(manga);
180+
schedule(manga, true);
181181

182182
return manga;
183183
}),

src/utils/index.ts

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import cronParser from 'cron-parser';
2+
import cronstrue from 'cronstrue';
3+
import { logger } from './logging';
4+
5+
export const sanitizer = (value: string): string => {
6+
return value
7+
.replaceAll(/[\\/<>:;"'|?!*{}#%&^+,~\s]/g, '_')
8+
.replaceAll(/__+/g, '_')
9+
.replaceAll(/^[_\-.]+|[_\-.]+$/g, '_');
10+
};
11+
12+
export const getCronLabel = (cron: string): string | undefined => {
13+
if (cron === 'never') {
14+
return 'never';
15+
}
16+
17+
try {
18+
return cronstrue.toString(cron, { use24HourTimeFormat: true });
19+
} catch (err) {
20+
logger.error('failed to parse cron');
21+
}
22+
23+
return undefined;
24+
};
25+
26+
export const isCronValid = (cron: string): boolean => {
27+
if (cron === 'never') {
28+
return true;
29+
}
30+
31+
try {
32+
cronParser.parseExpression(cron);
33+
cronstrue.toString(cron);
34+
return true;
35+
} catch (err) {
36+
return false;
37+
}
38+
};

0 commit comments

Comments
 (0)