summaryrefslogtreecommitdiff
path: root/packages/backend/src
diff options
context:
space:
mode:
author_ <phy.public@gmail.com>2023-10-09 12:36:25 +0900
committerGitHub <noreply@github.com>2023-10-09 12:36:25 +0900
commitca07459f5e80d7602c7f68df431bed4df9a8fd81 (patch)
tree54654a7656d3f9d0511a339fa8f34cec9117b0da /packages/backend/src
parentfix(backend): users/notes で 自身の visibility: followers なノートが... (diff)
downloadsharkey-ca07459f5e80d7602c7f68df431bed4df9a8fd81.tar.gz
sharkey-ca07459f5e80d7602c7f68df431bed4df9a8fd81.tar.bz2
sharkey-ca07459f5e80d7602c7f68df431bed4df9a8fd81.zip
fix(backend): ダイレクト投稿がタイムライン上に正常に表示されない問題を修正 (#11993)
* DMをredisにpushするように * add test * add CHANGELOG * Update NoteCreateService.ts * lint * :v: * 前のバージョンから発生した問題ではないため不要 --------- Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>
Diffstat (limited to 'packages/backend/src')
-rw-r--r--packages/backend/src/core/NoteCreateService.ts58
-rw-r--r--packages/backend/src/server/api/endpoints/users/notes.ts1
2 files changed, 33 insertions, 26 deletions
diff --git a/packages/backend/src/core/NoteCreateService.ts b/packages/backend/src/core/NoteCreateService.ts
index 4a454e79e7..277875a19f 100644
--- a/packages/backend/src/core/NoteCreateService.ts
+++ b/packages/backend/src/core/NoteCreateService.ts
@@ -494,11 +494,7 @@ export class NoteCreateService implements OnApplicationShutdown {
// Increment notes count (user)
this.incNotesCountOfUser(user);
- if (data.visibility === 'specified') {
- // TODO?
- } else {
- this.pushToTl(note, user);
- }
+ this.pushToTl(note, user);
this.antennaService.addNoteToAntennas(note, user);
@@ -861,24 +857,34 @@ export class NoteCreateService implements OnApplicationShutdown {
}
} else {
// TODO: キャッシュ?
- const followings = await this.followingsRepository.find({
- where: {
- followeeId: user.id,
- followerHost: IsNull(),
- isFollowerHibernated: false,
- },
- select: ['followerId', 'withReplies'],
- });
+ // eslint-disable-next-line prefer-const
+ let [followings, userListMemberships] = await Promise.all([
+ this.followingsRepository.find({
+ where: {
+ followeeId: user.id,
+ followerHost: IsNull(),
+ isFollowerHibernated: false,
+ },
+ select: ['followerId', 'withReplies'],
+ }),
+ this.userListMembershipsRepository.find({
+ where: {
+ userId: user.id,
+ },
+ select: ['userListId', 'userListUserId', 'withReplies'],
+ }),
+ ]);
- const userListMemberships = await this.userListMembershipsRepository.find({
- where: {
- userId: user.id,
- },
- select: ['userListId', 'withReplies'],
- });
+ if (note.visibility === 'followers') {
+ // TODO: 重そうだから何とかしたい Set 使う?
+ userListMemberships = userListMemberships.filter(x => followings.some(f => f.followerId === x.userListUserId));
+ }
// TODO: あまりにも数が多いと redisPipeline.exec に失敗する(理由は不明)ため、3万件程度を目安に分割して実行するようにする
for (const following of followings) {
+ // 基本的にvisibleUserIdsには自身のidが含まれている前提であること
+ if (note.visibility === 'specified' && !note.visibleUserIds.some(v => v === following.followerId)) continue;
+
// 自分自身以外への返信
if (note.replyId && note.replyUserId !== note.userId) {
if (!following.withReplies) continue;
@@ -899,13 +905,13 @@ export class NoteCreateService implements OnApplicationShutdown {
}
}
- // TODO
- //if (note.visibility === 'followers') {
- // // TODO: 重そうだから何とかしたい Set 使う?
- // userLists = userLists.filter(x => followings.some(f => f.followerId === x.userListUserId));
- //}
-
for (const userListMembership of userListMemberships) {
+ // ダイレクトのとき、そのリストが対象外のユーザーの場合
+ if (
+ note.visibility === 'specified' &&
+ !note.visibleUserIds.some(v => v === userListMembership.userListUserId)
+ ) continue;
+
// 自分自身以外への返信
if (note.replyId && note.replyUserId !== note.userId) {
if (!userListMembership.withReplies) continue;
@@ -926,7 +932,7 @@ export class NoteCreateService implements OnApplicationShutdown {
}
}
- { // 自分自身のHTL
+ if (note.visibility !== 'specified' || !note.visibleUserIds.some(v => v === user.id)) { // 自分自身のHTL
redisPipeline.xadd(
`homeTimeline:${user.id}`,
'MAXLEN', '~', meta.perUserHomeTimelineCacheMax.toString(),
diff --git a/packages/backend/src/server/api/endpoints/users/notes.ts b/packages/backend/src/server/api/endpoints/users/notes.ts
index d4f9186e3a..5736aad5f9 100644
--- a/packages/backend/src/server/api/endpoints/users/notes.ts
+++ b/packages/backend/src/server/api/endpoints/users/notes.ts
@@ -136,6 +136,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
}
}
+ if (note.visibility === 'specified' && (!me || (me.id !== note.userId && !note.visibleUserIds.some(v => v === me.id)))) return false;
if (note.visibility === 'followers' && !isFollowing) return false;
return true;