summaryrefslogtreecommitdiff
path: root/src/services/note
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2021-03-23 15:06:56 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2021-03-23 15:06:56 +0900
commit7e4a800352dd1de91a7a6c457b39f297d76fd9bf (patch)
tree174117f77dcc50defb3081b94a67c3de5c63c5cf /src/services/note
parentコミット忘れ (diff)
downloadsharkey-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.ts20
-rw-r--r--src/services/note/read.ts79
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();
}