diff --git a/packages/backend/src/core/ChatService.ts b/packages/backend/src/core/ChatService.ts index 62cf04e00e..5954274036 100644 --- a/packages/backend/src/core/ChatService.ts +++ b/packages/backend/src/core/ChatService.ts @@ -16,7 +16,7 @@ import { ChatEntityService } from '@/core/entities/ChatEntityService.js'; import { ApRendererService } from '@/core/activitypub/ApRendererService.js'; import { PushNotificationService } from '@/core/PushNotificationService.js'; import { bindThis } from '@/decorators.js'; -import type { ChatApprovalsRepository, ChatMessagesRepository, ChatRoomInvitationsRepository, ChatRoomMembershipsRepository, ChatRoomsRepository, MiChatMessage, MiChatRoom, MiChatRoomMembership, MiDriveFile, MiUser, MutingsRepository, UsersRepository } from '@/models/_.js'; +import type { ChatApprovalsRepository, ChatMessagesRepository, ChatRoomInvitationsRepository, ChatRoomMembershipsRepository, ChatRoomsRepository, MiAccessToken, MiChatMessage, MiChatRoom, MiChatRoomMembership, MiDriveFile, MiUser, MutingsRepository, UsersRepository } from '@/models/_.js'; import { UserBlockingService } from '@/core/UserBlockingService.js'; import { QueryService } from '@/core/QueryService.js'; import { RoleService } from '@/core/RoleService.js'; @@ -342,11 +342,11 @@ export class ChatService { } @bindThis - public async hasPermissionToViewRoomTimeline(meId: MiUser['id'], room: MiChatRoom) { + public async hasPermissionToViewRoomTimeline(meId: MiUser['id'], room: MiChatRoom, token?: MiAccessToken | null) { if (await this.isRoomMember(room, meId)) { return true; } else { - const iAmModerator = await this.roleService.isModerator({ id: meId }); + const iAmModerator = await this.roleService.isModerator({ id: meId }, token); if (iAmModerator) { return true; } @@ -563,12 +563,12 @@ export class ChatService { } @bindThis - public async hasPermissionToDeleteRoom(meId: MiUser['id'], room: MiChatRoom) { + public async hasPermissionToDeleteRoom(meId: MiUser['id'], room: MiChatRoom, token?: MiAccessToken | null) { if (room.ownerId === meId) { return true; } - const iAmModerator = await this.roleService.isModerator({ id: meId }); + const iAmModerator = await this.roleService.isModerator({ id: meId }, token); if (iAmModerator) { return true; } diff --git a/packages/backend/src/core/FanoutTimelineEndpointService.ts b/packages/backend/src/core/FanoutTimelineEndpointService.ts index ddb0ddb7d2..56766d869e 100644 --- a/packages/backend/src/core/FanoutTimelineEndpointService.ts +++ b/packages/backend/src/core/FanoutTimelineEndpointService.ts @@ -10,7 +10,7 @@ import type { MiUser } from '@/models/User.js'; import type { MiNote } from '@/models/Note.js'; import type { MiMeta } from '@/models/Meta.js'; import { Packed } from '@/misc/json-schema.js'; -import type { NotesRepository } from '@/models/_.js'; +import type { MiAccessToken, NotesRepository } from '@/models/_.js'; import { NoteEntityService } from '@/core/entities/NoteEntityService.js'; import { FanoutTimelineName, FanoutTimelineService } from '@/core/FanoutTimelineService.js'; import { UtilityService } from '@/core/UtilityService.js'; @@ -28,6 +28,7 @@ type TimelineOptions = { limit: number, allowPartial: boolean, me?: { id: MiUser['id'] } | undefined | null, + token?: MiAccessToken | null, useDbFallback: boolean, redisTimelines: FanoutTimelineName[], noteFilter?: (note: MiNote) => boolean, @@ -64,7 +65,7 @@ export class FanoutTimelineEndpointService { @bindThis async timeline(ps: TimelineOptions): Promise[]> { - return await this.noteEntityService.packMany(await this.getMiNotes(ps), ps.me); + return await this.noteEntityService.packMany(await this.getMiNotes(ps), ps.me, ps.token); } @bindThis diff --git a/packages/backend/src/core/NoteCreateService.ts b/packages/backend/src/core/NoteCreateService.ts index ea74d3a84e..1656fc1ff0 100644 --- a/packages/backend/src/core/NoteCreateService.ts +++ b/packages/backend/src/core/NoteCreateService.ts @@ -650,7 +650,7 @@ export class NoteCreateService implements OnApplicationShutdown { if (this.userEntityService.isLocalUser(user)) this.activeUsersChart.write(user); // Pack the note - const noteObj = await this.noteEntityService.pack(note, null, { skipHide: true, withReactionAndUserPairCache: true }); + const noteObj = await this.noteEntityService.pack(note, null, null, { skipHide: true, withReactionAndUserPairCache: true }); this.globalEventService.publishNotesStream(noteObj); @@ -856,7 +856,7 @@ export class NoteCreateService implements OnApplicationShutdown { continue; } - const detailPackedNote = await this.noteEntityService.pack(note, u, { + const detailPackedNote = await this.noteEntityService.pack(note, u, null, { detail: true, }); diff --git a/packages/backend/src/core/NoteEditService.ts b/packages/backend/src/core/NoteEditService.ts index 9e8bb8b4fd..bc091b8d97 100644 --- a/packages/backend/src/core/NoteEditService.ts +++ b/packages/backend/src/core/NoteEditService.ts @@ -618,7 +618,7 @@ export class NoteEditService implements OnApplicationShutdown { if (this.userEntityService.isLocalUser(user)) this.activeUsersChart.write(user); // Pack the note - const noteObj = await this.noteEntityService.pack(note, null, { skipHide: true, withReactionAndUserPairCache: true }); + const noteObj = await this.noteEntityService.pack(note, null, null, { skipHide: true, withReactionAndUserPairCache: true }); this.globalEventService.publishNoteStream(note.id, 'updated', { cw: note.cw, text: note.text ?? '', diff --git a/packages/backend/src/core/NotificationService.ts b/packages/backend/src/core/NotificationService.ts index 2ce7bdb5a9..65a3a89da4 100644 --- a/packages/backend/src/core/NotificationService.ts +++ b/packages/backend/src/core/NotificationService.ts @@ -177,7 +177,7 @@ export class NotificationService implements OnApplicationShutdown { // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition } while (true); - const packed = await this.notificationEntityService.pack(notification, notifieeId, {}); + const packed = await this.notificationEntityService.pack(notification, notifieeId, undefined, {}); if (packed == null) return null; diff --git a/packages/backend/src/core/RoleService.ts b/packages/backend/src/core/RoleService.ts index 6429e304e5..f047afaacd 100644 --- a/packages/backend/src/core/RoleService.ts +++ b/packages/backend/src/core/RoleService.ts @@ -8,6 +8,7 @@ import * as Redis from 'ioredis'; import { In } from 'typeorm'; import { ModuleRef } from '@nestjs/core'; import type { + MiAccessToken, MiMeta, MiRole, MiRoleAssignment, @@ -512,14 +513,16 @@ export class RoleService implements OnApplicationShutdown, OnModuleInit { } @bindThis - public async isModerator(user: { id: MiUser['id'] } | null): Promise { + public async isModerator(user: { id: MiUser['id'] } | null, token?: MiAccessToken | null): Promise { if (user == null) return false; + if (token?.rank != null && token.rank !== 'admin' && token.rank !== 'mod') return false; return (this.meta.rootUserId === user.id) || (await this.getUserRoles(user.id)).some(r => r.isModerator || r.isAdministrator); } @bindThis - public async isAdministrator(user: { id: MiUser['id'] } | null): Promise { + public async isAdministrator(user: { id: MiUser['id'] } | null, token?: MiAccessToken | null): Promise { if (user == null) return false; + if (token?.rank != null && token.rank !== 'admin') return false; return (this.meta.rootUserId === user.id) || (await this.getUserRoles(user.id)).some(r => r.isAdministrator); } diff --git a/packages/backend/src/core/UserSearchService.ts b/packages/backend/src/core/UserSearchService.ts index 4be7bd9bdb..441d9ccfcc 100644 --- a/packages/backend/src/core/UserSearchService.ts +++ b/packages/backend/src/core/UserSearchService.ts @@ -6,7 +6,7 @@ import { Inject, Injectable } from '@nestjs/common'; import { Brackets, SelectQueryBuilder } from 'typeorm'; import { DI } from '@/di-symbols.js'; -import { type FollowingsRepository, MiUser, type MutingsRepository, type UserProfilesRepository, type UsersRepository } from '@/models/_.js'; +import { type FollowingsRepository, MiAccessToken, MiUser, type MutingsRepository, type UserProfilesRepository, type UsersRepository } from '@/models/_.js'; import { bindThis } from '@/decorators.js'; import { sqlLikeEscape } from '@/misc/sql-like-escape.js'; import type { Config } from '@/config.js'; @@ -63,6 +63,7 @@ export class UserSearchService { * @param params 検索条件. * @param opts 関数の動作を制御するオプション. * @param me 検索を実行するユーザの情報. 未ログインの場合は指定しない. + * @param token * @see {@link UserSearchService#buildSearchUserQueries} * @see {@link UserSearchService#buildSearchUserNoLoginQueries} */ @@ -78,6 +79,7 @@ export class UserSearchService { detail?: boolean, }, me?: MiUser | null, + token?: MiAccessToken | null, ): Promise[]> { const queries = me ? this.buildSearchUserQueries(me, params) : this.buildSearchUserNoLoginQueries(params); @@ -100,7 +102,7 @@ export class UserSearchService { return this.userEntityService.packMany<'UserLite' | 'UserDetailed'>( [...resultSet].slice(0, limit), me, - { schema: opts?.detail ? 'UserDetailed' : 'UserLite' }, + { schema: opts?.detail ? 'UserDetailed' : 'UserLite', token }, ); } diff --git a/packages/backend/src/core/entities/AbuseUserReportEntityService.ts b/packages/backend/src/core/entities/AbuseUserReportEntityService.ts index c1d877aa12..aef8365d62 100644 --- a/packages/backend/src/core/entities/AbuseUserReportEntityService.ts +++ b/packages/backend/src/core/entities/AbuseUserReportEntityService.ts @@ -5,7 +5,7 @@ import { Inject, Injectable } from '@nestjs/common'; import { DI } from '@/di-symbols.js'; -import type { AbuseUserReportsRepository, InstancesRepository, MiInstance, MiUser } from '@/models/_.js'; +import type { AbuseUserReportsRepository, InstancesRepository, MiAccessToken, MiInstance, MiUser } from '@/models/_.js'; import { awaitAll } from '@/misc/prelude/await-all.js'; import type { MiAbuseUserReport } from '@/models/AbuseUserReport.js'; import { bindThis } from '@/decorators.js'; @@ -39,6 +39,7 @@ export class AbuseUserReportEntityService { packedAssignee?: Packed<'UserDetailedNotMe'>, }, me?: MiUser | null, + token?: MiAccessToken | null, ) { const report = typeof src === 'object' ? src : await this.abuseUserReportsRepository.findOneByOrFail({ id: src }); @@ -53,21 +54,24 @@ export class AbuseUserReportEntityService { assigneeId: report.assigneeId, reporter: hint?.packedReporter ?? this.userEntityService.pack(report.reporter ?? report.reporterId, me, { schema: 'UserDetailedNotMe', + token, }), targetUser: hint?.packedTargetUser ?? this.userEntityService.pack(report.targetUser ?? report.targetUserId, me, { schema: 'UserDetailedNotMe', + token, }), // return hint, or pack by relation, or fetch and pack by id, or null targetInstance: hint?.packedTargetInstance ?? ( report.targetUserInstance - ? this.instanceEntityService.pack(report.targetUserInstance, me) + ? this.instanceEntityService.pack(report.targetUserInstance, me, token) : report.targetUserHost ? this.instancesRepository.findOneBy({ host: report.targetUserHost }).then(instance => instance - ? this.instanceEntityService.pack(instance, me) + ? this.instanceEntityService.pack(instance, me, token) : null) : null), assignee: report.assigneeId ? hint?.packedAssignee ?? this.userEntityService.pack(report.assignee ?? report.assigneeId, me, { schema: 'UserDetailedNotMe', + token, }) : null, forwarded: report.forwarded, resolvedAs: report.resolvedAs, @@ -79,6 +83,7 @@ export class AbuseUserReportEntityService { public async packMany( reports: MiAbuseUserReport[], me?: MiUser | null, + token?: MiAccessToken | null, ) { const _reporters = reports.map(({ reporter, reporterId }) => reporter ?? reporterId); const _targetUsers = reports.map(({ targetUser, targetUserId }) => targetUser ?? targetUserId); @@ -86,12 +91,12 @@ export class AbuseUserReportEntityService { const _userMap = await this.userEntityService.packMany( [..._reporters, ..._targetUsers, ..._assignees], me, - { schema: 'UserDetailedNotMe' }, + { schema: 'UserDetailedNotMe', token }, ).then(users => new Map(users.map(u => [u.id, u]))); const _targetInstances = reports .map(({ targetUserInstance, targetUserHost }) => targetUserInstance ?? targetUserHost) .filter((i): i is MiInstance | string => i != null); - const _instanceMap = await this.instanceEntityService.packMany(await this.instanceEntityService.fetchInstancesByHost(_targetInstances), me) + const _instanceMap = await this.instanceEntityService.packMany(await this.instanceEntityService.fetchInstancesByHost(_targetInstances), me, token) .then(instances => new Map(instances.map(i => [i.host, i]))); return Promise.all( reports.map(report => { @@ -99,7 +104,7 @@ export class AbuseUserReportEntityService { const packedTargetUser = _userMap.get(report.targetUserId); const packedTargetInstance = report.targetUserHost ? _instanceMap.get(report.targetUserHost) : undefined; const packedAssignee = report.assigneeId != null ? _userMap.get(report.assigneeId) : undefined; - return this.pack(report, { packedReporter, packedTargetUser, packedAssignee, packedTargetInstance }, me); + return this.pack(report, { packedReporter, packedTargetUser, packedAssignee, packedTargetInstance }, me, token); }), ); } diff --git a/packages/backend/src/core/entities/BlockingEntityService.ts b/packages/backend/src/core/entities/BlockingEntityService.ts index 1e699032e2..1432c0b613 100644 --- a/packages/backend/src/core/entities/BlockingEntityService.ts +++ b/packages/backend/src/core/entities/BlockingEntityService.ts @@ -5,7 +5,7 @@ import { Inject, Injectable } from '@nestjs/common'; import { DI } from '@/di-symbols.js'; -import type { BlockingsRepository } from '@/models/_.js'; +import type { BlockingsRepository, MiAccessToken } from '@/models/_.js'; import { awaitAll } from '@/misc/prelude/await-all.js'; import type { Packed } from '@/misc/json-schema.js'; import type { MiBlocking } from '@/models/Blocking.js'; @@ -29,6 +29,7 @@ export class BlockingEntityService { public async pack( src: MiBlocking['id'] | MiBlocking, me?: { id: MiUser['id'] } | null | undefined, + token?: MiAccessToken | null, hint?: { blockee?: Packed<'UserDetailedNotMe'>, }, @@ -41,6 +42,7 @@ export class BlockingEntityService { blockeeId: blocking.blockeeId, blockee: hint?.blockee ?? this.userEntityService.pack(blocking.blockeeId, me, { schema: 'UserDetailedNotMe', + token, }), }); } @@ -49,10 +51,11 @@ export class BlockingEntityService { public async packMany( blockings: MiBlocking[], me: { id: MiUser['id'] }, + token?: MiAccessToken | null, ) { const _blockees = blockings.map(({ blockee, blockeeId }) => blockee ?? blockeeId); - const _userMap = await this.userEntityService.packMany(_blockees, me, { schema: 'UserDetailedNotMe' }) + const _userMap = await this.userEntityService.packMany(_blockees, me, { schema: 'UserDetailedNotMe', token }) .then(users => new Map(users.map(u => [u.id, u]))); - return Promise.all(blockings.map(blocking => this.pack(blocking, me, { blockee: _userMap.get(blocking.blockeeId) }))); + return Promise.all(blockings.map(blocking => this.pack(blocking, me, token, { blockee: _userMap.get(blocking.blockeeId) }))); } } diff --git a/packages/backend/src/core/entities/ChannelEntityService.ts b/packages/backend/src/core/entities/ChannelEntityService.ts index 1ba7ca8e57..2b34a2fd92 100644 --- a/packages/backend/src/core/entities/ChannelEntityService.ts +++ b/packages/backend/src/core/entities/ChannelEntityService.ts @@ -5,7 +5,7 @@ import { Inject, Injectable } from '@nestjs/common'; import { DI } from '@/di-symbols.js'; -import type { ChannelFavoritesRepository, ChannelFollowingsRepository, ChannelsRepository, DriveFilesRepository, NotesRepository } from '@/models/_.js'; +import type { ChannelFavoritesRepository, ChannelFollowingsRepository, ChannelsRepository, DriveFilesRepository, MiAccessToken, NotesRepository } from '@/models/_.js'; import type { Packed } from '@/misc/json-schema.js'; import type { } from '@/models/Blocking.js'; import type { MiUser } from '@/models/User.js'; @@ -44,6 +44,7 @@ export class ChannelEntityService { public async pack( src: MiChannel['id'] | MiChannel, me?: { id: MiUser['id'] } | null | undefined, + token?: MiAccessToken | null, detailed?: boolean, ): Promise> { const channel = typeof src === 'object' ? src : await this.channelsRepository.findOneByOrFail({ id: src }); @@ -94,7 +95,7 @@ export class ChannelEntityService { } : {}), ...(detailed ? { - pinnedNotes: (await this.noteEntityService.packMany(pinnedNotes, me)).sort((a, b) => channel.pinnedNoteIds.indexOf(a.id) - channel.pinnedNoteIds.indexOf(b.id)), + pinnedNotes: (await this.noteEntityService.packMany(pinnedNotes, me, token)).sort((a, b) => channel.pinnedNoteIds.indexOf(a.id) - channel.pinnedNoteIds.indexOf(b.id)), } : {}), }; } diff --git a/packages/backend/src/core/entities/ClipEntityService.ts b/packages/backend/src/core/entities/ClipEntityService.ts index d915645906..e866ca008b 100644 --- a/packages/backend/src/core/entities/ClipEntityService.ts +++ b/packages/backend/src/core/entities/ClipEntityService.ts @@ -5,7 +5,7 @@ import { Inject, Injectable } from '@nestjs/common'; import { DI } from '@/di-symbols.js'; -import type { ClipNotesRepository, ClipFavoritesRepository, ClipsRepository, MiUser } from '@/models/_.js'; +import type { ClipNotesRepository, ClipFavoritesRepository, ClipsRepository, MiUser, MiAccessToken } from '@/models/_.js'; import { awaitAll } from '@/misc/prelude/await-all.js'; import type { Packed } from '@/misc/json-schema.js'; import type { } from '@/models/Blocking.js'; @@ -35,6 +35,7 @@ export class ClipEntityService { public async pack( src: MiClip['id'] | MiClip, me?: { id: MiUser['id'] } | null | undefined, + token?: MiAccessToken | null, hint?: { packedUser?: Packed<'UserLite'> }, @@ -47,7 +48,7 @@ export class ClipEntityService { createdAt: this.idService.parse(clip.id).date.toISOString(), lastClippedAt: clip.lastClippedAt ? clip.lastClippedAt.toISOString() : null, userId: clip.userId, - user: hint?.packedUser ?? this.userEntityService.pack(clip.user ?? clip.userId), + user: hint?.packedUser ?? this.userEntityService.pack(clip.user ?? clip.userId, me, { token }), name: clip.name, description: clip.description, isPublic: clip.isPublic, @@ -61,11 +62,12 @@ export class ClipEntityService { public async packMany( clips: MiClip[], me?: { id: MiUser['id'] } | null | undefined, + token?: MiAccessToken | null, ) { const _users = clips.map(({ user, userId }) => user ?? userId); - const _userMap = await this.userEntityService.packMany(_users, me) + const _userMap = await this.userEntityService.packMany(_users, me, { token }) .then(users => new Map(users.map(u => [u.id, u]))); - return Promise.all(clips.map(clip => this.pack(clip, me, { packedUser: _userMap.get(clip.userId) }))); + return Promise.all(clips.map(clip => this.pack(clip, me, token, { packedUser: _userMap.get(clip.userId) }))); } } diff --git a/packages/backend/src/core/entities/FlashEntityService.ts b/packages/backend/src/core/entities/FlashEntityService.ts index 7b0150f5b6..5c3b47448f 100644 --- a/packages/backend/src/core/entities/FlashEntityService.ts +++ b/packages/backend/src/core/entities/FlashEntityService.ts @@ -5,7 +5,7 @@ import { Inject, Injectable } from '@nestjs/common'; import { DI } from '@/di-symbols.js'; -import type { FlashLikesRepository, FlashsRepository } from '@/models/_.js'; +import type { FlashLikesRepository, FlashsRepository, MiAccessToken } from '@/models/_.js'; import type { Packed } from '@/misc/json-schema.js'; import type { MiUser } from '@/models/User.js'; import type { MiFlash } from '@/models/Flash.js'; @@ -29,6 +29,7 @@ export class FlashEntityService { public async pack( src: MiFlash['id'] | MiFlash, me?: { id: MiUser['id'] } | null | undefined, + token?: MiAccessToken | null, hint?: { packedUser?: Packed<'UserLite'>, likedFlashIds?: MiFlash['id'][], @@ -38,7 +39,7 @@ export class FlashEntityService { const flash = typeof src === 'object' ? src : await this.flashsRepository.findOneByOrFail({ id: src }); // { schema: 'UserDetailed' } すると無限ループするので注意 - const user = hint?.packedUser ?? await this.userEntityService.pack(flash.user ?? flash.userId, me); + const user = hint?.packedUser ?? await this.userEntityService.pack(flash.user ?? flash.userId, me, { token }); let isLiked = undefined; if (meId) { @@ -66,9 +67,10 @@ export class FlashEntityService { public async packMany( flashes: MiFlash[], me?: { id: MiUser['id'] } | null | undefined, + token?: MiAccessToken | null, ) { const _users = flashes.map(({ user, userId }) => user ?? userId); - const _userMap = await this.userEntityService.packMany(_users, me) + const _userMap = await this.userEntityService.packMany(_users, me, { token }) .then(users => new Map(users.map(u => [u.id, u]))); const _likedFlashIds = me ? await this.flashLikesRepository.createQueryBuilder('flashLike') @@ -78,7 +80,7 @@ export class FlashEntityService { .then(likes => [...new Set(likes.map(like => like.flashLike_flashId))]) : []; return Promise.all( - flashes.map(flash => this.pack(flash, me, { + flashes.map(flash => this.pack(flash, me, token, { packedUser: _userMap.get(flash.userId), likedFlashIds: _likedFlashIds, })), diff --git a/packages/backend/src/core/entities/FlashLikeEntityService.ts b/packages/backend/src/core/entities/FlashLikeEntityService.ts index 6e0b9d6e11..d1e657659a 100644 --- a/packages/backend/src/core/entities/FlashLikeEntityService.ts +++ b/packages/backend/src/core/entities/FlashLikeEntityService.ts @@ -5,7 +5,7 @@ import { Inject, Injectable } from '@nestjs/common'; import { DI } from '@/di-symbols.js'; -import type { FlashLikesRepository } from '@/models/_.js'; +import type { FlashLikesRepository, MiAccessToken } from '@/models/_.js'; import type { } from '@/models/Blocking.js'; import type { MiUser } from '@/models/User.js'; import type { MiFlashLike } from '@/models/FlashLike.js'; @@ -26,12 +26,13 @@ export class FlashLikeEntityService { public async pack( src: MiFlashLike['id'] | MiFlashLike, me?: { id: MiUser['id'] } | null | undefined, + token?: MiAccessToken | null, ) { const like = typeof src === 'object' ? src : await this.flashLikesRepository.findOneByOrFail({ id: src }); return { id: like.id, - flash: await this.flashEntityService.pack(like.flash ?? like.flashId, me), + flash: await this.flashEntityService.pack(like.flash ?? like.flashId, me, token), }; } @@ -39,8 +40,9 @@ export class FlashLikeEntityService { public packMany( likes: any[], me: { id: MiUser['id'] }, + token?: MiAccessToken | null, ) { - return Promise.all(likes.map(x => this.pack(x, me))); + return Promise.all(likes.map(x => this.pack(x, me, token))); } } diff --git a/packages/backend/src/core/entities/FollowRequestEntityService.ts b/packages/backend/src/core/entities/FollowRequestEntityService.ts index 0101ec8aa7..54eb9e906d 100644 --- a/packages/backend/src/core/entities/FollowRequestEntityService.ts +++ b/packages/backend/src/core/entities/FollowRequestEntityService.ts @@ -5,7 +5,7 @@ import { Inject, Injectable } from '@nestjs/common'; import { DI } from '@/di-symbols.js'; -import type { FollowRequestsRepository } from '@/models/_.js'; +import type { FollowRequestsRepository, MiAccessToken } from '@/models/_.js'; import type { } from '@/models/Blocking.js'; import type { MiUser } from '@/models/User.js'; import type { MiFollowRequest } from '@/models/FollowRequest.js'; @@ -27,6 +27,7 @@ export class FollowRequestEntityService { public async pack( src: MiFollowRequest['id'] | MiFollowRequest, me?: { id: MiUser['id'] } | null | undefined, + token?: MiAccessToken | null, hint?: { packedFollower?: Packed<'UserLite'>, packedFollowee?: Packed<'UserLite'>, @@ -36,8 +37,8 @@ export class FollowRequestEntityService { return { id: request.id, - follower: hint?.packedFollower ?? await this.userEntityService.pack(request.followerId, me), - followee: hint?.packedFollowee ?? await this.userEntityService.pack(request.followeeId, me), + follower: hint?.packedFollower ?? await this.userEntityService.pack(request.followerId, me, { token }), + followee: hint?.packedFollowee ?? await this.userEntityService.pack(request.followeeId, me, { token }), }; } @@ -45,16 +46,17 @@ export class FollowRequestEntityService { public async packMany( requests: MiFollowRequest[], me?: { id: MiUser['id'] } | null | undefined, + token?: MiAccessToken | null, ) { const _followers = requests.map(({ follower, followerId }) => follower ?? followerId); const _followees = requests.map(({ followee, followeeId }) => followee ?? followeeId); - const _userMap = await this.userEntityService.packMany([..._followers, ..._followees], me) + const _userMap = await this.userEntityService.packMany([..._followers, ..._followees], me, { token }) .then(users => new Map(users.map(u => [u.id, u]))); return Promise.all( requests.map(req => { const packedFollower = _userMap.get(req.followerId); const packedFollowee = _userMap.get(req.followeeId); - return this.pack(req, me, { packedFollower, packedFollowee }); + return this.pack(req, me, token, { packedFollower, packedFollowee }); }), ); } diff --git a/packages/backend/src/core/entities/FollowingEntityService.ts b/packages/backend/src/core/entities/FollowingEntityService.ts index d54c954bf2..afb8260e85 100644 --- a/packages/backend/src/core/entities/FollowingEntityService.ts +++ b/packages/backend/src/core/entities/FollowingEntityService.ts @@ -5,7 +5,7 @@ import { Inject, Injectable } from '@nestjs/common'; import { DI } from '@/di-symbols.js'; -import type { FollowingsRepository } from '@/models/_.js'; +import type { FollowingsRepository, MiAccessToken } from '@/models/_.js'; import { awaitAll } from '@/misc/prelude/await-all.js'; import type { Packed } from '@/misc/json-schema.js'; import { MiBlocking } from '@/models/Blocking.js'; @@ -76,23 +76,23 @@ export class FollowingEntityService { } @bindThis - public async getFollowing(me: MiLocalUser, params: FollowsQueryParams) { - return await this.getFollows(me, params, 'following.followerHost = :host'); + public async getFollowing(me: MiLocalUser, token: MiAccessToken | null | undefined, params: FollowsQueryParams) { + return await this.getFollows(me, token, params, 'following.followerHost = :host'); } @bindThis - public async getFollowers(me: MiLocalUser, params: FollowsQueryParams) { - return await this.getFollows(me, params, 'following.followeeHost = :host'); + public async getFollowers(me: MiLocalUser, token: MiAccessToken | null | undefined, params: FollowsQueryParams) { + return await this.getFollows(me, token, params, 'following.followeeHost = :host'); } - private async getFollows(me: MiLocalUser, params: FollowsQueryParams, condition: string) { + private async getFollows(me: MiLocalUser, token: MiAccessToken | null | undefined, params: FollowsQueryParams, condition: string) { const builder = this.followingsRepository.createQueryBuilder('following'); const query = this.queryService .makePaginationQuery(builder, params.sinceId, params.untilId) .andWhere(condition, { host: params.host }) .limit(params.limit); - if (!await this.roleService.isModerator(me)) { + if (!await this.roleService.isModerator(me, token)) { query.setParameter('me', me.id); // Make sure that the followee doesn't block us, if their profile will be included. @@ -119,13 +119,14 @@ export class FollowingEntityService { } const followings = await query.getMany(); - return await this.packMany(followings, me, { populateFollowee: params.includeFollowee, populateFollower: params.includeFollower }); + return await this.packMany(followings, me, token, { populateFollowee: params.includeFollowee, populateFollower: params.includeFollower }); } @bindThis public async pack( src: MiFollowing['id'] | MiFollowing, me?: { id: MiUser['id'] } | null | undefined, + token?: MiAccessToken | null, opts?: { populateFollowee?: boolean; populateFollower?: boolean; @@ -146,9 +147,11 @@ export class FollowingEntityService { followerId: following.followerId, followee: opts.populateFollowee ? hint?.packedFollowee ?? this.userEntityService.pack(following.followee ?? following.followeeId, me, { schema: 'UserDetailedNotMe', + token, }) : undefined, follower: opts.populateFollower ? hint?.packedFollower ?? this.userEntityService.pack(following.follower ?? following.followerId, me, { schema: 'UserDetailedNotMe', + token, }) : undefined, }); } @@ -157,6 +160,7 @@ export class FollowingEntityService { public async packMany( followings: MiFollowing[], me?: { id: MiUser['id'] } | null | undefined, + token?: MiAccessToken | null, opts?: { populateFollowee?: boolean; populateFollower?: boolean; @@ -164,13 +168,13 @@ export class FollowingEntityService { ) { const _followees = opts?.populateFollowee ? followings.map(({ followee, followeeId }) => followee ?? followeeId) : []; const _followers = opts?.populateFollower ? followings.map(({ follower, followerId }) => follower ?? followerId) : []; - const _userMap = await this.userEntityService.packMany([..._followees, ..._followers], me, { schema: 'UserDetailedNotMe' }) + const _userMap = await this.userEntityService.packMany([..._followees, ..._followers], me, { schema: 'UserDetailedNotMe', token }) .then(users => new Map(users.map(u => [u.id, u]))); return Promise.all( followings.map(following => { const packedFollowee = opts?.populateFollowee ? _userMap.get(following.followeeId) : undefined; const packedFollower = opts?.populateFollower ? _userMap.get(following.followerId) : undefined; - return this.pack(following, me, opts, { packedFollowee, packedFollower }); + return this.pack(following, me, token, opts, { packedFollowee, packedFollower }); }), ); } diff --git a/packages/backend/src/core/entities/GalleryLikeEntityService.ts b/packages/backend/src/core/entities/GalleryLikeEntityService.ts index f199a81b4d..541c775182 100644 --- a/packages/backend/src/core/entities/GalleryLikeEntityService.ts +++ b/packages/backend/src/core/entities/GalleryLikeEntityService.ts @@ -5,7 +5,7 @@ import { Inject, Injectable } from '@nestjs/common'; import { DI } from '@/di-symbols.js'; -import type { GalleryLikesRepository } from '@/models/_.js'; +import type { GalleryLikesRepository, MiAccessToken } from '@/models/_.js'; import type { } from '@/models/Blocking.js'; import type { MiGalleryLike } from '@/models/GalleryLike.js'; import { bindThis } from '@/decorators.js'; @@ -25,12 +25,13 @@ export class GalleryLikeEntityService { public async pack( src: MiGalleryLike['id'] | MiGalleryLike, me?: any, + token?: MiAccessToken | null, ) { const like = typeof src === 'object' ? src : await this.galleryLikesRepository.findOneByOrFail({ id: src }); return { id: like.id, - post: await this.galleryPostEntityService.pack(like.post ?? like.postId, me), + post: await this.galleryPostEntityService.pack(like.post ?? like.postId, me, token), }; } @@ -38,8 +39,9 @@ export class GalleryLikeEntityService { public packMany( likes: any[], me: any, + token?: MiAccessToken | null, ) { - return Promise.all(likes.map(x => this.pack(x, me))); + return Promise.all(likes.map(x => this.pack(x, me, token))); } } diff --git a/packages/backend/src/core/entities/GalleryPostEntityService.ts b/packages/backend/src/core/entities/GalleryPostEntityService.ts index 9746a4c1af..0fdefd24cc 100644 --- a/packages/backend/src/core/entities/GalleryPostEntityService.ts +++ b/packages/backend/src/core/entities/GalleryPostEntityService.ts @@ -5,7 +5,7 @@ import { Inject, Injectable } from '@nestjs/common'; import { DI } from '@/di-symbols.js'; -import type { GalleryLikesRepository, GalleryPostsRepository } from '@/models/_.js'; +import type { GalleryLikesRepository, GalleryPostsRepository, MiAccessToken } from '@/models/_.js'; import { awaitAll } from '@/misc/prelude/await-all.js'; import type { Packed } from '@/misc/json-schema.js'; import type { } from '@/models/Blocking.js'; @@ -35,6 +35,7 @@ export class GalleryPostEntityService { public async pack( src: MiGalleryPost['id'] | MiGalleryPost, me?: { id: MiUser['id'] } | null | undefined, + token?: MiAccessToken | null, hint?: { packedUser?: Packed<'UserLite'> }, @@ -47,7 +48,7 @@ export class GalleryPostEntityService { createdAt: this.idService.parse(post.id).date.toISOString(), updatedAt: post.updatedAt.toISOString(), userId: post.userId, - user: hint?.packedUser ?? this.userEntityService.pack(post.user ?? post.userId, me), + user: hint?.packedUser ?? this.userEntityService.pack(post.user ?? post.userId, me, { token }), title: post.title, description: post.description, fileIds: post.fileIds, @@ -64,11 +65,12 @@ export class GalleryPostEntityService { public async packMany( posts: MiGalleryPost[], me?: { id: MiUser['id'] } | null | undefined, + token?: MiAccessToken | null, ) { const _users = posts.map(({ user, userId }) => user ?? userId); - const _userMap = await this.userEntityService.packMany(_users, me) + const _userMap = await this.userEntityService.packMany(_users, me, { token }) .then(users => new Map(users.map(u => [u.id, u]))); - return Promise.all(posts.map(post => this.pack(post, me, { packedUser: _userMap.get(post.userId) }))); + return Promise.all(posts.map(post => this.pack(post, me, token, { packedUser: _userMap.get(post.userId) }))); } } diff --git a/packages/backend/src/core/entities/InstanceEntityService.ts b/packages/backend/src/core/entities/InstanceEntityService.ts index 1225b6484a..c5caffa872 100644 --- a/packages/backend/src/core/entities/InstanceEntityService.ts +++ b/packages/backend/src/core/entities/InstanceEntityService.ts @@ -12,7 +12,7 @@ import { UtilityService } from '@/core/UtilityService.js'; import { RoleService } from '@/core/RoleService.js'; import { MiUser } from '@/models/User.js'; import { DI } from '@/di-symbols.js'; -import type { InstancesRepository, MiMeta } from '@/models/_.js'; +import type { InstancesRepository, MiAccessToken, MiMeta } from '@/models/_.js'; @Injectable() export class InstanceEntityService { @@ -33,8 +33,9 @@ export class InstanceEntityService { public async pack( instance: MiInstance, me?: { id: MiUser['id']; } | null | undefined, + token?: MiAccessToken | null, ): Promise> { - const iAmModerator = me ? await this.roleService.isModerator(me as MiUser) : false; + const iAmModerator = me ? await this.roleService.isModerator(me as MiUser, token) : false; const softwareSuspended = this.utilityService.isDeliverSuspendedSoftware(instance); return { @@ -75,8 +76,9 @@ export class InstanceEntityService { public packMany( instances: MiInstance[], me?: { id: MiUser['id']; } | null | undefined, + token?: MiAccessToken | null, ) { - return Promise.all(instances.map(x => this.pack(x, me))); + return Promise.all(instances.map(x => this.pack(x, me, token))); } @bindThis diff --git a/packages/backend/src/core/entities/InviteCodeEntityService.ts b/packages/backend/src/core/entities/InviteCodeEntityService.ts index 5d3e823a2a..164b520e99 100644 --- a/packages/backend/src/core/entities/InviteCodeEntityService.ts +++ b/packages/backend/src/core/entities/InviteCodeEntityService.ts @@ -5,7 +5,7 @@ import { Inject, Injectable } from '@nestjs/common'; import { DI } from '@/di-symbols.js'; -import type { RegistrationTicketsRepository } from '@/models/_.js'; +import type { MiAccessToken, RegistrationTicketsRepository } from '@/models/_.js'; import { awaitAll } from '@/misc/prelude/await-all.js'; import type { Packed } from '@/misc/json-schema.js'; import type { MiUser } from '@/models/User.js'; @@ -29,6 +29,7 @@ export class InviteCodeEntityService { public async pack( src: MiRegistrationTicket['id'] | MiRegistrationTicket, me?: { id: MiUser['id'] } | null | undefined, + token?: MiAccessToken | null, hints?: { packedCreatedBy?: Packed<'UserLite'>, packedUsedBy?: Packed<'UserLite'>, @@ -46,8 +47,8 @@ export class InviteCodeEntityService { code: target.code, expiresAt: target.expiresAt ? target.expiresAt.toISOString() : null, createdAt: this.idService.parse(target.id).date.toISOString(), - createdBy: target.createdBy ? hints?.packedCreatedBy ?? await this.userEntityService.pack(target.createdBy, me) : null, - usedBy: target.usedBy ? hints?.packedUsedBy ?? await this.userEntityService.pack(target.usedBy, me) : null, + createdBy: target.createdBy ? hints?.packedCreatedBy ?? await this.userEntityService.pack(target.createdBy, me, { token }) : null, + usedBy: target.usedBy ? hints?.packedUsedBy ?? await this.userEntityService.pack(target.usedBy, me, { token }) : null, usedAt: target.usedAt ? target.usedAt.toISOString() : null, used: !!target.usedAt, }); @@ -57,16 +58,17 @@ export class InviteCodeEntityService { public async packMany( tickets: MiRegistrationTicket[], me: { id: MiUser['id'] }, + token?: MiAccessToken | null, ) { const _createdBys = tickets.map(({ createdBy, createdById }) => createdBy ?? createdById).filter(x => x != null); const _usedBys = tickets.map(({ usedBy, usedById }) => usedBy ?? usedById).filter(x => x != null); - const _userMap = await this.userEntityService.packMany([..._createdBys, ..._usedBys], me) + const _userMap = await this.userEntityService.packMany([..._createdBys, ..._usedBys], me, { token }) .then(users => new Map(users.map(u => [u.id, u]))); return Promise.all( tickets.map(ticket => { const packedCreatedBy = ticket.createdById != null ? _userMap.get(ticket.createdById) : undefined; const packedUsedBy = ticket.usedById != null ? _userMap.get(ticket.usedById) : undefined; - return this.pack(ticket, me, { packedCreatedBy, packedUsedBy }); + return this.pack(ticket, me, token, { packedCreatedBy, packedUsedBy }); }), ); } diff --git a/packages/backend/src/core/entities/ModerationLogEntityService.ts b/packages/backend/src/core/entities/ModerationLogEntityService.ts index bf1b2a002c..c36ffa6d24 100644 --- a/packages/backend/src/core/entities/ModerationLogEntityService.ts +++ b/packages/backend/src/core/entities/ModerationLogEntityService.ts @@ -5,13 +5,14 @@ import { Inject, Injectable } from '@nestjs/common'; import { DI } from '@/di-symbols.js'; -import type { ModerationLogsRepository } from '@/models/_.js'; +import type { MiAccessToken, ModerationLogsRepository } from '@/models/_.js'; import { awaitAll } from '@/misc/prelude/await-all.js'; import type { } from '@/models/Blocking.js'; import { MiModerationLog } from '@/models/ModerationLog.js'; import { bindThis } from '@/decorators.js'; import { IdService } from '@/core/IdService.js'; import type { Packed } from '@/misc/json-schema.js'; +import type { MiLocalUser } from '@/models/User.js'; import { UserEntityService } from './UserEntityService.js'; @Injectable() @@ -28,6 +29,8 @@ export class ModerationLogEntityService { @bindThis public async pack( src: MiModerationLog['id'] | MiModerationLog, + me?: MiLocalUser, + token?: MiAccessToken | null, hint?: { packedUser?: Packed<'UserDetailedNotMe'>, }, @@ -40,8 +43,9 @@ export class ModerationLogEntityService { type: log.type, info: log.info, userId: log.userId, - user: hint?.packedUser ?? this.userEntityService.pack(log.user ?? log.userId, null, { + user: hint?.packedUser ?? this.userEntityService.pack(log.user ?? log.userId, me, { schema: 'UserDetailedNotMe', + token, }), }); } @@ -49,11 +53,13 @@ export class ModerationLogEntityService { @bindThis public async packMany( reports: MiModerationLog[], + me?: MiLocalUser, + token?: MiAccessToken | null, ) { const _users = reports.map(({ user, userId }) => user ?? userId); - const _userMap = await this.userEntityService.packMany(_users, null, { schema: 'UserDetailedNotMe' }) + const _userMap = await this.userEntityService.packMany(_users, me, { schema: 'UserDetailedNotMe', token }) .then(users => new Map(users.map(u => [u.id, u]))); - return Promise.all(reports.map(report => this.pack(report, { packedUser: _userMap.get(report.userId) }))); + return Promise.all(reports.map(report => this.pack(report, me, token, { packedUser: _userMap.get(report.userId) }))); } } diff --git a/packages/backend/src/core/entities/MutingEntityService.ts b/packages/backend/src/core/entities/MutingEntityService.ts index d361a20271..30d9d97b3f 100644 --- a/packages/backend/src/core/entities/MutingEntityService.ts +++ b/packages/backend/src/core/entities/MutingEntityService.ts @@ -5,7 +5,7 @@ import { Inject, Injectable } from '@nestjs/common'; import { DI } from '@/di-symbols.js'; -import type { MutingsRepository } from '@/models/_.js'; +import type { MiAccessToken, MutingsRepository } from '@/models/_.js'; import { awaitAll } from '@/misc/prelude/await-all.js'; import type { Packed } from '@/misc/json-schema.js'; import type { } from '@/models/Blocking.js'; @@ -30,6 +30,7 @@ export class MutingEntityService { public async pack( src: MiMuting['id'] | MiMuting, me?: { id: MiUser['id'] } | null | undefined, + token?: MiAccessToken | null, hints?: { packedMutee?: Packed<'UserDetailedNotMe'>, }, @@ -43,6 +44,7 @@ export class MutingEntityService { muteeId: muting.muteeId, mutee: hints?.packedMutee ?? this.userEntityService.pack(muting.muteeId, me, { schema: 'UserDetailedNotMe', + token, }), }); } @@ -51,11 +53,12 @@ export class MutingEntityService { public async packMany( mutings: MiMuting[], me: { id: MiUser['id'] }, + token?: MiAccessToken | null, ) { const _mutees = mutings.map(({ mutee, muteeId }) => mutee ?? muteeId); - const _userMap = await this.userEntityService.packMany(_mutees, me, { schema: 'UserDetailedNotMe' }) + const _userMap = await this.userEntityService.packMany(_mutees, me, { schema: 'UserDetailedNotMe', token }) .then(users => new Map(users.map(u => [u.id, u]))); - return Promise.all(mutings.map(muting => this.pack(muting, me, { packedMutee: _userMap.get(muting.muteeId) }))); + return Promise.all(mutings.map(muting => this.pack(muting, me, token, { packedMutee: _userMap.get(muting.muteeId) }))); } } diff --git a/packages/backend/src/core/entities/NoteFavoriteEntityService.ts b/packages/backend/src/core/entities/NoteFavoriteEntityService.ts index 3cdafe48ad..f6f48cb98f 100644 --- a/packages/backend/src/core/entities/NoteFavoriteEntityService.ts +++ b/packages/backend/src/core/entities/NoteFavoriteEntityService.ts @@ -5,7 +5,7 @@ import { Inject, Injectable } from '@nestjs/common'; import { DI } from '@/di-symbols.js'; -import type { NoteFavoritesRepository } from '@/models/_.js'; +import type { MiAccessToken, NoteFavoritesRepository } from '@/models/_.js'; import type { } from '@/models/Blocking.js'; import type { MiUser } from '@/models/User.js'; import type { MiNoteFavorite } from '@/models/NoteFavorite.js'; @@ -28,6 +28,7 @@ export class NoteFavoriteEntityService { public async pack( src: MiNoteFavorite['id'] | MiNoteFavorite, me?: { id: MiUser['id'] } | null | undefined, + token?: MiAccessToken | null, ) { const favorite = typeof src === 'object' ? src : await this.noteFavoritesRepository.findOneByOrFail({ id: src }); @@ -35,7 +36,7 @@ export class NoteFavoriteEntityService { id: favorite.id, createdAt: this.idService.parse(favorite.id).date.toISOString(), noteId: favorite.noteId, - note: await this.noteEntityService.pack(favorite.note ?? favorite.noteId, me), + note: await this.noteEntityService.pack(favorite.note ?? favorite.noteId, me, token), }; } @@ -43,7 +44,8 @@ export class NoteFavoriteEntityService { public packMany( favorites: any[], me: { id: MiUser['id'] }, + token?: MiAccessToken | null, ) { - return Promise.all(favorites.map(x => this.pack(x, me))); + return Promise.all(favorites.map(x => this.pack(x, me, token))); } } diff --git a/packages/backend/src/core/entities/NoteReactionEntityService.ts b/packages/backend/src/core/entities/NoteReactionEntityService.ts index 46ec13704c..255a06815e 100644 --- a/packages/backend/src/core/entities/NoteReactionEntityService.ts +++ b/packages/backend/src/core/entities/NoteReactionEntityService.ts @@ -5,7 +5,7 @@ import { Inject, Injectable } from '@nestjs/common'; import { DI } from '@/di-symbols.js'; -import type { NoteReactionsRepository } from '@/models/_.js'; +import type { MiAccessToken, NoteReactionsRepository } from '@/models/_.js'; import type { Packed } from '@/misc/json-schema.js'; import { bindThis } from '@/decorators.js'; import { IdService } from '@/core/IdService.js'; @@ -49,6 +49,7 @@ export class NoteReactionEntityService implements OnModuleInit { public async pack( src: MiNoteReaction['id'] | MiNoteReaction, me?: { id: MiUser['id'] } | null | undefined, + token?: MiAccessToken | null, options?: { withNote: boolean; }, @@ -65,10 +66,10 @@ export class NoteReactionEntityService implements OnModuleInit { return { id: reaction.id, createdAt: this.idService.parse(reaction.id).date.toISOString(), - user: hints?.packedUser ?? await this.userEntityService.pack(reaction.user ?? reaction.userId, me), + user: hints?.packedUser ?? await this.userEntityService.pack(reaction.user ?? reaction.userId, me, { token }), type: this.reactionService.convertLegacyReaction(reaction.reaction), ...(opts.withNote ? { - note: await this.noteEntityService.pack(reaction.note ?? reaction.noteId, me), + note: await this.noteEntityService.pack(reaction.note ?? reaction.noteId, me, token), } : {}), }; } @@ -77,6 +78,7 @@ export class NoteReactionEntityService implements OnModuleInit { public async packMany( reactions: MiNoteReaction[], me?: { id: MiUser['id'] } | null | undefined, + token?: MiAccessToken | null, options?: { withNote: boolean; }, @@ -85,8 +87,8 @@ export class NoteReactionEntityService implements OnModuleInit { withNote: false, }, options); const _users = reactions.map(({ user, userId }) => user ?? userId); - const _userMap = await this.userEntityService.packMany(_users, me) + const _userMap = await this.userEntityService.packMany(_users, me, { token }) .then(users => new Map(users.map(u => [u.id, u]))); - return Promise.all(reactions.map(reaction => this.pack(reaction, me, opts, { packedUser: _userMap.get(reaction.userId) }))); + return Promise.all(reactions.map(reaction => this.pack(reaction, me, token, opts, { packedUser: _userMap.get(reaction.userId) }))); } } diff --git a/packages/backend/src/core/entities/NotificationEntityService.ts b/packages/backend/src/core/entities/NotificationEntityService.ts index bb956b1097..8b35fd9f38 100644 --- a/packages/backend/src/core/entities/NotificationEntityService.ts +++ b/packages/backend/src/core/entities/NotificationEntityService.ts @@ -7,7 +7,7 @@ import { Inject, Injectable } from '@nestjs/common'; import { ModuleRef } from '@nestjs/core'; import { In, EntityNotFoundError } from 'typeorm'; import { DI } from '@/di-symbols.js'; -import type { FollowRequestsRepository, NotesRepository, MiUser, UsersRepository } from '@/models/_.js'; +import type { FollowRequestsRepository, NotesRepository, MiUser, UsersRepository, MiAccessToken } from '@/models/_.js'; import { awaitAll } from '@/misc/prelude/await-all.js'; import type { MiGroupedNotification, MiNotification } from '@/models/Notification.js'; import type { MiNote } from '@/models/Note.js'; @@ -66,6 +66,7 @@ export class NotificationEntityService implements OnModuleInit { async #packInternal ( src: T, meId: MiUser['id'], + token: MiAccessToken | null | undefined, options: { checkValidNotifier?: boolean; }, @@ -82,7 +83,7 @@ export class NotificationEntityService implements OnModuleInit { const noteIfNeed = needsNote ? ( hint?.packedNotes != null ? hint.packedNotes.get(notification.noteId) - : undefOnMissing(this.noteEntityService.pack(notification.noteId, { id: meId }, { + : undefOnMissing(this.noteEntityService.pack(notification.noteId, { id: meId }, token, { detail: true, })) ) : undefined; @@ -93,7 +94,7 @@ export class NotificationEntityService implements OnModuleInit { const userIfNeed = needsUser ? ( hint?.packedUsers != null ? hint.packedUsers.get(notification.notifierId) - : undefOnMissing(this.userEntityService.pack(notification.notifierId, { id: meId })) + : undefOnMissing(this.userEntityService.pack(notification.notifierId, { id: meId }, { token })) ) : undefined; // if the user has been deleted, don't show this notification if (needsUser && !userIfNeed) return null; @@ -103,7 +104,7 @@ export class NotificationEntityService implements OnModuleInit { const reactions = (await Promise.all(notification.reactions.map(async reaction => { const user = hint?.packedUsers != null ? hint.packedUsers.get(reaction.userId)! - : await undefOnMissing(this.userEntityService.pack(reaction.userId, { id: meId })); + : await undefOnMissing(this.userEntityService.pack(reaction.userId, { id: meId }, { token })); return { user, reaction: reaction.reaction, @@ -128,7 +129,7 @@ export class NotificationEntityService implements OnModuleInit { return packedUser; } - return undefOnMissing(this.userEntityService.pack(userId, { id: meId })); + return undefOnMissing(this.userEntityService.pack(userId, { id: meId }, { token })); }))).filter(x => x != null); // if all users have been deleted, don't show this notification if (users.length === 0) { @@ -205,6 +206,7 @@ export class NotificationEntityService implements OnModuleInit { async #packManyInternal ( notifications: T[], meId: MiUser['id'], + token?: MiAccessToken | null, ): Promise { if (notifications.length === 0) return []; @@ -217,7 +219,7 @@ export class NotificationEntityService implements OnModuleInit { where: { id: In(noteIds) }, relations: ['user', 'reply', 'reply.user', 'renote', 'renote.user'], }) : []; - const packedNotesArray = await this.noteEntityService.packMany(notes, { id: meId }, { + const packedNotesArray = await this.noteEntityService.packMany(notes, { id: meId }, token, { detail: true, }); const packedNotes = new Map(packedNotesArray.map(p => [p.id, p])); @@ -233,7 +235,7 @@ export class NotificationEntityService implements OnModuleInit { const users = userIds.length > 0 ? await this.usersRepository.find({ where: { id: In(userIds) }, }) : []; - const packedUsersArray = await this.userEntityService.packMany(users, { id: meId }); + const packedUsersArray = await this.userEntityService.packMany(users, { id: meId }, { token }); const packedUsers = new Map(packedUsersArray.map(p => [p.id, p])); // 既に解決されたフォローリクエストの通知を除外 @@ -249,6 +251,7 @@ export class NotificationEntityService implements OnModuleInit { return this.pack( x, meId, + token, { checkValidNotifier: false }, { packedNotes, packedUsers }, ); @@ -261,6 +264,7 @@ export class NotificationEntityService implements OnModuleInit { public async pack( src: MiNotification | MiGroupedNotification, meId: MiUser['id'], + token: MiAccessToken | null | undefined, options: { checkValidNotifier?: boolean; @@ -270,23 +274,25 @@ export class NotificationEntityService implements OnModuleInit { packedUsers: Map>; }, ): Promise | null> { - return await this.#packInternal(src, meId, options, hint); + return await this.#packInternal(src, meId, token, options, hint); } @bindThis public async packMany( notifications: MiNotification[], meId: MiUser['id'], + token?: MiAccessToken | null, ): Promise { - return await this.#packManyInternal(notifications, meId); + return await this.#packManyInternal(notifications, meId, token); } @bindThis public async packGroupedMany( notifications: MiGroupedNotification[], meId: MiUser['id'], + token?: MiAccessToken | null, ): Promise { - return await this.#packManyInternal(notifications, meId); + return await this.#packManyInternal(notifications, meId, token); } /** diff --git a/packages/backend/src/core/entities/PageEntityService.ts b/packages/backend/src/core/entities/PageEntityService.ts index 46bf51bb6d..17086c3b30 100644 --- a/packages/backend/src/core/entities/PageEntityService.ts +++ b/packages/backend/src/core/entities/PageEntityService.ts @@ -5,7 +5,7 @@ import { Inject, Injectable } from '@nestjs/common'; import { DI } from '@/di-symbols.js'; -import type { DriveFilesRepository, PagesRepository, PageLikesRepository } from '@/models/_.js'; +import type { DriveFilesRepository, PagesRepository, PageLikesRepository, MiAccessToken } from '@/models/_.js'; import { awaitAll } from '@/misc/prelude/await-all.js'; import type { Packed } from '@/misc/json-schema.js'; import type { } from '@/models/Blocking.js'; @@ -39,6 +39,7 @@ export class PageEntityService { public async pack( src: MiPage['id'] | MiPage, me?: { id: MiUser['id'] } | null | undefined, + token?: MiAccessToken | null, hint?: { packedUser?: Packed<'UserLite'> }, @@ -93,7 +94,7 @@ export class PageEntityService { createdAt: this.idService.parse(page.id).date.toISOString(), updatedAt: page.updatedAt.toISOString(), userId: page.userId, - user: hint?.packedUser ?? this.userEntityService.pack(page.user ?? page.userId, me), // { schema: 'UserDetailed' } すると無限ループするので注意 + user: hint?.packedUser ?? this.userEntityService.pack(page.user ?? page.userId, me, { token }), // { schema: 'UserDetailed' } すると無限ループするので注意 content: page.content, variables: page.variables, title: page.title, @@ -115,11 +116,12 @@ export class PageEntityService { public async packMany( pages: MiPage[], me?: { id: MiUser['id'] } | null | undefined, + token?: MiAccessToken | null, ) { const _users = pages.map(({ user, userId }) => user ?? userId); - const _userMap = await this.userEntityService.packMany(_users, me) + const _userMap = await this.userEntityService.packMany(_users, me, { token }) .then(users => new Map(users.map(u => [u.id, u]))); - return Promise.all(pages.map(page => this.pack(page, me, { packedUser: _userMap.get(page.userId) }))); + return Promise.all(pages.map(page => this.pack(page, me, token, { packedUser: _userMap.get(page.userId) }))); } } diff --git a/packages/backend/src/core/entities/PageLikeEntityService.ts b/packages/backend/src/core/entities/PageLikeEntityService.ts index cfccbcb660..3d7f5155f6 100644 --- a/packages/backend/src/core/entities/PageLikeEntityService.ts +++ b/packages/backend/src/core/entities/PageLikeEntityService.ts @@ -5,7 +5,7 @@ import { Inject, Injectable } from '@nestjs/common'; import { DI } from '@/di-symbols.js'; -import type { PageLikesRepository } from '@/models/_.js'; +import type { MiAccessToken, PageLikesRepository } from '@/models/_.js'; import type { } from '@/models/Blocking.js'; import type { MiUser } from '@/models/User.js'; import type { MiPageLike } from '@/models/PageLike.js'; @@ -26,12 +26,13 @@ export class PageLikeEntityService { public async pack( src: MiPageLike['id'] | MiPageLike, me?: { id: MiUser['id'] } | null | undefined, + token?: MiAccessToken | null, ) { const like = typeof src === 'object' ? src : await this.pageLikesRepository.findOneByOrFail({ id: src }); return { id: like.id, - page: await this.pageEntityService.pack(like.page ?? like.pageId, me), + page: await this.pageEntityService.pack(like.page ?? like.pageId, me, token), }; } @@ -39,8 +40,9 @@ export class PageLikeEntityService { public packMany( likes: any[], me: { id: MiUser['id'] }, + token?: MiAccessToken | null, ) { - return Promise.all(likes.map(x => this.pack(x, me))); + return Promise.all(likes.map(x => this.pack(x, me, token))); } } diff --git a/packages/backend/src/core/entities/RenoteMutingEntityService.ts b/packages/backend/src/core/entities/RenoteMutingEntityService.ts index e4e154109a..4cf586048b 100644 --- a/packages/backend/src/core/entities/RenoteMutingEntityService.ts +++ b/packages/backend/src/core/entities/RenoteMutingEntityService.ts @@ -5,7 +5,7 @@ import { Inject, Injectable } from '@nestjs/common'; import { DI } from '@/di-symbols.js'; -import type { RenoteMutingsRepository } from '@/models/_.js'; +import type { MiAccessToken, RenoteMutingsRepository } from '@/models/_.js'; import { awaitAll } from '@/misc/prelude/await-all.js'; import type { Packed } from '@/misc/json-schema.js'; import type { } from '@/models/Blocking.js'; @@ -30,6 +30,7 @@ export class RenoteMutingEntityService { public async pack( src: MiRenoteMuting['id'] | MiRenoteMuting, me?: { id: MiUser['id'] } | null | undefined, + token?: MiAccessToken | null, hints?: { packedMutee?: Packed<'UserDetailedNotMe'> }, @@ -42,6 +43,7 @@ export class RenoteMutingEntityService { muteeId: muting.muteeId, mutee: hints?.packedMutee ?? this.userEntityService.pack(muting.muteeId, me, { schema: 'UserDetailedNotMe', + token, }), }); } @@ -50,11 +52,12 @@ export class RenoteMutingEntityService { public async packMany( mutings: MiRenoteMuting[], me: { id: MiUser['id'] }, + token?: MiAccessToken | null, ) { const _users = mutings.map(({ mutee, muteeId }) => mutee ?? muteeId); - const _userMap = await this.userEntityService.packMany(_users, me, { schema: 'UserDetailedNotMe' }) + const _userMap = await this.userEntityService.packMany(_users, me, { schema: 'UserDetailedNotMe', token }) .then(users => new Map(users.map(u => [u.id, u]))); - return Promise.all(mutings.map(muting => this.pack(muting, me, { packedMutee: _userMap.get(muting.muteeId) }))); + return Promise.all(mutings.map(muting => this.pack(muting, me, token, { packedMutee: _userMap.get(muting.muteeId) }))); } } diff --git a/packages/backend/src/core/entities/UserEntityService.ts b/packages/backend/src/core/entities/UserEntityService.ts index b4db479f20..bc3672e6f5 100644 --- a/packages/backend/src/core/entities/UserEntityService.ts +++ b/packages/backend/src/core/entities/UserEntityService.ts @@ -479,7 +479,7 @@ export class UserEntityService implements OnModuleInit { const isDetailed = opts.schema !== 'UserLite'; const meId = me ? me.id : null; const isMe = meId === user.id; - const iAmModerator = opts.iAmModerator ?? (me ? await this.roleService.isModerator(me as MiUser) : false); + const iAmModerator = opts.iAmModerator ?? (me ? await this.roleService.isModerator(me as MiUser, opts.token) : false); const profile = isDetailed ? (opts.userProfile ?? user.userProfile ?? await this.userProfilesRepository.findOneByOrFail({ userId: user.id })) @@ -531,8 +531,7 @@ export class UserEntityService implements OnModuleInit { (profile.followersVisibility === 'followers') && (relation && relation.isFollowing) ? user.followersCount : null; - const isModerator = isMe && isDetailed && (opts.token?.rank == null || opts.token.rank === 'mod') ? this.roleService.isModerator(user) : null; - const isAdmin = isMe && isDetailed && (opts.token?.rank == null || opts.token.rank === 'admin') ? this.roleService.isAdministrator(user) : null; + const isAdmin = isMe && isDetailed ? this.roleService.isAdministrator(user, opts.token) : null; const unreadAnnouncements = isMe && isDetailed ? (await this.announcementService.getUnreadAnnouncements(user)).map((announcement) => ({ createdAt: this.idService.parse(announcement.id).date.toISOString(), @@ -628,11 +627,11 @@ export class UserEntityService implements OnModuleInit { fields: profile!.fields, verifiedLinks: profile!.verifiedLinks, pinnedNoteIds: pins.map(pin => pin.noteId), - pinnedNotes: this.noteEntityService.packMany(pins.map(pin => pin.note!), me, { + pinnedNotes: this.noteEntityService.packMany(pins.map(pin => pin.note!), me, opts.token, { detail: true, }), pinnedPageId: profile!.pinnedPageId, - pinnedPage: profile!.pinnedPageId ? this.pageEntityService.pack(profile!.pinnedPageId, me) : null, + pinnedPage: profile!.pinnedPageId ? this.pageEntityService.pack(profile!.pinnedPageId, me, opts.token) : null, publicReactions: this.isLocalUser(user) ? profile!.publicReactions : false, // https://github.com/misskey-dev/misskey/issues/12964 followersVisibility: profile!.followersVisibility, followingVisibility: profile!.followingVisibility, @@ -665,7 +664,7 @@ export class UserEntityService implements OnModuleInit { bannerId: user.bannerId, backgroundId: user.backgroundId, followedMessage: profile!.followedMessage, - isModerator: isModerator, + isModerator: iAmModerator, isAdmin: isAdmin, isSystem: isSystemAccount(user), injectFeaturedNote: profile!.injectFeaturedNote, @@ -742,12 +741,15 @@ export class UserEntityService implements OnModuleInit { return await awaitAll(packed); } + // TODO pass token + public async packMany( users: (MiUser['id'] | MiUser)[], me?: { id: MiUser['id'] } | null | undefined, options?: { schema?: S, includeSecrets?: boolean, + token?: MiAccessToken | null, }, ): Promise[]> { if (users.length === 0) return []; @@ -769,7 +771,7 @@ export class UserEntityService implements OnModuleInit { } const _userIds = _users.map(u => u.id); - const iAmModerator = await this.roleService.isModerator(me as MiUser); + const iAmModerator = await this.roleService.isModerator(me as MiUser, options?.token); const meId = me ? me.id : null; const isDetailed = options && options.schema !== 'UserLite'; const isDetailedAndMod = isDetailed && iAmModerator; diff --git a/packages/backend/src/core/entities/UserListEntityService.ts b/packages/backend/src/core/entities/UserListEntityService.ts index b77249c5cb..88b810fb18 100644 --- a/packages/backend/src/core/entities/UserListEntityService.ts +++ b/packages/backend/src/core/entities/UserListEntityService.ts @@ -5,12 +5,13 @@ import { Inject, Injectable } from '@nestjs/common'; import { DI } from '@/di-symbols.js'; -import type { MiUserListMembership, UserListMembershipsRepository, UserListsRepository } from '@/models/_.js'; +import type { MiAccessToken, MiUserListMembership, UserListMembershipsRepository, UserListsRepository } from '@/models/_.js'; import type { Packed } from '@/misc/json-schema.js'; import type { } from '@/models/Blocking.js'; import type { MiUserList } from '@/models/UserList.js'; import { bindThis } from '@/decorators.js'; import { IdService } from '@/core/IdService.js'; +import type { MiLocalUser } from '@/models/User.js'; import { UserEntityService } from './UserEntityService.js'; @Injectable() @@ -49,15 +50,17 @@ export class UserListEntityService { @bindThis public async packMembershipsMany( memberships: MiUserListMembership[], + me?: MiLocalUser | null, + token?: MiAccessToken | null, ) { const _users = memberships.map(({ user, userId }) => user ?? userId); - const _userMap = await this.userEntityService.packMany(_users) + const _userMap = await this.userEntityService.packMany(_users, me, { token }) .then(users => new Map(users.map(u => [u.id, u]))); return Promise.all(memberships.map(async x => ({ id: x.id, createdAt: this.idService.parse(x.id).date.toISOString(), userId: x.userId, - user: _userMap.get(x.userId) ?? await this.userEntityService.pack(x.userId), + user: _userMap.get(x.userId) ?? await this.userEntityService.pack(x.userId, me, { token }), withReplies: x.withReplies, }))); } diff --git a/packages/backend/src/server/api/ApiServerService.ts b/packages/backend/src/server/api/ApiServerService.ts index 6ed139ad77..b58aa35f38 100644 --- a/packages/backend/src/server/api/ApiServerService.ts +++ b/packages/backend/src/server/api/ApiServerService.ts @@ -201,7 +201,7 @@ export class ApiServerService { return { ok: true, token: token.token, - user: await this.userEntityService.pack(token.userId, null, { schema: 'UserDetailedNotMe' }), + user: await this.userEntityService.pack(token.userId, null, { schema: 'UserDetailedNotMe', token }), }; } else { return { diff --git a/packages/backend/src/server/api/endpoints/admin/abuse-user-reports.ts b/packages/backend/src/server/api/endpoints/admin/abuse-user-reports.ts index b8200c09aa..594bb9c43c 100644 --- a/packages/backend/src/server/api/endpoints/admin/abuse-user-reports.ts +++ b/packages/backend/src/server/api/endpoints/admin/abuse-user-reports.ts @@ -119,7 +119,7 @@ export default class extends Endpoint { // eslint- private abuseUserReportEntityService: AbuseUserReportEntityService, private queryService: QueryService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const query = this.queryService.makePaginationQuery(this.abuseUserReportsRepository.createQueryBuilder('report'), ps.sinceId, ps.untilId) .leftJoinAndSelect('report.targetUser', 'targetUser') .leftJoinAndSelect('targetUser.userProfile', 'targetUserProfile') @@ -147,7 +147,7 @@ export default class extends Endpoint { // eslint- const reports = await query.limit(ps.limit).getMany(); - return await this.abuseUserReportEntityService.packMany(reports, me); + return await this.abuseUserReportEntityService.packMany(reports, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/admin/accounts/create.ts b/packages/backend/src/server/api/endpoints/admin/accounts/create.ts index 88490800cf..4267a33f53 100644 --- a/packages/backend/src/server/api/endpoints/admin/accounts/create.ts +++ b/packages/backend/src/server/api/endpoints/admin/accounts/create.ts @@ -121,7 +121,7 @@ export default class extends Endpoint { // eslint- throw new ApiError(meta.errors.noPermission); } - if (me && !await this.roleService.isAdministrator(me)) { + if (me && !await this.roleService.isAdministrator(me, token)) { // Only administrators (including root) can create users. throw new ApiError(meta.errors.noAdmin); } diff --git a/packages/backend/src/server/api/endpoints/admin/accounts/find-by-email.ts b/packages/backend/src/server/api/endpoints/admin/accounts/find-by-email.ts index 12cd5cf295..d2489ebd66 100644 --- a/packages/backend/src/server/api/endpoints/admin/accounts/find-by-email.ts +++ b/packages/backend/src/server/api/endpoints/admin/accounts/find-by-email.ts @@ -47,7 +47,7 @@ export default class extends Endpoint { // eslint- private userEntityService: UserEntityService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const profile = await this.userProfilesRepository.findOne({ where: { email: ps.email }, relations: ['user'], @@ -57,8 +57,9 @@ export default class extends Endpoint { // eslint- throw new ApiError(meta.errors.userNotFound); } - const res = await this.userEntityService.pack(profile.user!, null, { + const res = await this.userEntityService.pack(profile.user!, me, { schema: 'UserDetailedNotMe', + token, }); return res; diff --git a/packages/backend/src/server/api/endpoints/admin/drive/show-file.ts b/packages/backend/src/server/api/endpoints/admin/drive/show-file.ts index a7136d8c8c..8b007d68b8 100644 --- a/packages/backend/src/server/api/endpoints/admin/drive/show-file.ts +++ b/packages/backend/src/server/api/endpoints/admin/drive/show-file.ts @@ -185,7 +185,7 @@ export default class extends Endpoint { // eslint- private roleService: RoleService, private idService: IdService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const file = ps.fileId ? await this.driveFilesRepository.findOneBy({ id: ps.fileId }) : await this.driveFilesRepository.findOne({ where: [{ url: ps.url, @@ -204,7 +204,7 @@ export default class extends Endpoint { // eslint- id: file.userId, }) : null; - const iAmModerator = await this.roleService.isModerator(me); + const iAmModerator = await this.roleService.isModerator(me, token); const ownerIsModerator = owner ? await this.roleService.isModerator(owner) : false; return { diff --git a/packages/backend/src/server/api/endpoints/admin/invite/create.ts b/packages/backend/src/server/api/endpoints/admin/invite/create.ts index e52b177e2b..ecb2a88172 100644 --- a/packages/backend/src/server/api/endpoints/admin/invite/create.ts +++ b/packages/backend/src/server/api/endpoints/admin/invite/create.ts @@ -58,7 +58,7 @@ export default class extends Endpoint { // eslint- private idService: IdService, private moderationLogService: ModerationLogService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { if (ps.expiresAt && isNaN(Date.parse(ps.expiresAt))) { throw new ApiError(meta.errors.invalidDateTime); } @@ -81,7 +81,7 @@ export default class extends Endpoint { // eslint- invitations: tickets, }); - return await this.inviteCodeEntityService.packMany(tickets, me); + return await this.inviteCodeEntityService.packMany(tickets, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/admin/invite/list.ts b/packages/backend/src/server/api/endpoints/admin/invite/list.ts index e33a9a1aec..b22e09f0b1 100644 --- a/packages/backend/src/server/api/endpoints/admin/invite/list.ts +++ b/packages/backend/src/server/api/endpoints/admin/invite/list.ts @@ -46,7 +46,7 @@ export default class extends Endpoint { // eslint- private inviteCodeEntityService: InviteCodeEntityService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const query = this.registrationTicketsRepository.createQueryBuilder('ticket') .leftJoinAndSelect('ticket.createdBy', 'createdBy') .leftJoinAndSelect('ticket.usedBy', 'usedBy'); @@ -70,7 +70,7 @@ export default class extends Endpoint { // eslint- const tickets = await query.getMany(); - return await this.inviteCodeEntityService.packMany(tickets, me); + return await this.inviteCodeEntityService.packMany(tickets, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/admin/roles/assign.ts b/packages/backend/src/server/api/endpoints/admin/roles/assign.ts index b6c7953781..6181f31b0c 100644 --- a/packages/backend/src/server/api/endpoints/admin/roles/assign.ts +++ b/packages/backend/src/server/api/endpoints/admin/roles/assign.ts @@ -65,13 +65,13 @@ export default class extends Endpoint { // eslint- private roleService: RoleService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const role = await this.rolesRepository.findOneBy({ id: ps.roleId }); if (role == null) { throw new ApiError(meta.errors.noSuchRole); } - if (!role.canEditMembersByModerator && !(await this.roleService.isAdministrator(me))) { + if (!role.canEditMembersByModerator && !(await this.roleService.isAdministrator(me, token))) { throw new ApiError(meta.errors.accessDenied); } diff --git a/packages/backend/src/server/api/endpoints/admin/roles/unassign.ts b/packages/backend/src/server/api/endpoints/admin/roles/unassign.ts index e7da3384b1..f951176945 100644 --- a/packages/backend/src/server/api/endpoints/admin/roles/unassign.ts +++ b/packages/backend/src/server/api/endpoints/admin/roles/unassign.ts @@ -67,13 +67,13 @@ export default class extends Endpoint { // eslint- private roleService: RoleService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const role = await this.rolesRepository.findOneBy({ id: ps.roleId }); if (role == null) { throw new ApiError(meta.errors.noSuchRole); } - if (!role.canEditMembersByModerator && !(await this.roleService.isAdministrator(me))) { + if (!role.canEditMembersByModerator && !(await this.roleService.isAdministrator(me, token))) { throw new ApiError(meta.errors.accessDenied); } diff --git a/packages/backend/src/server/api/endpoints/admin/show-moderation-logs.ts b/packages/backend/src/server/api/endpoints/admin/show-moderation-logs.ts index 58c5f1f60a..42fa8c42df 100644 --- a/packages/backend/src/server/api/endpoints/admin/show-moderation-logs.ts +++ b/packages/backend/src/server/api/endpoints/admin/show-moderation-logs.ts @@ -78,7 +78,7 @@ export default class extends Endpoint { // eslint- private moderationLogEntityService: ModerationLogEntityService, private queryService: QueryService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const query = this.queryService.makePaginationQuery(this.moderationLogsRepository.createQueryBuilder('report'), ps.sinceId, ps.untilId); if (ps.type != null) { @@ -91,7 +91,7 @@ export default class extends Endpoint { // eslint- const reports = await query.limit(ps.limit).getMany(); - return await this.moderationLogEntityService.packMany(reports); + return await this.moderationLogEntityService.packMany(reports, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/admin/show-user.ts b/packages/backend/src/server/api/endpoints/admin/show-user.ts index 6f0081f1f7..95f69a63c5 100644 --- a/packages/backend/src/server/api/endpoints/admin/show-user.ts +++ b/packages/backend/src/server/api/endpoints/admin/show-user.ts @@ -254,7 +254,7 @@ export default class extends Endpoint { // eslint- private idService: IdService, private readonly cacheService: CacheService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const [user, profile] = await Promise.all([ this.usersRepository.findOneBy({ id: ps.userId }), this.userProfilesRepository.findOneBy({ userId: ps.userId }), @@ -269,7 +269,7 @@ export default class extends Endpoint { // eslint- const isSilenced = user.isSilenced || !(await this.roleService.getUserPolicies(user.id)).canPublicNote; const _me = await this.usersRepository.findOneByOrFail({ id: me.id }); - if (!await this.roleService.isAdministrator(_me) && await this.roleService.isAdministrator(user)) { + if (!await this.roleService.isAdministrator(_me, token) && await this.roleService.isAdministrator(user)) { throw new Error('cannot show info of admin'); } diff --git a/packages/backend/src/server/api/endpoints/admin/silence-user.ts b/packages/backend/src/server/api/endpoints/admin/silence-user.ts index e69c46e55a..cb8f80d399 100644 --- a/packages/backend/src/server/api/endpoints/admin/silence-user.ts +++ b/packages/backend/src/server/api/endpoints/admin/silence-user.ts @@ -38,10 +38,10 @@ export default class extends Endpoint { // eslint- private readonly roleService: RoleService, private readonly globalEventService: GlobalEventService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const user = await this.cacheService.findUserById(ps.userId); - if (await this.roleService.isModerator(user)) { + if (await this.roleService.isModerator(user, token)) { throw new Error('cannot silence moderator account'); } diff --git a/packages/backend/src/server/api/endpoints/admin/suspend-user.ts b/packages/backend/src/server/api/endpoints/admin/suspend-user.ts index 39d208a859..71f59dacfb 100644 --- a/packages/backend/src/server/api/endpoints/admin/suspend-user.ts +++ b/packages/backend/src/server/api/endpoints/admin/suspend-user.ts @@ -35,7 +35,7 @@ export default class extends Endpoint { // eslint- private userSuspendService: UserSuspendService, private roleService: RoleService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const user = await this.usersRepository.findOneBy({ id: ps.userId }); if (user == null) { @@ -44,7 +44,7 @@ export default class extends Endpoint { // eslint- if (user.isSuspended) return; - if (await this.roleService.isModerator(user)) { + if (await this.roleService.isModerator(user, token)) { throw new Error('cannot suspend moderator account'); } diff --git a/packages/backend/src/server/api/endpoints/admin/update-proxy-account.ts b/packages/backend/src/server/api/endpoints/admin/update-proxy-account.ts index 6c9612c71a..107122eead 100644 --- a/packages/backend/src/server/api/endpoints/admin/update-proxy-account.ts +++ b/packages/backend/src/server/api/endpoints/admin/update-proxy-account.ts @@ -40,13 +40,14 @@ export default class extends Endpoint { // eslint- private moderationLogService: ModerationLogService, private systemAccountService: SystemAccountService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const proxy = await this.systemAccountService.updateCorrespondingUserProfile('proxy', { description: ps.description, }); const updated = await this.userEntityService.pack(proxy.id, proxy, { schema: 'MeDetailed', + token, }); if (ps.description !== undefined) { diff --git a/packages/backend/src/server/api/endpoints/antennas/notes.ts b/packages/backend/src/server/api/endpoints/antennas/notes.ts index 0aeceda038..c41f7e87c0 100644 --- a/packages/backend/src/server/api/endpoints/antennas/notes.ts +++ b/packages/backend/src/server/api/endpoints/antennas/notes.ts @@ -78,7 +78,7 @@ export default class extends Endpoint { // eslint- private globalEventService: GlobalEventService, private readonly activeUsersChart: ActiveUsersChart, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const untilId = ps.untilId ?? (ps.untilDate ? this.idService.gen(ps.untilDate!) : null); const sinceId = ps.sinceId ?? (ps.sinceDate ? this.idService.gen(ps.sinceDate!) : null); @@ -134,7 +134,7 @@ export default class extends Endpoint { // eslint- this.activeUsersChart.read(me); }); - return await this.noteEntityService.packMany(notes, me); + return await this.noteEntityService.packMany(notes, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/ap/show.ts b/packages/backend/src/server/api/endpoints/ap/show.ts index d631b002cc..9895bc0916 100644 --- a/packages/backend/src/server/api/endpoints/ap/show.ts +++ b/packages/backend/src/server/api/endpoints/ap/show.ts @@ -21,6 +21,7 @@ import { ApRequestService } from '@/core/activitypub/ApRequestService.js'; import { SystemAccountService } from '@/core/SystemAccountService.js'; import { ApiError } from '../../error.js'; import { IdentifiableError } from '@/misc/identifiable-error.js'; +import { MiAccessToken } from '@/models/AccessToken.js'; export const meta = { tags: ['federation'], @@ -121,8 +122,8 @@ export default class extends Endpoint { // eslint- private readonly apRequestService: ApRequestService, private readonly systemAccountService: SystemAccountService, ) { - super(meta, paramDef, async (ps, me) => { - const object = await this.fetchAny(ps.uri, me); + super(meta, paramDef, async (ps, me, token) => { + const object = await this.fetchAny(ps.uri, me, token); if (object) { return object; } else { @@ -135,12 +136,12 @@ export default class extends Endpoint { // eslint- * URIからUserかNoteを解決する */ @bindThis - private async fetchAny(uri: string, me: MiLocalUser | null | undefined): Promise | null> { + private async fetchAny(uri: string, me: MiLocalUser | null | undefined, token?: MiAccessToken | null): Promise | null> { if (!this.utilityService.isFederationAllowedUri(uri)) { throw new ApiError(meta.errors.federationNotAllowed); } - const local = await this.mergePack(me, ...await Promise.all([ + const local = await this.mergePack(me, token, ...await Promise.all([ this.apDbResolverService.getUserFromApId(uri), this.apDbResolverService.getNoteFromApId(uri), ])); @@ -198,21 +199,22 @@ export default class extends Endpoint { // eslint- // The resolve* methods automatically check for locally cached copies. return await this.mergePack( me, + token, isActor(object) ? await this.apPersonService.resolvePerson(object, resolver, uri) : null, isPost(object) ? await this.apNoteService.resolveNote(object, { resolver, sentFrom: uri }) : null, ); } @bindThis - private async mergePack(me: MiLocalUser | null | undefined, user: MiUser | null | undefined, note: MiNote | null | undefined): Promise | null> { + private async mergePack(me: MiLocalUser | null | undefined, token: MiAccessToken | null | undefined, user: MiUser | null | undefined, note: MiNote | null | undefined): Promise | null> { if (user != null) { return { type: 'User', - object: await this.userEntityService.pack(user, me, { schema: 'UserDetailedNotMe' }), + object: await this.userEntityService.pack(user, me, { schema: 'UserDetailedNotMe', token }), }; } else if (note != null) { try { - const object = await this.noteEntityService.pack(note, me, { detail: true }); + const object = await this.noteEntityService.pack(note, me, token, { detail: true }); return { type: 'Note', diff --git a/packages/backend/src/server/api/endpoints/auth/session/userkey.ts b/packages/backend/src/server/api/endpoints/auth/session/userkey.ts index 8e9aff8058..29b78656f7 100644 --- a/packages/backend/src/server/api/endpoints/auth/session/userkey.ts +++ b/packages/backend/src/server/api/endpoints/auth/session/userkey.ts @@ -117,8 +117,9 @@ export default class extends Endpoint { // eslint- return { accessToken: accessToken.token, - user: await this.userEntityService.pack(session.userId, null, { + user: await this.userEntityService.pack(session.userId, me, { schema: 'UserDetailedNotMe', + token: accessToken, }), }; }); diff --git a/packages/backend/src/server/api/endpoints/blocking/create.ts b/packages/backend/src/server/api/endpoints/blocking/create.ts index fd6c164449..140176f006 100644 --- a/packages/backend/src/server/api/endpoints/blocking/create.ts +++ b/packages/backend/src/server/api/endpoints/blocking/create.ts @@ -78,7 +78,7 @@ export default class extends Endpoint { // eslint- private userBlockingService: UserBlockingService, private userMutingService: UserMutingService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const blocker = await this.usersRepository.findOneByOrFail({ id: me.id }); // 自分自身 @@ -120,6 +120,7 @@ export default class extends Endpoint { // eslint- return await this.userEntityService.pack(blockee.id, blocker, { schema: 'UserDetailedNotMe', + token, }); }); } diff --git a/packages/backend/src/server/api/endpoints/blocking/delete.ts b/packages/backend/src/server/api/endpoints/blocking/delete.ts index a4cd1b1cde..5524fdb463 100644 --- a/packages/backend/src/server/api/endpoints/blocking/delete.ts +++ b/packages/backend/src/server/api/endpoints/blocking/delete.ts @@ -78,7 +78,7 @@ export default class extends Endpoint { // eslint- private userBlockingService: UserBlockingService, private userMutingService: UserMutingService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const blocker = await this.usersRepository.findOneByOrFail({ id: me.id }); // Check if the blockee is yourself @@ -119,6 +119,7 @@ export default class extends Endpoint { // eslint- return await this.userEntityService.pack(blockee.id, blocker, { schema: 'UserDetailedNotMe', + token, }); }); } diff --git a/packages/backend/src/server/api/endpoints/blocking/list.ts b/packages/backend/src/server/api/endpoints/blocking/list.ts index ecbfb10d53..5dde186364 100644 --- a/packages/backend/src/server/api/endpoints/blocking/list.ts +++ b/packages/backend/src/server/api/endpoints/blocking/list.ts @@ -53,7 +53,7 @@ export default class extends Endpoint { // eslint- private blockingEntityService: BlockingEntityService, private queryService: QueryService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const query = this.queryService.makePaginationQuery(this.blockingsRepository.createQueryBuilder('blocking'), ps.sinceId, ps.untilId) .andWhere('blocking.blockerId = :meId', { meId: me.id }); @@ -61,7 +61,7 @@ export default class extends Endpoint { // eslint- .limit(ps.limit) .getMany(); - return await this.blockingEntityService.packMany(blockings, me); + return await this.blockingEntityService.packMany(blockings, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/bubble-game/ranking.ts b/packages/backend/src/server/api/endpoints/bubble-game/ranking.ts index 5597570f8e..449261cbed 100644 --- a/packages/backend/src/server/api/endpoints/bubble-game/ranking.ts +++ b/packages/backend/src/server/api/endpoints/bubble-game/ranking.ts @@ -64,7 +64,7 @@ export default class extends Endpoint { // eslint- private userEntityService: UserEntityService, ) { - super(meta, paramDef, async (ps) => { + super(meta, paramDef, async (ps, me, token) => { const records = await this.bubbleGameRecordsRepository.find({ where: { gameMode: ps.gameMode, @@ -77,7 +77,7 @@ export default class extends Endpoint { // eslint- relations: ['user'], }); - const users = await this.userEntityService.packMany(records.map(r => r.user!), null); + const users = await this.userEntityService.packMany(records.map(r => r.user!), me, { token }); return records.map(r => ({ id: r.id, diff --git a/packages/backend/src/server/api/endpoints/channels/create.ts b/packages/backend/src/server/api/endpoints/channels/create.ts index e3a6d2d670..98771bf958 100644 --- a/packages/backend/src/server/api/endpoints/channels/create.ts +++ b/packages/backend/src/server/api/endpoints/channels/create.ts @@ -67,7 +67,7 @@ export default class extends Endpoint { // eslint- private idService: IdService, private channelEntityService: ChannelEntityService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { let banner = null; if (ps.bannerId != null) { banner = await this.driveFilesRepository.findOneBy({ @@ -91,7 +91,7 @@ export default class extends Endpoint { // eslint- allowRenoteToExternal: ps.allowRenoteToExternal ?? true, } as MiChannel); - return await this.channelEntityService.pack(channel, me); + return await this.channelEntityService.pack(channel, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/channels/featured.ts b/packages/backend/src/server/api/endpoints/channels/featured.ts index 24323cbe63..2bda4868d8 100644 --- a/packages/backend/src/server/api/endpoints/channels/featured.ts +++ b/packages/backend/src/server/api/endpoints/channels/featured.ts @@ -45,7 +45,7 @@ export default class extends Endpoint { // eslint- private channelEntityService: ChannelEntityService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const query = this.channelsRepository.createQueryBuilder('channel') .where('channel.lastNotedAt IS NOT NULL') .andWhere('channel.isArchived = FALSE') @@ -53,7 +53,7 @@ export default class extends Endpoint { // eslint- const channels = await query.limit(10).getMany(); - return await Promise.all(channels.map(x => this.channelEntityService.pack(x, me))); + return await Promise.all(channels.map(x => this.channelEntityService.pack(x, me, token))); }); } } diff --git a/packages/backend/src/server/api/endpoints/channels/followed.ts b/packages/backend/src/server/api/endpoints/channels/followed.ts index 415f7ee29a..64cf7d08a7 100644 --- a/packages/backend/src/server/api/endpoints/channels/followed.ts +++ b/packages/backend/src/server/api/endpoints/channels/followed.ts @@ -53,7 +53,7 @@ export default class extends Endpoint { // eslint- private channelEntityService: ChannelEntityService, private queryService: QueryService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const query = this.queryService .makePaginationQuery( this.channelFollowingsRepository.createQueryBuilder(), @@ -69,7 +69,7 @@ export default class extends Endpoint { // eslint- .limit(ps.limit) .getMany(); - return await Promise.all(followings.map(x => this.channelEntityService.pack(x.followeeId, me))); + return await Promise.all(followings.map(x => this.channelEntityService.pack(x.followeeId, me, token))); }); } } diff --git a/packages/backend/src/server/api/endpoints/channels/my-favorites.ts b/packages/backend/src/server/api/endpoints/channels/my-favorites.ts index 72a1cc0cf9..37399585cf 100644 --- a/packages/backend/src/server/api/endpoints/channels/my-favorites.ts +++ b/packages/backend/src/server/api/endpoints/channels/my-favorites.ts @@ -48,7 +48,7 @@ export default class extends Endpoint { // eslint- private channelEntityService: ChannelEntityService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const query = this.channelFavoritesRepository.createQueryBuilder('favorite') .andWhere('favorite.userId = :meId', { meId: me.id }) .leftJoinAndSelect('favorite.channel', 'channel'); @@ -56,7 +56,7 @@ export default class extends Endpoint { // eslint- const favorites = await query .getMany(); - return await Promise.all(favorites.map(x => this.channelEntityService.pack(x.channel!, me))); + return await Promise.all(favorites.map(x => this.channelEntityService.pack(x.channel!, me, token))); }); } } diff --git a/packages/backend/src/server/api/endpoints/channels/owned.ts b/packages/backend/src/server/api/endpoints/channels/owned.ts index 6e51add6b2..1a0e9987a7 100644 --- a/packages/backend/src/server/api/endpoints/channels/owned.ts +++ b/packages/backend/src/server/api/endpoints/channels/owned.ts @@ -53,7 +53,7 @@ export default class extends Endpoint { // eslint- private channelEntityService: ChannelEntityService, private queryService: QueryService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const query = this.queryService.makePaginationQuery(this.channelsRepository.createQueryBuilder('channel'), ps.sinceId, ps.untilId) .andWhere('channel.isArchived = FALSE') .andWhere({ userId: me.id }); @@ -62,7 +62,7 @@ export default class extends Endpoint { // eslint- .limit(ps.limit) .getMany(); - return await Promise.all(channels.map(x => this.channelEntityService.pack(x, me))); + return await Promise.all(channels.map(x => this.channelEntityService.pack(x, me, token))); }); } } diff --git a/packages/backend/src/server/api/endpoints/channels/show.ts b/packages/backend/src/server/api/endpoints/channels/show.ts index e9c0c392c0..401c16ceca 100644 --- a/packages/backend/src/server/api/endpoints/channels/show.ts +++ b/packages/backend/src/server/api/endpoints/channels/show.ts @@ -52,7 +52,7 @@ export default class extends Endpoint { // eslint- private channelEntityService: ChannelEntityService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const channel = await this.channelsRepository.findOneBy({ id: ps.channelId, }); @@ -61,7 +61,7 @@ export default class extends Endpoint { // eslint- throw new ApiError(meta.errors.noSuchChannel); } - return await this.channelEntityService.pack(channel, me, true); + return await this.channelEntityService.pack(channel, me, token, true); }); } } diff --git a/packages/backend/src/server/api/endpoints/channels/timeline.ts b/packages/backend/src/server/api/endpoints/channels/timeline.ts index 806b203b51..7556af049d 100644 --- a/packages/backend/src/server/api/endpoints/channels/timeline.ts +++ b/packages/backend/src/server/api/endpoints/channels/timeline.ts @@ -85,7 +85,7 @@ export default class extends Endpoint { // eslint- private activeUsersChart: ActiveUsersChart, private readonly cacheService: CacheService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const untilId = ps.untilId ?? (ps.untilDate ? this.idService.gen(ps.untilDate!) : null); const sinceId = ps.sinceId ?? (ps.sinceDate ? this.idService.gen(ps.sinceDate!) : null); @@ -104,7 +104,7 @@ export default class extends Endpoint { // eslint- } if (!this.serverSettings.enableFanoutTimeline) { - return await this.noteEntityService.packMany(await this.getFromDb({ untilId, sinceId, limit: ps.limit, channelId: channel.id, withFiles: ps.withFiles, withRenotes: ps.withRenotes }, me), me); + return await this.noteEntityService.packMany(await this.getFromDb({ untilId, sinceId, limit: ps.limit, channelId: channel.id, withFiles: ps.withFiles, withRenotes: ps.withRenotes }, me), me, token); } return await this.fanoutTimelineEndpointService.timeline({ @@ -113,6 +113,7 @@ export default class extends Endpoint { // eslint- limit: ps.limit, allowPartial: ps.allowPartial, me, + token, useDbFallback: true, redisTimelines: [`channelTimeline:${channel.id}`], excludePureRenotes: !ps.withRenotes, diff --git a/packages/backend/src/server/api/endpoints/channels/update.ts b/packages/backend/src/server/api/endpoints/channels/update.ts index 7cca688fda..b7ec7cb119 100644 --- a/packages/backend/src/server/api/endpoints/channels/update.ts +++ b/packages/backend/src/server/api/endpoints/channels/update.ts @@ -85,7 +85,7 @@ export default class extends Endpoint { // eslint- private roleService: RoleService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const channel = await this.channelsRepository.findOneBy({ id: ps.channelId, }); @@ -94,7 +94,7 @@ export default class extends Endpoint { // eslint- throw new ApiError(meta.errors.noSuchChannel); } - const iAmModerator = await this.roleService.isModerator(me); + const iAmModerator = await this.roleService.isModerator(me, token); if (channel.userId !== me.id && !iAmModerator) { throw new ApiError(meta.errors.accessDenied); } @@ -125,7 +125,7 @@ export default class extends Endpoint { // eslint- ...(typeof ps.allowRenoteToExternal === 'boolean' ? { allowRenoteToExternal: ps.allowRenoteToExternal } : {}), }); - return await this.channelEntityService.pack(channel.id, me); + return await this.channelEntityService.pack(channel.id, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/charts/user/following.ts b/packages/backend/src/server/api/endpoints/charts/user/following.ts index 1d333f9a9b..7a741e3735 100644 --- a/packages/backend/src/server/api/endpoints/charts/user/following.ts +++ b/packages/backend/src/server/api/endpoints/charts/user/following.ts @@ -45,11 +45,11 @@ export default class extends Endpoint { // eslint- private readonly cacheService: CacheService, private readonly roleService: RoleService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const profile = await this.cacheService.userProfileCache.fetch(ps.userId); // These are structured weird to avoid un-necessary calls to roleService and cacheService - const iAmModeratorOrTarget = me && (me.id === ps.userId || await this.roleService.isModerator(me)); + const iAmModeratorOrTarget = me && (me.id === ps.userId || await this.roleService.isModerator(me, token)); const iAmFollowingOrTarget = me && (me.id === ps.userId || await this.cacheService.isFollowing(me.id, ps.userId)); const canViewFollowing = diff --git a/packages/backend/src/server/api/endpoints/chat/messages/room-timeline.ts b/packages/backend/src/server/api/endpoints/chat/messages/room-timeline.ts index c0e344b889..38ae995111 100644 --- a/packages/backend/src/server/api/endpoints/chat/messages/room-timeline.ts +++ b/packages/backend/src/server/api/endpoints/chat/messages/room-timeline.ts @@ -53,7 +53,7 @@ export default class extends Endpoint { // eslint- private chatEntityService: ChatEntityService, private chatService: ChatService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { await this.chatService.checkChatAvailability(me.id, 'read'); const room = await this.chatService.findRoomById(ps.roomId); @@ -61,7 +61,7 @@ export default class extends Endpoint { // eslint- throw new ApiError(meta.errors.noSuchRoom); } - if (!await this.chatService.hasPermissionToViewRoomTimeline(me.id, room)) { + if (!await this.chatService.hasPermissionToViewRoomTimeline(me.id, room, token)) { throw new ApiError(meta.errors.noSuchRoom); } diff --git a/packages/backend/src/server/api/endpoints/chat/messages/show.ts b/packages/backend/src/server/api/endpoints/chat/messages/show.ts index 9a2bbb8742..840b542df3 100644 --- a/packages/backend/src/server/api/endpoints/chat/messages/show.ts +++ b/packages/backend/src/server/api/endpoints/chat/messages/show.ts @@ -49,14 +49,14 @@ export default class extends Endpoint { // eslint- private roleService: RoleService, private chatEntityService: ChatEntityService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { await this.chatService.checkChatAvailability(me.id, 'read'); const message = await this.chatService.findMessageById(ps.messageId); if (message == null) { throw new ApiError(meta.errors.noSuchMessage); } - if (message.fromUserId !== me.id && message.toUserId !== me.id && !(await this.roleService.isModerator(me))) { + if (message.fromUserId !== me.id && message.toUserId !== me.id && !(await this.roleService.isModerator(me, token))) { throw new ApiError(meta.errors.noSuchMessage); } return this.chatEntityService.packMessageDetailed(message, me); diff --git a/packages/backend/src/server/api/endpoints/chat/rooms/delete.ts b/packages/backend/src/server/api/endpoints/chat/rooms/delete.ts index 1ea81448c1..71438af410 100644 --- a/packages/backend/src/server/api/endpoints/chat/rooms/delete.ts +++ b/packages/backend/src/server/api/endpoints/chat/rooms/delete.ts @@ -38,7 +38,7 @@ export default class extends Endpoint { // eslint- constructor( private chatService: ChatService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { await this.chatService.checkChatAvailability(me.id, 'write'); const room = await this.chatService.findRoomById(ps.roomId); @@ -46,7 +46,7 @@ export default class extends Endpoint { // eslint- throw new ApiError(meta.errors.noSuchRoom); } - if (!await this.chatService.hasPermissionToDeleteRoom(me.id, room)) { + if (!await this.chatService.hasPermissionToDeleteRoom(me.id, room, token)) { throw new ApiError(meta.errors.noSuchRoom); } diff --git a/packages/backend/src/server/api/endpoints/clips/create.ts b/packages/backend/src/server/api/endpoints/clips/create.ts index e3b8f33f97..27abc91543 100644 --- a/packages/backend/src/server/api/endpoints/clips/create.ts +++ b/packages/backend/src/server/api/endpoints/clips/create.ts @@ -56,7 +56,7 @@ export default class extends Endpoint { // eslint- private clipEntityService: ClipEntityService, private clipService: ClipService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { let clip: MiClip; try { // 空文字列をnullにしたいので??は使わない @@ -68,7 +68,7 @@ export default class extends Endpoint { // eslint- } throw e; } - return await this.clipEntityService.pack(clip, me); + return await this.clipEntityService.pack(clip, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/clips/list.ts b/packages/backend/src/server/api/endpoints/clips/list.ts index cd4c6bb2fc..05bb4034c8 100644 --- a/packages/backend/src/server/api/endpoints/clips/list.ts +++ b/packages/backend/src/server/api/endpoints/clips/list.ts @@ -47,12 +47,12 @@ export default class extends Endpoint { // eslint- private clipEntityService: ClipEntityService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const clips = await this.clipsRepository.findBy({ userId: me.id, }); - return await this.clipEntityService.packMany(clips, me); + return await this.clipEntityService.packMany(clips, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/clips/my-favorites.ts b/packages/backend/src/server/api/endpoints/clips/my-favorites.ts index 1f9b24e6c9..3d98731cc8 100644 --- a/packages/backend/src/server/api/endpoints/clips/my-favorites.ts +++ b/packages/backend/src/server/api/endpoints/clips/my-favorites.ts @@ -48,7 +48,7 @@ export default class extends Endpoint { // eslint- private clipEntityService: ClipEntityService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const query = this.clipFavoritesRepository.createQueryBuilder('favorite') .andWhere('favorite.userId = :meId', { meId: me.id }) .leftJoinAndSelect('favorite.clip', 'clip'); @@ -56,7 +56,7 @@ export default class extends Endpoint { // eslint- const favorites = await query .getMany(); - return this.clipEntityService.packMany(favorites.map(x => x.clip!), me); + return this.clipEntityService.packMany(favorites.map(x => x.clip!), me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/clips/notes.ts b/packages/backend/src/server/api/endpoints/clips/notes.ts index a238d7d002..bd1a16155b 100644 --- a/packages/backend/src/server/api/endpoints/clips/notes.ts +++ b/packages/backend/src/server/api/endpoints/clips/notes.ts @@ -69,7 +69,7 @@ export default class extends Endpoint { // eslint- private noteEntityService: NoteEntityService, private queryService: QueryService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const clip = await this.clipsRepository.findOneBy({ id: ps.clipId, }); @@ -104,7 +104,7 @@ export default class extends Endpoint { // eslint- .limit(ps.limit) .getMany(); - return await this.noteEntityService.packMany(notes, me); + return await this.noteEntityService.packMany(notes, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/clips/show.ts b/packages/backend/src/server/api/endpoints/clips/show.ts index 949f0e70aa..9dc6ff96eb 100644 --- a/packages/backend/src/server/api/endpoints/clips/show.ts +++ b/packages/backend/src/server/api/endpoints/clips/show.ts @@ -54,7 +54,7 @@ export default class extends Endpoint { // eslint- private clipEntityService: ClipEntityService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { // Fetch the clip const clip = await this.clipsRepository.findOneBy({ id: ps.clipId, @@ -68,7 +68,7 @@ export default class extends Endpoint { // eslint- throw new ApiError(meta.errors.noSuchClip); } - return await this.clipEntityService.pack(clip, me); + return await this.clipEntityService.pack(clip, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/clips/update.ts b/packages/backend/src/server/api/endpoints/clips/update.ts index beab427b69..1957e2ebec 100644 --- a/packages/backend/src/server/api/endpoints/clips/update.ts +++ b/packages/backend/src/server/api/endpoints/clips/update.ts @@ -57,7 +57,7 @@ export default class extends Endpoint { // eslint- private clipEntityService: ClipEntityService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { try { // 空文字列をnullにしたいので??は使わない // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing @@ -69,7 +69,7 @@ export default class extends Endpoint { // eslint- throw e; } - return await this.clipEntityService.pack(ps.clipId, me); + return await this.clipEntityService.pack(ps.clipId, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/drive/files/delete.ts b/packages/backend/src/server/api/endpoints/drive/files/delete.ts index 3065bb6711..3bc944a68f 100644 --- a/packages/backend/src/server/api/endpoints/drive/files/delete.ts +++ b/packages/backend/src/server/api/endpoints/drive/files/delete.ts @@ -60,14 +60,14 @@ export default class extends Endpoint { // eslint- private roleService: RoleService, private globalEventService: GlobalEventService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const file = await this.driveFilesRepository.findOneBy({ id: ps.fileId }); if (file == null) { throw new ApiError(meta.errors.noSuchFile); } - if (!await this.roleService.isModerator(me) && (file.userId !== me.id)) { + if (!await this.roleService.isModerator(me, token) && (file.userId !== me.id)) { throw new ApiError(meta.errors.accessDenied); } diff --git a/packages/backend/src/server/api/endpoints/drive/files/show.ts b/packages/backend/src/server/api/endpoints/drive/files/show.ts index 64f6a8b2ba..759fb3d649 100644 --- a/packages/backend/src/server/api/endpoints/drive/files/show.ts +++ b/packages/backend/src/server/api/endpoints/drive/files/show.ts @@ -69,7 +69,7 @@ export default class extends Endpoint { // eslint- private driveFileEntityService: DriveFileEntityService, private roleService: RoleService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { let file: MiDriveFile | null = null; if (ps.fileId) { @@ -90,7 +90,7 @@ export default class extends Endpoint { // eslint- throw new ApiError(meta.errors.noSuchFile); } - if (!await this.roleService.isModerator(me) && (file.userId !== me.id)) { + if (!await this.roleService.isModerator(me, token) && (file.userId !== me.id)) { throw new ApiError(meta.errors.accessDenied); } diff --git a/packages/backend/src/server/api/endpoints/drive/files/update.ts b/packages/backend/src/server/api/endpoints/drive/files/update.ts index 306a646785..30846b107f 100644 --- a/packages/backend/src/server/api/endpoints/drive/files/update.ts +++ b/packages/backend/src/server/api/endpoints/drive/files/update.ts @@ -94,13 +94,13 @@ export default class extends Endpoint { // eslint- private driveService: DriveService, private roleService: RoleService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const file = await this.driveFilesRepository.findOneBy({ id: ps.fileId }); if (file == null) { throw new ApiError(meta.errors.noSuchFile); } - if (!await this.roleService.isModerator(me) && (file.userId !== me.id)) { + if (!await this.roleService.isModerator(me, token) && (file.userId !== me.id)) { throw new ApiError(meta.errors.accessDenied); } diff --git a/packages/backend/src/server/api/endpoints/federation/followers.ts b/packages/backend/src/server/api/endpoints/federation/followers.ts index 9add00ccde..c64f410630 100644 --- a/packages/backend/src/server/api/endpoints/federation/followers.ts +++ b/packages/backend/src/server/api/endpoints/federation/followers.ts @@ -49,8 +49,8 @@ export default class extends Endpoint { // eslint- constructor( private followingEntityService: FollowingEntityService, ) { - super(meta, paramDef, async (ps, me) => { - return this.followingEntityService.getFollowers(me, ps); + super(meta, paramDef, async (ps, me, token) => { + return this.followingEntityService.getFollowers(me, token, ps); }); } } diff --git a/packages/backend/src/server/api/endpoints/federation/following.ts b/packages/backend/src/server/api/endpoints/federation/following.ts index 849bb61fb4..0ec0f5b9a7 100644 --- a/packages/backend/src/server/api/endpoints/federation/following.ts +++ b/packages/backend/src/server/api/endpoints/federation/following.ts @@ -49,8 +49,8 @@ export default class extends Endpoint { // eslint- constructor( private followingEntityService: FollowingEntityService, ) { - super(meta, paramDef, async (ps, me) => { - return this.followingEntityService.getFollowing(me, ps); + super(meta, paramDef, async (ps, me, token) => { + return this.followingEntityService.getFollowing(me, token, ps); }); } } diff --git a/packages/backend/src/server/api/endpoints/federation/instances.ts b/packages/backend/src/server/api/endpoints/federation/instances.ts index da0535d0b9..31cd6741b9 100644 --- a/packages/backend/src/server/api/endpoints/federation/instances.ts +++ b/packages/backend/src/server/api/endpoints/federation/instances.ts @@ -85,7 +85,7 @@ export default class extends Endpoint { // eslint- private instanceEntityService: InstanceEntityService, private metaService: MetaService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const query = this.instancesRepository.createQueryBuilder('instance'); switch (ps.sort) { @@ -191,7 +191,7 @@ export default class extends Endpoint { // eslint- const instances = await query.limit(ps.limit).offset(ps.offset).getMany(); - return await this.instanceEntityService.packMany(instances, me); + return await this.instanceEntityService.packMany(instances, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/federation/show-instance.ts b/packages/backend/src/server/api/endpoints/federation/show-instance.ts index ea3349c17b..b1bbfc23fa 100644 --- a/packages/backend/src/server/api/endpoints/federation/show-instance.ts +++ b/packages/backend/src/server/api/endpoints/federation/show-instance.ts @@ -46,11 +46,11 @@ export default class extends Endpoint { // eslint- private utilityService: UtilityService, private instanceEntityService: InstanceEntityService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const instance = await this.instancesRepository .findOneBy({ host: this.utilityService.toPuny(ps.host) }); - return instance ? await this.instanceEntityService.pack(instance, me) : null; + return instance ? await this.instanceEntityService.pack(instance, me, token) : null; }); } } diff --git a/packages/backend/src/server/api/endpoints/federation/stats.ts b/packages/backend/src/server/api/endpoints/federation/stats.ts index 605df455b4..c22498d29d 100644 --- a/packages/backend/src/server/api/endpoints/federation/stats.ts +++ b/packages/backend/src/server/api/endpoints/federation/stats.ts @@ -78,7 +78,7 @@ export default class extends Endpoint { // eslint- private instanceEntityService: InstanceEntityService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const [topSubInstances, topPubInstances, allSubCount, allPubCount] = await Promise.all([ this.instancesRepository.find({ where: { @@ -114,9 +114,9 @@ export default class extends Endpoint { // eslint- const gotPubCount = topPubInstances.map(x => x.followingCount).reduce((a, b) => a + b, 0); return await awaitAll({ - topSubInstances: this.instanceEntityService.packMany(topSubInstances, me), + topSubInstances: this.instanceEntityService.packMany(topSubInstances, me, token), otherFollowersCount: Math.max(0, allSubCount - gotSubCount), - topPubInstances: this.instanceEntityService.packMany(topPubInstances, me), + topPubInstances: this.instanceEntityService.packMany(topPubInstances, me, token), otherFollowingCount: Math.max(0, allPubCount - gotPubCount), }); }); diff --git a/packages/backend/src/server/api/endpoints/federation/users.ts b/packages/backend/src/server/api/endpoints/federation/users.ts index b41138a842..0bfcc01940 100644 --- a/packages/backend/src/server/api/endpoints/federation/users.ts +++ b/packages/backend/src/server/api/endpoints/federation/users.ts @@ -53,7 +53,7 @@ export default class extends Endpoint { // eslint- private userEntityService: UserEntityService, private queryService: QueryService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const query = this.queryService.makePaginationQuery(this.usersRepository.createQueryBuilder('user'), ps.sinceId, ps.untilId) .andWhere('user.host = :host', { host: ps.host }); @@ -61,7 +61,7 @@ export default class extends Endpoint { // eslint- .limit(ps.limit) .getMany(); - return await this.userEntityService.packMany(users, me, { schema: 'UserDetailedNotMe' }); + return await this.userEntityService.packMany(users, me, { schema: 'UserDetailedNotMe', token }); }); } } diff --git a/packages/backend/src/server/api/endpoints/flash/create.ts b/packages/backend/src/server/api/endpoints/flash/create.ts index 64f13a577e..fad424fefa 100644 --- a/packages/backend/src/server/api/endpoints/flash/create.ts +++ b/packages/backend/src/server/api/endpoints/flash/create.ts @@ -58,7 +58,7 @@ export default class extends Endpoint { // eslint- private flashEntityService: FlashEntityService, private idService: IdService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const flash = await this.flashsRepository.insertOne({ id: this.idService.gen(), userId: me.id, @@ -70,7 +70,7 @@ export default class extends Endpoint { // eslint- visibility: ps.visibility, }); - return await this.flashEntityService.pack(flash); + return await this.flashEntityService.pack(flash, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/flash/delete.ts b/packages/backend/src/server/api/endpoints/flash/delete.ts index 271a44f8d5..923d37ca12 100644 --- a/packages/backend/src/server/api/endpoints/flash/delete.ts +++ b/packages/backend/src/server/api/endpoints/flash/delete.ts @@ -59,14 +59,14 @@ export default class extends Endpoint { // eslint- private moderationLogService: ModerationLogService, private roleService: RoleService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const flash = await this.flashsRepository.findOneBy({ id: ps.flashId }); if (flash == null) { throw new ApiError(meta.errors.noSuchFlash); } - if (!await this.roleService.isModerator(me) && flash.userId !== me.id) { + if (!await this.roleService.isModerator(me, token) && flash.userId !== me.id) { throw new ApiError(meta.errors.accessDenied); } diff --git a/packages/backend/src/server/api/endpoints/flash/featured.ts b/packages/backend/src/server/api/endpoints/flash/featured.ts index ad1f35055a..62490ac0e7 100644 --- a/packages/backend/src/server/api/endpoints/flash/featured.ts +++ b/packages/backend/src/server/api/endpoints/flash/featured.ts @@ -47,12 +47,12 @@ export default class extends Endpoint { // eslint- private flashService: FlashService, private flashEntityService: FlashEntityService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const result = await this.flashService.featured({ offset: ps.offset, limit: ps.limit, }); - return await this.flashEntityService.packMany(result, me); + return await this.flashEntityService.packMany(result, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/flash/my-likes.ts b/packages/backend/src/server/api/endpoints/flash/my-likes.ts index 22eae381da..9f3dbb90be 100644 --- a/packages/backend/src/server/api/endpoints/flash/my-likes.ts +++ b/packages/backend/src/server/api/endpoints/flash/my-likes.ts @@ -63,7 +63,7 @@ export default class extends Endpoint { // eslint- private flashLikeEntityService: FlashLikeEntityService, private queryService: QueryService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const query = this.queryService.makePaginationQuery(this.flashLikesRepository.createQueryBuilder('like'), ps.sinceId, ps.untilId) .andWhere('like.userId = :meId', { meId: me.id }) .leftJoinAndSelect('like.flash', 'flash'); @@ -72,7 +72,7 @@ export default class extends Endpoint { // eslint- .limit(ps.limit) .getMany(); - return this.flashLikeEntityService.packMany(likes, me); + return this.flashLikeEntityService.packMany(likes, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/flash/my.ts b/packages/backend/src/server/api/endpoints/flash/my.ts index 48f464c337..a0503ca96e 100644 --- a/packages/backend/src/server/api/endpoints/flash/my.ts +++ b/packages/backend/src/server/api/endpoints/flash/my.ts @@ -53,7 +53,7 @@ export default class extends Endpoint { // eslint- private flashEntityService: FlashEntityService, private queryService: QueryService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const query = this.queryService.makePaginationQuery(this.flashsRepository.createQueryBuilder('flash'), ps.sinceId, ps.untilId) .andWhere('flash.userId = :meId', { meId: me.id }); @@ -61,7 +61,7 @@ export default class extends Endpoint { // eslint- .limit(ps.limit) .getMany(); - return await this.flashEntityService.packMany(flashs); + return await this.flashEntityService.packMany(flashs, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/flash/show.ts b/packages/backend/src/server/api/endpoints/flash/show.ts index 03d9710773..37f009f103 100644 --- a/packages/backend/src/server/api/endpoints/flash/show.ts +++ b/packages/backend/src/server/api/endpoints/flash/show.ts @@ -52,14 +52,14 @@ export default class extends Endpoint { // eslint- private flashEntityService: FlashEntityService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const flash = await this.flashsRepository.findOneBy({ id: ps.flashId }); if (flash == null) { throw new ApiError(meta.errors.noSuchFlash); } - return await this.flashEntityService.pack(flash, me); + return await this.flashEntityService.pack(flash, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/following/create.ts b/packages/backend/src/server/api/endpoints/following/create.ts index db320e7129..7aed95d55d 100644 --- a/packages/backend/src/server/api/endpoints/following/create.ts +++ b/packages/backend/src/server/api/endpoints/following/create.ts @@ -86,7 +86,7 @@ export default class extends Endpoint { // eslint- private getterService: GetterService, private userFollowingService: UserFollowingService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const follower = me; // 自分自身 @@ -111,7 +111,7 @@ export default class extends Endpoint { // eslint- throw e; } - return await this.userEntityService.pack(followee.id, me); + return await this.userEntityService.pack(followee.id, me, { token }); }); } } diff --git a/packages/backend/src/server/api/endpoints/following/delete.ts b/packages/backend/src/server/api/endpoints/following/delete.ts index 442352a4d2..9b68fc8afc 100644 --- a/packages/backend/src/server/api/endpoints/following/delete.ts +++ b/packages/backend/src/server/api/endpoints/following/delete.ts @@ -11,8 +11,8 @@ import { UserEntityService } from '@/core/entities/UserEntityService.js'; import { UserFollowingService } from '@/core/UserFollowingService.js'; import { DI } from '@/di-symbols.js'; import { GetterService } from '@/server/api/GetterService.js'; -import { ApiError } from '../../error.js'; import { CacheService } from '@/core/CacheService.js'; +import { ApiError } from '../../error.js'; export const meta = { tags: ['following', 'users'], @@ -72,7 +72,7 @@ export default class extends Endpoint { // eslint- private userFollowingService: UserFollowingService, private readonly cacheService: CacheService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const follower = me; // Check if the followee is yourself @@ -95,7 +95,7 @@ export default class extends Endpoint { // eslint- await this.userFollowingService.unfollow(follower, followee); - return await this.userEntityService.pack(followee.id, me); + return await this.userEntityService.pack(followee.id, me, { token }); }); } } diff --git a/packages/backend/src/server/api/endpoints/following/invalidate.ts b/packages/backend/src/server/api/endpoints/following/invalidate.ts index 3809bf29b0..076d4d40ac 100644 --- a/packages/backend/src/server/api/endpoints/following/invalidate.ts +++ b/packages/backend/src/server/api/endpoints/following/invalidate.ts @@ -72,7 +72,7 @@ export default class extends Endpoint { // eslint- private userFollowingService: UserFollowingService, private readonly cacheService: CacheService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const followee = me; // Check if the follower is yourself @@ -95,7 +95,7 @@ export default class extends Endpoint { // eslint- await this.userFollowingService.unfollow(follower, followee); - return await this.userEntityService.pack(follower.id, me); + return await this.userEntityService.pack(follower.id, me, { token }); }); } } diff --git a/packages/backend/src/server/api/endpoints/following/requests/cancel.ts b/packages/backend/src/server/api/endpoints/following/requests/cancel.ts index 9bcd726b12..2e3b63a7ee 100644 --- a/packages/backend/src/server/api/endpoints/following/requests/cancel.ts +++ b/packages/backend/src/server/api/endpoints/following/requests/cancel.ts @@ -60,7 +60,7 @@ export default class extends Endpoint { // eslint- private getterService: GetterService, private userFollowingService: UserFollowingService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { // Fetch followee const followee = await this.getterService.getUser(ps.userId).catch(err => { if (err.id === '15348ddd-432d-49c2-8a5a-8069753becff') throw new ApiError(meta.errors.noSuchUser); @@ -76,7 +76,7 @@ export default class extends Endpoint { // eslint- throw err; } - return await this.userEntityService.pack(followee.id, me); + return await this.userEntityService.pack(followee.id, me, { token }); }); } } diff --git a/packages/backend/src/server/api/endpoints/following/requests/list.ts b/packages/backend/src/server/api/endpoints/following/requests/list.ts index 7ec217fdc4..8c2921ea67 100644 --- a/packages/backend/src/server/api/endpoints/following/requests/list.ts +++ b/packages/backend/src/server/api/endpoints/following/requests/list.ts @@ -69,7 +69,7 @@ export default class extends Endpoint { // eslint- private followRequestEntityService: FollowRequestEntityService, private queryService: QueryService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const query = this.queryService.makePaginationQuery(this.followRequestsRepository.createQueryBuilder('request'), ps.sinceId, ps.untilId) .andWhere('request.followeeId = :meId', { meId: me.id }); @@ -77,7 +77,7 @@ export default class extends Endpoint { // eslint- .limit(ps.limit) .getMany(); - return await this.followRequestEntityService.packMany(requests, me); + return await this.followRequestEntityService.packMany(requests, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/following/requests/sent.ts b/packages/backend/src/server/api/endpoints/following/requests/sent.ts index 7f99c228f4..6589b525fc 100644 --- a/packages/backend/src/server/api/endpoints/following/requests/sent.ts +++ b/packages/backend/src/server/api/endpoints/following/requests/sent.ts @@ -69,7 +69,7 @@ export default class extends Endpoint { // eslint- private followRequestEntityService: FollowRequestEntityService, private queryService: QueryService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const query = this.queryService.makePaginationQuery(this.followRequestsRepository.createQueryBuilder('request'), ps.sinceId, ps.untilId) .andWhere('request.followerId = :meId', { meId: me.id }); @@ -77,7 +77,7 @@ export default class extends Endpoint { // eslint- .limit(ps.limit) .getMany(); - return await this.followRequestEntityService.packMany(requests, me); + return await this.followRequestEntityService.packMany(requests, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/following/update.ts b/packages/backend/src/server/api/endpoints/following/update.ts index f4ca21856f..93f1e286cf 100644 --- a/packages/backend/src/server/api/endpoints/following/update.ts +++ b/packages/backend/src/server/api/endpoints/following/update.ts @@ -74,7 +74,7 @@ export default class extends Endpoint { // eslint- private userFollowingService: UserFollowingService, private readonly cacheService: CacheService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const follower = me; // Check if the follower is yourself @@ -104,7 +104,7 @@ export default class extends Endpoint { // eslint- await this.cacheService.refreshFollowRelationsFor(follower.id); - return await this.userEntityService.pack(follower.id, me); + return await this.userEntityService.pack(follower.id, me, { token }); }); } } diff --git a/packages/backend/src/server/api/endpoints/gallery/featured.ts b/packages/backend/src/server/api/endpoints/gallery/featured.ts index abbfb9b83b..c73f61a86e 100644 --- a/packages/backend/src/server/api/endpoints/gallery/featured.ts +++ b/packages/backend/src/server/api/endpoints/gallery/featured.ts @@ -53,7 +53,7 @@ export default class extends Endpoint { // eslint- private galleryPostEntityService: GalleryPostEntityService, private featuredService: FeaturedService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { let postIds: string[]; if (this.galleryPostsRankingCacheLastFetchedAt !== 0 && (Date.now() - this.galleryPostsRankingCacheLastFetchedAt < 1000 * 60 * 30)) { postIds = this.galleryPostsRankingCache; @@ -78,7 +78,7 @@ export default class extends Endpoint { // eslint- const posts = await query.getMany(); - return await this.galleryPostEntityService.packMany(posts, me); + return await this.galleryPostEntityService.packMany(posts, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/gallery/popular.ts b/packages/backend/src/server/api/endpoints/gallery/popular.ts index 71b979ab9f..4f6b9bec3c 100644 --- a/packages/backend/src/server/api/endpoints/gallery/popular.ts +++ b/packages/backend/src/server/api/endpoints/gallery/popular.ts @@ -45,14 +45,14 @@ export default class extends Endpoint { // eslint- private galleryPostEntityService: GalleryPostEntityService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const query = this.galleryPostsRepository.createQueryBuilder('post') .andWhere('post.likedCount > 0') .orderBy('post.likedCount', 'DESC'); const posts = await query.limit(10).getMany(); - return await this.galleryPostEntityService.packMany(posts, me); + return await this.galleryPostEntityService.packMany(posts, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/gallery/posts.ts b/packages/backend/src/server/api/endpoints/gallery/posts.ts index 630b6cede5..4c1de5123d 100644 --- a/packages/backend/src/server/api/endpoints/gallery/posts.ts +++ b/packages/backend/src/server/api/endpoints/gallery/posts.ts @@ -49,13 +49,13 @@ export default class extends Endpoint { // eslint- private galleryPostEntityService: GalleryPostEntityService, private queryService: QueryService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const query = this.queryService.makePaginationQuery(this.galleryPostsRepository.createQueryBuilder('post'), ps.sinceId, ps.untilId) .innerJoinAndSelect('post.user', 'user'); const posts = await query.limit(ps.limit).getMany(); - return await this.galleryPostEntityService.packMany(posts, me); + return await this.galleryPostEntityService.packMany(posts, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/gallery/posts/create.ts b/packages/backend/src/server/api/endpoints/gallery/posts/create.ts index 08abd7fed5..80a8b78945 100644 --- a/packages/backend/src/server/api/endpoints/gallery/posts/create.ts +++ b/packages/backend/src/server/api/endpoints/gallery/posts/create.ts @@ -63,7 +63,7 @@ export default class extends Endpoint { // eslint- private galleryPostEntityService: GalleryPostEntityService, private idService: IdService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const files = (await Promise.all(ps.fileIds.map(fileId => this.driveFilesRepository.findOneBy({ id: fileId, @@ -85,7 +85,7 @@ export default class extends Endpoint { // eslint- fileIds: files.map(file => file.id), })); - return await this.galleryPostEntityService.pack(post, me); + return await this.galleryPostEntityService.pack(post, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/gallery/posts/delete.ts b/packages/backend/src/server/api/endpoints/gallery/posts/delete.ts index 9854358e3e..79b01bcc37 100644 --- a/packages/backend/src/server/api/endpoints/gallery/posts/delete.ts +++ b/packages/backend/src/server/api/endpoints/gallery/posts/delete.ts @@ -59,14 +59,14 @@ export default class extends Endpoint { // eslint- private moderationLogService: ModerationLogService, private roleService: RoleService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const post = await this.galleryPostsRepository.findOneBy({ id: ps.postId }); if (post == null) { throw new ApiError(meta.errors.noSuchPost); } - if (!await this.roleService.isModerator(me) && post.userId !== me.id) { + if (!await this.roleService.isModerator(me, token) && post.userId !== me.id) { throw new ApiError(meta.errors.accessDenied); } diff --git a/packages/backend/src/server/api/endpoints/gallery/posts/show.ts b/packages/backend/src/server/api/endpoints/gallery/posts/show.ts index fd637febaa..6927d754eb 100644 --- a/packages/backend/src/server/api/endpoints/gallery/posts/show.ts +++ b/packages/backend/src/server/api/endpoints/gallery/posts/show.ts @@ -52,7 +52,7 @@ export default class extends Endpoint { // eslint- private galleryPostEntityService: GalleryPostEntityService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const post = await this.galleryPostsRepository.findOneBy({ id: ps.postId, }); @@ -61,7 +61,7 @@ export default class extends Endpoint { // eslint- throw new ApiError(meta.errors.noSuchPost); } - return await this.galleryPostEntityService.pack(post, me); + return await this.galleryPostEntityService.pack(post, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/gallery/posts/update.ts b/packages/backend/src/server/api/endpoints/gallery/posts/update.ts index d0f9b56863..53a6f475b9 100644 --- a/packages/backend/src/server/api/endpoints/gallery/posts/update.ts +++ b/packages/backend/src/server/api/endpoints/gallery/posts/update.ts @@ -61,7 +61,7 @@ export default class extends Endpoint { // eslint- private galleryPostEntityService: GalleryPostEntityService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { let files: Array | undefined; if (ps.fileIds) { @@ -90,7 +90,7 @@ export default class extends Endpoint { // eslint- const post = await this.galleryPostsRepository.findOneByOrFail({ id: ps.postId }); - return await this.galleryPostEntityService.pack(post, me); + return await this.galleryPostEntityService.pack(post, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/i/2fa/key-done.ts b/packages/backend/src/server/api/endpoints/i/2fa/key-done.ts index 6d1972456d..8b64e3b47f 100644 --- a/packages/backend/src/server/api/endpoints/i/2fa/key-done.ts +++ b/packages/backend/src/server/api/endpoints/i/2fa/key-done.ts @@ -77,7 +77,7 @@ export default class extends Endpoint { private userEntityService: UserEntityService, private globalEventService: GlobalEventService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, at) => { const token = ps.token; const profile = await this.userProfilesRepository.findOneByOrFail({ userId: me.id }); @@ -120,6 +120,7 @@ export default class extends Endpoint { this.globalEventService.publishMainStream(me.id, 'meUpdated', await this.userEntityService.pack(me.id, me, { schema: 'MeDetailed', includeSecrets: true, + token: at, })); return { diff --git a/packages/backend/src/server/api/endpoints/i/2fa/password-less.ts b/packages/backend/src/server/api/endpoints/i/2fa/password-less.ts index cd520cff0f..8cb74ee7ad 100644 --- a/packages/backend/src/server/api/endpoints/i/2fa/password-less.ts +++ b/packages/backend/src/server/api/endpoints/i/2fa/password-less.ts @@ -52,7 +52,7 @@ export default class extends Endpoint { // eslint- private userEntityService: UserEntityService, private globalEventService: GlobalEventService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { if (ps.value === true) { // セキュリティキーがなければパスワードレスを有効にはできない const keyCount = await this.userSecurityKeysRepository.count({ @@ -83,6 +83,7 @@ export default class extends Endpoint { // eslint- this.globalEventService.publishMainStream(me.id, 'meUpdated', await this.userEntityService.pack(me.id, me, { schema: 'MeDetailed', includeSecrets: true, + token, })); }); } diff --git a/packages/backend/src/server/api/endpoints/i/2fa/remove-key.ts b/packages/backend/src/server/api/endpoints/i/2fa/remove-key.ts index 931c8d69b0..e47c1d5189 100644 --- a/packages/backend/src/server/api/endpoints/i/2fa/remove-key.ts +++ b/packages/backend/src/server/api/endpoints/i/2fa/remove-key.ts @@ -57,7 +57,7 @@ export default class extends Endpoint { // eslint- private userAuthService: UserAuthService, private globalEventService: GlobalEventService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, at) => { const token = ps.token; const profile = await this.userProfilesRepository.findOneByOrFail({ userId: me.id }); @@ -107,6 +107,7 @@ export default class extends Endpoint { // eslint- this.globalEventService.publishMainStream(me.id, 'meUpdated', await this.userEntityService.pack(me.id, me, { schema: 'MeDetailed', includeSecrets: true, + token: at, })); return {}; diff --git a/packages/backend/src/server/api/endpoints/i/2fa/unregister.ts b/packages/backend/src/server/api/endpoints/i/2fa/unregister.ts index fc5a51f81b..072b804e66 100644 --- a/packages/backend/src/server/api/endpoints/i/2fa/unregister.ts +++ b/packages/backend/src/server/api/endpoints/i/2fa/unregister.ts @@ -53,7 +53,7 @@ export default class extends Endpoint { // eslint- private userAuthService: UserAuthService, private globalEventService: GlobalEventService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, at) => { const token = ps.token; const profile = await this.userProfilesRepository.findOneByOrFail({ userId: me.id }); @@ -85,6 +85,7 @@ export default class extends Endpoint { // eslint- this.globalEventService.publishMainStream(me.id, 'meUpdated', await this.userEntityService.pack(me.id, me, { schema: 'MeDetailed', includeSecrets: true, + token: at, })); }); } diff --git a/packages/backend/src/server/api/endpoints/i/2fa/update-key.ts b/packages/backend/src/server/api/endpoints/i/2fa/update-key.ts index a9f631cfaf..52d05c4092 100644 --- a/packages/backend/src/server/api/endpoints/i/2fa/update-key.ts +++ b/packages/backend/src/server/api/endpoints/i/2fa/update-key.ts @@ -56,7 +56,7 @@ export default class extends Endpoint { // eslint- private userEntityService: UserEntityService, private globalEventService: GlobalEventService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const key = await this.userSecurityKeysRepository.findOneBy({ id: ps.credentialId, }); @@ -77,6 +77,7 @@ export default class extends Endpoint { // eslint- this.globalEventService.publishMainStream(me.id, 'meUpdated', await this.userEntityService.pack(me.id, me, { schema: 'MeDetailed', includeSecrets: true, + token, })); return {}; diff --git a/packages/backend/src/server/api/endpoints/i/apps.ts b/packages/backend/src/server/api/endpoints/i/apps.ts index c33174ed48..4656a696fc 100644 --- a/packages/backend/src/server/api/endpoints/i/apps.ts +++ b/packages/backend/src/server/api/endpoints/i/apps.ts @@ -91,7 +91,7 @@ export default class extends Endpoint { // eslint- private readonly userEntityService: UserEntityService, private idService: IdService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, at) => { const query = this.accessTokensRepository.createQueryBuilder('token') .where('token.userId = :userId', { userId: me.id }) .leftJoinAndSelect('token.app', 'app'); @@ -114,7 +114,7 @@ export default class extends Endpoint { // eslint- }); // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const grantees = await this.userEntityService.packMany(sharedTokens.map(t => t.grantee!), me); + const grantees = await this.userEntityService.packMany(sharedTokens.map(t => t.grantee!), me, { token: at }); return { id: token.id, diff --git a/packages/backend/src/server/api/endpoints/i/favorites.ts b/packages/backend/src/server/api/endpoints/i/favorites.ts index 49d47e1624..2efc408661 100644 --- a/packages/backend/src/server/api/endpoints/i/favorites.ts +++ b/packages/backend/src/server/api/endpoints/i/favorites.ts @@ -53,7 +53,7 @@ export default class extends Endpoint { // eslint- private noteFavoriteEntityService: NoteFavoriteEntityService, private queryService: QueryService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const query = this.queryService.makePaginationQuery(this.noteFavoritesRepository.createQueryBuilder('favorite'), ps.sinceId, ps.untilId) .andWhere('favorite.userId = :meId', { meId: me.id }) .leftJoinAndSelect('favorite.note', 'note'); @@ -62,7 +62,7 @@ export default class extends Endpoint { // eslint- .limit(ps.limit) .getMany(); - return await this.noteFavoriteEntityService.packMany(favorites, me); + return await this.noteFavoriteEntityService.packMany(favorites, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/i/gallery/likes.ts b/packages/backend/src/server/api/endpoints/i/gallery/likes.ts index 9baa01ae1e..6c6aa39187 100644 --- a/packages/backend/src/server/api/endpoints/i/gallery/likes.ts +++ b/packages/backend/src/server/api/endpoints/i/gallery/likes.ts @@ -64,7 +64,7 @@ export default class extends Endpoint { // eslint- private galleryLikeEntityService: GalleryLikeEntityService, private queryService: QueryService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const query = this.queryService.makePaginationQuery(this.galleryLikesRepository.createQueryBuilder('like'), ps.sinceId, ps.untilId) .andWhere('like.userId = :meId', { meId: me.id }) .leftJoinAndSelect('like.post', 'post'); @@ -73,7 +73,7 @@ export default class extends Endpoint { // eslint- .limit(ps.limit) .getMany(); - return await this.galleryLikeEntityService.packMany(likes, me); + return await this.galleryLikeEntityService.packMany(likes, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/i/gallery/posts.ts b/packages/backend/src/server/api/endpoints/i/gallery/posts.ts index 350491a73a..c363b2044f 100644 --- a/packages/backend/src/server/api/endpoints/i/gallery/posts.ts +++ b/packages/backend/src/server/api/endpoints/i/gallery/posts.ts @@ -53,7 +53,7 @@ export default class extends Endpoint { // eslint- private galleryPostEntityService: GalleryPostEntityService, private queryService: QueryService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const query = this.queryService.makePaginationQuery(this.galleryPostsRepository.createQueryBuilder('post'), ps.sinceId, ps.untilId) .andWhere('post.userId = :meId', { meId: me.id }); @@ -61,7 +61,7 @@ export default class extends Endpoint { // eslint- .limit(ps.limit) .getMany(); - return await this.galleryPostEntityService.packMany(posts, me); + return await this.galleryPostEntityService.packMany(posts, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/i/notifications-grouped.ts b/packages/backend/src/server/api/endpoints/i/notifications-grouped.ts index 3821b5a20e..f59325a0a1 100644 --- a/packages/backend/src/server/api/endpoints/i/notifications-grouped.ts +++ b/packages/backend/src/server/api/endpoints/i/notifications-grouped.ts @@ -71,7 +71,7 @@ export default class extends Endpoint { // eslint- private notificationEntityService: NotificationEntityService, private notificationService: NotificationService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const EXTRA_LIMIT = 100; // includeTypes が空の場合はクエリしない @@ -191,7 +191,7 @@ export default class extends Endpoint { // eslint- // this matches the logic in NotificationService and it's what MkPagination expects if (ps.sinceId && !ps.untilId) groupedNotifications.reverse(); - return await this.notificationEntityService.packGroupedMany(groupedNotifications, me.id); + return await this.notificationEntityService.packGroupedMany(groupedNotifications, me.id, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/i/notifications.ts b/packages/backend/src/server/api/endpoints/i/notifications.ts index f5a48b2f69..59e06e72d0 100644 --- a/packages/backend/src/server/api/endpoints/i/notifications.ts +++ b/packages/backend/src/server/api/endpoints/i/notifications.ts @@ -69,7 +69,7 @@ export default class extends Endpoint { // eslint- private notificationEntityService: NotificationEntityService, private notificationService: NotificationService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { // includeTypes が空の場合はクエリしない if (ps.includeTypes && ps.includeTypes.length === 0) { return []; @@ -95,7 +95,7 @@ export default class extends Endpoint { // eslint- this.notificationService.readAllNotification(me.id); } - return await this.notificationEntityService.packMany(notifications, me.id); + return await this.notificationEntityService.packMany(notifications, me.id, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/i/page-likes.ts b/packages/backend/src/server/api/endpoints/i/page-likes.ts index 19baa9726d..492e95116f 100644 --- a/packages/backend/src/server/api/endpoints/i/page-likes.ts +++ b/packages/backend/src/server/api/endpoints/i/page-likes.ts @@ -63,7 +63,7 @@ export default class extends Endpoint { // eslint- private pageLikeEntityService: PageLikeEntityService, private queryService: QueryService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const query = this.queryService.makePaginationQuery(this.pageLikesRepository.createQueryBuilder('like'), ps.sinceId, ps.untilId) .andWhere('like.userId = :meId', { meId: me.id }) .leftJoinAndSelect('like.page', 'page'); @@ -72,7 +72,7 @@ export default class extends Endpoint { // eslint- .limit(ps.limit) .getMany(); - return this.pageLikeEntityService.packMany(likes, me); + return this.pageLikeEntityService.packMany(likes, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/i/pages.ts b/packages/backend/src/server/api/endpoints/i/pages.ts index 65a19ac5ab..dcb4b42d5d 100644 --- a/packages/backend/src/server/api/endpoints/i/pages.ts +++ b/packages/backend/src/server/api/endpoints/i/pages.ts @@ -53,7 +53,7 @@ export default class extends Endpoint { // eslint- private pageEntityService: PageEntityService, private queryService: QueryService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const query = this.queryService.makePaginationQuery(this.pagesRepository.createQueryBuilder('page'), ps.sinceId, ps.untilId) .andWhere('page.userId = :meId', { meId: me.id }); @@ -61,7 +61,7 @@ export default class extends Endpoint { // eslint- .limit(ps.limit) .getMany(); - return await this.pageEntityService.packMany(pages); + return await this.pageEntityService.packMany(pages, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/i/pin.ts b/packages/backend/src/server/api/endpoints/i/pin.ts index e324485277..0729c17ae6 100644 --- a/packages/backend/src/server/api/endpoints/i/pin.ts +++ b/packages/backend/src/server/api/endpoints/i/pin.ts @@ -64,7 +64,7 @@ export default class extends Endpoint { // eslint- private userEntityService: UserEntityService, private notePiningService: NotePiningService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { await this.notePiningService.addPinned(me, ps.noteId).catch(err => { if (err.id === '70c4e51f-5bea-449c-a030-53bee3cce202') throw new ApiError(meta.errors.noSuchNote); if (err.id === '15a018eb-58e5-4da1-93be-330fcc5e4e1a') throw new ApiError(meta.errors.pinLimitExceeded); @@ -74,6 +74,7 @@ export default class extends Endpoint { // eslint- return await this.userEntityService.pack(me.id, me, { schema: 'MeDetailed', + token, }); }); } diff --git a/packages/backend/src/server/api/endpoints/i/shared-access/list.ts b/packages/backend/src/server/api/endpoints/i/shared-access/list.ts index 4c2aa7755b..ce917c01ee 100644 --- a/packages/backend/src/server/api/endpoints/i/shared-access/list.ts +++ b/packages/backend/src/server/api/endpoints/i/shared-access/list.ts @@ -70,14 +70,14 @@ export default class extends Endpoint { // eslint- private readonly userEntityService: UserEntityService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const tokens = await this.sharedAccessTokensRepository.find({ where: { granteeId: me.id }, relations: { accessToken: true }, }); const users = tokens.map(token => token.accessToken!.userId); - const packedUsers: Packed<'UserLite'>[] = await this.userEntityService.packMany(users, me); + const packedUsers: Packed<'UserLite'>[] = await this.userEntityService.packMany(users, me, { token }); const packedUserMap = new Map>(packedUsers.map(u => [u.id, u])); return tokens.map(token => ({ diff --git a/packages/backend/src/server/api/endpoints/i/unpin.ts b/packages/backend/src/server/api/endpoints/i/unpin.ts index e88e3fbc01..5800f9cf9d 100644 --- a/packages/backend/src/server/api/endpoints/i/unpin.ts +++ b/packages/backend/src/server/api/endpoints/i/unpin.ts @@ -51,7 +51,7 @@ export default class extends Endpoint { // eslint- private userEntityService: UserEntityService, private notePiningService: NotePiningService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { await this.notePiningService.removePinned(me, ps.noteId).catch(err => { if (err.id === 'b302d4cf-c050-400a-bbb3-be208681f40c') throw new ApiError(meta.errors.noSuchNote); throw err; @@ -59,6 +59,7 @@ export default class extends Endpoint { // eslint- return await this.userEntityService.pack(me.id, me, { schema: 'MeDetailed', + token, }); }); } diff --git a/packages/backend/src/server/api/endpoints/i/update-email.ts b/packages/backend/src/server/api/endpoints/i/update-email.ts index dc07556760..51662cd801 100644 --- a/packages/backend/src/server/api/endpoints/i/update-email.ts +++ b/packages/backend/src/server/api/endpoints/i/update-email.ts @@ -80,7 +80,7 @@ export default class extends Endpoint { // eslint- private userAuthService: UserAuthService, private globalEventService: GlobalEventService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, at) => { const token = ps.token; const profile = await this.userProfilesRepository.findOneByOrFail({ userId: me.id }); @@ -119,6 +119,7 @@ export default class extends Endpoint { // eslint- const iObj = await this.userEntityService.pack(me.id, me, { schema: 'MeDetailed', includeSecrets: true, + token: at, }); // Publish meUpdated event diff --git a/packages/backend/src/server/api/endpoints/i/update.ts b/packages/backend/src/server/api/endpoints/i/update.ts index ba61d19300..87f078cd43 100644 --- a/packages/backend/src/server/api/endpoints/i/update.ts +++ b/packages/backend/src/server/api/endpoints/i/update.ts @@ -629,6 +629,7 @@ export default class extends Endpoint { // eslint- const iObj = await this.userEntityService.pack(user.id, user, { schema: 'MeDetailed', includeSecrets: isSecure, + token, }); const updatedProfile = await this.userProfilesRepository.findOneByOrFail({ userId: user.id }); diff --git a/packages/backend/src/server/api/endpoints/invite/create.ts b/packages/backend/src/server/api/endpoints/invite/create.ts index f607a35515..b14c0e7b10 100644 --- a/packages/backend/src/server/api/endpoints/invite/create.ts +++ b/packages/backend/src/server/api/endpoints/invite/create.ts @@ -58,7 +58,7 @@ export default class extends Endpoint { // eslint- private idService: IdService, private roleService: RoleService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const policies = await this.roleService.getUserPolicies(me.id); if (policies.inviteLimit) { @@ -80,7 +80,7 @@ export default class extends Endpoint { // eslint- code: generateInviteCode(), }); - return await this.inviteCodeEntityService.pack(ticket, me); + return await this.inviteCodeEntityService.pack(ticket, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/invite/delete.ts b/packages/backend/src/server/api/endpoints/invite/delete.ts index d15d400e9b..dea7dc2726 100644 --- a/packages/backend/src/server/api/endpoints/invite/delete.ts +++ b/packages/backend/src/server/api/endpoints/invite/delete.ts @@ -60,9 +60,9 @@ export default class extends Endpoint { // eslint- private roleService: RoleService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const ticket = await this.registrationTicketsRepository.findOneBy({ id: ps.inviteId }); - const isModerator = await this.roleService.isModerator(me); + const isModerator = await this.roleService.isModerator(me, token); if (ticket == null) { throw new ApiError(meta.errors.noSuchCode); diff --git a/packages/backend/src/server/api/endpoints/invite/list.ts b/packages/backend/src/server/api/endpoints/invite/list.ts index 12e3873304..b4a635a47b 100644 --- a/packages/backend/src/server/api/endpoints/invite/list.ts +++ b/packages/backend/src/server/api/endpoints/invite/list.ts @@ -53,7 +53,7 @@ export default class extends Endpoint { // eslint- private inviteCodeEntityService: InviteCodeEntityService, private queryService: QueryService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const query = this.queryService.makePaginationQuery(this.registrationTicketsRepository.createQueryBuilder('ticket'), ps.sinceId, ps.untilId) .andWhere('ticket.createdById = :meId', { meId: me.id }) .leftJoinAndSelect('ticket.createdBy', 'createdBy') @@ -63,7 +63,7 @@ export default class extends Endpoint { // eslint- .limit(ps.limit) .getMany(); - return await this.inviteCodeEntityService.packMany(tickets, me); + return await this.inviteCodeEntityService.packMany(tickets, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/mute/list.ts b/packages/backend/src/server/api/endpoints/mute/list.ts index 3efbe349e0..983f842cf4 100644 --- a/packages/backend/src/server/api/endpoints/mute/list.ts +++ b/packages/backend/src/server/api/endpoints/mute/list.ts @@ -53,7 +53,7 @@ export default class extends Endpoint { // eslint- private mutingEntityService: MutingEntityService, private queryService: QueryService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const query = this.queryService.makePaginationQuery(this.mutingsRepository.createQueryBuilder('muting'), ps.sinceId, ps.untilId) .andWhere('muting.muterId = :meId', { meId: me.id }); @@ -61,7 +61,7 @@ export default class extends Endpoint { // eslint- .limit(ps.limit) .getMany(); - return await this.mutingEntityService.packMany(mutings, me); + return await this.mutingEntityService.packMany(mutings, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/notes/bubble-timeline.ts b/packages/backend/src/server/api/endpoints/notes/bubble-timeline.ts index cd97a7773b..b535283e4b 100644 --- a/packages/backend/src/server/api/endpoints/notes/bubble-timeline.ts +++ b/packages/backend/src/server/api/endpoints/notes/bubble-timeline.ts @@ -67,7 +67,7 @@ export default class extends Endpoint { // eslint- private roleService: RoleService, private activeUsersChart: ActiveUsersChart, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const policies = await this.roleService.getUserPolicies(me ? me.id : null); if (!policies.btlAvailable) { throw new ApiError(meta.errors.btlDisabled); @@ -126,7 +126,7 @@ export default class extends Endpoint { // eslint- }); } - return await this.noteEntityService.packMany(timeline, me); + return await this.noteEntityService.packMany(timeline, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/notes/children.ts b/packages/backend/src/server/api/endpoints/notes/children.ts index 8a5a203d80..d3865b40c3 100644 --- a/packages/backend/src/server/api/endpoints/notes/children.ts +++ b/packages/backend/src/server/api/endpoints/notes/children.ts @@ -55,7 +55,7 @@ export default class extends Endpoint { // eslint- private noteEntityService: NoteEntityService, private queryService: QueryService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const query = this.queryService.makePaginationQuery(this.notesRepository.createQueryBuilder('note'), ps.sinceId, ps.untilId) .andWhere(new Brackets(qb => { qb.orWhere('note.replyId = :noteId'); @@ -85,7 +85,7 @@ export default class extends Endpoint { // eslint- const notes = await query.getMany(); - return await this.noteEntityService.packMany(notes, me); + return await this.noteEntityService.packMany(notes, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/notes/clips.ts b/packages/backend/src/server/api/endpoints/notes/clips.ts index b3dcdcef12..36b00b1193 100644 --- a/packages/backend/src/server/api/endpoints/notes/clips.ts +++ b/packages/backend/src/server/api/endpoints/notes/clips.ts @@ -62,7 +62,7 @@ export default class extends Endpoint { // eslint- private clipEntityService: ClipEntityService, private getterService: GetterService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const note = await this.getterService.getNote(ps.noteId).catch(err => { if (err.id === '9725d0ce-ba28-4dde-95a7-2cbb2c15de24') throw new ApiError(meta.errors.noSuchNote); throw err; @@ -77,7 +77,7 @@ export default class extends Endpoint { // eslint- isPublic: true, }); - return await this.clipEntityService.packMany(clips, me); + return await this.clipEntityService.packMany(clips, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/notes/conversation.ts b/packages/backend/src/server/api/endpoints/notes/conversation.ts index 80aea580ec..e54663794e 100644 --- a/packages/backend/src/server/api/endpoints/notes/conversation.ts +++ b/packages/backend/src/server/api/endpoints/notes/conversation.ts @@ -61,7 +61,7 @@ export default class extends Endpoint { // eslint- private noteEntityService: NoteEntityService, private getterService: GetterService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const note = await this.getterService.getNote(ps.noteId).catch(err => { if (err.id === '9725d0ce-ba28-4dde-95a7-2cbb2c15de24') throw new ApiError(meta.errors.noSuchNote); throw err; @@ -93,10 +93,10 @@ export default class extends Endpoint { // eslint- } if (note.hasPoll) { - return await this.noteEntityService.packMany(conversation, me, { detail: true }); + return await this.noteEntityService.packMany(conversation, me, token, { detail: true }); } - return await this.noteEntityService.packMany(conversation, me); + return await this.noteEntityService.packMany(conversation, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/notes/create.ts b/packages/backend/src/server/api/endpoints/notes/create.ts index d6fccd1b84..9caef1cf2b 100644 --- a/packages/backend/src/server/api/endpoints/notes/create.ts +++ b/packages/backend/src/server/api/endpoints/notes/create.ts @@ -264,7 +264,7 @@ export default class extends Endpoint { // eslint- private noteCreateService: NoteCreateService, private readonly noteVisibilityService: NoteVisibilityService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { if (ps.text && ps.text.length > this.config.maxNoteLength) { throw new ApiError(meta.errors.maxLength); } @@ -417,7 +417,7 @@ export default class extends Endpoint { // eslint- }); return { - createdNote: await this.noteEntityService.pack(note, me), + createdNote: await this.noteEntityService.pack(note, me, token), }; } catch (e) { // TODO: 他のErrorもここでキャッチしてエラーメッセージを当てるようにしたい diff --git a/packages/backend/src/server/api/endpoints/notes/delete.ts b/packages/backend/src/server/api/endpoints/notes/delete.ts index 9d7c9a9081..710b9d1ad2 100644 --- a/packages/backend/src/server/api/endpoints/notes/delete.ts +++ b/packages/backend/src/server/api/endpoints/notes/delete.ts @@ -59,13 +59,13 @@ export default class extends Endpoint { // eslint- private roleService: RoleService, private noteDeleteService: NoteDeleteService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const note = await this.getterService.getNote(ps.noteId).catch(err => { if (err.id === '9725d0ce-ba28-4dde-95a7-2cbb2c15de24') throw new ApiError(meta.errors.noSuchNote); throw err; }); - if (!await this.roleService.isModerator(me) && (note.userId !== me.id)) { + if (!await this.roleService.isModerator(me, token) && (note.userId !== me.id)) { throw new ApiError(meta.errors.accessDenied); } diff --git a/packages/backend/src/server/api/endpoints/notes/edit.ts b/packages/backend/src/server/api/endpoints/notes/edit.ts index 717dab59e1..e49cece167 100644 --- a/packages/backend/src/server/api/endpoints/notes/edit.ts +++ b/packages/backend/src/server/api/endpoints/notes/edit.ts @@ -314,7 +314,7 @@ export default class extends Endpoint { // eslint- private noteEditService: NoteEditService, private readonly noteVisibilityService: NoteVisibilityService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { if (ps.text && ps.text.length > this.config.maxNoteLength) { throw new ApiError(meta.errors.maxLength); } @@ -472,7 +472,7 @@ export default class extends Endpoint { // eslint- }); return { - createdNote: await this.noteEntityService.pack(note, me), + createdNote: await this.noteEntityService.pack(note, me, token), }; } catch (e) { // TODO: 他のErrorもここでキャッチしてエラーメッセージを当てるようにしたい diff --git a/packages/backend/src/server/api/endpoints/notes/featured.ts b/packages/backend/src/server/api/endpoints/notes/featured.ts index ac6dfe8da6..9b6a9e1178 100644 --- a/packages/backend/src/server/api/endpoints/notes/featured.ts +++ b/packages/backend/src/server/api/endpoints/notes/featured.ts @@ -73,7 +73,7 @@ export default class extends Endpoint { // eslint- private queryService: QueryService, private readonly roleService: RoleService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const policies = await this.roleService.getUserPolicies(me ? me.id : null); if (!policies.ltlAvailable) { throw new ApiError(meta.errors.ltlDisabled); @@ -126,7 +126,7 @@ export default class extends Endpoint { // eslint- notes.sort((a, b) => a.id > b.id ? -1 : 1); - return await this.noteEntityService.packMany(notes, me); + return await this.noteEntityService.packMany(notes, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/notes/following.ts b/packages/backend/src/server/api/endpoints/notes/following.ts index 8c2938b3bd..62a46b24f5 100644 --- a/packages/backend/src/server/api/endpoints/notes/following.ts +++ b/packages/backend/src/server/api/endpoints/notes/following.ts @@ -81,7 +81,7 @@ export default class extends Endpoint { // eslint- private readonly queryService: QueryService, private readonly activeUsersChart: ActiveUsersChart, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { if (ps.includeReplies && ps.filesOnly) throw new ApiError(meta.errors.bothWithRepliesAndWithFiles); if (ps.list === 'followers' && ps.includeNonPublic) throw new ApiError(meta.errors.bothWithFollowersAndIncludeNonPublic); @@ -170,7 +170,7 @@ export default class extends Endpoint { // eslint- this.activeUsersChart.read(me); }); - return await this.noteEntityService.packMany(notes, me, { skipHide: true }); + return await this.noteEntityService.packMany(notes, me, token, { skipHide: true }); }); } } diff --git a/packages/backend/src/server/api/endpoints/notes/global-timeline.ts b/packages/backend/src/server/api/endpoints/notes/global-timeline.ts index 601c5e7a48..329fac4f10 100644 --- a/packages/backend/src/server/api/endpoints/notes/global-timeline.ts +++ b/packages/backend/src/server/api/endpoints/notes/global-timeline.ts @@ -70,7 +70,7 @@ export default class extends Endpoint { // eslint- private activeUsersChart: ActiveUsersChart, private readonly cacheService: CacheService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const policies = await this.roleService.getUserPolicies(me ? me.id : null); if (!policies.gtlAvailable) { throw new ApiError(meta.errors.gtlDisabled); @@ -118,7 +118,7 @@ export default class extends Endpoint { // eslint- }); } - return await this.noteEntityService.packMany(timeline, me); + return await this.noteEntityService.packMany(timeline, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/notes/hybrid-timeline.ts b/packages/backend/src/server/api/endpoints/notes/hybrid-timeline.ts index 7ad1b0bf6e..77bd0cbc83 100644 --- a/packages/backend/src/server/api/endpoints/notes/hybrid-timeline.ts +++ b/packages/backend/src/server/api/endpoints/notes/hybrid-timeline.ts @@ -95,7 +95,7 @@ export default class extends Endpoint { // eslint- private userFollowingService: UserFollowingService, private fanoutTimelineEndpointService: FanoutTimelineEndpointService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const untilId = ps.untilId ?? (ps.untilDate ? this.idService.gen(ps.untilDate!) : null); const sinceId = ps.sinceId ?? (ps.sinceDate ? this.idService.gen(ps.sinceDate!) : null); @@ -121,7 +121,7 @@ export default class extends Endpoint { // eslint- this.activeUsersChart.read(me); }); - return await this.noteEntityService.packMany(timeline, me); + return await this.noteEntityService.packMany(timeline, me, token); } let timelineConfig: FanoutTimelineName[]; @@ -151,6 +151,7 @@ export default class extends Endpoint { // eslint- limit: ps.limit, allowPartial: ps.allowPartial, me, + token, redisTimelines: timelineConfig, useDbFallback: this.serverSettings.enableFanoutTimelineDbFallback, excludePureRenotes: !ps.withRenotes, diff --git a/packages/backend/src/server/api/endpoints/notes/local-timeline.ts b/packages/backend/src/server/api/endpoints/notes/local-timeline.ts index 73725f9af2..d79f08dd44 100644 --- a/packages/backend/src/server/api/endpoints/notes/local-timeline.ts +++ b/packages/backend/src/server/api/endpoints/notes/local-timeline.ts @@ -86,7 +86,7 @@ export default class extends Endpoint { // eslint- private queryService: QueryService, private readonly cacheService: CacheService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const untilId = ps.untilId ?? (ps.untilDate ? this.idService.gen(ps.untilDate!) : null); const sinceId = ps.sinceId ?? (ps.sinceDate ? this.idService.gen(ps.sinceDate!) : null); @@ -114,7 +114,7 @@ export default class extends Endpoint { // eslint- }); } - return await this.noteEntityService.packMany(timeline, me); + return await this.noteEntityService.packMany(timeline, me, token); } const timeline = await this.fanoutTimelineEndpointService.timeline({ @@ -123,6 +123,7 @@ export default class extends Endpoint { // eslint- limit: ps.limit, allowPartial: ps.allowPartial, me, + token, useDbFallback: this.serverSettings.enableFanoutTimelineDbFallback, redisTimelines: ps.withFiles ? ['localTimelineWithFiles'] diff --git a/packages/backend/src/server/api/endpoints/notes/mentions.ts b/packages/backend/src/server/api/endpoints/notes/mentions.ts index 05d0a5aebd..333aa28a53 100644 --- a/packages/backend/src/server/api/endpoints/notes/mentions.ts +++ b/packages/backend/src/server/api/endpoints/notes/mentions.ts @@ -61,7 +61,7 @@ export default class extends Endpoint { // eslint- private queryService: QueryService, private readonly activeUsersChart: ActiveUsersChart, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const query = this.queryService.makePaginationQuery(this.notesRepository.createQueryBuilder('note'), ps.sinceId, ps.untilId) .innerJoin(qb => { qb @@ -114,7 +114,7 @@ export default class extends Endpoint { // eslint- this.activeUsersChart.read(me); }); - return await this.noteEntityService.packMany(mentions, me); + return await this.noteEntityService.packMany(mentions, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/notes/polls/recommendation.ts b/packages/backend/src/server/api/endpoints/notes/polls/recommendation.ts index 6e5fdaa281..a7d10d8c62 100644 --- a/packages/backend/src/server/api/endpoints/notes/polls/recommendation.ts +++ b/packages/backend/src/server/api/endpoints/notes/polls/recommendation.ts @@ -78,7 +78,7 @@ export default class extends Endpoint { // eslint- private readonly queryService: QueryService, private readonly roleService: RoleService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const query = this.pollsRepository.createQueryBuilder('poll') .innerJoinAndSelect('poll.note', 'note') .innerJoinAndSelect('note.user', 'user') @@ -175,7 +175,7 @@ export default class extends Endpoint { // eslint- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const notes = polls.map(poll => poll.note!); - return await this.noteEntityService.packMany(notes, me, { + return await this.noteEntityService.packMany(notes, me, token, { detail: true, }); }); diff --git a/packages/backend/src/server/api/endpoints/notes/polls/refresh.ts b/packages/backend/src/server/api/endpoints/notes/polls/refresh.ts index 69e718fc81..9f6ac4b603 100644 --- a/packages/backend/src/server/api/endpoints/notes/polls/refresh.ts +++ b/packages/backend/src/server/api/endpoints/notes/polls/refresh.ts @@ -71,7 +71,7 @@ export default class extends Endpoint { // eslint- private apQuestionService: ApQuestionService, private noteEntityService: NoteEntityService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { // Get note const note = await this.getterService.getNote(ps.noteId).catch(err => { if (err.id === '9725d0ce-ba28-4dde-95a7-2cbb2c15de24') throw new ApiError(meta.errors.noSuchNote); @@ -96,7 +96,7 @@ export default class extends Endpoint { // eslint- await this.apQuestionService.updateQuestion(note.uri); - return await this.noteEntityService.pack(note, me, { + return await this.noteEntityService.pack(note, me, token, { detail: true, }); }); diff --git a/packages/backend/src/server/api/endpoints/notes/reactions.ts b/packages/backend/src/server/api/endpoints/notes/reactions.ts index f2355518a2..c8fa232bf7 100644 --- a/packages/backend/src/server/api/endpoints/notes/reactions.ts +++ b/packages/backend/src/server/api/endpoints/notes/reactions.ts @@ -66,7 +66,7 @@ export default class extends Endpoint { // eslint- private noteReactionEntityService: NoteReactionEntityService, private queryService: QueryService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const query = this.queryService.makePaginationQuery(this.noteReactionsRepository.createQueryBuilder('reaction'), ps.sinceId, ps.untilId) .andWhere('reaction.noteId = :noteId', { noteId: ps.noteId }) .leftJoinAndSelect('reaction.user', 'user') @@ -85,7 +85,7 @@ export default class extends Endpoint { // eslint- const reactions = await query.limit(ps.limit).getMany(); - return await this.noteReactionEntityService.packMany(reactions, me); + return await this.noteReactionEntityService.packMany(reactions, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/notes/renotes.ts b/packages/backend/src/server/api/endpoints/notes/renotes.ts index cc38e9a405..138fb8e0b4 100644 --- a/packages/backend/src/server/api/endpoints/notes/renotes.ts +++ b/packages/backend/src/server/api/endpoints/notes/renotes.ts @@ -66,7 +66,7 @@ export default class extends Endpoint { // eslint- private queryService: QueryService, private getterService: GetterService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const note = await this.getterService.getNote(ps.noteId).catch(err => { if (err.id === '9725d0ce-ba28-4dde-95a7-2cbb2c15de24') throw new ApiError(meta.errors.noSuchNote); throw err; @@ -102,7 +102,7 @@ export default class extends Endpoint { // eslint- const renotes = await query.limit(ps.limit).getMany(); - return await this.noteEntityService.packMany(renotes, me); + return await this.noteEntityService.packMany(renotes, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/notes/replies.ts b/packages/backend/src/server/api/endpoints/notes/replies.ts index d6142b581a..be29803523 100644 --- a/packages/backend/src/server/api/endpoints/notes/replies.ts +++ b/packages/backend/src/server/api/endpoints/notes/replies.ts @@ -52,7 +52,7 @@ export default class extends Endpoint { // eslint- private noteEntityService: NoteEntityService, private queryService: QueryService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const query = this.queryService.makePaginationQuery(this.notesRepository.createQueryBuilder('note'), ps.sinceId, ps.untilId) .andWhere('note.replyId = :replyId', { replyId: ps.noteId }) .innerJoinAndSelect('note.user', 'user') @@ -72,7 +72,7 @@ export default class extends Endpoint { // eslint- const timeline = await query.getMany(); - return await this.noteEntityService.packMany(timeline, me); + return await this.noteEntityService.packMany(timeline, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/notes/schedule/list.ts b/packages/backend/src/server/api/endpoints/notes/schedule/list.ts index cbf3a961c0..b1eebebc0e 100644 --- a/packages/backend/src/server/api/endpoints/notes/schedule/list.ts +++ b/packages/backend/src/server/api/endpoints/notes/schedule/list.ts @@ -7,7 +7,7 @@ import ms from 'ms'; import { Inject, Injectable } from '@nestjs/common'; import { Endpoint } from '@/server/api/endpoint-base.js'; import { DI } from '@/di-symbols.js'; -import type { MiNote, MiUser, MiNoteSchedule, NoteScheduleRepository, NotesRepository } from '@/models/_.js'; +import type { MiNote, MiUser, MiNoteSchedule, NoteScheduleRepository, NotesRepository, MiAccessToken } from '@/models/_.js'; import { UserEntityService } from '@/core/entities/UserEntityService.js'; import { NoteEntityService } from '@/core/entities/NoteEntityService.js'; import { DriveFileEntityService } from '@/core/entities/DriveFileEntityService.js'; @@ -91,11 +91,11 @@ export default class extends Endpoint { // eslint- private driveFileEntityService: DriveFileEntityService, private queryService: QueryService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const query = this.queryService.makePaginationQuery(this.noteScheduleRepository.createQueryBuilder('note'), ps.sinceId, ps.untilId) .andWhere('note.userId = :userId', { userId: me.id }); const scheduleNotes = await query.limit(ps.limit).getMany(); - const user = await this.userEntityService.pack(me, me); + const user = await this.userEntityService.pack(me, me, { token }); const scheduleNotesPack: { id: string; note: { @@ -124,7 +124,7 @@ export default class extends Endpoint { // eslint- user: user, visibility: item.note.visibility ?? 'public', reactionAcceptance: item.note.reactionAcceptance ?? null, - visibleUsers: item.note.visibleUsers ? await this.userEntityService.packMany(item.note.visibleUsers.map(u => u.id), me) : [], + visibleUsers: item.note.visibleUsers ? await this.userEntityService.packMany(item.note.visibleUsers.map(u => u.id), me, { token }) : [], fileIds: item.note.files ? item.note.files : [], files: await this.driveFileEntityService.packManyByIds(item.note.files), createdAt: item.scheduledAt.toISOString(), @@ -146,12 +146,13 @@ export default class extends Endpoint { // eslint- private async fetchNote( id: MiNote['id'] | null | undefined, me: MiUser, + token?: MiAccessToken | null, ): Promise | null> { if (id) { const note = await this.notesRepository.findOneBy({ id }); if (note) { note.reactionAndUserPairCache ??= []; - return this.noteEntityService.pack(note, me); + return this.noteEntityService.pack(note, me, token); } } return null; diff --git a/packages/backend/src/server/api/endpoints/notes/search-by-tag.ts b/packages/backend/src/server/api/endpoints/notes/search-by-tag.ts index fa962feca7..326100a63e 100644 --- a/packages/backend/src/server/api/endpoints/notes/search-by-tag.ts +++ b/packages/backend/src/server/api/endpoints/notes/search-by-tag.ts @@ -81,7 +81,7 @@ export default class extends Endpoint { // eslint- private noteEntityService: NoteEntityService, private queryService: QueryService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const query = this.queryService.makePaginationQuery(this.notesRepository.createQueryBuilder('note'), ps.sinceId, ps.untilId) .andWhere(new Brackets(qb => qb .orWhere('note.visibility = \'public\'') @@ -159,7 +159,7 @@ export default class extends Endpoint { // eslint- // Search notes const notes = await query.getMany(); - return await this.noteEntityService.packMany(notes, me); + return await this.noteEntityService.packMany(notes, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/notes/search.ts b/packages/backend/src/server/api/endpoints/notes/search.ts index f46f4d2adb..55b7274ff8 100644 --- a/packages/backend/src/server/api/endpoints/notes/search.ts +++ b/packages/backend/src/server/api/endpoints/notes/search.ts @@ -73,7 +73,7 @@ export default class extends Endpoint { // eslint- private searchService: SearchService, private roleService: RoleService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const policies = await this.roleService.getUserPolicies(me ? me.id : null); if (!policies.canSearchNotes) { throw new ApiError(meta.errors.unavailable); @@ -91,7 +91,7 @@ export default class extends Endpoint { // eslint- limit: ps.limit, }); - return await this.noteEntityService.packMany(notes, me); + return await this.noteEntityService.packMany(notes, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/notes/show.ts b/packages/backend/src/server/api/endpoints/notes/show.ts index 44e7137f29..00e16124bb 100644 --- a/packages/backend/src/server/api/endpoints/notes/show.ts +++ b/packages/backend/src/server/api/endpoints/notes/show.ts @@ -60,7 +60,7 @@ export default class extends Endpoint { // eslint- private noteEntityService: NoteEntityService, private queryService: QueryService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const query = await this.notesRepository.createQueryBuilder('note') .where('note.id = :noteId', { noteId: ps.noteId }) .innerJoinAndSelect('note.user', 'user'); @@ -80,7 +80,7 @@ export default class extends Endpoint { // eslint- throw new ApiError(meta.errors.signinRequired); } - return await this.noteEntityService.pack(note, me, { + return await this.noteEntityService.pack(note, me, token, { detail: true, }); }); diff --git a/packages/backend/src/server/api/endpoints/notes/timeline.ts b/packages/backend/src/server/api/endpoints/notes/timeline.ts index 27ba7399a7..0c14546d77 100644 --- a/packages/backend/src/server/api/endpoints/notes/timeline.ts +++ b/packages/backend/src/server/api/endpoints/notes/timeline.ts @@ -76,7 +76,7 @@ export default class extends Endpoint { // eslint- private userFollowingService: UserFollowingService, private queryService: QueryService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const untilId = ps.untilId ?? (ps.untilDate ? this.idService.gen(ps.untilDate!) : null); const sinceId = ps.sinceId ?? (ps.sinceDate ? this.idService.gen(ps.sinceDate!) : null); @@ -94,7 +94,7 @@ export default class extends Endpoint { // eslint- this.activeUsersChart.read(me); }); - return await this.noteEntityService.packMany(timeline, me); + return await this.noteEntityService.packMany(timeline, me, token); } const timeline = this.fanoutTimelineEndpointService.timeline({ diff --git a/packages/backend/src/server/api/endpoints/notes/user-list-timeline.ts b/packages/backend/src/server/api/endpoints/notes/user-list-timeline.ts index 7fb671a446..ec24ff7367 100644 --- a/packages/backend/src/server/api/endpoints/notes/user-list-timeline.ts +++ b/packages/backend/src/server/api/endpoints/notes/user-list-timeline.ts @@ -88,7 +88,7 @@ export default class extends Endpoint { // eslint- private fanoutTimelineEndpointService: FanoutTimelineEndpointService, private queryService: QueryService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const untilId = ps.untilId ?? (ps.untilDate ? this.idService.gen(ps.untilDate!) : null); const sinceId = ps.sinceId ?? (ps.sinceDate ? this.idService.gen(ps.sinceDate!) : null); @@ -114,7 +114,7 @@ export default class extends Endpoint { // eslint- this.activeUsersChart.read(me); }); - return await this.noteEntityService.packMany(timeline, me); + return await this.noteEntityService.packMany(timeline, me, token); } const timeline = await this.fanoutTimelineEndpointService.timeline({ @@ -123,6 +123,7 @@ export default class extends Endpoint { // eslint- limit: ps.limit, allowPartial: ps.allowPartial, me, + token, useDbFallback: this.serverSettings.enableFanoutTimelineDbFallback, redisTimelines: ps.withFiles ? [`userListTimelineWithFiles:${list.id}`] : [`userListTimeline:${list.id}`], excludePureRenotes: !ps.withRenotes, diff --git a/packages/backend/src/server/api/endpoints/page-push.ts b/packages/backend/src/server/api/endpoints/page-push.ts index 61f9862734..22b44a033a 100644 --- a/packages/backend/src/server/api/endpoints/page-push.ts +++ b/packages/backend/src/server/api/endpoints/page-push.ts @@ -49,7 +49,7 @@ export default class extends Endpoint { // eslint- private userEntityService: UserEntityService, private globalEventService: GlobalEventService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const page = await this.pagesRepository.findOneBy({ id: ps.pageId }); if (page == null) { throw new ApiError(meta.errors.noSuchPage); @@ -62,6 +62,7 @@ export default class extends Endpoint { // eslint- userId: me.id, user: await this.userEntityService.pack(me.id, { id: page.userId }, { schema: 'UserDetailed', + token, }), }); }); diff --git a/packages/backend/src/server/api/endpoints/pages/create.ts b/packages/backend/src/server/api/endpoints/pages/create.ts index 6de5fe3d44..fb4286d143 100644 --- a/packages/backend/src/server/api/endpoints/pages/create.ts +++ b/packages/backend/src/server/api/endpoints/pages/create.ts @@ -80,7 +80,7 @@ export default class extends Endpoint { // eslint- private pageEntityService: PageEntityService, private idService: IdService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { let eyeCatchingImage = null; if (ps.eyeCatchingImageId != null) { eyeCatchingImage = await this.driveFilesRepository.findOneBy({ @@ -119,7 +119,7 @@ export default class extends Endpoint { // eslint- font: ps.font, })); - return await this.pageEntityService.pack(page); + return await this.pageEntityService.pack(page, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/pages/delete.ts b/packages/backend/src/server/api/endpoints/pages/delete.ts index c95f8ecf6b..51705306a2 100644 --- a/packages/backend/src/server/api/endpoints/pages/delete.ts +++ b/packages/backend/src/server/api/endpoints/pages/delete.ts @@ -60,14 +60,14 @@ export default class extends Endpoint { // eslint- private moderationLogService: ModerationLogService, private roleService: RoleService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const page = await this.pagesRepository.findOneBy({ id: ps.pageId }); if (page == null) { throw new ApiError(meta.errors.noSuchPage); } - if (!await this.roleService.isModerator(me) && page.userId !== me.id) { + if (!await this.roleService.isModerator(me, token) && page.userId !== me.id) { throw new ApiError(meta.errors.accessDenied); } diff --git a/packages/backend/src/server/api/endpoints/pages/featured.ts b/packages/backend/src/server/api/endpoints/pages/featured.ts index 1886e7be28..6c94757014 100644 --- a/packages/backend/src/server/api/endpoints/pages/featured.ts +++ b/packages/backend/src/server/api/endpoints/pages/featured.ts @@ -45,7 +45,7 @@ export default class extends Endpoint { // eslint- private pageEntityService: PageEntityService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const query = this.pagesRepository.createQueryBuilder('page') .where('page.visibility = \'public\'') .andWhere('page.likedCount > 0') @@ -53,7 +53,7 @@ export default class extends Endpoint { // eslint- const pages = await query.limit(10).getMany(); - return await this.pageEntityService.packMany(pages, me); + return await this.pageEntityService.packMany(pages, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/renote-mute/list.ts b/packages/backend/src/server/api/endpoints/renote-mute/list.ts index aabee237f4..998e5e2984 100644 --- a/packages/backend/src/server/api/endpoints/renote-mute/list.ts +++ b/packages/backend/src/server/api/endpoints/renote-mute/list.ts @@ -53,7 +53,7 @@ export default class extends Endpoint { // eslint- private renoteMutingEntityService: RenoteMutingEntityService, private queryService: QueryService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const query = this.queryService.makePaginationQuery(this.renoteMutingsRepository.createQueryBuilder('muting'), ps.sinceId, ps.untilId) .andWhere('muting.muterId = :meId', { meId: me.id }); @@ -61,7 +61,7 @@ export default class extends Endpoint { // eslint- .limit(ps.limit) .getMany(); - return await this.renoteMutingEntityService.packMany(mutings, me); + return await this.renoteMutingEntityService.packMany(mutings, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/reversi/invitations.ts b/packages/backend/src/server/api/endpoints/reversi/invitations.ts index b5abad73e2..635cb48345 100644 --- a/packages/backend/src/server/api/endpoints/reversi/invitations.ts +++ b/packages/backend/src/server/api/endpoints/reversi/invitations.ts @@ -36,10 +36,10 @@ export default class extends Endpoint { // eslint- private userEntityService: UserEntityService, private reversiService: ReversiService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const invitations = await this.reversiService.getInvitations(me); - return await this.userEntityService.packMany(invitations, me); + return await this.userEntityService.packMany(invitations, me, { token }); }); } } diff --git a/packages/backend/src/server/api/endpoints/roles/notes.ts b/packages/backend/src/server/api/endpoints/roles/notes.ts index a061bba6de..bdbfd6b901 100644 --- a/packages/backend/src/server/api/endpoints/roles/notes.ts +++ b/packages/backend/src/server/api/endpoints/roles/notes.ts @@ -77,7 +77,7 @@ export default class extends Endpoint { // eslint- private fanoutTimelineService: FanoutTimelineService, private readonly activeUsersChart: ActiveUsersChart, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const untilId = ps.untilId ?? (ps.untilDate ? this.idService.gen(ps.untilDate!) : null); const sinceId = ps.sinceId ?? (ps.sinceDate ? this.idService.gen(ps.sinceDate!) : null); @@ -124,7 +124,7 @@ export default class extends Endpoint { // eslint- this.activeUsersChart.read(me); }); - return await this.noteEntityService.packMany(notes, me); + return await this.noteEntityService.packMany(notes, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/users/clips.ts b/packages/backend/src/server/api/endpoints/users/clips.ts index a457a6c434..eb208bdc7f 100644 --- a/packages/backend/src/server/api/endpoints/users/clips.ts +++ b/packages/backend/src/server/api/endpoints/users/clips.ts @@ -52,7 +52,7 @@ export default class extends Endpoint { // eslint- private clipEntityService: ClipEntityService, private queryService: QueryService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const query = this.queryService.makePaginationQuery(this.clipsRepository.createQueryBuilder('clip'), ps.sinceId, ps.untilId) .andWhere('clip.userId = :userId', { userId: ps.userId }) .andWhere('clip.isPublic = true'); @@ -61,7 +61,7 @@ export default class extends Endpoint { // eslint- .limit(ps.limit) .getMany(); - return await this.clipEntityService.packMany(clips, me); + return await this.clipEntityService.packMany(clips, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/users/featured-notes.ts b/packages/backend/src/server/api/endpoints/users/featured-notes.ts index cf328ad71c..e86d76ea77 100644 --- a/packages/backend/src/server/api/endpoints/users/featured-notes.ts +++ b/packages/backend/src/server/api/endpoints/users/featured-notes.ts @@ -58,7 +58,7 @@ export default class extends Endpoint { // eslint- private cacheService: CacheService, private queryService: QueryService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const userIdsWhoBlockingMe = me ? await this.cacheService.userBlockedCache.fetch(me.id) : new Set(); // early return if me is blocked by requesting user @@ -101,7 +101,7 @@ export default class extends Endpoint { // eslint- notes.sort((a, b) => a.id > b.id ? -1 : 1); - return await this.noteEntityService.packMany(notes, me); + return await this.noteEntityService.packMany(notes, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/users/flashs.ts b/packages/backend/src/server/api/endpoints/users/flashs.ts index 2da46e8747..6acb1cb8f4 100644 --- a/packages/backend/src/server/api/endpoints/users/flashs.ts +++ b/packages/backend/src/server/api/endpoints/users/flashs.ts @@ -53,7 +53,7 @@ export default class extends Endpoint { private flashEntityService: FlashEntityService, private queryService: QueryService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const query = this.queryService.makePaginationQuery(this.flashsRepository.createQueryBuilder('flash'), ps.sinceId, ps.untilId) .andWhere('flash.userId = :userId', { userId: ps.userId }) .andWhere('flash.visibility = \'public\''); @@ -62,7 +62,7 @@ export default class extends Endpoint { .limit(ps.limit) .getMany(); - return await this.flashEntityService.packMany(flashs); + return await this.flashEntityService.packMany(flashs, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/users/followers.ts b/packages/backend/src/server/api/endpoints/users/followers.ts index 82ce282bfc..04d896f4ed 100644 --- a/packages/backend/src/server/api/endpoints/users/followers.ts +++ b/packages/backend/src/server/api/endpoints/users/followers.ts @@ -92,7 +92,7 @@ export default class extends Endpoint { // eslint- private roleService: RoleService, private readonly cacheService: CacheService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const user = await this.usersRepository.findOneBy(ps.userId != null ? { id: ps.userId } : { usernameLower: ps.username!.toLowerCase(), host: this.utilityService.toPunyNullable(ps.host) ?? IsNull() }); @@ -103,7 +103,7 @@ export default class extends Endpoint { // eslint- const profile = await this.userProfilesRepository.findOneByOrFail({ userId: user.id }); - if (profile.followersVisibility !== 'public' && !await this.roleService.isModerator(me)) { + if (profile.followersVisibility !== 'public' && !await this.roleService.isModerator(me, token)) { if (profile.followersVisibility === 'private') { if (me == null || (me.id !== user.id)) { throw new ApiError(meta.errors.forbidden); @@ -128,7 +128,7 @@ export default class extends Endpoint { // eslint- .limit(ps.limit) .getMany(); - return await this.followingEntityService.packMany(followings, me, { populateFollower: true }); + return await this.followingEntityService.packMany(followings, me, token, { populateFollower: true }); }); } } diff --git a/packages/backend/src/server/api/endpoints/users/following.ts b/packages/backend/src/server/api/endpoints/users/following.ts index 80f0b0c484..a71e8abe68 100644 --- a/packages/backend/src/server/api/endpoints/users/following.ts +++ b/packages/backend/src/server/api/endpoints/users/following.ts @@ -101,7 +101,7 @@ export default class extends Endpoint { // eslint- private roleService: RoleService, private readonly cacheService: CacheService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const user = await this.usersRepository.findOneBy(ps.userId != null ? { id: ps.userId } : { usernameLower: ps.username!.toLowerCase(), host: this.utilityService.toPunyNullable(ps.host) ?? IsNull() }); @@ -112,7 +112,7 @@ export default class extends Endpoint { // eslint- const profile = await this.userProfilesRepository.findOneByOrFail({ userId: user.id }); - if (profile.followingVisibility !== 'public' && !await this.roleService.isModerator(me)) { + if (profile.followingVisibility !== 'public' && !await this.roleService.isModerator(me, token)) { if (profile.followingVisibility === 'private') { if (me == null || (me.id !== user.id)) { throw new ApiError(meta.errors.forbidden); @@ -150,7 +150,7 @@ export default class extends Endpoint { // eslint- .limit(ps.limit) .getMany(); - return await this.followingEntityService.packMany(followings, me, { populateFollowee: true }); + return await this.followingEntityService.packMany(followings, me, token, { populateFollowee: true }); }); } } diff --git a/packages/backend/src/server/api/endpoints/users/gallery/posts.ts b/packages/backend/src/server/api/endpoints/users/gallery/posts.ts index 931685e32a..0077d5f65a 100644 --- a/packages/backend/src/server/api/endpoints/users/gallery/posts.ts +++ b/packages/backend/src/server/api/endpoints/users/gallery/posts.ts @@ -52,7 +52,7 @@ export default class extends Endpoint { // eslint- private galleryPostEntityService: GalleryPostEntityService, private queryService: QueryService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const query = this.queryService.makePaginationQuery(this.galleryPostsRepository.createQueryBuilder('post'), ps.sinceId, ps.untilId) .andWhere('post.userId = :userId', { userId: ps.userId }); @@ -60,7 +60,7 @@ export default class extends Endpoint { // eslint- .limit(ps.limit) .getMany(); - return await this.galleryPostEntityService.packMany(posts, me); + return await this.galleryPostEntityService.packMany(posts, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/users/lists/get-memberships.ts b/packages/backend/src/server/api/endpoints/users/lists/get-memberships.ts index 18373fdf07..ccb85f0449 100644 --- a/packages/backend/src/server/api/endpoints/users/lists/get-memberships.ts +++ b/packages/backend/src/server/api/endpoints/users/lists/get-memberships.ts @@ -86,7 +86,7 @@ export default class extends Endpoint { private userListEntityService: UserListEntityService, private queryService: QueryService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { // Fetch the list const userList = await this.userListsRepository.findOneBy(!ps.forPublic && me !== null ? { id: ps.listId, @@ -108,7 +108,7 @@ export default class extends Endpoint { .limit(ps.limit) .getMany(); - return this.userListEntityService.packMembershipsMany(memberships); + return this.userListEntityService.packMembershipsMany(memberships, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/users/notes.ts b/packages/backend/src/server/api/endpoints/users/notes.ts index 2822b52ec8..82d0cadb92 100644 --- a/packages/backend/src/server/api/endpoints/users/notes.ts +++ b/packages/backend/src/server/api/endpoints/users/notes.ts @@ -95,7 +95,7 @@ export default class extends Endpoint { // eslint- private idService: IdService, private fanoutTimelineEndpointService: FanoutTimelineEndpointService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const untilId = ps.untilId ?? (ps.untilDate ? this.idService.gen(ps.untilDate!) : null); const sinceId = ps.sinceId ?? (ps.sinceDate ? this.idService.gen(ps.sinceDate!) : null); const isSelf = me && (me.id === ps.userId); @@ -126,7 +126,7 @@ export default class extends Endpoint { // eslint- withRepliesToSelf: ps.withRepliesToSelf, }, me); - return await this.noteEntityService.packMany(timeline, me); + return await this.noteEntityService.packMany(timeline, me, token); } const redisTimelines: FanoutTimelineName[] = [ps.withFiles ? `userTimelineWithFiles:${ps.userId}` : `userTimeline:${ps.userId}`]; @@ -140,6 +140,7 @@ export default class extends Endpoint { // eslint- limit: ps.limit, allowPartial: ps.allowPartial, me, + token, redisTimelines, useDbFallback: true, ignoreAuthorFromMute: true, diff --git a/packages/backend/src/server/api/endpoints/users/pages.ts b/packages/backend/src/server/api/endpoints/users/pages.ts index 3cb958066e..97de0913f8 100644 --- a/packages/backend/src/server/api/endpoints/users/pages.ts +++ b/packages/backend/src/server/api/endpoints/users/pages.ts @@ -52,7 +52,7 @@ export default class extends Endpoint { // eslint- private pageEntityService: PageEntityService, private queryService: QueryService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const query = this.queryService.makePaginationQuery(this.pagesRepository.createQueryBuilder('page'), ps.sinceId, ps.untilId) .andWhere('page.userId = :userId', { userId: ps.userId }) .andWhere('page.visibility = \'public\''); @@ -61,7 +61,7 @@ export default class extends Endpoint { // eslint- .limit(ps.limit) .getMany(); - return await this.pageEntityService.packMany(pages); + return await this.pageEntityService.packMany(pages, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/users/reactions.ts b/packages/backend/src/server/api/endpoints/users/reactions.ts index 8409631c8e..53d2fecf8f 100644 --- a/packages/backend/src/server/api/endpoints/users/reactions.ts +++ b/packages/backend/src/server/api/endpoints/users/reactions.ts @@ -80,9 +80,9 @@ export default class extends Endpoint { // eslint- private queryService: QueryService, private roleService: RoleService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const userIdsWhoBlockingMe = me ? await this.cacheService.userBlockedCache.fetch(me.id) : new Set(); - const iAmModerator = me ? await this.roleService.isModerator(me) : false; // Moderators can see reactions of all users + const iAmModerator = me ? await this.roleService.isModerator(me, token) : false; // Moderators can see reactions of all users if (!iAmModerator) { const user = await this.cacheService.findUserById(ps.userId); if (this.userEntityService.isRemoteUser(user)) { @@ -122,7 +122,7 @@ export default class extends Endpoint { // eslint- const reactions = await query.limit(ps.limit).getMany(); - return await this.noteReactionEntityService.packMany(reactions, me, { withNote: true }); + return await this.noteReactionEntityService.packMany(reactions, me, token, { withNote: true }); }); } } diff --git a/packages/backend/src/server/api/endpoints/users/search-by-username-and-host.ts b/packages/backend/src/server/api/endpoints/users/search-by-username-and-host.ts index f1a0fc5ddb..47b5855e69 100644 --- a/packages/backend/src/server/api/endpoints/users/search-by-username-and-host.ts +++ b/packages/backend/src/server/api/endpoints/users/search-by-username-and-host.ts @@ -51,14 +51,14 @@ export default class extends Endpoint { // eslint- constructor( private userSearchService: UserSearchService, ) { - super(meta, paramDef, (ps, me) => { + super(meta, paramDef, (ps, me, token) => { return this.userSearchService.searchByUsernameAndHost({ username: ps.username, host: ps.host, }, { limit: ps.limit, detail: ps.detail, - }, me); + }, me, token); }); } } diff --git a/packages/backend/src/server/api/endpoints/users/search.ts b/packages/backend/src/server/api/endpoints/users/search.ts index 138cef2ec5..5c95911b82 100644 --- a/packages/backend/src/server/api/endpoints/users/search.ts +++ b/packages/backend/src/server/api/endpoints/users/search.ts @@ -51,14 +51,14 @@ export default class extends Endpoint { // eslint- private userEntityService: UserEntityService, private userSearchService: UserSearchService, ) { - super(meta, paramDef, async (ps, me) => { + super(meta, paramDef, async (ps, me, token) => { const users = await this.userSearchService.search(ps.query.trim(), me?.id ?? null, { offset: ps.offset, limit: ps.limit, origin: ps.origin, }); - return await this.userEntityService.packMany(users, me, { schema: ps.detail ? 'UserDetailed' : 'UserLite' }); + return await this.userEntityService.packMany(users, me, { schema: ps.detail ? 'UserDetailed' : 'UserLite', token }); }); } } diff --git a/packages/backend/src/server/api/endpoints/users/show.ts b/packages/backend/src/server/api/endpoints/users/show.ts index 30b4719e09..740dd0f5b1 100644 --- a/packages/backend/src/server/api/endpoints/users/show.ts +++ b/packages/backend/src/server/api/endpoints/users/show.ts @@ -104,10 +104,10 @@ export default class extends Endpoint { // eslint- private perUserPvChart: PerUserPvChart, private apiLoggerService: ApiLoggerService, ) { - super(meta, paramDef, async (ps, me, _1, _2, _3, ip) => { + super(meta, paramDef, async (ps, me, token, _2, _3, ip) => { let user; - const isModerator = await this.roleService.isModerator(me); + const isModerator = await this.roleService.isModerator(me, token); ps.username = ps.username?.trim(); if (ps.userIds) { diff --git a/packages/backend/src/server/api/stream/channel.ts b/packages/backend/src/server/api/stream/channel.ts index 71845125ad..90fb3d3237 100644 --- a/packages/backend/src/server/api/stream/channel.ts +++ b/packages/backend/src/server/api/stream/channel.ts @@ -35,6 +35,10 @@ export default abstract class Channel { return this.connection.user; } + protected get token() { + return this.connection.token; + } + protected get userProfile() { return this.connection.userProfile; } diff --git a/packages/backend/src/server/api/stream/channels/antenna.ts b/packages/backend/src/server/api/stream/channels/antenna.ts index c2f5db9476..e2dd937dc4 100644 --- a/packages/backend/src/server/api/stream/channels/antenna.ts +++ b/packages/backend/src/server/api/stream/channels/antenna.ts @@ -39,7 +39,7 @@ class AntennaChannel extends Channel { @bindThis private async onEvent(data: GlobalEvents['antenna']['payload']) { if (data.type === 'note') { - const note = await this.noteEntityService.pack(data.body.id, this.user, { detail: true }); + const note = await this.noteEntityService.pack(data.body.id, this.user, this.token, { detail: true }); const { accessible, silence } = await this.checkNoteVisibility(note, { includeReplies: true }); if (!accessible || silence) return; diff --git a/packages/backend/src/server/web/ClientServerService.ts b/packages/backend/src/server/web/ClientServerService.ts index 654d477628..764b145370 100644 --- a/packages/backend/src/server/web/ClientServerService.ts +++ b/packages/backend/src/server/web/ClientServerService.ts @@ -842,7 +842,7 @@ export class ClientServerService { if (['specified', 'followers'].includes(note.visibility)) return; if (note.userHost != null) return; - const _note = await this.noteEntityService.pack(note, null, { detail: true }); + const _note = await this.noteEntityService.pack(note, null, null, { detail: true }); reply.header('Cache-Control', 'public, max-age=3600'); return await reply.view('base-embed', {