diff --git a/server/src/db/models/DLQItem.ts b/server/src/db/models/DLQItem.ts new file mode 100644 index 000000000..9453519a1 --- /dev/null +++ b/server/src/db/models/DLQItem.ts @@ -0,0 +1,73 @@ +import { Schema, model, type Types } from "mongoose"; +import { DLQItemTypes, DLQItemStatuses, type DLQItem } from "@/types/dlqItem.js"; + +type DLQItemDocumentBase = Omit & { + monitorId: Types.ObjectId; + teamId: Types.ObjectId; + nextRetryAt: Date; + createdAt: Date; + updatedAt: Date; +}; + +export interface DLQItemDocument extends DLQItemDocumentBase { + _id: Types.ObjectId; +} + +const DLQItemSchema = new Schema( + { + type: { + type: String, + enum: DLQItemTypes, + required: true, + }, + status: { + type: String, + enum: DLQItemStatuses, + default: "pending", + }, + payload: { + type: Schema.Types.Mixed, + required: true, + }, + monitorId: { + type: Schema.Types.ObjectId, + ref: "Monitor", + required: true, + immutable: true, + index: true, + }, + teamId: { + type: Schema.Types.ObjectId, + ref: "Team", + required: true, + immutable: true, + index: true, + }, + retryCount: { + type: Number, + default: 0, + }, + maxRetries: { + type: Number, + default: 5, + }, + lastError: { + type: String, + default: "", + }, + nextRetryAt: { + type: Date, + required: true, + }, + }, + { timestamps: true } +); + +DLQItemSchema.index({ status: 1, nextRetryAt: 1 }); +DLQItemSchema.index({ teamId: 1, status: 1 }); +DLQItemSchema.index({ createdAt: 1 }); + +const DLQItemModel = model("DLQItem", DLQItemSchema); + +export { DLQItemModel }; +export default DLQItemModel; diff --git a/server/src/db/models/index.ts b/server/src/db/models/index.ts index 1024b2b93..d4c8f1a3b 100644 --- a/server/src/db/models/index.ts +++ b/server/src/db/models/index.ts @@ -36,3 +36,6 @@ export { default as MaintenanceWindowModel } from "@/db/models/MaintenanceWindow export * from "@/db/models/GeoCheck.js"; export { default as GeoCheckModel } from "@/db/models/GeoCheck.js"; + +export * from "@/db/models/DLQItem.js"; +export { default as DLQItemModel } from "@/db/models/DLQItem.js";