Define DM poll HyperDB collections and channel index.

Register dm-polls/dm-poll-votes schemas in build.js and mapDmPollChannel; align message schema fields for future spec regen.

Co-authored-by: Cursor <[email protected]>
This commit is contained in:
Raven Scott
2026-06-02 17:17:54 -04:00
co-authored by Cursor
parent 1c33a21602
commit 895e03dfc2
3 changed files with 61 additions and 1 deletions
+2
View File
@@ -51,6 +51,8 @@ Platform default path: `{PEARCORD_STORAGE or ~/.config/pearcord}/db`.
DM metadata uses a separate `JsonStore` at `{storagePath}/dm-meta` (platform-only).
DM poll definitions/votes use `DmPollStore` (`pearcord-dm`) with JsonStore at `{storagePath}/dm-polls` and HyperDB collections `@pearcord/dm-polls` / `@pearcord/dm-poll-votes` (plus `dm-polls-by-channel` index) defined in `build.js`. Full `npm run build:schema` regen is pending hyperschema reconciliation with on-disk `spec/`; stores probe collections at runtime and fall back to JSON when unknown.
## Platform integration
```javascript
+54 -1
View File
@@ -105,7 +105,10 @@ ns.register({
{ name: 'authorId', type: 'string', required: true },
{ name: 'content', type: 'string', required: true },
{ name: 'createdAt', type: 'uint', required: true },
{ name: 'editedAt', type: 'uint' }
{ name: 'editedAt', type: 'uint' },
{ name: 'replyToId', type: 'string' },
{ name: 'stickerNamesJson', type: 'string' },
{ name: 'hubMirrorJson', type: 'string' }
]
})
@@ -304,6 +307,36 @@ ns.register({
]
})
ns.register({
name: 'dmPoll',
compact: true,
fields: [
{ name: 'messageId', type: 'string', required: true },
{ name: 'channelId', type: 'string', required: true },
{ name: 'guildId', type: 'string', required: true },
{ name: 'question', type: 'string', required: true },
{ name: 'optionsJson', type: 'string', required: true },
{ name: 'multiSelect', type: 'bool' },
{ name: 'anonymous', type: 'bool' },
{ name: 'expiresAt', type: 'uint' },
{ name: 'closedAt', type: 'uint' },
{ name: 'createdAt', type: 'uint', required: true },
{ name: 'updatedAt', type: 'uint', required: true }
]
})
ns.register({
name: 'dmPollVote',
compact: true,
fields: [
{ name: 'channelId', type: 'string', required: true },
{ name: 'messageId', type: 'string', required: true },
{ name: 'userId', type: 'string', required: true },
{ name: 'optionIndex', type: 'uint', required: true },
{ name: 'votedAt', type: 'uint', required: true }
]
})
Hyperschema.toDisk(schema)
const db = HyperDB.from(SCHEMA_DIR, DB_DIR)
@@ -404,6 +437,16 @@ pdb.collections.register({
schema: '@pearcord/dmCallHistory',
key: ['userId', 'entryId']
})
pdb.collections.register({
name: 'dm-polls',
schema: '@pearcord/dmPoll',
key: ['messageId']
})
pdb.collections.register({
name: 'dm-poll-votes',
schema: '@pearcord/dmPollVote',
key: ['channelId', 'messageId', 'userId', 'optionIndex']
})
pdb.indexes.register({
name: 'messages-by-channel-time',
@@ -435,5 +478,15 @@ pdb.indexes.register({
}
})
pdb.indexes.register({
name: 'dm-polls-by-channel',
collection: '@pearcord/dm-polls',
unique: false,
key: {
type: 'string',
map: 'mapDmPollChannel'
}
})
HyperDB.toDisk(db)
console.log('HyperDB spec written to', DB_DIR)
+5
View File
@@ -14,3 +14,8 @@ exports.mapPinChannel = (record) => {
if (!record.channelId) return []
return [record.channelId]
}
exports.mapDmPollChannel = (record) => {
if (!record.channelId) return []
return [record.channelId]
}