diff --git a/packages/cron-jobs/src/index.ts b/packages/cron-jobs/src/index.ts index cf4132911..e1e1d6f2a 100644 --- a/packages/cron-jobs/src/index.ts +++ b/packages/cron-jobs/src/index.ts @@ -13,6 +13,7 @@ import type { RssFeed } from "./jobs/rss-feeds"; import { rssFeedsJob } from "./jobs/rss-feeds"; import { sessionCleanupJob } from "./jobs/session-cleanup"; import { createCronJobGroup } from "./lib"; +import {notificationsFetcherJob} from "./jobs/notifications-fetcher"; export const jobGroup = createCronJobGroup({ analytics: analyticsJob, @@ -29,6 +30,7 @@ export const jobGroup = createCronJobGroup({ indexerManager: indexerManagerJob, healthMonitoring: healthMonitoringJob, sessionCleanup: sessionCleanupJob, + "notifications-fetcher": notificationsFetcherJob }); export type JobGroupKeys = ReturnType<(typeof jobGroup)["getKeys"]>[number]; diff --git a/packages/cron-jobs/src/jobs/notifications-fetcher.ts b/packages/cron-jobs/src/jobs/notifications-fetcher.ts new file mode 100644 index 000000000..84b8f7998 --- /dev/null +++ b/packages/cron-jobs/src/jobs/notifications-fetcher.ts @@ -0,0 +1,8 @@ +import {createCronJob} from "../lib"; +import {EVERY_HOUR} from "@homarr/cron-jobs-core/expressions"; + +export const notificationsFetcherJob = createCronJob("notifications-fetcher", EVERY_HOUR, { + runOnStart: true +}).withCallback(async () => { + +}); \ No newline at end of file diff --git a/packages/db/schema/sqlite.ts b/packages/db/schema/sqlite.ts index fd4158f38..e7ef936c2 100644 --- a/packages/db/schema/sqlite.ts +++ b/packages/db/schema/sqlite.ts @@ -354,6 +354,20 @@ export const icons = sqliteTable("icon", { .references(() => iconRepositories.id, { onDelete: "cascade" }), }); +export const notifications = sqliteTable("notifications", { + id: text().notNull().primaryKey(), + createdAt: int({ mode: "timestamp" }).notNull(), + dismissAfterOneAcknowledgement: int({ mode: "boolean" }).default(false).notNull(), + content: text().notNull() +}); + +export const notificationsAcknowledgements = sqliteTable("notificationAcknowledgements", { + id: text().notNull().primaryKey(), + acknowledgedAt: int({ mode: "timestamp" }).notNull(), + userId: text().notNull().references(() => users.id, { onDelete: "cascade" }), + notificationId: text().notNull().references(() => notifications.id, { onDelete: "cascade" }), +}); + export const iconRepositories = sqliteTable("iconRepository", { id: text().notNull().primaryKey(), slug: text().notNull(), diff --git a/packages/translation/src/lang/en.json b/packages/translation/src/lang/en.json index cac220e9f..e5d6adde2 100644 --- a/packages/translation/src/lang/en.json +++ b/packages/translation/src/lang/en.json @@ -2150,6 +2150,9 @@ }, "sessionCleanup": { "label": "Session Cleanup" + }, + "notifications-fetcher": { + "label": "Notifications fetcher" } } },