From 3f05488da024895005786de0b8dd6973045d7b46 Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Fri, 18 Sep 2026 06:29:01 -0700 Subject: [PATCH] Review topic metadata: harden default-value coverage - Add DB unit tests covering a summary missing postCount, a post missing blockHeight in listTopics/getTopicPostTxids ordering, listTopics' default limit/offset, and topicRecencyKey's missing-height fallback. These kill the remaining language-mutation survivors in the changed DB sources. - Refresh the mutate4javascript manifests for the changed sources and commit the gherkin-mutator manifests/stamps written into the three topic-metadata features. - No production behavior changes; the review adds tests and tool-written metadata only. By architect. --- .../specs/topic-metadata-columns.feature | 4 ++ psf-memo-client/src/services/relative-time.js | 4 ++ .../src/services/topic-discovery-page.js | 2 +- psf-memo-db/specs/topic-metadata.feature | 5 ++ psf-memo-db/src/adapters/topic-query.js | 2 +- psf-memo-db/src/lib/backfill-topic-indexes.js | 2 +- .../test/unit/adapters/topic-query.unit.js | 59 +++++++++++++++++++ .../unit/lib/backfill-topic-indexes.unit.js | 20 +++++++ .../specs/topic-metadata-indexing.feature | 4 ++ .../use-cases/action-types/topic-follow.js | 2 +- .../use-cases/action-types/topic-indexing.js | 2 +- .../use-cases/action-types/topic-message.js | 2 +- 12 files changed, 102 insertions(+), 6 deletions(-) diff --git a/psf-memo-client/specs/topic-metadata-columns.feature b/psf-memo-client/specs/topic-metadata-columns.feature index e8ede7d..bd9b788 100644 --- a/psf-memo-client/specs/topic-metadata-columns.feature +++ b/psf-memo-client/specs/topic-metadata-columns.feature @@ -1,3 +1,7 @@ +# acceptance-mutation-manifest-begin +# {"version":1,"tested_at":"2026-09-18T13:25:09.808780081Z","feature_name":"Topic Metadata Columns","feature_path":"/home/trout/work/psf-memo/.worktrees/architect/psf-memo-client/specs/topic-metadata-columns.feature","background_hash":"74234e98afe7498fb5daf1f36ac2d78acc339464f950703b8c019892f982b90b","implementation_hash":"unknown","scenarios":[]} +# acceptance-mutation-manifest-end + # Scenarios: Topic Metadata Columns - 1, Topic Metadata Columns - 2, Topic Metadata Columns - 3 # # The topics page renders one row per topic with four columns: the topic name, diff --git a/psf-memo-client/src/services/relative-time.js b/psf-memo-client/src/services/relative-time.js index e655084..7c148fd 100644 --- a/psf-memo-client/src/services/relative-time.js +++ b/psf-memo-client/src/services/relative-time.js @@ -29,3 +29,7 @@ function relativeTime (lastSeen, now = Date.now()) { } module.exports = { relativeTime } + +// mutate4javascript-manifest-begin +// {"version":1,"tested_at":"2026-09-18T13:14:01.486Z","module_hash":"6634036bb8540c472635da18b1a0932b5eb83a7454bb48ba25f6b323fdd1d69d","functions":[{"id":"func/relativeTime","name":"relativeTime","line":16,"end_line":29,"hash":"ee4cb814f0fb308d2a7d2c8cccaf2369b0fc84462569f0db0668f647ad2b4980"}]} +// mutate4javascript-manifest-end diff --git a/psf-memo-client/src/services/topic-discovery-page.js b/psf-memo-client/src/services/topic-discovery-page.js index 3297d50..0d7b0f6 100644 --- a/psf-memo-client/src/services/topic-discovery-page.js +++ b/psf-memo-client/src/services/topic-discovery-page.js @@ -49,5 +49,5 @@ TopicDiscoveryPage.topicFeedPath = function (room) { module.exports = TopicDiscoveryPage // mutate4javascript-manifest-begin -// {"version":1,"tested_at":"2026-09-17T16:44:01.309Z","module_hash":"5d9d81d1a2fa72e4365f6db50999dc28988b51dfe9c90662187ebc8dc634bba9","functions":[{"id":"func/TopicDiscoveryPage.constructor","name":"TopicDiscoveryPage.constructor","line":14,"end_line":21,"hash":"78cbee16b0d08e3f695dc65865466d12424e67d40f16683603585a48adfc2510"},{"id":"func/TopicDiscoveryPage.getTopic","name":"TopicDiscoveryPage.getTopic","line":23,"end_line":25,"hash":"7faf4b56db0bc89d32176a1741546958495ba10b5f313581f321de47e58ecb95"},{"id":"func/TopicDiscoveryPage.openTopic","name":"TopicDiscoveryPage.openTopic","line":27,"end_line":31,"hash":"ebd17b5f176c964308b69705b7a53af4c9c392e9856308b3095d69151ebde9aa"}]} +// {"version":1,"tested_at":"2026-09-18T13:16:01.949Z","module_hash":"9ec924cb4da672a28c5f312e1d183eaed7a8db8da0307cf7b262c35fa5745352","functions":[{"id":"func/TopicDiscoveryPage.constructor","name":"TopicDiscoveryPage.constructor","line":15,"end_line":22,"hash":"78cbee16b0d08e3f695dc65865466d12424e67d40f16683603585a48adfc2510"},{"id":"func/TopicDiscoveryPage.getTopic","name":"TopicDiscoveryPage.getTopic","line":24,"end_line":26,"hash":"7faf4b56db0bc89d32176a1741546958495ba10b5f313581f321de47e58ecb95"},{"id":"func/TopicDiscoveryPage.getLastSeenLabel","name":"TopicDiscoveryPage.getLastSeenLabel","line":31,"end_line":35,"hash":"3f180b8beaf2126a36cdd9d597945e61274dc312cb0f080e208a995e107ab920"},{"id":"func/TopicDiscoveryPage.openTopic","name":"TopicDiscoveryPage.openTopic","line":37,"end_line":41,"hash":"ebd17b5f176c964308b69705b7a53af4c9c392e9856308b3095d69151ebde9aa"}]} // mutate4javascript-manifest-end diff --git a/psf-memo-db/specs/topic-metadata.feature b/psf-memo-db/specs/topic-metadata.feature index ecf465a..d3c002d 100644 --- a/psf-memo-db/specs/topic-metadata.feature +++ b/psf-memo-db/specs/topic-metadata.feature @@ -1,3 +1,8 @@ +# mutation-stamp: sha256=a7af9fed2e6666ad93c80887c4e0a99aa3e228da6eb00c46f30e1ffbbd3825e6 +# acceptance-mutation-manifest-begin +# {"version":1,"tested_at":"2026-09-18T13:25:05.913631022Z","feature_name":"Topic Metadata","feature_path":"/home/trout/work/psf-memo/.worktrees/architect/psf-memo-db/specs/topic-metadata.feature","background_hash":"622a318a0cc0b3d885a9951ae6f22a74f37e4e7842ebfb6a6d9cffe0b0dcce85","implementation_hash":"unknown","scenarios":[{"index":0,"name":"Topic Metadata - 1 GET /topics returns each topic's last-seen time","scenario_hash":"cbdac93ce1eb89a953548fe391593d674f843d5efa6b27042ae030763e50ff10","mutation_count":6,"result":{"Total":6,"Killed":6,"Survived":0,"Errors":0},"tested_at":"2026-09-18T13:25:05.913631022Z"},{"index":1,"name":"Topic Metadata - 2 GET /topics returns each topic's follower count","scenario_hash":"0ccdf1b954eb4787b9075a63d2bcb0aeb6da90243b7670c712ef1de7cffc6542","mutation_count":6,"result":{"Total":6,"Killed":6,"Survived":0,"Errors":0},"tested_at":"2026-09-18T13:25:05.913631022Z"},{"index":2,"name":"Topic Metadata - 3 backfill records each room's last-seen time","scenario_hash":"094bdaa1176c9a2c2aca6e46b4853e512cf140e77999cc6fb696fdbeda2402f3","mutation_count":6,"result":{"Total":6,"Killed":6,"Survived":0,"Errors":0},"tested_at":"2026-09-18T13:25:05.913631022Z"},{"index":3,"name":"Topic Metadata - 4 backfill records each room's follower count","scenario_hash":"80ac7a2c4143421b9268c05c1f5f83d3f5335c9cd6ad1edc70b85c76e9afe683","mutation_count":6,"result":{"Total":6,"Killed":6,"Survived":0,"Errors":0},"tested_at":"2026-09-18T13:25:05.913631022Z"},{"index":4,"name":"Topic Metadata - 5 backfill is idempotent for topic metadata","scenario_hash":"d3f7f226124160e334e8547e4c05c020bdd66acac0445155de93c6615299cacf","mutation_count":6,"result":{"Total":6,"Killed":6,"Survived":0,"Errors":0},"tested_at":"2026-09-18T13:25:05.913631022Z"}]} +# acceptance-mutation-manifest-end + # Scenarios: Topic Metadata - 1, Topic Metadata - 2, Topic Metadata - 3, Topic Metadata - 4, Topic Metadata - 5 # # GET /topics reports each topic's lastSeen (the epoch-millisecond time of the diff --git a/psf-memo-db/src/adapters/topic-query.js b/psf-memo-db/src/adapters/topic-query.js index c6a8476..0c05c0f 100644 --- a/psf-memo-db/src/adapters/topic-query.js +++ b/psf-memo-db/src/adapters/topic-query.js @@ -176,5 +176,5 @@ class TopicQuery { export default TopicQuery // mutate4javascript-manifest-begin -// {"version":1,"tested_at":"2026-09-17T17:27:18.416Z","module_hash":"a31f16e3a18a841a71910ab28019ded60ef8800bc08dcd5460dfb21a84194903","functions":[{"id":"func/TopicQuery.constructor","name":"TopicQuery.constructor","line":24,"end_line":52,"hash":"51f22d20b4d0bb817f3b005e12f1635a3669a77bd741c3f0b386bc71fa28c08e"},{"id":"func/TopicQuery.roomFromKey","name":"TopicQuery.roomFromKey","line":54,"end_line":57,"hash":"4175916ac2bb8f9f102c70750f336ed980db2a30a1f8f35645534303408aaece"},{"id":"func/TopicQuery.txidFromKey","name":"TopicQuery.txidFromKey","line":59,"end_line":62,"hash":"4f5f5c456f1e74a60acff54d1d5e2d982be53886c2a77c6eff3293133efa9c87"},{"id":"func/TopicQuery.roomRange","name":"TopicQuery.roomRange","line":67,"end_line":69,"hash":"ceb99a638ee22ce625c9962d90786bd779de8d946b501640db9b76276c8bd7ea"},{"id":"func/TopicQuery.summaryRoom","name":"TopicQuery.summaryRoom","line":73,"end_line":76,"hash":"8ca2c04ae70839ca8e2deebe6f0661883dacbf3a06731dd9c134f326bf921b7c"},{"id":"func/TopicQuery.recencyRoom","name":"TopicQuery.recencyRoom","line":80,"end_line":84,"hash":"677abdcb0687362d170da432571cb0912bc43d4bd6e7022e3d785714f8bd9402"},{"id":"func/TopicQuery.listTopics","name":"TopicQuery.listTopics","line":90,"end_line":117,"hash":"75cb4c5ee90a44a156119f08226d0d3a8a75c136568676cdbd484c3f1e55a943"},{"id":"func/TopicQuery.getTopicPostTxids","name":"TopicQuery.getTopicPostTxids","line":119,"end_line":137,"hash":"c18e8ca08fa3695cc2d49bbc0a83eb5488831bf14ddfdb9c421afefd4b91d521"},{"id":"func/TopicQuery.isFollowingRoom","name":"TopicQuery.isFollowingRoom","line":140,"end_line":149,"hash":"a0cf48cc6f4842adf65830b41d536cd6a078c7adf6b837e57259491157e2e97d"},{"id":"func/TopicQuery.listRoomFollowers","name":"TopicQuery.listRoomFollowers","line":152,"end_line":161,"hash":"40dc014f433895e930bfec5de78d73ca2f75a023cecb174ddc57f7ec150dd300"},{"id":"func/TopicQuery.followAddrFromValue","name":"TopicQuery.followAddrFromValue","line":163,"end_line":167,"hash":"2ce68c35f539e1fd7694774059b4b2afd096014c99a87c7538f3cbb70e26c3c7"}]} +// {"version":1,"tested_at":"2026-09-18T13:18:16.700Z","module_hash":"dff0369d21f542be9d43c21fc7dd8a4784be62481d35de52296358e16ca57742","functions":[{"id":"func/TopicQuery.constructor","name":"TopicQuery.constructor","line":24,"end_line":52,"hash":"51f22d20b4d0bb817f3b005e12f1635a3669a77bd741c3f0b386bc71fa28c08e"},{"id":"func/TopicQuery.roomFromKey","name":"TopicQuery.roomFromKey","line":54,"end_line":57,"hash":"4175916ac2bb8f9f102c70750f336ed980db2a30a1f8f35645534303408aaece"},{"id":"func/TopicQuery.txidFromKey","name":"TopicQuery.txidFromKey","line":59,"end_line":62,"hash":"4f5f5c456f1e74a60acff54d1d5e2d982be53886c2a77c6eff3293133efa9c87"},{"id":"func/TopicQuery.roomRange","name":"TopicQuery.roomRange","line":67,"end_line":69,"hash":"ceb99a638ee22ce625c9962d90786bd779de8d946b501640db9b76276c8bd7ea"},{"id":"func/TopicQuery.summaryRoom","name":"TopicQuery.summaryRoom","line":73,"end_line":76,"hash":"8ca2c04ae70839ca8e2deebe6f0661883dacbf3a06731dd9c134f326bf921b7c"},{"id":"func/TopicQuery.recencyRoom","name":"TopicQuery.recencyRoom","line":80,"end_line":84,"hash":"677abdcb0687362d170da432571cb0912bc43d4bd6e7022e3d785714f8bd9402"},{"id":"func/TopicQuery.listTopics","name":"TopicQuery.listTopics","line":91,"end_line":123,"hash":"a1b90c50f24182301ac170be9611ef9f75847de3d12997b0fa7c407c739b28da"},{"id":"func/TopicQuery.getTopicPostTxids","name":"TopicQuery.getTopicPostTxids","line":125,"end_line":143,"hash":"c18e8ca08fa3695cc2d49bbc0a83eb5488831bf14ddfdb9c421afefd4b91d521"},{"id":"func/TopicQuery.isFollowingRoom","name":"TopicQuery.isFollowingRoom","line":146,"end_line":155,"hash":"a0cf48cc6f4842adf65830b41d536cd6a078c7adf6b837e57259491157e2e97d"},{"id":"func/TopicQuery.listRoomFollowers","name":"TopicQuery.listRoomFollowers","line":158,"end_line":167,"hash":"40dc014f433895e930bfec5de78d73ca2f75a023cecb174ddc57f7ec150dd300"},{"id":"func/TopicQuery.followAddrFromValue","name":"TopicQuery.followAddrFromValue","line":169,"end_line":173,"hash":"2ce68c35f539e1fd7694774059b4b2afd096014c99a87c7538f3cbb70e26c3c7"}]} // mutate4javascript-manifest-end diff --git a/psf-memo-db/src/lib/backfill-topic-indexes.js b/psf-memo-db/src/lib/backfill-topic-indexes.js index 8f81d05..037cd50 100644 --- a/psf-memo-db/src/lib/backfill-topic-indexes.js +++ b/psf-memo-db/src/lib/backfill-topic-indexes.js @@ -100,5 +100,5 @@ export async function backfillTopicIndexes ({ roomsDb, topicSummariesDb, topicRe } // mutate4javascript-manifest-begin -// {"version":1,"tested_at":"2026-09-17T16:40:51.620Z","module_hash":"7a67d2c6ca7ea2494b1ff3a6dcc703c47a0dfd341fe2d593750b82b810f36da1","functions":[{"id":"func/topicRecencyKey","name":"topicRecencyKey","line":26,"end_line":29,"hash":"a034a6023f72d08e40d28bb51e41e370c1a42d5682315b162a7c2a81f7f31310"},{"id":"func/roomFromEntry","name":"roomFromEntry","line":33,"end_line":36,"hash":"5bf2a8338a623f65191729bc2433a87869b085b29547fbb5e42ebaa67d6473c1"},{"id":"func/applyPost","name":"applyPost","line":39,"end_line":43,"hash":"4edf9dd98a5889c62fd60f4107563427f0a55dc0250c27f6ac0af49b6b934c42"},{"id":"func/collectSummaries","name":"collectSummaries","line":45,"end_line":60,"hash":"73a07286477939379fb82ceace71991aa0cd830f041897dbe4cb5748c091a93f"},{"id":"func/removeStale","name":"removeStale","line":63,"end_line":69,"hash":"09cc44be72b9f955722f17c117d8ca18fe953dcf2cbd6efab110798dce4d0417"},{"id":"func/backfillTopicIndexes","name":"backfillTopicIndexes","line":71,"end_line":87,"hash":"7a6c1207032b16c5e7fc90fe9f7e2543b22d126fc0924296573c911dbf21d8c4"}]} +// {"version":1,"tested_at":"2026-09-18T13:21:43.873Z","module_hash":"ddd3db74a27e53d7c7e84d649294b03a683752557459b174ce0d22617dfbd38a","functions":[{"id":"func/topicRecencyKey","name":"topicRecencyKey","line":26,"end_line":29,"hash":"a034a6023f72d08e40d28bb51e41e370c1a42d5682315b162a7c2a81f7f31310"},{"id":"func/roomFromEntry","name":"roomFromEntry","line":33,"end_line":36,"hash":"5bf2a8338a623f65191729bc2433a87869b085b29547fbb5e42ebaa67d6473c1"},{"id":"func/applyPost","name":"applyPost","line":40,"end_line":46,"hash":"387a3d781edfcf5fd721c82acad22d80446db66d560f9e055f7a7bba520f07ca"},{"id":"func/applyFollow","name":"applyFollow","line":50,"end_line":53,"hash":"34bdf6e926e08b1fb77b70a7e866028cc86baa5f42cb5f61b6db8d2568685619"},{"id":"func/collectSummaries","name":"collectSummaries","line":55,"end_line":73,"hash":"d49573d9177ec74105e3e0b0c73c6f1825816b6ba42c3cd42d3c6dc273345182"},{"id":"func/removeStale","name":"removeStale","line":76,"end_line":82,"hash":"09cc44be72b9f955722f17c117d8ca18fe953dcf2cbd6efab110798dce4d0417"},{"id":"func/backfillTopicIndexes","name":"backfillTopicIndexes","line":84,"end_line":100,"hash":"7a6c1207032b16c5e7fc90fe9f7e2543b22d126fc0924296573c911dbf21d8c4"}]} // mutate4javascript-manifest-end diff --git a/psf-memo-db/test/unit/adapters/topic-query.unit.js b/psf-memo-db/test/unit/adapters/topic-query.unit.js index 205d17c..0984f46 100644 --- a/psf-memo-db/test/unit/adapters/topic-query.unit.js +++ b/psf-memo-db/test/unit/adapters/topic-query.unit.js @@ -168,6 +168,47 @@ describe('#TopicQuery', () => { ]) }) + it('should default a missing postCount to zero for a summary that omits it', async () => { + uut = new TopicQuery({ + roomsDb, + postsDb, + topicSummariesDb: makeIteratorDb([ + ['memo', { room: 'memo', lastHeight: 600500, lastSeen: 1700020000000, followerCount: 2 }] + ]), + topicRecencyDb: makeIteratorDb([ + [topicRecencyKey(600500, 'memo'), { room: 'memo', blockHeight: 600500 }] + ]) + }) + + const result = await uut.listTopics({ limit: 100, offset: 0 }) + + assert.deepEqual(result.topics, [ + { room: 'memo', postCount: 0, lastSeen: 1700020000000, followerCount: 2 } + ]) + }) + + it('should default limit and offset when called with no arguments', async () => { + uut = new TopicQuery({ + roomsDb, + postsDb, + topicSummariesDb: makeIteratorDb(summaries), + topicRecencyDb: makeIteratorDb(recency) + }) + + const result = await uut.listTopics() + + assert.equal(result.pagination.limit, 100) + assert.equal(result.pagination.offset, 0) + assert.deepEqual(result.topics.map((t) => t.room), [ + 'memo', + 'cash', + 'dance', + 'anime', + 'lone', + 'quiet' + ]) + }) + for (const { name, limit, offset, expectedRooms, hasMore } of [ { name: 'should paginate using recency order and report total and hasMore', limit: 2, offset: 2, expectedRooms: ['dance', 'anime'], hasMore: true }, { name: 'should report hasMore false on the last page', limit: 2, offset: 4, expectedRooms: ['lone', 'quiet'], hasMore: false } @@ -279,6 +320,24 @@ describe('#TopicQuery', () => { assert.equal(result.total, 1) }) + it('should default a missing post block height to zero when ordering', async () => { + async function * mockRooms () { + // Yield the height-less post first: with a zero default it sorts after + // the height-1 post, while a one default would leave it first (stable + // tie), so the asserted order distinguishes the default. + yield ['bitcoin:post-missing', { room: 'bitcoin', txid: 'post-missing', type: 'post' }] + yield ['bitcoin:post-1', { room: 'bitcoin', txid: 'post-1', type: 'post', blockHeight: 1 }] + } + roomsDb.iterator + .withArgs(sinon.match({ gte: 'bitcoin:', lte: 'bitcoin:\uffff' })) + .returns(mockRooms()) + + const result = await uut.getTopicPostTxids('bitcoin', { limit: 100, offset: 0 }) + + assert.deepEqual(result.txids, ['post-1', 'post-missing']) + assert.equal(result.total, 2) + }) + it('should exclude posts from muted addresses when a viewer is provided', async () => { async function * mockRooms () { yield ['bitcoin:post-300', { room: 'bitcoin', txid: 'post-300', type: 'post', blockHeight: 300 }] diff --git a/psf-memo-db/test/unit/lib/backfill-topic-indexes.unit.js b/psf-memo-db/test/unit/lib/backfill-topic-indexes.unit.js index be83c00..d49cdf4 100644 --- a/psf-memo-db/test/unit/lib/backfill-topic-indexes.unit.js +++ b/psf-memo-db/test/unit/lib/backfill-topic-indexes.unit.js @@ -127,4 +127,24 @@ describe('#backfillTopicIndexes', () => { }) assert.deepEqual(topicRecencyDb.store.get(topicRecencyKey(500, 'cash')), { room: 'cash', blockHeight: 500 }) }) + + it('should default a missing post block height to zero', async () => { + const roomsDb = new FakeDb([ + ['bitcoin:post-1', { room: 'bitcoin', txid: 'post-1', type: 'post', seen: 1700000000000 }] + ]) + const topicSummariesDb = new FakeDb() + const topicRecencyDb = new FakeDb() + + await backfillTopicIndexes({ roomsDb, topicSummariesDb, topicRecencyDb }) + + assert.equal(topicSummariesDb.store.get('bitcoin').lastHeight, 0) + assert.deepEqual(topicRecencyDb.store.get(topicRecencyKey(0, 'bitcoin')), { room: 'bitcoin', blockHeight: 0 }) + }) +}) + +describe('#topicRecencyKey', () => { + it('should treat a missing or null height as height zero', () => { + assert.equal(topicRecencyKey(undefined, 'bitcoin'), topicRecencyKey(0, 'bitcoin')) + assert.equal(topicRecencyKey(null, 'bitcoin'), topicRecencyKey(0, 'bitcoin')) + }) }) diff --git a/psf-memo-indexer/specs/topic-metadata-indexing.feature b/psf-memo-indexer/specs/topic-metadata-indexing.feature index 2f638a9..b5725ba 100644 --- a/psf-memo-indexer/specs/topic-metadata-indexing.feature +++ b/psf-memo-indexer/specs/topic-metadata-indexing.feature @@ -1,3 +1,7 @@ +# acceptance-mutation-manifest-begin +# {"version":1,"tested_at":"2026-09-18T13:25:07.835747327Z","feature_name":"Topic Metadata Indexing","feature_path":"/home/trout/work/psf-memo/.worktrees/architect/psf-memo-indexer/specs/topic-metadata-indexing.feature","background_hash":"0639f3e7176ddd178bf266b5f62c66fcfff9acda7487916f3496de2a3dd86e3f","implementation_hash":"unknown","scenarios":[]} +# acceptance-mutation-manifest-end + # Scenarios: Topic Metadata Indexing - 1, Topic Metadata Indexing - 2, Topic Metadata Indexing - 3, Topic Metadata Indexing - 4, Topic Metadata Indexing - 5, Topic Metadata Indexing - 6 # # The indexer maintains lastSeen and followerCount on each room's diff --git a/psf-memo-indexer/src/use-cases/action-types/topic-follow.js b/psf-memo-indexer/src/use-cases/action-types/topic-follow.js index 258ac1f..6928fee 100644 --- a/psf-memo-indexer/src/use-cases/action-types/topic-follow.js +++ b/psf-memo-indexer/src/use-cases/action-types/topic-follow.js @@ -26,5 +26,5 @@ export async function handleTopicFollow (ctx) { } // mutate4javascript-manifest-begin -// {"version":1,"tested_at":"2026-09-17T16:34:56.427Z","module_hash":"98bbf2e83e9afae81b2a25b3b03d66a32c9af7864e8eace4aec99b16dfe773b5","functions":[{"id":"func/handleTopicFollow","name":"handleTopicFollow","line":5,"end_line":30,"hash":"6137b8d03c0bcf24ddd08824e462565407677303981b1a376b94e449897e217a"}]} +// {"version":1,"tested_at":"2026-09-18T13:05:43.531Z","module_hash":"365e587ffaac43d371c7d389cb00a00cc7d0e0eee37130a001f8b40daba856ec","functions":[{"id":"func/handleTopicFollow","name":"handleTopicFollow","line":5,"end_line":26,"hash":"b2ce7138ed40e5c618d55fad85b2324861330efb66b150fb7ed296a46de3abfc"}]} // mutate4javascript-manifest-end diff --git a/psf-memo-indexer/src/use-cases/action-types/topic-indexing.js b/psf-memo-indexer/src/use-cases/action-types/topic-indexing.js index 925fcc2..da55d17 100644 --- a/psf-memo-indexer/src/use-cases/action-types/topic-indexing.js +++ b/psf-memo-indexer/src/use-cases/action-types/topic-indexing.js @@ -89,5 +89,5 @@ export async function recordTopicFollow (adapters, record) { } // mutate4javascript-manifest-begin -// {"version":1,"tested_at":"2026-09-17T16:22:46.190Z","module_hash":"cdd90074000f9eddb01ce298351d75ae8afdecc8fe34711a0a415099d64a7e70","functions":[{"id":"func/recordTopicPost","name":"recordTopicPost","line":19,"end_line":40,"hash":"91b542cddca534356bcaf15426ec2abccd04d610cf8db4c21de7deb216b250d8"},{"id":"func/ensureTopicRoom","name":"ensureTopicRoom","line":44,"end_line":50,"hash":"ca3cb6538d16deea7546a5bbf1a24a752f803a8929b7da8c3b8ba9582a20816a"}]} +// {"version":1,"tested_at":"2026-09-18T13:03:40.448Z","module_hash":"e9af75f22787ded23bf9ff7e714409eab94c48ef8f5b860daf0d51959912b213","functions":[{"id":"func/recordTopicPost","name":"recordTopicPost","line":21,"end_line":46,"hash":"21d57fd91bb1c043f1c20012f7a3f1c0ea5704d1c0bf1c39f2b2d1300ae23097"},{"id":"func/ensureTopicRoom","name":"ensureTopicRoom","line":51,"end_line":59,"hash":"d8e7974e36399709da6e6e9b5d4193cc81cf99feb4f2da839bd9911e600b4ebd"},{"id":"func/recordTopicFollow","name":"recordTopicFollow","line":65,"end_line":89,"hash":"1538d50df786da982e65e306812ee41045ca2ac5a9869e9a6c639de413b0e678"}]} // mutate4javascript-manifest-end diff --git a/psf-memo-indexer/src/use-cases/action-types/topic-message.js b/psf-memo-indexer/src/use-cases/action-types/topic-message.js index 5d9e1c2..2b8774c 100644 --- a/psf-memo-indexer/src/use-cases/action-types/topic-message.js +++ b/psf-memo-indexer/src/use-cases/action-types/topic-message.js @@ -38,5 +38,5 @@ export async function handleTopicMessage (ctx) { } // mutate4javascript-manifest-begin -// {"version":1,"tested_at":"2026-09-17T16:35:45.388Z","module_hash":"3bf8a10d51b15167c500fd9d0586eedffb4b6f2191b6f563e9f9b15c75e850c0","functions":[{"id":"func/handleTopicMessage","name":"handleTopicMessage","line":6,"end_line":38,"hash":"d58559b106ed4f846feabd05070886a2962d95bbe55f2438e8d3f42b0f26a5ed"}]} +// {"version":1,"tested_at":"2026-09-18T13:06:18.562Z","module_hash":"b991a1ddf77b69bb3751a9e92e2531c50ed0aa980988a7d901d4eb0df891ff75","functions":[{"id":"func/handleTopicMessage","name":"handleTopicMessage","line":6,"end_line":38,"hash":"5de80e5dbb72e58d371e9c7382347171083bec81db141a186a222df4499b5499"}]} // mutate4javascript-manifest-end