diff options
| author | syuilo <Syuilotan@yahoo.co.jp> | 2021-03-23 15:06:56 +0900 |
|---|---|---|
| committer | syuilo <Syuilotan@yahoo.co.jp> | 2021-03-23 15:06:56 +0900 |
| commit | 7e4a800352dd1de91a7a6c457b39f297d76fd9bf (patch) | |
| tree | 174117f77dcc50defb3081b94a67c3de5c63c5cf /src/services/note | |
| parent | コミット忘れ (diff) | |
| download | sharkey-7e4a800352dd1de91a7a6c457b39f297d76fd9bf.tar.gz sharkey-7e4a800352dd1de91a7a6c457b39f297d76fd9bf.tar.bz2 sharkey-7e4a800352dd1de91a7a6c457b39f297d76fd9bf.zip | |
noteのread処理
Diffstat (limited to 'src/services/note')
| -rw-r--r-- | src/services/note/create.ts | 20 | ||||
| -rw-r--r-- | src/services/note/read.ts | 79 |
2 files changed, 62 insertions, 37 deletions
diff --git a/src/services/note/create.ts b/src/services/note/create.ts index 4a737e8516..b9c1676c58 100644 --- a/src/services/note/create.ts +++ b/src/services/note/create.ts @@ -33,6 +33,7 @@ import { countSameRenotes } from '../../misc/count-same-renotes'; import { deliverToRelays } from '../relay'; import { Channel } from '../../models/entities/channel'; import { normalizeForSearch } from '../../misc/normalize-for-search'; +import { getAntennas } from '../../misc/antenna-cache'; type NotificationType = 'reply' | 'renote' | 'quote' | 'mention'; @@ -241,6 +242,7 @@ export default async (user: User, data: Option, silent = false) => new Promise<N incNotesCountOfUser(user); // Word mute + // TODO: cache UserProfiles.find({ enableWordMute: true }).then(us => { @@ -262,17 +264,15 @@ export default async (user: User, data: Option, silent = false) => new Promise<N Followings.createQueryBuilder('following') .andWhere(`following.followeeId = :userId`, { userId: note.userId }) .getMany() - .then(followings => { + .then(async followings => { const followers = followings.map(f => f.followerId); - Antennas.find().then(async antennas => { - for (const antenna of antennas) { - checkHitAntenna(antenna, note, user, followers).then(hit => { - if (hit) { - addNoteToAntenna(antenna, note, user); - } - }); - } - }); + for (const antenna of (await getAntennas())) { + checkHitAntenna(antenna, note, user, followers).then(hit => { + if (hit) { + addNoteToAntenna(antenna, note, user); + } + }); + } }); // Channel diff --git a/src/services/note/read.ts b/src/services/note/read.ts index 35279db411..91b523bd1d 100644 --- a/src/services/note/read.ts +++ b/src/services/note/read.ts @@ -1,23 +1,59 @@ import { publishMainStream } from '../stream'; import { Note } from '../../models/entities/note'; import { User } from '../../models/entities/user'; -import { NoteUnreads, Antennas, AntennaNotes, Users } from '../../models'; +import { NoteUnreads, AntennaNotes, Users } from '../../models'; import { Not, IsNull, In } from 'typeorm'; +import { Channel } from '../../models/entities/channel'; +import { checkHitAntenna } from '../../misc/check-hit-antenna'; +import { getAntennas } from '../../misc/antenna-cache'; +import { PackedNote } from '../../models/repositories/note'; /** * Mark notes as read */ export default async function( userId: User['id'], - noteIds: Note['id'][] + notes: (Note | PackedNote)[], + info: { + following: Set<Channel['id']>; + followingChannels: Set<Channel['id']>; + } ) { - async function careNoteUnreads() { + const myAntennas = (await getAntennas()).filter(a => a.userId === userId); + const readMentions: (Note | PackedNote)[] = []; + const readSpecifiedNotes: (Note | PackedNote)[] = []; + const readChannelNotes: (Note | PackedNote)[] = []; + const readAntennaNotes: (Note | PackedNote)[] = []; + + for (const note of notes) { + if (note.mentions && note.mentions.includes(userId)) { + readMentions.push(note); + } else if (note.visibleUserIds && note.visibleUserIds.includes(userId)) { + readSpecifiedNotes.push(note); + } + + if (note.channelId && info.followingChannels.has(note.channelId)) { + readChannelNotes.push(note); + } + + if (note.user != null) { // たぶんnullになることは無いはずだけど一応 + for (const antenna of myAntennas) { + if (checkHitAntenna(antenna, note, note.user as any, undefined, Array.from(info.following))) { + readAntennaNotes.push(note); + } + } + } + } + + if ((readMentions.length > 0) || (readSpecifiedNotes.length > 0) || (readChannelNotes.length > 0)) { // Remove the record await NoteUnreads.delete({ userId: userId, - noteId: In(noteIds), + noteId: In([...readMentions.map(n => n.id), ...readSpecifiedNotes.map(n => n.id), ...readChannelNotes.map(n => n.id)]), }); + // TODO: ↓まとめてクエリしたい + NoteUnreads.count({ userId: userId, isMentioned: true @@ -49,33 +85,25 @@ export default async function( }); } - async function careAntenna() { - const antennas = await Antennas.find({ userId }); - - await Promise.all(antennas.map(async antenna => { - const countBefore = await AntennaNotes.count({ - antennaId: antenna.id, - read: false - }); - - if (countBefore === 0) return; - - await AntennaNotes.update({ - antennaId: antenna.id, - noteId: In(noteIds) - }, { - read: true - }); + if (readAntennaNotes.length > 0) { + await AntennaNotes.update({ + antennaId: In(myAntennas.map(a => a.id)), + noteId: In(readAntennaNotes.map(n => n.id)) + }, { + read: true + }); - const countAfter = await AntennaNotes.count({ + // TODO: まとめてクエリしたい + for (const antenna of myAntennas) { + const count = await AntennaNotes.count({ antennaId: antenna.id, read: false }); - if (countAfter === 0) { + if (count === 0) { publishMainStream(userId, 'readAntenna', antenna); } - })); + } Users.getHasUnreadAntenna(userId).then(unread => { if (!unread) { @@ -83,7 +111,4 @@ export default async function( } }); } - - careNoteUnreads(); - careAntenna(); } |