Mongoose 6 entered maintenance/EOL in 2023; current major is 8.x. No source
changes required — every API the codebase uses is identical between v6 and
v8:
- models.js schema DSL (Schema, default: Date.now function refs, enum,
unique, required, index) is unchanged.
- db-connection.js connect options (serverSelectionTimeoutMS,
socketTimeoutMS) and connection event names (error/disconnected/
reconnected) are unchanged.
- All queries already use the v7+-required APIs: countDocuments (not the
removed count()), updateOne/findOneAndUpdate (not the removed update()),
bulkWrite, .lean() — no callback-based queries, no Model.remove(),
no findOneAndRemove.
- findOneAndUpdate sites all explicitly pass { new: true } so the v7
default-flip from old-doc to new-doc doesn't change behavior.
- strictQuery default flipped to false in v7+; codebase only filters on
schema-defined fields, so the change is a no-op.
Verification on this commit:
- node -e "require('./db-connection')" loads cleanly; modelNames() returns
the expected six models.
- Every source file under handlers/, services/, routes/, gmail-poll.js,
broccolini-discord.js requires cleanly.
- new Ticket(...).validateSync() accepts valid docs, rejects invalid enum
values, and Date defaults still fire.
- vitest run still passes (87/87) — pure-function suite is unaffected by
the upgrade but confirms no regression in the dependency-shared modules.
Production verification (live DB CRUD: create/find/updateOne/deleteOne/
bulkWrite) still owed via docker compose up --build -d on the homelab.
- 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>