refactor: resolve #7139
This commit is contained in:
		| @@ -240,36 +240,6 @@ SQLでは配列のインデックスは**1始まり**。 | ||||
| MongoDBの時とは違い、findOneでレコードを取得する時に対象レコードが存在しない場合 **`undefined`** が返ってくるので注意。 | ||||
| MongoDBは`null`で返してきてたので、その感覚で`if (x === null)`とか書くとバグる。代わりに`if (x == null)`と書いてください | ||||
|  | ||||
| ### 簡素な`undefined`チェック | ||||
| データベースからレコードを取得するときに、プログラムの流れ的に(ほぼ)絶対`undefined`にはならない場合でも、`undefined`チェックしないとTypeScriptに怒られます。 | ||||
| でもいちいち複数行を費やして、発生するはずのない`undefined`をチェックするのも面倒なので、`ensure`というユーティリティ関数を用意しています。 | ||||
| 例えば、 | ||||
| ``` ts | ||||
| const user = await Users.findOne(userId); | ||||
| // この時点で user の型は User | undefined | ||||
| if (user == null) { | ||||
| 	throw 'missing user'; | ||||
| } | ||||
| // この時点で user の型は User | ||||
| ``` | ||||
| という処理を`ensure`を使うと | ||||
| ``` ts | ||||
| const user = await Users.findOne(userId).then(ensure); | ||||
| // この時点で user の型は User | ||||
| ``` | ||||
| という風に書けます。 | ||||
| もちろん`ensure`内部でエラーを握りつぶすようなことはしておらず、万が一`undefined`だった場合はPromiseがRejectされ後続の処理は実行されません。 | ||||
| ``` ts | ||||
| const user = await Users.findOne(userId).then(ensure); | ||||
| // 万が一 Users.findOne の結果が undefined だったら、ensure でエラーが発生するので | ||||
| // この行に到達することは無い | ||||
| // なので、.then(ensure) は | ||||
| // if (user == null) { | ||||
| //	throw 'missing user'; | ||||
| // } | ||||
| // の糖衣構文のような扱いです | ||||
| ``` | ||||
|  | ||||
| ### Migration作成方法 | ||||
| ``` | ||||
| npx ts-node ./node_modules/typeorm/cli.js migration:generate -n 変更の名前 | ||||
|   | ||||
| @@ -4,7 +4,6 @@ import { User } from '../models/entities/user'; | ||||
| import { UserListJoinings, UserGroupJoinings } from '../models'; | ||||
| import parseAcct from './acct/parse'; | ||||
| import { getFullApAccount } from './convert-host'; | ||||
| import { ensure } from '../prelude/ensure'; | ||||
|  | ||||
| export async function checkHitAntenna(antenna: Antenna, note: Note, noteUser: User, followers: User['id'][]): Promise<boolean> { | ||||
| 	if (note.visibility === 'specified') return false; | ||||
| @@ -24,7 +23,7 @@ export async function checkHitAntenna(antenna: Antenna, note: Note, noteUser: Us | ||||
|  | ||||
| 		if (!listUsers.includes(note.userId)) return false; | ||||
| 	} else if (antenna.src === 'group') { | ||||
| 		const joining = await UserGroupJoinings.findOne(antenna.userGroupJoiningId!).then(ensure); | ||||
| 		const joining = await UserGroupJoinings.findOneOrFail(antenna.userGroupJoiningId!); | ||||
|  | ||||
| 		const groupUsers = (await UserGroupJoinings.find({ | ||||
| 			userGroupId: joining.userGroupId | ||||
|   | ||||
| @@ -1,10 +1,9 @@ | ||||
| import { fetchMeta } from './fetch-meta'; | ||||
| import { ILocalUser } from '../models/entities/user'; | ||||
| import { Users } from '../models'; | ||||
| import { ensure } from '../prelude/ensure'; | ||||
|  | ||||
| export async function fetchProxyAccount(): Promise<ILocalUser | null> { | ||||
| 	const meta = await fetchMeta(); | ||||
| 	if (meta.proxyAccountId == null) return null; | ||||
| 	return await Users.findOne(meta.proxyAccountId).then(ensure) as ILocalUser; | ||||
| 	return await Users.findOneOrFail(meta.proxyAccountId) as ILocalUser; | ||||
| } | ||||
|   | ||||
| @@ -1,7 +1,6 @@ | ||||
| import { EntityRepository, Repository } from 'typeorm'; | ||||
| import { Users } from '..'; | ||||
| import { AbuseUserReport } from '../entities/abuse-user-report'; | ||||
| import { ensure } from '../../prelude/ensure'; | ||||
| import { awaitAll } from '../../prelude/await-all'; | ||||
|  | ||||
| @EntityRepository(AbuseUserReport) | ||||
| @@ -9,7 +8,7 @@ export class AbuseUserReportRepository extends Repository<AbuseUserReport> { | ||||
| 	public async pack( | ||||
| 		src: AbuseUserReport['id'] | AbuseUserReport, | ||||
| 	) { | ||||
| 		const report = typeof src === 'object' ? src : await this.findOne(src).then(ensure); | ||||
| 		const report = typeof src === 'object' ? src : await this.findOneOrFail(src); | ||||
|  | ||||
| 		return await awaitAll({ | ||||
| 			id: report.id, | ||||
|   | ||||
| @@ -1,6 +1,5 @@ | ||||
| import { EntityRepository, Repository } from 'typeorm'; | ||||
| import { Antenna } from '../entities/antenna'; | ||||
| import { ensure } from '../../prelude/ensure'; | ||||
| import { SchemaType } from '../../misc/schema'; | ||||
| import { AntennaNotes, UserGroupJoinings } from '..'; | ||||
|  | ||||
| @@ -11,7 +10,7 @@ export class AntennaRepository extends Repository<Antenna> { | ||||
| 	public async pack( | ||||
| 		src: Antenna['id'] | Antenna, | ||||
| 	): Promise<PackedAntenna> { | ||||
| 		const antenna = typeof src === 'object' ? src : await this.findOne(src).then(ensure); | ||||
| 		const antenna = typeof src === 'object' ? src : await this.findOneOrFail(src); | ||||
|  | ||||
| 		const hasUnreadNote = (await AntennaNotes.findOne({ antennaId: antenna.id, read: false })) != null; | ||||
| 		const userGroupJoining = antenna.userGroupJoiningId ? await UserGroupJoinings.findOne(antenna.userGroupJoiningId) : null; | ||||
|   | ||||
| @@ -1,7 +1,6 @@ | ||||
| import { EntityRepository, Repository } from 'typeorm'; | ||||
| import { App } from '../entities/app'; | ||||
| import { AccessTokens } from '..'; | ||||
| import { ensure } from '../../prelude/ensure'; | ||||
| import { SchemaType } from '../../misc/schema'; | ||||
|  | ||||
| export type PackedApp = SchemaType<typeof packedAppSchema>; | ||||
| @@ -23,7 +22,7 @@ export class AppRepository extends Repository<App> { | ||||
| 			includeProfileImageIds: false | ||||
| 		}, options); | ||||
|  | ||||
| 		const app = typeof src === 'object' ? src : await this.findOne(src).then(ensure); | ||||
| 		const app = typeof src === 'object' ? src : await this.findOneOrFail(src); | ||||
|  | ||||
| 		return { | ||||
| 			id: app.id, | ||||
|   | ||||
| @@ -1,7 +1,6 @@ | ||||
| import { EntityRepository, Repository } from 'typeorm'; | ||||
| import { Apps } from '..'; | ||||
| import { AuthSession } from '../entities/auth-session'; | ||||
| import { ensure } from '../../prelude/ensure'; | ||||
| import { awaitAll } from '../../prelude/await-all'; | ||||
|  | ||||
| @EntityRepository(AuthSession) | ||||
| @@ -10,7 +9,7 @@ export class AuthSessionRepository extends Repository<AuthSession> { | ||||
| 		src: AuthSession['id'] | AuthSession, | ||||
| 		me?: any | ||||
| 	) { | ||||
| 		const session = typeof src === 'object' ? src : await this.findOne(src).then(ensure); | ||||
| 		const session = typeof src === 'object' ? src : await this.findOneOrFail(src); | ||||
|  | ||||
| 		return await awaitAll({ | ||||
| 			id: session.id, | ||||
|   | ||||
| @@ -1,7 +1,6 @@ | ||||
| import { EntityRepository, Repository } from 'typeorm'; | ||||
| import { Users } from '..'; | ||||
| import { Blocking } from '../entities/blocking'; | ||||
| import { ensure } from '../../prelude/ensure'; | ||||
| import { awaitAll } from '../../prelude/await-all'; | ||||
| import { SchemaType } from '../../misc/schema'; | ||||
|  | ||||
| @@ -13,7 +12,7 @@ export class BlockingRepository extends Repository<Blocking> { | ||||
| 		src: Blocking['id'] | Blocking, | ||||
| 		me?: any | ||||
| 	): Promise<PackedBlocking> { | ||||
| 		const blocking = typeof src === 'object' ? src : await this.findOne(src).then(ensure); | ||||
| 		const blocking = typeof src === 'object' ? src : await this.findOneOrFail(src); | ||||
|  | ||||
| 		return await awaitAll({ | ||||
| 			id: blocking.id, | ||||
|   | ||||
| @@ -1,6 +1,5 @@ | ||||
| import { EntityRepository, Repository } from 'typeorm'; | ||||
| import { Channel } from '../entities/channel'; | ||||
| import { ensure } from '../../prelude/ensure'; | ||||
| import { SchemaType } from '../../misc/schema'; | ||||
| import { DriveFiles, ChannelFollowings, NoteUnreads } from '..'; | ||||
| import { User } from '../entities/user'; | ||||
| @@ -13,7 +12,7 @@ export class ChannelRepository extends Repository<Channel> { | ||||
| 		src: Channel['id'] | Channel, | ||||
| 		me?: User['id'] | User | null | undefined, | ||||
| 	): Promise<PackedChannel> { | ||||
| 		const channel = typeof src === 'object' ? src : await this.findOne(src).then(ensure); | ||||
| 		const channel = typeof src === 'object' ? src : await this.findOneOrFail(src); | ||||
| 		const meId = me ? typeof me === 'string' ? me : me.id : null; | ||||
|  | ||||
| 		const banner = channel.bannerId ? await DriveFiles.findOne(channel.bannerId) : null; | ||||
|   | ||||
| @@ -1,6 +1,5 @@ | ||||
| import { EntityRepository, Repository } from 'typeorm'; | ||||
| import { Clip } from '../entities/clip'; | ||||
| import { ensure } from '../../prelude/ensure'; | ||||
| import { SchemaType } from '../../misc/schema'; | ||||
| import { Users } from '..'; | ||||
| import { awaitAll } from '../../prelude/await-all'; | ||||
| @@ -12,7 +11,7 @@ export class ClipRepository extends Repository<Clip> { | ||||
| 	public async pack( | ||||
| 		src: Clip['id'] | Clip, | ||||
| 	): Promise<PackedClip> { | ||||
| 		const clip = typeof src === 'object' ? src : await this.findOne(src).then(ensure); | ||||
| 		const clip = typeof src === 'object' ? src : await this.findOneOrFail(src); | ||||
|  | ||||
| 		return await awaitAll({ | ||||
| 			id: clip.id, | ||||
|   | ||||
| @@ -3,7 +3,6 @@ import { DriveFile } from '../entities/drive-file'; | ||||
| import { Users, DriveFolders } from '..'; | ||||
| import { User } from '../entities/user'; | ||||
| import { toPuny } from '../../misc/convert-host'; | ||||
| import { ensure } from '../../prelude/ensure'; | ||||
| import { awaitAll } from '../../prelude/await-all'; | ||||
| import { SchemaType } from '../../misc/schema'; | ||||
| import config from '../../config'; | ||||
| @@ -103,7 +102,7 @@ export class DriveFileRepository extends Repository<DriveFile> { | ||||
| 			self: false | ||||
| 		}, options); | ||||
|  | ||||
| 		const file = typeof src === 'object' ? src : await this.findOne(src).then(ensure); | ||||
| 		const file = typeof src === 'object' ? src : await this.findOneOrFail(src); | ||||
|  | ||||
| 		const meta = await fetchMeta(); | ||||
|  | ||||
|   | ||||
| @@ -1,7 +1,6 @@ | ||||
| import { EntityRepository, Repository } from 'typeorm'; | ||||
| import { DriveFolders, DriveFiles } from '..'; | ||||
| import { DriveFolder } from '../entities/drive-folder'; | ||||
| import { ensure } from '../../prelude/ensure'; | ||||
| import { awaitAll } from '../../prelude/await-all'; | ||||
| import { SchemaType } from '../../misc/schema'; | ||||
|  | ||||
| @@ -26,7 +25,7 @@ export class DriveFolderRepository extends Repository<DriveFolder> { | ||||
| 			detail: false | ||||
| 		}, options); | ||||
|  | ||||
| 		const folder = typeof src === 'object' ? src : await this.findOne(src).then(ensure); | ||||
| 		const folder = typeof src === 'object' ? src : await this.findOneOrFail(src); | ||||
|  | ||||
| 		return await awaitAll({ | ||||
| 			id: folder.id, | ||||
|   | ||||
| @@ -1,13 +1,12 @@ | ||||
| import { EntityRepository, Repository } from 'typeorm'; | ||||
| import { Emoji } from '../entities/emoji'; | ||||
| import { ensure } from '../../prelude/ensure'; | ||||
|  | ||||
| @EntityRepository(Emoji) | ||||
| export class EmojiRepository extends Repository<Emoji> { | ||||
| 	public async pack( | ||||
| 		src: Emoji['id'] | Emoji, | ||||
| 	) { | ||||
| 		const emoji = typeof src === 'object' ? src : await this.findOne(src).then(ensure); | ||||
| 		const emoji = typeof src === 'object' ? src : await this.findOneOrFail(src); | ||||
|  | ||||
| 		return { | ||||
| 			id: emoji.id, | ||||
|   | ||||
| @@ -1,7 +1,6 @@ | ||||
| import { EntityRepository, Repository } from 'typeorm'; | ||||
| import { FollowRequest } from '../entities/follow-request'; | ||||
| import { Users } from '..'; | ||||
| import { ensure } from '../../prelude/ensure'; | ||||
|  | ||||
| @EntityRepository(FollowRequest) | ||||
| export class FollowRequestRepository extends Repository<FollowRequest> { | ||||
| @@ -9,7 +8,7 @@ export class FollowRequestRepository extends Repository<FollowRequest> { | ||||
| 		src: FollowRequest['id'] | FollowRequest, | ||||
| 		me?: any | ||||
| 	) { | ||||
| 		const request = typeof src === 'object' ? src : await this.findOne(src).then(ensure); | ||||
| 		const request = typeof src === 'object' ? src : await this.findOneOrFail(src); | ||||
|  | ||||
| 		return { | ||||
| 			id: request.id, | ||||
|   | ||||
| @@ -1,7 +1,6 @@ | ||||
| import { EntityRepository, Repository } from 'typeorm'; | ||||
| import { Users } from '..'; | ||||
| import { Following } from '../entities/following'; | ||||
| import { ensure } from '../../prelude/ensure'; | ||||
| import { awaitAll } from '../../prelude/await-all'; | ||||
| import { SchemaType } from '../../misc/schema'; | ||||
|  | ||||
| @@ -57,7 +56,7 @@ export class FollowingRepository extends Repository<Following> { | ||||
| 			populateFollower?: boolean; | ||||
| 		} | ||||
| 	): Promise<PackedFollowing> { | ||||
| 		const following = typeof src === 'object' ? src : await this.findOne(src).then(ensure); | ||||
| 		const following = typeof src === 'object' ? src : await this.findOneOrFail(src); | ||||
|  | ||||
| 		if (opts == null) opts = {}; | ||||
|  | ||||
|   | ||||
| @@ -1,7 +1,6 @@ | ||||
| import { EntityRepository, Repository } from 'typeorm'; | ||||
| import { Users } from '../../..'; | ||||
| import { ReversiGame } from '../../../entities/games/reversi/game'; | ||||
| import { ensure } from '../../../../prelude/ensure'; | ||||
|  | ||||
| @EntityRepository(ReversiGame) | ||||
| export class ReversiGameRepository extends Repository<ReversiGame> { | ||||
| @@ -16,7 +15,7 @@ export class ReversiGameRepository extends Repository<ReversiGame> { | ||||
| 			detail: true | ||||
| 		}, options); | ||||
|  | ||||
| 		const game = typeof src === 'object' ? src : await this.findOne(src).then(ensure); | ||||
| 		const game = typeof src === 'object' ? src : await this.findOneOrFail(src); | ||||
| 		const meId = me ? typeof me === 'string' ? me : me.id : null; | ||||
|  | ||||
| 		return { | ||||
|   | ||||
| @@ -1,7 +1,6 @@ | ||||
| import { EntityRepository, Repository } from 'typeorm'; | ||||
| import { ReversiMatching } from '../../../entities/games/reversi/matching'; | ||||
| import { Users } from '../../..'; | ||||
| import { ensure } from '../../../../prelude/ensure'; | ||||
| import { awaitAll } from '../../../../prelude/await-all'; | ||||
|  | ||||
| @EntityRepository(ReversiMatching) | ||||
| @@ -10,7 +9,7 @@ export class ReversiMatchingRepository extends Repository<ReversiMatching> { | ||||
| 		src: ReversiMatching['id'] | ReversiMatching, | ||||
| 		me: any | ||||
| 	) { | ||||
| 		const matching = typeof src === 'object' ? src : await this.findOne(src).then(ensure); | ||||
| 		const matching = typeof src === 'object' ? src : await this.findOneOrFail(src); | ||||
|  | ||||
| 		return await awaitAll({ | ||||
| 			id: matching.id, | ||||
|   | ||||
| @@ -1,7 +1,6 @@ | ||||
| import { EntityRepository, Repository } from 'typeorm'; | ||||
| import { MessagingMessage } from '../entities/messaging-message'; | ||||
| import { Users, DriveFiles, UserGroups } from '..'; | ||||
| import { ensure } from '../../prelude/ensure'; | ||||
| import { SchemaType } from '../../misc/schema'; | ||||
|  | ||||
| export type PackedMessagingMessage = SchemaType<typeof packedMessagingMessageSchema>; | ||||
| @@ -25,7 +24,7 @@ export class MessagingMessageRepository extends Repository<MessagingMessage> { | ||||
| 			populateGroup: true, | ||||
| 		}; | ||||
|  | ||||
| 		const message = typeof src === 'object' ? src : await this.findOne(src).then(ensure); | ||||
| 		const message = typeof src === 'object' ? src : await this.findOneOrFail(src); | ||||
|  | ||||
| 		return { | ||||
| 			id: message.id, | ||||
|   | ||||
| @@ -1,7 +1,6 @@ | ||||
| import { EntityRepository, Repository } from 'typeorm'; | ||||
| import { Users } from '..'; | ||||
| import { ModerationLog } from '../entities/moderation-log'; | ||||
| import { ensure } from '../../prelude/ensure'; | ||||
| import { awaitAll } from '../../prelude/await-all'; | ||||
|  | ||||
| @EntityRepository(ModerationLog) | ||||
| @@ -9,7 +8,7 @@ export class ModerationLogRepository extends Repository<ModerationLog> { | ||||
| 	public async pack( | ||||
| 		src: ModerationLog['id'] | ModerationLog, | ||||
| 	) { | ||||
| 		const log = typeof src === 'object' ? src : await this.findOne(src).then(ensure); | ||||
| 		const log = typeof src === 'object' ? src : await this.findOneOrFail(src); | ||||
|  | ||||
| 		return await awaitAll({ | ||||
| 			id: log.id, | ||||
|   | ||||
| @@ -1,7 +1,6 @@ | ||||
| import { EntityRepository, Repository } from 'typeorm'; | ||||
| import { Users } from '..'; | ||||
| import { Muting } from '../entities/muting'; | ||||
| import { ensure } from '../../prelude/ensure'; | ||||
| import { awaitAll } from '../../prelude/await-all'; | ||||
| import { SchemaType } from '../../misc/schema'; | ||||
|  | ||||
| @@ -13,7 +12,7 @@ export class MutingRepository extends Repository<Muting> { | ||||
| 		src: Muting['id'] | Muting, | ||||
| 		me?: any | ||||
| 	): Promise<PackedMuting> { | ||||
| 		const muting = typeof src === 'object' ? src : await this.findOne(src).then(ensure); | ||||
| 		const muting = typeof src === 'object' ? src : await this.findOneOrFail(src); | ||||
|  | ||||
| 		return await awaitAll({ | ||||
| 			id: muting.id, | ||||
|   | ||||
| @@ -1,7 +1,6 @@ | ||||
| import { EntityRepository, Repository } from 'typeorm'; | ||||
| import { NoteFavorite } from '../entities/note-favorite'; | ||||
| import { Notes } from '..'; | ||||
| import { ensure } from '../../prelude/ensure'; | ||||
|  | ||||
| @EntityRepository(NoteFavorite) | ||||
| export class NoteFavoriteRepository extends Repository<NoteFavorite> { | ||||
| @@ -9,7 +8,7 @@ export class NoteFavoriteRepository extends Repository<NoteFavorite> { | ||||
| 		src: NoteFavorite['id'] | NoteFavorite, | ||||
| 		me?: any | ||||
| 	) { | ||||
| 		const favorite = typeof src === 'object' ? src : await this.findOne(src).then(ensure); | ||||
| 		const favorite = typeof src === 'object' ? src : await this.findOneOrFail(src); | ||||
|  | ||||
| 		return { | ||||
| 			id: favorite.id, | ||||
|   | ||||
| @@ -1,7 +1,6 @@ | ||||
| import { EntityRepository, Repository } from 'typeorm'; | ||||
| import { NoteReaction } from '../entities/note-reaction'; | ||||
| import { Users } from '..'; | ||||
| import { ensure } from '../../prelude/ensure'; | ||||
| import { SchemaType } from '../../misc/schema'; | ||||
| import { convertLegacyReaction } from '../../misc/reaction-lib'; | ||||
|  | ||||
| @@ -13,7 +12,7 @@ export class NoteReactionRepository extends Repository<NoteReaction> { | ||||
| 		src: NoteReaction['id'] | NoteReaction, | ||||
| 		me?: any | ||||
| 	): Promise<PackedNoteReaction> { | ||||
| 		const reaction = typeof src === 'object' ? src : await this.findOne(src).then(ensure); | ||||
| 		const reaction = typeof src === 'object' ? src : await this.findOneOrFail(src); | ||||
|  | ||||
| 		return { | ||||
| 			id: reaction.id, | ||||
|   | ||||
| @@ -2,7 +2,6 @@ import { EntityRepository, Repository, In } from 'typeorm'; | ||||
| import { Note } from '../entities/note'; | ||||
| import { User } from '../entities/user'; | ||||
| import { Emojis, Users, PollVotes, DriveFiles, NoteReactions, Followings, Polls, Channels } from '..'; | ||||
| import { ensure } from '../../prelude/ensure'; | ||||
| import { SchemaType } from '../../misc/schema'; | ||||
| import { awaitAll } from '../../prelude/await-all'; | ||||
| import { convertLegacyReaction, convertLegacyReactions, decodeReaction } from '../../misc/reaction-lib'; | ||||
| @@ -92,11 +91,11 @@ export class NoteRepository extends Repository<Note> { | ||||
| 		}, options); | ||||
|  | ||||
| 		const meId = me ? typeof me === 'string' ? me : me.id : null; | ||||
| 		const note = typeof src === 'object' ? src : await this.findOne(src).then(ensure); | ||||
| 		const note = typeof src === 'object' ? src : await this.findOneOrFail(src); | ||||
| 		const host = note.userHost; | ||||
|  | ||||
| 		async function populatePoll() { | ||||
| 			const poll = await Polls.findOne(note.id).then(ensure); | ||||
| 			const poll = await Polls.findOneOrFail(note.id); | ||||
| 			const choices = poll.choices.map(c => ({ | ||||
| 				text: c, | ||||
| 				votes: poll.votes[poll.choices.indexOf(c)], | ||||
|   | ||||
| @@ -1,7 +1,6 @@ | ||||
| import { EntityRepository, Repository } from 'typeorm'; | ||||
| import { Users, Notes, UserGroupInvitations, AccessTokens } from '..'; | ||||
| import { Notification } from '../entities/notification'; | ||||
| import { ensure } from '../../prelude/ensure'; | ||||
| import { awaitAll } from '../../prelude/await-all'; | ||||
| import { SchemaType } from '../../misc/schema'; | ||||
|  | ||||
| @@ -12,8 +11,8 @@ export class NotificationRepository extends Repository<Notification> { | ||||
| 	public async pack( | ||||
| 		src: Notification['id'] | Notification, | ||||
| 	): Promise<PackedNotification> { | ||||
| 		const notification = typeof src === 'object' ? src : await this.findOne(src).then(ensure); | ||||
| 		const token = notification.appAccessTokenId ? await AccessTokens.findOne(notification.appAccessTokenId).then(ensure) : null; | ||||
| 		const notification = typeof src === 'object' ? src : await this.findOneOrFail(src); | ||||
| 		const token = notification.appAccessTokenId ? await AccessTokens.findOneOrFail(notification.appAccessTokenId) : null; | ||||
|  | ||||
| 		return await awaitAll({ | ||||
| 			id: notification.id, | ||||
|   | ||||
| @@ -1,7 +1,6 @@ | ||||
| import { EntityRepository, Repository } from 'typeorm'; | ||||
| import { PageLike } from '../entities/page-like'; | ||||
| import { Pages } from '..'; | ||||
| import { ensure } from '../../prelude/ensure'; | ||||
|  | ||||
| @EntityRepository(PageLike) | ||||
| export class PageLikeRepository extends Repository<PageLike> { | ||||
| @@ -9,7 +8,7 @@ export class PageLikeRepository extends Repository<PageLike> { | ||||
| 		src: PageLike['id'] | PageLike, | ||||
| 		me?: any | ||||
| 	) { | ||||
| 		const like = typeof src === 'object' ? src : await this.findOne(src).then(ensure); | ||||
| 		const like = typeof src === 'object' ? src : await this.findOneOrFail(src); | ||||
|  | ||||
| 		return { | ||||
| 			id: like.id, | ||||
|   | ||||
| @@ -5,7 +5,6 @@ import { Users, DriveFiles, PageLikes } from '..'; | ||||
| import { awaitAll } from '../../prelude/await-all'; | ||||
| import { DriveFile } from '../entities/drive-file'; | ||||
| import { User } from '../entities/user'; | ||||
| import { ensure } from '../../prelude/ensure'; | ||||
|  | ||||
| export type PackedPage = SchemaType<typeof packedPageSchema>; | ||||
|  | ||||
| @@ -16,7 +15,7 @@ export class PageRepository extends Repository<Page> { | ||||
| 		me?: User['id'] | User | null | undefined, | ||||
| 	): Promise<PackedPage> { | ||||
| 		const meId = me ? typeof me === 'string' ? me : me.id : null; | ||||
| 		const page = typeof src === 'object' ? src : await this.findOne(src).then(ensure); | ||||
| 		const page = typeof src === 'object' ? src : await this.findOneOrFail(src); | ||||
|  | ||||
| 		const attachedFiles: Promise<DriveFile | undefined>[] = []; | ||||
| 		const collectFile = (xs: any[]) => { | ||||
|   | ||||
| @@ -1,14 +1,13 @@ | ||||
| import { EntityRepository, Repository } from 'typeorm'; | ||||
| import { UserGroupInvitation } from '../entities/user-group-invitation'; | ||||
| import { UserGroups } from '..'; | ||||
| import { ensure } from '../../prelude/ensure'; | ||||
|  | ||||
| @EntityRepository(UserGroupInvitation) | ||||
| export class UserGroupInvitationRepository extends Repository<UserGroupInvitation> { | ||||
| 	public async pack( | ||||
| 		src: UserGroupInvitation['id'] | UserGroupInvitation, | ||||
| 	) { | ||||
| 		const invitation = typeof src === 'object' ? src : await this.findOne(src).then(ensure); | ||||
| 		const invitation = typeof src === 'object' ? src : await this.findOneOrFail(src); | ||||
|  | ||||
| 		return { | ||||
| 			id: invitation.id, | ||||
|   | ||||
| @@ -1,6 +1,5 @@ | ||||
| import { EntityRepository, Repository } from 'typeorm'; | ||||
| import { UserGroup } from '../entities/user-group'; | ||||
| import { ensure } from '../../prelude/ensure'; | ||||
| import { UserGroupJoinings } from '..'; | ||||
| import { SchemaType } from '../../misc/schema'; | ||||
|  | ||||
| @@ -11,7 +10,7 @@ export class UserGroupRepository extends Repository<UserGroup> { | ||||
| 	public async pack( | ||||
| 		src: UserGroup['id'] | UserGroup, | ||||
| 	): Promise<PackedUserGroup> { | ||||
| 		const userGroup = typeof src === 'object' ? src : await this.findOne(src).then(ensure); | ||||
| 		const userGroup = typeof src === 'object' ? src : await this.findOneOrFail(src); | ||||
|  | ||||
| 		const users = await UserGroupJoinings.find({ | ||||
| 			userGroupId: userGroup.id | ||||
|   | ||||
| @@ -1,6 +1,5 @@ | ||||
| import { EntityRepository, Repository } from 'typeorm'; | ||||
| import { UserList } from '../entities/user-list'; | ||||
| import { ensure } from '../../prelude/ensure'; | ||||
| import { UserListJoinings } from '..'; | ||||
| import { SchemaType } from '../../misc/schema'; | ||||
|  | ||||
| @@ -11,7 +10,7 @@ export class UserListRepository extends Repository<UserList> { | ||||
| 	public async pack( | ||||
| 		src: UserList['id'] | UserList, | ||||
| 	): Promise<PackedUserList> { | ||||
| 		const userList = typeof src === 'object' ? src : await this.findOne(src).then(ensure); | ||||
| 		const userList = typeof src === 'object' ? src : await this.findOneOrFail(src); | ||||
|  | ||||
| 		const users = await UserListJoinings.find({ | ||||
| 			userListId: userList.id | ||||
|   | ||||
| @@ -2,7 +2,6 @@ import $ from 'cafy'; | ||||
| import { EntityRepository, Repository, In, Not } from 'typeorm'; | ||||
| import { User, ILocalUser, IRemoteUser } from '../entities/user'; | ||||
| import { Emojis, Notes, NoteUnreads, FollowRequests, Notifications, MessagingMessages, UserNotePinings, Followings, Blockings, Mutings, UserProfiles, UserSecurityKeys, UserGroupJoinings, Pages, Announcements, AnnouncementReads, Antennas, AntennaNotes, ChannelFollowings, Instances } from '..'; | ||||
| import { ensure } from '../../prelude/ensure'; | ||||
| import config from '../../config'; | ||||
| import { SchemaType } from '../../misc/schema'; | ||||
| import { awaitAll } from '../../prelude/await-all'; | ||||
| @@ -157,7 +156,7 @@ export class UserRepository extends Repository<User> { | ||||
| 			includeSecrets: false | ||||
| 		}, options); | ||||
|  | ||||
| 		const user = typeof src === 'object' ? src : await this.findOne(src).then(ensure); | ||||
| 		const user = typeof src === 'object' ? src : await this.findOneOrFail(src); | ||||
| 		const meId = me ? typeof me === 'string' ? me : me.id : null; | ||||
|  | ||||
| 		const relation = meId && (meId !== user.id) && opts.detail ? await this.getRelation(meId, user.id) : null; | ||||
| @@ -165,7 +164,7 @@ export class UserRepository extends Repository<User> { | ||||
| 			where: { userId: user.id }, | ||||
| 			order: { id: 'DESC' } | ||||
| 		}) : []; | ||||
| 		const profile = opts.detail ? await UserProfiles.findOne(user.id).then(ensure) : null; | ||||
| 		const profile = opts.detail ? await UserProfiles.findOneOrFail(user.id) : null; | ||||
|  | ||||
| 		const falsy = opts.detail ? false : undefined; | ||||
|  | ||||
|   | ||||
| @@ -1,10 +0,0 @@ | ||||
| /** | ||||
|  * 値が null または undefined の場合はエラーを発生させ、そうでない場合は値をそのまま返します | ||||
|  */ | ||||
| export function ensure<T>(x: T): NonNullable<T> { | ||||
| 	if (x == null) { | ||||
| 		throw new Error('ぬるぽ'); | ||||
| 	} else { | ||||
| 		return x!; | ||||
| 	} | ||||
| } | ||||
| @@ -9,7 +9,6 @@ import { Users, Notes, Polls } from '../../../models'; | ||||
| import { MoreThan } from 'typeorm'; | ||||
| import { Note } from '../../../models/entities/note'; | ||||
| import { Poll } from '../../../models/entities/poll'; | ||||
| import { ensure } from '../../../prelude/ensure'; | ||||
|  | ||||
| const logger = queueLogger.createSubLogger('export-notes'); | ||||
|  | ||||
| @@ -70,7 +69,7 @@ export async function exportNotes(job: Bull.Job, done: any): Promise<void> { | ||||
| 		for (const note of notes) { | ||||
| 			let poll: Poll | undefined; | ||||
| 			if (note.hasPoll) { | ||||
| 				poll = await Polls.findOne({ noteId: note.id }).then(ensure); | ||||
| 				poll = await Polls.findOneOrFail({ noteId: note.id }); | ||||
| 			} | ||||
| 			const content = JSON.stringify(serialize(note, poll)); | ||||
| 			await new Promise((res, rej) => { | ||||
|   | ||||
| @@ -6,7 +6,6 @@ import { MessagingMessage } from '../../models/entities/messaging-message'; | ||||
| import { Notes, Users, UserPublickeys, MessagingMessages } from '../../models'; | ||||
| import { IObject, getApId } from './type'; | ||||
| import { resolvePerson } from './models/person'; | ||||
| import { ensure } from '../../prelude/ensure'; | ||||
| import escapeRegexp = require('escape-regexp'); | ||||
|  | ||||
| export default class DbResolver { | ||||
| @@ -99,7 +98,7 @@ export default class DbResolver { | ||||
|  | ||||
| 		if (user == null) return null; | ||||
|  | ||||
| 		const key = await UserPublickeys.findOne(user.id).then(ensure); | ||||
| 		const key = await UserPublickeys.findOneOrFail(user.id); | ||||
|  | ||||
| 		return { | ||||
| 			user, | ||||
|   | ||||
| @@ -5,7 +5,6 @@ import { fetchMeta } from '../../../misc/fetch-meta'; | ||||
| import { apLogger } from '../logger'; | ||||
| import { DriveFile } from '../../../models/entities/drive-file'; | ||||
| import { DriveFiles } from '../../../models'; | ||||
| import { ensure } from '../../../prelude/ensure'; | ||||
|  | ||||
| const logger = apLogger; | ||||
|  | ||||
| @@ -40,7 +39,7 @@ export async function createImage(actor: IRemoteUser, value: any): Promise<Drive | ||||
| 				uri: image.url | ||||
| 			}); | ||||
|  | ||||
| 			file = await DriveFiles.findOne(file.id).then(ensure); | ||||
| 			file = await DriveFiles.findOneOrFail(file.id); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
|   | ||||
| @@ -21,7 +21,6 @@ import { IObject, getOneApId, getApId, getOneApHrefNullable, validPost, IPost, i | ||||
| import { Emoji } from '../../../models/entities/emoji'; | ||||
| import { genId } from '../../../misc/gen-id'; | ||||
| import { fetchMeta } from '../../../misc/fetch-meta'; | ||||
| import { ensure } from '../../../prelude/ensure'; | ||||
| import { getApLock } from '../../../misc/app-lock'; | ||||
| import { createMessage } from '../../../services/messages/create'; | ||||
| import { parseAudience } from '../audience'; | ||||
| @@ -201,7 +200,7 @@ export async function createNote(value: string | IObject, resolver?: Resolver, s | ||||
|  | ||||
| 	// vote | ||||
| 	if (reply && reply.hasPoll) { | ||||
| 		const poll = await Polls.findOne(reply.id).then(ensure); | ||||
| 		const poll = await Polls.findOneOrFail(reply.id); | ||||
|  | ||||
| 		const tryCreateVote = async (name: string, index: number): Promise<null> => { | ||||
| 			if (poll.expiresAt && Date.now() > new Date(poll.expiresAt).getTime()) { | ||||
|   | ||||
| @@ -24,7 +24,6 @@ import { toPuny } from '../../../misc/convert-host'; | ||||
| import { UserProfile } from '../../../models/entities/user-profile'; | ||||
| import { validActor } from '../../../remote/activitypub/type'; | ||||
| import { getConnection } from 'typeorm'; | ||||
| import { ensure } from '../../../prelude/ensure'; | ||||
| import { toArray } from '../../../prelude/array'; | ||||
| import { fetchInstanceMetadata } from '../../../services/fetch-instance-metadata'; | ||||
| import { normalizeForSearch } from '../../../misc/normalize-for-search'; | ||||
| @@ -457,7 +456,7 @@ export function analyzeAttachments(attachments: IObject | IObject[] | undefined) | ||||
| } | ||||
|  | ||||
| export async function updateFeatured(userId: User['id']) { | ||||
| 	const user = await Users.findOne(userId).then(ensure); | ||||
| 	const user = await Users.findOneOrFail(userId); | ||||
| 	if (!Users.isRemoteUser(user)) return; | ||||
| 	if (!user.featured) return; | ||||
|  | ||||
|   | ||||
| @@ -1,13 +1,12 @@ | ||||
| import config from '../../../config'; | ||||
| import { Users } from '../../../models'; | ||||
| import { User } from '../../../models/entities/user'; | ||||
| import { ensure } from '../../../prelude/ensure'; | ||||
|  | ||||
| /** | ||||
|  * Convert (local|remote)(Follower|Followee)ID to URL | ||||
|  * @param id Follower|Followee ID | ||||
|  */ | ||||
| export default async function renderFollowUser(id: User['id']): Promise<any> { | ||||
| 	const user = await Users.findOne(id).then(ensure); | ||||
| 	const user = await Users.findOneOrFail(id); | ||||
| 	return Users.isLocalUser(user) ? `${config.url}/users/${user.id}` : user.uri; | ||||
| } | ||||
|   | ||||
| @@ -4,7 +4,6 @@ import { IActivity } from '../type'; | ||||
| import { LdSignature } from '../misc/ld-signature'; | ||||
| import { ILocalUser } from '../../../models/entities/user'; | ||||
| import { UserKeypairs } from '../../../models'; | ||||
| import { ensure } from '../../../prelude/ensure'; | ||||
|  | ||||
| export const renderActivity = (x: any): IActivity | null => { | ||||
| 	if (x == null) return null; | ||||
| @@ -24,9 +23,9 @@ export const renderActivity = (x: any): IActivity | null => { | ||||
| export const attachLdSignature = async (activity: any, user: ILocalUser): Promise<IActivity | null> => { | ||||
| 	if (activity == null) return null; | ||||
|  | ||||
| 	const keypair = await UserKeypairs.findOne({ | ||||
| 	const keypair = await UserKeypairs.findOneOrFail({ | ||||
| 		userId: user.id | ||||
| 	}).then(ensure); | ||||
| 	}); | ||||
|  | ||||
| 	const obj = { | ||||
| 		// as non-standards | ||||
|   | ||||
| @@ -10,7 +10,6 @@ import { DriveFiles, Notes, Users, Emojis, Polls } from '../../../models'; | ||||
| import { In } from 'typeorm'; | ||||
| import { Emoji } from '../../../models/entities/emoji'; | ||||
| import { Poll } from '../../../models/entities/poll'; | ||||
| import { ensure } from '../../../prelude/ensure'; | ||||
|  | ||||
| export default async function renderNote(note: Note, dive = true, isTalk = false): Promise<any> { | ||||
| 	const getPromisedFiles = async (ids: string[]) => { | ||||
| @@ -54,7 +53,7 @@ export default async function renderNote(note: Note, dive = true, isTalk = false | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	const user = await Users.findOne(note.userId).then(ensure); | ||||
| 	const user = await Users.findOneOrFail(note.userId); | ||||
|  | ||||
| 	const attributedTo = `${config.url}/users/${user.id}`; | ||||
|  | ||||
|   | ||||
| @@ -9,7 +9,6 @@ import renderEmoji from './emoji'; | ||||
| import { IIdentifier } from '../models/identifier'; | ||||
| import renderHashtag from './hashtag'; | ||||
| import { DriveFiles, UserProfiles, UserKeypairs } from '../../../models'; | ||||
| import { ensure } from '../../../prelude/ensure'; | ||||
|  | ||||
| export async function renderPerson(user: ILocalUser) { | ||||
| 	const id = `${config.url}/users/${user.id}`; | ||||
| @@ -18,7 +17,7 @@ export async function renderPerson(user: ILocalUser) { | ||||
| 	const [avatar, banner, profile] = await Promise.all([ | ||||
| 		user.avatarId ? DriveFiles.findOne(user.avatarId) : Promise.resolve(undefined), | ||||
| 		user.bannerId ? DriveFiles.findOne(user.bannerId) : Promise.resolve(undefined), | ||||
| 		UserProfiles.findOne(user.id).then(ensure) | ||||
| 		UserProfiles.findOneOrFail(user.id) | ||||
| 	]); | ||||
|  | ||||
| 	const attachment: { | ||||
| @@ -50,7 +49,7 @@ export async function renderPerson(user: ILocalUser) { | ||||
| 		...hashtagTags, | ||||
| 	]; | ||||
|  | ||||
| 	const keypair = await UserKeypairs.findOne(user.id).then(ensure); | ||||
| 	const keypair = await UserKeypairs.findOneOrFail(user.id); | ||||
|  | ||||
| 	const person = { | ||||
| 		type: isSystem ? 'Application' : user.isBot ? 'Service' : 'Person', | ||||
|   | ||||
| @@ -6,7 +6,6 @@ import * as crypto from 'crypto'; | ||||
| import config from '../../config'; | ||||
| import { ILocalUser } from '../../models/entities/user'; | ||||
| import { UserKeypairs } from '../../models'; | ||||
| import { ensure } from '../../prelude/ensure'; | ||||
| import { getAgentByUrl } from '../../misc/fetch'; | ||||
| import { URL } from 'url'; | ||||
| import got from 'got'; | ||||
| @@ -23,9 +22,9 @@ export default async (user: ILocalUser, url: string, object: any) => { | ||||
| 	sha256.update(data); | ||||
| 	const hash = sha256.digest('base64'); | ||||
|  | ||||
| 	const keypair = await UserKeypairs.findOne({ | ||||
| 	const keypair = await UserKeypairs.findOneOrFail({ | ||||
| 		userId: user.id | ||||
| 	}).then(ensure); | ||||
| 	}); | ||||
|  | ||||
| 	await new Promise((resolve, reject) => { | ||||
| 		const req = https.request({ | ||||
| @@ -75,9 +74,9 @@ export default async (user: ILocalUser, url: string, object: any) => { | ||||
| export async function signedGet(url: string, user: ILocalUser) { | ||||
| 	const timeout = 10 * 1000; | ||||
|  | ||||
| 	const keypair = await UserKeypairs.findOne({ | ||||
| 	const keypair = await UserKeypairs.findOneOrFail({ | ||||
| 		userId: user.id | ||||
| 	}).then(ensure); | ||||
| 	}); | ||||
|  | ||||
| 	const req = got.get<any>(url, { | ||||
| 		headers: { | ||||
|   | ||||
| @@ -16,7 +16,6 @@ import { isSelfHost } from '../misc/convert-host'; | ||||
| import { Notes, Users, Emojis, UserKeypairs, NoteReactions } from '../models'; | ||||
| import { ILocalUser, User } from '../models/entities/user'; | ||||
| import { In } from 'typeorm'; | ||||
| import { ensure } from '../prelude/ensure'; | ||||
| import { renderLike } from '../remote/activitypub/renderer/like'; | ||||
|  | ||||
| // Init router | ||||
| @@ -136,7 +135,7 @@ router.get('/users/:user/publickey', async ctx => { | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	const keypair = await UserKeypairs.findOne(user.id).then(ensure); | ||||
| 	const keypair = await UserKeypairs.findOneOrFail(user.id); | ||||
|  | ||||
| 	if (Users.isLocalUser(user)) { | ||||
| 		ctx.body = renderActivity(renderKey(user, keypair)); | ||||
|   | ||||
| @@ -5,7 +5,6 @@ import renderOrderedCollection from '../../remote/activitypub/renderer/ordered-c | ||||
| import { setResponseType } from '../activitypub'; | ||||
| import renderNote from '../../remote/activitypub/renderer/note'; | ||||
| import { Users, Notes, UserNotePinings } from '../../models'; | ||||
| import { ensure } from '../../prelude/ensure'; | ||||
|  | ||||
| export default async (ctx: Router.RouterContext) => { | ||||
| 	const userId = ctx.params.user; | ||||
| @@ -27,7 +26,7 @@ export default async (ctx: Router.RouterContext) => { | ||||
| 	}); | ||||
|  | ||||
| 	const pinnedNotes = await Promise.all(pinings.map(pining => | ||||
| 		Notes.findOne(pining.noteId).then(ensure))); | ||||
| 		Notes.findOneOrFail(pining.noteId))); | ||||
|  | ||||
| 	const renderedNotes = await Promise.all(pinnedNotes.map(note => renderNote(note))); | ||||
|  | ||||
|   | ||||
| @@ -15,7 +15,6 @@ import { Users, Notes } from '../../models'; | ||||
| import { makePaginationQuery } from '../api/common/make-pagination-query'; | ||||
| import { Brackets } from 'typeorm'; | ||||
| import { Note } from '../../models/entities/note'; | ||||
| import { ensure } from '../../prelude/ensure'; | ||||
|  | ||||
| export default async (ctx: Router.RouterContext) => { | ||||
| 	const userId = ctx.params.user; | ||||
| @@ -101,7 +100,7 @@ export default async (ctx: Router.RouterContext) => { | ||||
|  */ | ||||
| export async function packActivity(note: Note): Promise<any> { | ||||
| 	if (note.renoteId && note.text == null && !note.hasPoll && (note.fileIds == null || note.fileIds.length === 0)) { | ||||
| 		const renote = await Notes.findOne(note.renoteId).then(ensure); | ||||
| 		const renote = await Notes.findOneOrFail(note.renoteId); | ||||
| 		return renderAnnounce(renote.uri ? renote.uri : `${config.url}/notes/${renote.id}`, note); | ||||
| 	} | ||||
|  | ||||
|   | ||||
| @@ -1,7 +1,6 @@ | ||||
| import isNativeToken from './common/is-native-token'; | ||||
| import { User } from '../../models/entities/user'; | ||||
| import { Users, AccessTokens, Apps } from '../../models'; | ||||
| import { ensure } from '../../prelude/ensure'; | ||||
| import { AccessToken } from '../../models/entities/access-token'; | ||||
|  | ||||
| export default async (token: string): Promise<[User | null | undefined, AccessToken | null | undefined]> => { | ||||
| @@ -43,7 +42,7 @@ export default async (token: string): Promise<[User | null | undefined, AccessTo | ||||
|  | ||||
| 		if (accessToken.appId) { | ||||
| 			const app = await Apps | ||||
| 				.findOne(accessToken.appId).then(ensure); | ||||
| 				.findOneOrFail(accessToken.appId); | ||||
|  | ||||
| 			return [user, { | ||||
| 				id: accessToken.id, | ||||
|   | ||||
| @@ -3,7 +3,6 @@ import { Note } from '../../../models/entities/note'; | ||||
| import { User } from '../../../models/entities/user'; | ||||
| import { Notes, UserProfiles, NoteReactions } from '../../../models'; | ||||
| import { generateMutedUserQuery } from './generate-muted-user-query'; | ||||
| import { ensure } from '../../../prelude/ensure'; | ||||
|  | ||||
| // TODO: リアクション、Renote、返信などをしたノートは除外する | ||||
|  | ||||
| @@ -11,7 +10,7 @@ export async function injectFeatured(timeline: Note[], user?: User | null) { | ||||
| 	if (timeline.length < 5) return; | ||||
|  | ||||
| 	if (user) { | ||||
| 		const profile = await UserProfiles.findOne(user.id).then(ensure); | ||||
| 		const profile = await UserProfiles.findOneOrFail(user.id); | ||||
| 		if (!profile.injectFeaturedNote) return; | ||||
| 	} | ||||
|  | ||||
|   | ||||
| @@ -2,7 +2,6 @@ import rndstr from 'rndstr'; | ||||
| import { Note } from '../../../models/entities/note'; | ||||
| import { User } from '../../../models/entities/user'; | ||||
| import { PromoReads, PromoNotes, Notes, Users } from '../../../models'; | ||||
| import { ensure } from '../../../prelude/ensure'; | ||||
|  | ||||
| export async function injectPromo(timeline: Note[], user?: User | null) { | ||||
| 	if (timeline.length < 5) return; | ||||
| @@ -23,10 +22,10 @@ export async function injectPromo(timeline: Note[], user?: User | null) { | ||||
| 	// Pick random promo | ||||
| 	const promo = promos[Math.floor(Math.random() * promos.length)]; | ||||
|  | ||||
| 	const note = await Notes.findOne(promo.noteId).then(ensure); | ||||
| 	const note = await Notes.findOneOrFail(promo.noteId); | ||||
|  | ||||
| 	// Join | ||||
| 	note.user = await Users.findOne(note.userId).then(ensure); | ||||
| 	note.user = await Users.findOneOrFail(note.userId); | ||||
|  | ||||
| 	(note as any)._prId_ = rndstr('a-z0-9', 8); | ||||
|  | ||||
|   | ||||
| @@ -2,7 +2,6 @@ import $ from 'cafy'; | ||||
| import define from '../../../define'; | ||||
| import deleteFollowing from '../../../../../services/following/delete'; | ||||
| import { Followings, Users } from '../../../../../models'; | ||||
| import { ensure } from '../../../../../prelude/ensure'; | ||||
|  | ||||
| export const meta = { | ||||
| 	tags: ['admin'], | ||||
| @@ -23,8 +22,8 @@ export default define(meta, async (ps, me) => { | ||||
| 	}); | ||||
|  | ||||
| 	const pairs = await Promise.all(followings.map(f => Promise.all([ | ||||
| 		Users.findOne(f.followerId).then(ensure), | ||||
| 		Users.findOne(f.followeeId).then(ensure) | ||||
| 		Users.findOneOrFail(f.followerId), | ||||
| 		Users.findOneOrFail(f.followeeId) | ||||
| 	]))); | ||||
|  | ||||
| 	for (const pair of pairs) { | ||||
|   | ||||
| @@ -4,7 +4,6 @@ import define from '../../define'; | ||||
| import { ApiError } from '../../error'; | ||||
| import { AuthSessions, AccessTokens, Apps } from '../../../../models'; | ||||
| import { genId } from '../../../../misc/gen-id'; | ||||
| import { ensure } from '../../../../prelude/ensure'; | ||||
| import { secureRndstr } from '../../../../misc/secure-rndstr'; | ||||
|  | ||||
| export const meta = { | ||||
| @@ -49,7 +48,7 @@ export default define(meta, async (ps, user) => { | ||||
|  | ||||
| 	if (exist == null) { | ||||
| 		// Lookup app | ||||
| 		const app = await Apps.findOne(session.appId).then(ensure); | ||||
| 		const app = await Apps.findOneOrFail(session.appId); | ||||
|  | ||||
| 		// Generate Hash | ||||
| 		const sha256 = crypto.createHash('sha256'); | ||||
|   | ||||
| @@ -2,7 +2,6 @@ import $ from 'cafy'; | ||||
| import define from '../../../define'; | ||||
| import { ApiError } from '../../../error'; | ||||
| import { Apps, AuthSessions, AccessTokens, Users } from '../../../../../models'; | ||||
| import { ensure } from '../../../../../prelude/ensure'; | ||||
|  | ||||
| export const meta = { | ||||
| 	tags: ['auth'], | ||||
| @@ -92,10 +91,10 @@ export default define(meta, async (ps) => { | ||||
| 	} | ||||
|  | ||||
| 	// Lookup access token | ||||
| 	const accessToken = await AccessTokens.findOne({ | ||||
| 	const accessToken = await AccessTokens.findOneOrFail({ | ||||
| 		appId: app.id, | ||||
| 		userId: session.userId | ||||
| 	}).then(ensure); | ||||
| 	}); | ||||
|  | ||||
| 	// Delete session | ||||
| 	AuthSessions.delete(session.id); | ||||
|   | ||||
| @@ -1,6 +1,5 @@ | ||||
| import define from '../define'; | ||||
| import { RegistryItems, UserProfiles, Users } from '../../../models'; | ||||
| import { ensure } from '../../../prelude/ensure'; | ||||
| import { genId } from '../../../misc/gen-id'; | ||||
|  | ||||
| export const meta = { | ||||
| @@ -25,7 +24,7 @@ export default define(meta, async (ps, user, token) => { | ||||
| 	const isSecure = token == null; | ||||
|  | ||||
| 	// TODO: そのうち消す | ||||
| 	const profile = await UserProfiles.findOne(user.id).then(ensure); | ||||
| 	const profile = await UserProfiles.findOneOrFail(user.id); | ||||
| 	for (const [k, v] of Object.entries(profile.clientData)) { | ||||
| 		await RegistryItems.insert({ | ||||
| 			id: genId(), | ||||
|   | ||||
| @@ -2,7 +2,6 @@ import $ from 'cafy'; | ||||
| import * as speakeasy from 'speakeasy'; | ||||
| import define from '../../../define'; | ||||
| import { UserProfiles } from '../../../../../models'; | ||||
| import { ensure } from '../../../../../prelude/ensure'; | ||||
|  | ||||
| export const meta = { | ||||
| 	requireCredential: true as const, | ||||
| @@ -19,7 +18,7 @@ export const meta = { | ||||
| export default define(meta, async (ps, user) => { | ||||
| 	const token = ps.token.replace(/\s/g, ''); | ||||
|  | ||||
| 	const profile = await UserProfiles.findOne(user.id).then(ensure); | ||||
| 	const profile = await UserProfiles.findOneOrFail(user.id); | ||||
|  | ||||
| 	if (profile.twoFactorTempSecret == null) { | ||||
| 		throw new Error('二段階認証の設定が開始されていません'); | ||||
|   | ||||
| @@ -9,7 +9,6 @@ import { | ||||
| 	AttestationChallenges, | ||||
| 	Users | ||||
| } from '../../../../../models'; | ||||
| import { ensure } from '../../../../../prelude/ensure'; | ||||
| import config from '../../../../../config'; | ||||
| import { procedures, hash } from '../../../2fa'; | ||||
| import { publishMainStream } from '../../../../../services/stream'; | ||||
| @@ -43,7 +42,7 @@ export const meta = { | ||||
| const rpIdHashReal = hash(Buffer.from(config.hostname, 'utf-8')); | ||||
|  | ||||
| export default define(meta, async (ps, user) => { | ||||
| 	const profile = await UserProfiles.findOne(user.id).then(ensure); | ||||
| 	const profile = await UserProfiles.findOneOrFail(user.id); | ||||
|  | ||||
| 	// Compare password | ||||
| 	const same = await bcrypt.compare(ps.password, profile.password!); | ||||
|   | ||||
| @@ -2,7 +2,6 @@ import $ from 'cafy'; | ||||
| import * as bcrypt from 'bcryptjs'; | ||||
| import define from '../../../define'; | ||||
| import { UserProfiles, AttestationChallenges } from '../../../../../models'; | ||||
| import { ensure } from '../../../../../prelude/ensure'; | ||||
| import { promisify } from 'util'; | ||||
| import * as crypto from 'crypto'; | ||||
| import { genId } from '../../../../../misc/gen-id'; | ||||
| @@ -23,7 +22,7 @@ export const meta = { | ||||
| }; | ||||
|  | ||||
| export default define(meta, async (ps, user) => { | ||||
| 	const profile = await UserProfiles.findOne(user.id).then(ensure); | ||||
| 	const profile = await UserProfiles.findOneOrFail(user.id); | ||||
|  | ||||
| 	// Compare password | ||||
| 	const same = await bcrypt.compare(ps.password, profile.password!); | ||||
|   | ||||
| @@ -5,7 +5,6 @@ import * as QRCode from 'qrcode'; | ||||
| import config from '../../../../../config'; | ||||
| import define from '../../../define'; | ||||
| import { UserProfiles } from '../../../../../models'; | ||||
| import { ensure } from '../../../../../prelude/ensure'; | ||||
|  | ||||
| export const meta = { | ||||
| 	requireCredential: true as const, | ||||
| @@ -20,7 +19,7 @@ export const meta = { | ||||
| }; | ||||
|  | ||||
| export default define(meta, async (ps, user) => { | ||||
| 	const profile = await UserProfiles.findOne(user.id).then(ensure); | ||||
| 	const profile = await UserProfiles.findOneOrFail(user.id); | ||||
|  | ||||
| 	// Compare password | ||||
| 	const same = await bcrypt.compare(ps.password, profile.password!); | ||||
|   | ||||
| @@ -2,7 +2,6 @@ import $ from 'cafy'; | ||||
| import * as bcrypt from 'bcryptjs'; | ||||
| import define from '../../../define'; | ||||
| import { UserProfiles, UserSecurityKeys, Users } from '../../../../../models'; | ||||
| import { ensure } from '../../../../../prelude/ensure'; | ||||
| import { publishMainStream } from '../../../../../services/stream'; | ||||
|  | ||||
| export const meta = { | ||||
| @@ -21,7 +20,7 @@ export const meta = { | ||||
| }; | ||||
|  | ||||
| export default define(meta, async (ps, user) => { | ||||
| 	const profile = await UserProfiles.findOne(user.id).then(ensure); | ||||
| 	const profile = await UserProfiles.findOneOrFail(user.id); | ||||
|  | ||||
| 	// Compare password | ||||
| 	const same = await bcrypt.compare(ps.password, profile.password!); | ||||
|   | ||||
| @@ -2,7 +2,6 @@ import $ from 'cafy'; | ||||
| import * as bcrypt from 'bcryptjs'; | ||||
| import define from '../../../define'; | ||||
| import { UserProfiles } from '../../../../../models'; | ||||
| import { ensure } from '../../../../../prelude/ensure'; | ||||
|  | ||||
| export const meta = { | ||||
| 	requireCredential: true as const, | ||||
| @@ -17,7 +16,7 @@ export const meta = { | ||||
| }; | ||||
|  | ||||
| export default define(meta, async (ps, user) => { | ||||
| 	const profile = await UserProfiles.findOne(user.id).then(ensure); | ||||
| 	const profile = await UserProfiles.findOneOrFail(user.id); | ||||
|  | ||||
| 	// Compare password | ||||
| 	const same = await bcrypt.compare(ps.password, profile.password!); | ||||
|   | ||||
| @@ -2,7 +2,6 @@ import $ from 'cafy'; | ||||
| import * as bcrypt from 'bcryptjs'; | ||||
| import define from '../../define'; | ||||
| import { UserProfiles } from '../../../../models'; | ||||
| import { ensure } from '../../../../prelude/ensure'; | ||||
|  | ||||
| export const meta = { | ||||
| 	requireCredential: true as const, | ||||
| @@ -21,7 +20,7 @@ export const meta = { | ||||
| }; | ||||
|  | ||||
| export default define(meta, async (ps, user) => { | ||||
| 	const profile = await UserProfiles.findOne(user.id).then(ensure); | ||||
| 	const profile = await UserProfiles.findOneOrFail(user.id); | ||||
|  | ||||
| 	// Compare password | ||||
| 	const same = await bcrypt.compare(ps.currentPassword, profile.password!); | ||||
|   | ||||
| @@ -2,7 +2,6 @@ import $ from 'cafy'; | ||||
| import * as bcrypt from 'bcryptjs'; | ||||
| import define from '../../define'; | ||||
| import { Users, UserProfiles } from '../../../../models'; | ||||
| import { ensure } from '../../../../prelude/ensure'; | ||||
| import { doPostSuspend } from '../../../../services/suspend-user'; | ||||
|  | ||||
| export const meta = { | ||||
| @@ -18,7 +17,7 @@ export const meta = { | ||||
| }; | ||||
|  | ||||
| export default define(meta, async (ps, user) => { | ||||
| 	const profile = await UserProfiles.findOne(user.id).then(ensure); | ||||
| 	const profile = await UserProfiles.findOneOrFail(user.id); | ||||
|  | ||||
| 	// Compare password | ||||
| 	const same = await bcrypt.compare(ps.password, profile.password!); | ||||
|   | ||||
| @@ -4,7 +4,6 @@ import { publishMainStream } from '../../../../services/stream'; | ||||
| import generateUserToken from '../../common/generate-native-user-token'; | ||||
| import define from '../../define'; | ||||
| import { Users, UserProfiles } from '../../../../models'; | ||||
| import { ensure } from '../../../../prelude/ensure'; | ||||
|  | ||||
| export const meta = { | ||||
| 	requireCredential: true as const, | ||||
| @@ -19,7 +18,7 @@ export const meta = { | ||||
| }; | ||||
|  | ||||
| export default define(meta, async (ps, user) => { | ||||
| 	const profile = await UserProfiles.findOne(user.id).then(ensure); | ||||
| 	const profile = await UserProfiles.findOneOrFail(user.id); | ||||
|  | ||||
| 	// Compare password | ||||
| 	const same = await bcrypt.compare(ps.password, profile.password!); | ||||
|   | ||||
| @@ -6,7 +6,6 @@ import config from '../../../../config'; | ||||
| import * as ms from 'ms'; | ||||
| import * as bcrypt from 'bcryptjs'; | ||||
| import { Users, UserProfiles } from '../../../../models'; | ||||
| import { ensure } from '../../../../prelude/ensure'; | ||||
| import { sendEmail } from '../../../../services/send-email'; | ||||
| import { ApiError } from '../../error'; | ||||
|  | ||||
| @@ -40,7 +39,7 @@ export const meta = { | ||||
| }; | ||||
|  | ||||
| export default define(meta, async (ps, user) => { | ||||
| 	const profile = await UserProfiles.findOne(user.id).then(ensure); | ||||
| 	const profile = await UserProfiles.findOneOrFail(user.id); | ||||
|  | ||||
| 	// Compare password | ||||
| 	const same = await bcrypt.compare(ps.password, profile.password!); | ||||
|   | ||||
| @@ -13,7 +13,6 @@ import { ApiError } from '../../error'; | ||||
| import { Users, DriveFiles, UserProfiles, Pages } from '../../../../models'; | ||||
| import { User } from '../../../../models/entities/user'; | ||||
| import { UserProfile } from '../../../../models/entities/user-profile'; | ||||
| import { ensure } from '../../../../prelude/ensure'; | ||||
| import { notificationTypes } from '../../../../types'; | ||||
| import { normalizeForSearch } from '../../../../misc/normalize-for-search'; | ||||
|  | ||||
| @@ -206,7 +205,7 @@ export default define(meta, async (ps, user, token) => { | ||||
| 	const updates = {} as Partial<User>; | ||||
| 	const profileUpdates = {} as Partial<UserProfile>; | ||||
|  | ||||
| 	const profile = await UserProfiles.findOne(user.id).then(ensure); | ||||
| 	const profile = await UserProfiles.findOneOrFail(user.id); | ||||
|  | ||||
| 	if (ps.name !== undefined) updates.name = ps.name; | ||||
| 	if (ps.description !== undefined) profileUpdates.description = ps.description; | ||||
|   | ||||
| @@ -6,7 +6,6 @@ import * as ms from 'ms'; | ||||
| import { getNote } from '../../common/getters'; | ||||
| import { ApiError } from '../../error'; | ||||
| import { Users } from '../../../../models'; | ||||
| import { ensure } from '../../../../prelude/ensure'; | ||||
|  | ||||
| export const meta = { | ||||
| 	desc: { | ||||
| @@ -62,5 +61,5 @@ export default define(meta, async (ps, user) => { | ||||
| 	} | ||||
|  | ||||
| 	// この操作を行うのが投稿者とは限らない(例えばモデレーター)ため | ||||
| 	await deleteNote(await Users.findOne(note.userId).then(ensure), note); | ||||
| 	await deleteNote(await Users.findOneOrFail(note.userId), note); | ||||
| }); | ||||
|   | ||||
| @@ -13,7 +13,6 @@ import { PollVotes, NoteWatchings, Users, Polls } from '../../../../../models'; | ||||
| import { Not } from 'typeorm'; | ||||
| import { IRemoteUser } from '../../../../../models/entities/user'; | ||||
| import { genId } from '../../../../../misc/gen-id'; | ||||
| import { ensure } from '../../../../../prelude/ensure'; | ||||
|  | ||||
| export const meta = { | ||||
| 	desc: { | ||||
| @@ -87,7 +86,7 @@ export default define(meta, async (ps, user) => { | ||||
| 		throw new ApiError(meta.errors.noPoll); | ||||
| 	} | ||||
|  | ||||
| 	const poll = await Polls.findOne({ noteId: note.id }).then(ensure); | ||||
| 	const poll = await Polls.findOneOrFail({ noteId: note.id }); | ||||
|  | ||||
| 	if (poll.expiresAt && poll.expiresAt < createdAt) { | ||||
| 		throw new ApiError(meta.errors.alreadyExpired); | ||||
| @@ -153,7 +152,7 @@ export default define(meta, async (ps, user) => { | ||||
|  | ||||
| 	// リモート投票の場合リプライ送信 | ||||
| 	if (note.userHost != null) { | ||||
| 		const pollOwner = await Users.findOne(note.userId).then(ensure) as IRemoteUser; | ||||
| 		const pollOwner = await Users.findOneOrFail(note.userId) as IRemoteUser; | ||||
|  | ||||
| 		deliver(user, renderActivity(await renderVote(user, vote, note, poll, pollOwner)), pollOwner.inbox); | ||||
| 	} | ||||
|   | ||||
| @@ -3,7 +3,6 @@ import define from '../../define'; | ||||
| import { ApiError } from '../../error'; | ||||
| import { Users, UserProfiles } from '../../../../models'; | ||||
| import { ID } from '../../../../misc/cafy-id'; | ||||
| import { ensure } from '../../../../prelude/ensure'; | ||||
| import { toPunyNullable } from '../../../../misc/convert-host'; | ||||
|  | ||||
| export const meta = { | ||||
| @@ -51,7 +50,7 @@ export default define(meta, async (ps, me) => { | ||||
| 		throw new ApiError(meta.errors.noSuchUser); | ||||
| 	} | ||||
|  | ||||
| 	const profile = await UserProfiles.findOne(user.id).then(ensure); | ||||
| 	const profile = await UserProfiles.findOneOrFail(user.id); | ||||
|  | ||||
| 	if (profile.room.furnitures == null) { | ||||
| 		await UserProfiles.update(user.id, { | ||||
|   | ||||
| @@ -6,7 +6,6 @@ import config from '../../../config'; | ||||
| import { Users, Signins, UserProfiles, UserSecurityKeys, AttestationChallenges } from '../../../models'; | ||||
| import { ILocalUser } from '../../../models/entities/user'; | ||||
| import { genId } from '../../../misc/gen-id'; | ||||
| import { ensure } from '../../../prelude/ensure'; | ||||
| import { verifyLogin, hash } from '../2fa'; | ||||
| import { randomBytes } from 'crypto'; | ||||
|  | ||||
| @@ -47,7 +46,7 @@ export default async (ctx: Koa.Context) => { | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	const profile = await UserProfiles.findOne(user.id).then(ensure); | ||||
| 	const profile = await UserProfiles.findOneOrFail(user.id); | ||||
|  | ||||
| 	// Compare password | ||||
| 	const same = await bcrypt.compare(password, profile.password!); | ||||
|   | ||||
| @@ -10,7 +10,6 @@ import signin from '../common/signin'; | ||||
| import { fetchMeta } from '../../../misc/fetch-meta'; | ||||
| import { Users, UserProfiles } from '../../../models'; | ||||
| import { ILocalUser } from '../../../models/entities/user'; | ||||
| import { ensure } from '../../../prelude/ensure'; | ||||
|  | ||||
| function getUserToken(ctx: Koa.Context) { | ||||
| 	return ((ctx.headers['cookie'] || '').match(/igi=(\w+)/) || [null, null])[1]; | ||||
| @@ -41,12 +40,12 @@ router.get('/disconnect/discord', async ctx => { | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	const user = await Users.findOne({ | ||||
| 	const user = await Users.findOneOrFail({ | ||||
| 		host: null, | ||||
| 		token: userToken | ||||
| 	}).then(ensure); | ||||
| 	}); | ||||
|  | ||||
| 	const profile = await UserProfiles.findOne(user.id).then(ensure); | ||||
| 	const profile = await UserProfiles.findOneOrFail(user.id); | ||||
|  | ||||
| 	delete profile.integrations.discord; | ||||
|  | ||||
| @@ -253,12 +252,12 @@ router.get('/dc/cb', async ctx => { | ||||
| 			return; | ||||
| 		} | ||||
|  | ||||
| 		const user = await Users.findOne({ | ||||
| 		const user = await Users.findOneOrFail({ | ||||
| 			host: null, | ||||
| 			token: userToken | ||||
| 		}).then(ensure); | ||||
| 		}); | ||||
|  | ||||
| 		const profile = await UserProfiles.findOne(user.id).then(ensure); | ||||
| 		const profile = await UserProfiles.findOneOrFail(user.id); | ||||
|  | ||||
| 		await UserProfiles.update(user.id, { | ||||
| 			integrations: { | ||||
|   | ||||
| @@ -10,7 +10,6 @@ import signin from '../common/signin'; | ||||
| import { fetchMeta } from '../../../misc/fetch-meta'; | ||||
| import { Users, UserProfiles } from '../../../models'; | ||||
| import { ILocalUser } from '../../../models/entities/user'; | ||||
| import { ensure } from '../../../prelude/ensure'; | ||||
|  | ||||
| function getUserToken(ctx: Koa.Context) { | ||||
| 	return ((ctx.headers['cookie'] || '').match(/igi=(\w+)/) || [null, null])[1]; | ||||
| @@ -41,12 +40,12 @@ router.get('/disconnect/github', async ctx => { | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	const user = await Users.findOne({ | ||||
| 	const user = await Users.findOneOrFail({ | ||||
| 		host: null, | ||||
| 		token: userToken | ||||
| 	}).then(ensure); | ||||
| 	}); | ||||
|  | ||||
| 	const profile = await UserProfiles.findOne(user.id).then(ensure); | ||||
| 	const profile = await UserProfiles.findOneOrFail(user.id); | ||||
|  | ||||
| 	delete profile.integrations.github; | ||||
|  | ||||
| @@ -227,12 +226,12 @@ router.get('/gh/cb', async ctx => { | ||||
| 			return; | ||||
| 		} | ||||
|  | ||||
| 		const user = await Users.findOne({ | ||||
| 		const user = await Users.findOneOrFail({ | ||||
| 			host: null, | ||||
| 			token: userToken | ||||
| 		}).then(ensure); | ||||
| 		}); | ||||
|  | ||||
| 		const profile = await UserProfiles.findOne(user.id).then(ensure); | ||||
| 		const profile = await UserProfiles.findOneOrFail(user.id); | ||||
|  | ||||
| 		await UserProfiles.update(user.id, { | ||||
| 			integrations: { | ||||
|   | ||||
| @@ -9,7 +9,6 @@ import signin from '../common/signin'; | ||||
| import { fetchMeta } from '../../../misc/fetch-meta'; | ||||
| import { Users, UserProfiles } from '../../../models'; | ||||
| import { ILocalUser } from '../../../models/entities/user'; | ||||
| import { ensure } from '../../../prelude/ensure'; | ||||
|  | ||||
| function getUserToken(ctx: Koa.Context) { | ||||
| 	return ((ctx.headers['cookie'] || '').match(/igi=(\w+)/) || [null, null])[1]; | ||||
| @@ -40,12 +39,12 @@ router.get('/disconnect/twitter', async ctx => { | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	const user = await Users.findOne({ | ||||
| 	const user = await Users.findOneOrFail({ | ||||
| 		host: null, | ||||
| 		token: userToken | ||||
| 	}).then(ensure); | ||||
| 	}); | ||||
|  | ||||
| 	const profile = await UserProfiles.findOne(user.id).then(ensure); | ||||
| 	const profile = await UserProfiles.findOneOrFail(user.id); | ||||
|  | ||||
| 	delete profile.integrations.twitter; | ||||
|  | ||||
| @@ -163,12 +162,12 @@ router.get('/tw/cb', async ctx => { | ||||
|  | ||||
| 		const result = await twAuth!.done(JSON.parse(twCtx), verifier); | ||||
|  | ||||
| 		const user = await Users.findOne({ | ||||
| 		const user = await Users.findOneOrFail({ | ||||
| 			host: null, | ||||
| 			token: userToken | ||||
| 		}).then(ensure); | ||||
| 		}); | ||||
|  | ||||
| 		const profile = await UserProfiles.findOne(user.id).then(ensure); | ||||
| 		const profile = await UserProfiles.findOneOrFail(user.id); | ||||
|  | ||||
| 		await UserProfiles.update(user.id, { | ||||
| 			integrations: { | ||||
|   | ||||
| @@ -3,7 +3,6 @@ import config from '../../config'; | ||||
| import { User } from '../../models/entities/user'; | ||||
| import { Notes, DriveFiles, UserProfiles } from '../../models'; | ||||
| import { In } from 'typeorm'; | ||||
| import { ensure } from '../../prelude/ensure'; | ||||
|  | ||||
| export default async function(user: User) { | ||||
| 	const author = { | ||||
| @@ -11,7 +10,7 @@ export default async function(user: User) { | ||||
| 		name: user.name || user.username | ||||
| 	}; | ||||
|  | ||||
| 	const profile = await UserProfiles.findOne(user.id).then(ensure); | ||||
| 	const profile = await UserProfiles.findOneOrFail(user.id); | ||||
|  | ||||
| 	const notes = await Notes.find({ | ||||
| 		where: { | ||||
|   | ||||
| @@ -20,7 +20,6 @@ import config from '../../config'; | ||||
| import { Users, Notes, Emojis, UserProfiles, Pages, Channels, Clips } from '../../models'; | ||||
| import parseAcct from '../../misc/acct/parse'; | ||||
| import { getNoteSummary } from '../../misc/get-note-summary'; | ||||
| import { ensure } from '../../prelude/ensure'; | ||||
| import { getConnection } from 'typeorm'; | ||||
| import redis from '../../db/redis'; | ||||
| import locales = require('../../../locales'); | ||||
| @@ -199,7 +198,7 @@ router.get(['/@:user', '/@:user/:sub'], async (ctx, next) => { | ||||
| 	}); | ||||
|  | ||||
| 	if (user != null) { | ||||
| 		const profile = await UserProfiles.findOne(user.id).then(ensure); | ||||
| 		const profile = await UserProfiles.findOneOrFail(user.id); | ||||
| 		const meta = await fetchMeta(); | ||||
| 		const me = profile.fields | ||||
| 			? profile.fields | ||||
| @@ -242,7 +241,7 @@ router.get('/notes/:note', async ctx => { | ||||
|  | ||||
| 	if (note) { | ||||
| 		const _note = await Notes.pack(note); | ||||
| 		const profile = await UserProfiles.findOne(note.userId).then(ensure); | ||||
| 		const profile = await UserProfiles.findOneOrFail(note.userId); | ||||
| 		const meta = await fetchMeta(); | ||||
| 		await ctx.render('note', { | ||||
| 			note: _note, | ||||
| @@ -282,7 +281,7 @@ router.get('/@:user/pages/:page', async ctx => { | ||||
|  | ||||
| 	if (page) { | ||||
| 		const _page = await Pages.pack(page); | ||||
| 		const profile = await UserProfiles.findOne(page.userId).then(ensure); | ||||
| 		const profile = await UserProfiles.findOneOrFail(page.userId); | ||||
| 		const meta = await fetchMeta(); | ||||
| 		await ctx.render('page', { | ||||
| 			page: _page, | ||||
| @@ -311,7 +310,7 @@ router.get('/clips/:clip', async ctx => { | ||||
|  | ||||
| 	if (clip) { | ||||
| 		const _clip = await Clips.pack(clip); | ||||
| 		const profile = await UserProfiles.findOne(clip.userId).then(ensure); | ||||
| 		const profile = await UserProfiles.findOneOrFail(clip.userId); | ||||
| 		const meta = await fetchMeta(); | ||||
| 		await ctx.render('clip', { | ||||
| 			clip: _clip, | ||||
|   | ||||
| @@ -3,7 +3,6 @@ import { Note } from '../models/entities/note'; | ||||
| import { AntennaNotes, Mutings, Notes } from '../models'; | ||||
| import { genId } from '../misc/gen-id'; | ||||
| import { isMutedUserRelated } from '../misc/is-muted-user-related'; | ||||
| import { ensure } from '../prelude/ensure'; | ||||
| import { publishAntennaStream, publishMainStream } from './stream'; | ||||
| import { User } from '../models/entities/user'; | ||||
|  | ||||
| @@ -34,10 +33,10 @@ export async function addNoteToAntenna(antenna: Antenna, note: Note, noteUser: U | ||||
| 		}; | ||||
|  | ||||
| 		if (note.replyId != null) { | ||||
| 			_note.reply = await Notes.findOne(note.replyId).then(ensure); | ||||
| 			_note.reply = await Notes.findOneOrFail(note.replyId); | ||||
| 		} | ||||
| 		if (note.renoteId != null) { | ||||
| 			_note.renote = await Notes.findOne(note.renoteId).then(ensure); | ||||
| 			_note.renote = await Notes.findOneOrFail(note.renoteId); | ||||
| 		} | ||||
|  | ||||
| 		if (isMutedUserRelated(_note, new Set<string>(mutings.map(x => x.muteeId)))) { | ||||
|   | ||||
| @@ -14,7 +14,6 @@ import { instanceChart, perUserFollowingChart } from '../chart'; | ||||
| import { genId } from '../../misc/gen-id'; | ||||
| import { createNotification } from '../create-notification'; | ||||
| import { isDuplicateKeyValueError } from '../../misc/is-duplicate-key-value-error'; | ||||
| import { ensure } from '../../prelude/ensure'; | ||||
|  | ||||
| const logger = new Logger('following/create'); | ||||
|  | ||||
| @@ -130,7 +129,7 @@ export default async function(follower: User, followee: User, requestId?: string | ||||
| 		if (blocked != null) throw new IdentifiableError('3338392a-f764-498d-8855-db939dcf8c48', 'blocked'); | ||||
| 	} | ||||
|  | ||||
| 	const followeeProfile = await UserProfiles.findOne(followee.id).then(ensure); | ||||
| 	const followeeProfile = await UserProfiles.findOneOrFail(followee.id); | ||||
|  | ||||
| 	// フォロー対象が鍵アカウントである or | ||||
| 	// フォロワーがBotであり、フォロー対象がBotからのフォローに慎重である or | ||||
|   | ||||
| @@ -1,7 +1,6 @@ | ||||
| import accept from './accept'; | ||||
| import { User } from '../../../models/entities/user'; | ||||
| import { FollowRequests, Users } from '../../../models'; | ||||
| import { ensure } from '../../../prelude/ensure'; | ||||
|  | ||||
| /** | ||||
|  * 指定したユーザー宛てのフォローリクエストをすべて承認 | ||||
| @@ -13,7 +12,7 @@ export default async function(user: User) { | ||||
| 	}); | ||||
|  | ||||
| 	for (const request of requests) { | ||||
| 		const follower = await Users.findOne(request.followerId).then(ensure); | ||||
| 		const follower = await Users.findOneOrFail(request.followerId); | ||||
| 		accept(user, follower); | ||||
| 	} | ||||
| } | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| import config from '../../config'; | ||||
| import { ensure } from '../../prelude/ensure'; | ||||
| import { MessagingMessages, Users } from '../../models'; | ||||
| import { MessagingMessage } from '../../models/entities/messaging-message'; | ||||
| import { publishGroupMessagingStream, publishMessagingStream } from '../stream'; | ||||
| @@ -15,8 +14,8 @@ export async function deleteMessage(message: MessagingMessage) { | ||||
|  | ||||
| async function postDeleteMessage(message: MessagingMessage) { | ||||
| 	if (message.recipientId) { | ||||
| 		const user = await Users.findOne(message.userId).then(ensure); | ||||
| 		const recipient = await Users.findOne(message.recipientId).then(ensure); | ||||
| 		const user = await Users.findOneOrFail(message.userId); | ||||
| 		const recipient = await Users.findOneOrFail(message.recipientId); | ||||
|  | ||||
| 		if (Users.isLocalUser(user)) publishMessagingStream(message.userId, message.recipientId, 'deleted', message.id); | ||||
| 		if (Users.isLocalUser(recipient)) publishMessagingStream(message.recipientId, message.userId, 'deleted', message.id); | ||||
|   | ||||
| @@ -26,7 +26,6 @@ import { notesChart, perUserNotesChart, activeUsersChart, instanceChart } from ' | ||||
| import { Poll, IPoll } from '../../models/entities/poll'; | ||||
| import { createNotification } from '../create-notification'; | ||||
| import { isDuplicateKeyValueError } from '../../misc/is-duplicate-key-value-error'; | ||||
| import { ensure } from '../../prelude/ensure'; | ||||
| import { checkHitAntenna } from '../../misc/check-hit-antenna'; | ||||
| import { checkWordMute } from '../../misc/check-word-mute'; | ||||
| import { addNoteToAntenna } from '../add-note-to-antenna'; | ||||
| @@ -200,7 +199,7 @@ export default async (user: User, data: Option, silent = false) => new Promise<N | ||||
| 	tags = tags.filter(tag => Array.from(tag || '').length <= 128).splice(0, 32); | ||||
|  | ||||
| 	if (data.reply && (user.id !== data.reply.userId) && !mentionedUsers.some(u => u.id === data.reply!.userId)) { | ||||
| 		mentionedUsers.push(await Users.findOne(data.reply.userId).then(ensure)); | ||||
| 		mentionedUsers.push(await Users.findOneOrFail(data.reply.userId)); | ||||
| 	} | ||||
|  | ||||
| 	if (data.visibility == 'specified') { | ||||
| @@ -213,7 +212,7 @@ export default async (user: User, data: Option, silent = false) => new Promise<N | ||||
| 		} | ||||
|  | ||||
| 		if (data.reply && !data.visibleUsers.some(x => x.id === data.reply!.userId)) { | ||||
| 			data.visibleUsers.push(await Users.findOne(data.reply.userId).then(ensure)); | ||||
| 			data.visibleUsers.push(await Users.findOneOrFail(data.reply.userId)); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 syuilo
					syuilo