aboutsummaryrefslogtreecommitdiffstats
path: root/packages/shared
diff options
context:
space:
mode:
Diffstat (limited to 'packages/shared')
-rw-r--r--packages/shared/queues.ts17
-rw-r--r--packages/shared/types/feeds.ts27
2 files changed, 44 insertions, 0 deletions
diff --git a/packages/shared/queues.ts b/packages/shared/queues.ts
index 6189a633..7baae535 100644
--- a/packages/shared/queues.ts
+++ b/packages/shared/queues.ts
@@ -116,3 +116,20 @@ export async function triggerVideoWorker(bookmarkId: string, url: string) {
url,
});
}
+
+// Feed Worker
+export const zFeedRequestSchema = z.object({
+ feedId: z.string(),
+});
+export type ZFeedRequestSchema = z.infer<typeof zFeedRequestSchema>;
+
+export const FeedQueue = new SqliteQueue<ZFeedRequestSchema>(
+ "feed_queue",
+ queueDB,
+ {
+ defaultJobArgs: {
+ // One retry is enough for the feed queue given that it's periodic
+ numRetries: 1,
+ },
+ },
+);
diff --git a/packages/shared/types/feeds.ts b/packages/shared/types/feeds.ts
new file mode 100644
index 00000000..3771624b
--- /dev/null
+++ b/packages/shared/types/feeds.ts
@@ -0,0 +1,27 @@
+import { z } from "zod";
+
+const MAX_FEED_URL_LENGTH = 500;
+const MAX_FEED_NAME_LENGTH = 100;
+
+export const zAppliesToEnumSchema = z.enum(["all", "text", "images"]);
+
+export const zFeedSchema = z.object({
+ id: z.string(),
+ name: z.string().min(1).max(MAX_FEED_NAME_LENGTH),
+ url: z.string().url(),
+ lastFetchedStatus: z.enum(["success", "failure", "pending"]).nullable(),
+ lastFetchedAt: z.date().nullable(),
+});
+
+export type ZFeed = z.infer<typeof zFeedSchema>;
+
+export const zNewFeedSchema = z.object({
+ name: z.string().min(1).max(MAX_FEED_NAME_LENGTH),
+ url: z.string().max(MAX_FEED_URL_LENGTH).url(),
+});
+
+export const zUpdateFeedSchema = z.object({
+ feedId: z.string(),
+ name: z.string().min(1).max(MAX_FEED_NAME_LENGTH),
+ url: z.string().max(MAX_FEED_URL_LENGTH).url(),
+});