Files
broccolini-bot/models.js
indifferentketchup 840b6bfcf8 simplify: prune dead code, dedup gmail send, drop neutered log stubs
- Remove no-op log stubs (logGmail, logAutomation, logSecurity, logSystem)
  and ~17 callsites; dead counters in tickets.js and gmail-poll.js go too
- Dedup three near-identical Gmail send paths into sendThreadedEmail helper
- Drop dead Mongoose fields: broccoliniTicketId, lastSyncedBroccoliniArticleId,
  renameCount, renameWindowStart, reminderSent, staffChannelId,
  unclaimedRemindersSent, lastMessageAuthorIsStaff
- Drop dead config fields and their .env.example entries
- Inline api/botClient.js (3-line wrapper, 2 callers)
- Trim unused exports across utils.js, tickets.js, configSchema.js, debugLog.js
- Fix handlers/messages.js to use isStaff() — old partial check ignored
  ADDITIONAL_STAFF_ROLES, so those members were treated as customers
- Drop unused deps p-queue + dotenv-expand; move mongodb to devDependencies

Net: -583 LOC source + -57 LOC lockfile. All 23 modules load clean.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 18:37:14 +00:00

64 lines
2.3 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,
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,
priority: { type: String, default: 'normal', enum: ['low', 'normal', 'medium', 'high'] },
ticketTag: String,
lastActivity: Date,
welcomeMessageId: String,
claimerId: String,
parentCategoryId: String,
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('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 }
}));