feat(dlq): add DLQItem Mongoose model with indexes for retry polling and cleanup

This commit is contained in:
Br0wnHammer committed 2026-03-27 20:06:12 +05:30
1 parent 94ca9896db
commit 60b1d95b74
2 files changed
+76

No files matched your search

+73
View File
@@ -0,0 +1,73 @@
import { Schema, model, type Types } from "mongoose";
import { DLQItemTypes, DLQItemStatuses, type DLQItem } from "@/types/dlqItem.js";
type DLQItemDocumentBase = Omit<DLQItem, "id" | "monitorId" | "teamId" | "nextRetryAt" | "createdAt" | "updatedAt"> & {
monitorId: Types.ObjectId;
teamId: Types.ObjectId;
nextRetryAt: Date;
createdAt: Date;
updatedAt: Date;
};
export interface DLQItemDocument extends DLQItemDocumentBase {
_id: Types.ObjectId;
}
const DLQItemSchema = new Schema<DLQItemDocument>(
{
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<DLQItemDocument>("DLQItem", DLQItemSchema);
export { DLQItemModel };
export default DLQItemModel;
+3
View File
@@ -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";