summaryrefslogtreecommitdiff
path: root/packages/backend/src/core/NoteCreateService.ts
diff options
context:
space:
mode:
authordakkar <dakkar@thenautilus.net>2024-10-07 17:15:33 +0000
committerdakkar <dakkar@thenautilus.net>2024-10-07 17:15:33 +0000
commit32a97a5a057941d88868b94b01b320e61b8d0e15 (patch)
treea12a4a05b616459bfad4f385759898a70c01261d /packages/backend/src/core/NoteCreateService.ts
parentmerge: Add controls to delete all files or sever all relations with a remote ... (diff)
parentupdate autogen types (diff)
downloadsharkey-32a97a5a057941d88868b94b01b320e61b8d0e15.tar.gz
sharkey-32a97a5a057941d88868b94b01b320e61b8d0e15.tar.bz2
sharkey-32a97a5a057941d88868b94b01b320e61b8d0e15.zip
merge: Add feed of latest posts by followed users (!640)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/640 Approved-by: dakkar <dakkar@thenautilus.net> Approved-by: Marie <github@yuugi.dev>
Diffstat (limited to 'packages/backend/src/core/NoteCreateService.ts')
-rw-r--r--packages/backend/src/core/NoteCreateService.ts30
1 files changed, 29 insertions, 1 deletions
diff --git a/packages/backend/src/core/NoteCreateService.ts b/packages/backend/src/core/NoteCreateService.ts
index c252336f99..daf0894cfd 100644
--- a/packages/backend/src/core/NoteCreateService.ts
+++ b/packages/backend/src/core/NoteCreateService.ts
@@ -14,7 +14,8 @@ import { extractCustomEmojisFromMfm } from '@/misc/extract-custom-emojis-from-mf
import { extractHashtags } from '@/misc/extract-hashtags.js';
import type { IMentionedRemoteUsers } from '@/models/Note.js';
import { MiNote } from '@/models/Note.js';
-import type { ChannelFollowingsRepository, ChannelsRepository, FollowingsRepository, InstancesRepository, MiFollowing, MutingsRepository, NotesRepository, NoteThreadMutingsRepository, UserListMembershipsRepository, UserProfilesRepository, UsersRepository } from '@/models/_.js';
+import { LatestNote } from '@/models/LatestNote.js';
+import type { ChannelFollowingsRepository, ChannelsRepository, FollowingsRepository, InstancesRepository, LatestNotesRepository, MiFollowing, MutingsRepository, NotesRepository, NoteThreadMutingsRepository, UserListMembershipsRepository, UserProfilesRepository, UsersRepository } from '@/models/_.js';
import type { MiDriveFile } from '@/models/DriveFile.js';
import type { MiApp } from '@/models/App.js';
import { concat } from '@/misc/prelude/array.js';
@@ -62,6 +63,7 @@ import { isReply } from '@/misc/is-reply.js';
import { trackPromise } from '@/misc/promise-tracker.js';
import { isUserRelated } from '@/misc/is-user-related.js';
import { IdentifiableError } from '@/misc/identifiable-error.js';
+import { isQuote, isRenote } from '@/misc/is-renote.js';
type NotificationType = 'reply' | 'renote' | 'quote' | 'mention';
@@ -170,6 +172,9 @@ export class NoteCreateService implements OnApplicationShutdown {
@Inject(DI.notesRepository)
private notesRepository: NotesRepository,
+ @Inject(DI.latestNotesRepository)
+ private latestNotesRepository: LatestNotesRepository,
+
@Inject(DI.mutingsRepository)
private mutingsRepository: MutingsRepository,
@@ -514,6 +519,8 @@ export class NoteCreateService implements OnApplicationShutdown {
await this.notesRepository.insert(insert);
}
+ await this.updateLatestNote(insert);
+
return insert;
} catch (e) {
// duplicate key error
@@ -1125,4 +1132,25 @@ export class NoteCreateService implements OnApplicationShutdown {
public onApplicationShutdown(signal?: string | undefined): void {
this.dispose();
}
+
+ private async updateLatestNote(note: MiNote) {
+ // Ignore DMs.
+ // Followers-only posts are *included*, as this table is used to back the "following" feed.
+ if (note.visibility === 'specified') return;
+
+ // Ignore pure renotes
+ if (isRenote(note) && !isQuote(note)) return;
+
+ // Make sure that this isn't an *older* post.
+ // We can get older posts through replies, lookups, etc.
+ const currentLatest = await this.latestNotesRepository.findOneBy({ userId: note.userId });
+ if (currentLatest != null && currentLatest.noteId >= note.id) return;
+
+ // Record this as the latest note for the given user
+ const latestNote = new LatestNote({
+ userId: note.userId,
+ noteId: note.id,
+ });
+ await this.latestNotesRepository.upsert(latestNote, ['userId']);
+ }
}