Files
broccolini-bot/models.js

85 lines
3.1 KiB
JavaScript

var mongoose = require('mongoose');
// ===== Broccolini Bot Models =====
const ticketSchema = new mongoose.Schema({
gmailThreadId: { type: String, required: true, unique: true, index: true },
discordThreadId: String,
broccoliniTicketId: Number,
lastSyncedBroccoliniArticleId: Number,
senderEmail: { type: String, required: true },
subject: String,
createdAt: { type: Date, default: Date.now },
status: { type: String, default: 'open', enum: ['open', 'closed'] },
transcriptMessageId: String,
claimedBy: String,
escalated: { type: Boolean, default: false },
escalationTier: { type: Number, default: 0 },
ticketNumber: Number,
renameCount: { type: Number, default: 0 },
renameWindowStart: Date,
priority: { type: String, default: 'normal', enum: ['low', 'normal', 'medium', 'high'] },
ticketTag: String,
lastActivity: Date,
reminderSent: { type: Boolean, default: false },
welcomeMessageId: String,
claimerId: String,
staffChannelId: String,
parentCategoryId: String,
unclaimedRemindersSent: { type: [Number], default: [] },
lastMessageAuthorIsStaff: { type: Boolean, default: false },
pendingDelete: { type: Boolean, default: false }
});
ticketSchema.index({ status: 1, lastActivity: 1 });
ticketSchema.index({ senderEmail: 1, status: 1 });
ticketSchema.index({ discordThreadId: 1 });
mongoose.model('Ticket', ticketSchema);
mongoose.model('TicketCounter', new mongoose.Schema({
senderLocal: { type: String, required: true, unique: true },
counter: { type: Number, default: 1 }
}));
mongoose.model('Transcript', new mongoose.Schema({
gmailThreadId: { type: String, required: true },
transcriptMessageId: String,
createdAt: { type: Date, default: Date.now }
}));
mongoose.model('Tag', new mongoose.Schema({
name: { type: String, required: true, unique: true },
content: { type: String, required: true },
createdAt: { type: Date, default: Date.now },
createdBy: String,
useCount: { type: Number, default: 0 }
}));
mongoose.model('CloseRequest', new mongoose.Schema({
ticketId: { type: String, required: true, unique: true },
requestedBy: { type: String, required: true },
reason: String,
createdAt: { type: Date, required: true }
}));
mongoose.model('GuildSettings', new mongoose.Schema({
guildId: { type: String, required: true, unique: true },
emailRouting: { type: String, enum: ['thread', 'category'], default: 'category' },
updatedAt: { type: Date, default: Date.now }
}));
mongoose.model('StaffSettings', new mongoose.Schema({
userId: { type: String, required: true, unique: true },
guildId: { type: String, required: true },
notifyDm: { type: Boolean, default: false },
updatedAt: { type: Date, default: Date.now }
}));
mongoose.model('StaffSignature', new mongoose.Schema({
userId: { type: String, required: true, unique: true },
guildId: { type: String, required: true },
valediction: { type: String, default: '' },
displayName: { type: String, default: '' },
tagline: { type: String, default: '' },
updatedAt: { type: Date, default: Date.now }
}));