diff --git a/keyserver/src/database/migration-config.js b/keyserver/src/database/migration-config.js --- a/keyserver/src/database/migration-config.js +++ b/keyserver/src/database/migration-config.js @@ -3,8 +3,10 @@ import fs from 'fs'; import bots from 'lib/facts/bots.js'; +import genesis from 'lib/facts/genesis.js'; import { policyTypes } from 'lib/facts/policies.js'; import { messageTypes } from 'lib/types/message-types-enum.js'; +import { threadPermissions } from 'lib/types/thread-permission-types.js'; import { threadTypes } from 'lib/types/thread-types-enum.js'; import { dbQuery, SQL } from '../database/database.js'; @@ -583,6 +585,36 @@ () => dbQuery(SQL`ALTER TABLE cookies MODIFY COLUMN hash char(64) NOT NULL`), ], + [ + 48, + async () => { + const visibleExtractString = `$.${threadPermissions.VISIBLE}.value`; + const query = SQL` + UPDATE memberships mm + LEFT JOIN ( + SELECT m.thread, MAX(m.id) AS message FROM messages m + WHERE m.type != ${messageTypes.CREATE_SUB_THREAD} + AND m.thread = ${genesis.id} + GROUP BY m.thread + ) all_users_query ON mm.thread = all_users_query.thread + LEFT JOIN ( + SELECT m.thread, stm.user, MAX(m.id) AS message FROM messages m + LEFT JOIN memberships stm ON m.type = ${messageTypes.CREATE_SUB_THREAD} + AND stm.thread = m.content + WHERE JSON_EXTRACT(stm.permissions, ${visibleExtractString}) IS TRUE + AND m.thread = ${genesis.id} + GROUP BY m.thread, stm.user + ) last_subthread_message_for_user_query + ON mm.thread = last_subthread_message_for_user_query.thread + AND mm.user = last_subthread_message_for_user_query.user + SET + mm.last_message = GREATEST(COALESCE(all_users_query.message, 0), + COALESCE(last_subthread_message_for_user_query.message, 0)) + WHERE mm.thread = ${genesis.id}; + `; + await dbQuery(query); + }, + ], ]); const newDatabaseVersion: number = Math.max(...migrations.keys());