diff --git a/server/src/db/models/QueueWorker.ts b/server/src/db/models/QueueWorker.ts new file mode 100644 index 000000000..76485f56c --- /dev/null +++ b/server/src/db/models/QueueWorker.ts @@ -0,0 +1,28 @@ +import { Schema, model } from "mongoose"; +import { QueueModes, type QueueMode } from "@/types/settings.js"; + +// Heartbeat presence record for a scheduler instance. _id is the scheduler's +// workerId (hostname:pid:uuid). The TTL index on lastSeenAt garbage-collects +// records for instances that have stopped heartbeating. +interface QueueWorkerDocument { + _id: string; + mode: QueueMode; + lastSeenAt: Date; + createdAt: Date; + updatedAt: Date; +} + +const QueueWorkerSchema = new Schema( + { + _id: { type: String, required: true }, + mode: { type: String, enum: QueueModes, required: true }, + lastSeenAt: { type: Date, default: Date.now, expires: 30 }, + }, + { timestamps: true } +); + +const QueueWorkerModel = model("QueueWorker", QueueWorkerSchema); + +export type { QueueWorkerDocument }; +export { QueueWorkerModel }; +export default QueueWorkerModel; diff --git a/server/src/db/models/index.ts b/server/src/db/models/index.ts index f0647f9eb..b825ca503 100644 --- a/server/src/db/models/index.ts +++ b/server/src/db/models/index.ts @@ -41,3 +41,6 @@ export * from "@/db/models/DLQItem.js"; export { default as DLQItemModel } from "@/db/models/DLQItem.js"; export * from "@/db/models/Tag.js"; export { default as TagModel } from "@/db/models/Tag.js"; + +export * from "@/db/models/QueueWorker.js"; +export { default as QueueWorkerModel } from "@/db/models/QueueWorker.js";