From 91172654e4b715198099146d4c442e0787df0785 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Sat, 13 Feb 2021 15:33:38 +0900
Subject: [PATCH] refactor: resolve #7139

---
 CONTRIBUTING.md                               | 30 -------------------
 src/misc/check-hit-antenna.ts                 |  3 +-
 src/misc/fetch-proxy-account.ts               |  3 +-
 src/models/repositories/abuse-user-report.ts  |  3 +-
 src/models/repositories/antenna.ts            |  3 +-
 src/models/repositories/app.ts                |  3 +-
 src/models/repositories/auth-session.ts       |  3 +-
 src/models/repositories/blocking.ts           |  3 +-
 src/models/repositories/channel.ts            |  3 +-
 src/models/repositories/clip.ts               |  3 +-
 src/models/repositories/drive-file.ts         |  3 +-
 src/models/repositories/drive-folder.ts       |  3 +-
 src/models/repositories/emoji.ts              |  3 +-
 src/models/repositories/follow-request.ts     |  3 +-
 src/models/repositories/following.ts          |  3 +-
 src/models/repositories/games/reversi/game.ts |  3 +-
 .../repositories/games/reversi/matching.ts    |  3 +-
 src/models/repositories/messaging-message.ts  |  3 +-
 src/models/repositories/moderation-logs.ts    |  3 +-
 src/models/repositories/muting.ts             |  3 +-
 src/models/repositories/note-favorite.ts      |  3 +-
 src/models/repositories/note-reaction.ts      |  3 +-
 src/models/repositories/note.ts               |  5 ++--
 src/models/repositories/notification.ts       |  5 ++--
 src/models/repositories/page-like.ts          |  3 +-
 src/models/repositories/page.ts               |  3 +-
 .../repositories/user-group-invitation.ts     |  3 +-
 src/models/repositories/user-group.ts         |  3 +-
 src/models/repositories/user-list.ts          |  3 +-
 src/models/repositories/user.ts               |  5 ++--
 src/prelude/ensure.ts                         | 10 -------
 src/queue/processors/db/export-notes.ts       |  3 +-
 src/remote/activitypub/db-resolver.ts         |  3 +-
 src/remote/activitypub/models/image.ts        |  3 +-
 src/remote/activitypub/models/note.ts         |  3 +-
 src/remote/activitypub/models/person.ts       |  3 +-
 .../activitypub/renderer/follow-user.ts       |  3 +-
 src/remote/activitypub/renderer/index.ts      |  5 ++--
 src/remote/activitypub/renderer/note.ts       |  3 +-
 src/remote/activitypub/renderer/person.ts     |  5 ++--
 src/remote/activitypub/request.ts             |  9 +++---
 src/server/activitypub.ts                     |  3 +-
 src/server/activitypub/featured.ts            |  3 +-
 src/server/activitypub/outbox.ts              |  3 +-
 src/server/api/authenticate.ts                |  3 +-
 src/server/api/common/inject-featured.ts      |  3 +-
 src/server/api/common/inject-promo.ts         |  5 ++--
 .../admin/federation/remove-all-following.ts  |  5 ++--
 src/server/api/endpoints/auth/accept.ts       |  3 +-
 .../api/endpoints/auth/session/userkey.ts     |  5 ++--
 src/server/api/endpoints/i.ts                 |  3 +-
 src/server/api/endpoints/i/2fa/done.ts        |  3 +-
 src/server/api/endpoints/i/2fa/key-done.ts    |  3 +-
 .../api/endpoints/i/2fa/register-key.ts       |  3 +-
 src/server/api/endpoints/i/2fa/register.ts    |  3 +-
 src/server/api/endpoints/i/2fa/remove-key.ts  |  3 +-
 src/server/api/endpoints/i/2fa/unregister.ts  |  3 +-
 src/server/api/endpoints/i/change-password.ts |  3 +-
 src/server/api/endpoints/i/delete-account.ts  |  3 +-
 .../api/endpoints/i/regenerate-token.ts       |  3 +-
 src/server/api/endpoints/i/update-email.ts    |  3 +-
 src/server/api/endpoints/i/update.ts          |  3 +-
 src/server/api/endpoints/notes/delete.ts      |  3 +-
 src/server/api/endpoints/notes/polls/vote.ts  |  5 ++--
 src/server/api/endpoints/room/show.ts         |  3 +-
 src/server/api/private/signin.ts              |  3 +-
 src/server/api/service/discord.ts             | 13 ++++----
 src/server/api/service/github.ts              | 13 ++++----
 src/server/api/service/twitter.ts             | 13 ++++----
 src/server/web/feed.ts                        |  3 +-
 src/server/web/index.ts                       |  9 +++---
 src/services/add-note-to-antenna.ts           |  5 ++--
 src/services/following/create.ts              |  3 +-
 src/services/following/requests/accept-all.ts |  3 +-
 src/services/messages/delete.ts               |  5 ++--
 src/services/note/create.ts                   |  5 ++--
 76 files changed, 107 insertions(+), 221 deletions(-)
 delete mode 100644 src/prelude/ensure.ts

diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 2ffe6dc2e1..d9d6702e80 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -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 変更の名前
diff --git a/src/misc/check-hit-antenna.ts b/src/misc/check-hit-antenna.ts
index 562d054563..0464f14131 100644
--- a/src/misc/check-hit-antenna.ts
+++ b/src/misc/check-hit-antenna.ts
@@ -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
diff --git a/src/misc/fetch-proxy-account.ts b/src/misc/fetch-proxy-account.ts
index 0094ab8a56..537edf2891 100644
--- a/src/misc/fetch-proxy-account.ts
+++ b/src/misc/fetch-proxy-account.ts
@@ -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;
 }
diff --git a/src/models/repositories/abuse-user-report.ts b/src/models/repositories/abuse-user-report.ts
index dbdaa5ee15..cb33d2506e 100644
--- a/src/models/repositories/abuse-user-report.ts
+++ b/src/models/repositories/abuse-user-report.ts
@@ -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,
diff --git a/src/models/repositories/antenna.ts b/src/models/repositories/antenna.ts
index 16ef2e5a39..b20da26c5d 100644
--- a/src/models/repositories/antenna.ts
+++ b/src/models/repositories/antenna.ts
@@ -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;
diff --git a/src/models/repositories/app.ts b/src/models/repositories/app.ts
index 45d8d16c51..f5cc10787a 100644
--- a/src/models/repositories/app.ts
+++ b/src/models/repositories/app.ts
@@ -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,
diff --git a/src/models/repositories/auth-session.ts b/src/models/repositories/auth-session.ts
index a6a4d46de6..e985d6925f 100644
--- a/src/models/repositories/auth-session.ts
+++ b/src/models/repositories/auth-session.ts
@@ -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,
diff --git a/src/models/repositories/blocking.ts b/src/models/repositories/blocking.ts
index 9ebe6bbf59..314f459e65 100644
--- a/src/models/repositories/blocking.ts
+++ b/src/models/repositories/blocking.ts
@@ -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,
diff --git a/src/models/repositories/channel.ts b/src/models/repositories/channel.ts
index 2a90419922..2654c9d6f3 100644
--- a/src/models/repositories/channel.ts
+++ b/src/models/repositories/channel.ts
@@ -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;
diff --git a/src/models/repositories/clip.ts b/src/models/repositories/clip.ts
index 11f743349f..84891a4372 100644
--- a/src/models/repositories/clip.ts
+++ b/src/models/repositories/clip.ts
@@ -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,
diff --git a/src/models/repositories/drive-file.ts b/src/models/repositories/drive-file.ts
index ab22d2dc09..3d013b8bb2 100644
--- a/src/models/repositories/drive-file.ts
+++ b/src/models/repositories/drive-file.ts
@@ -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();
 
diff --git a/src/models/repositories/drive-folder.ts b/src/models/repositories/drive-folder.ts
index dee424cccb..2a18220384 100644
--- a/src/models/repositories/drive-folder.ts
+++ b/src/models/repositories/drive-folder.ts
@@ -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,
diff --git a/src/models/repositories/emoji.ts b/src/models/repositories/emoji.ts
index b485b37da5..3490a6ac86 100644
--- a/src/models/repositories/emoji.ts
+++ b/src/models/repositories/emoji.ts
@@ -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,
diff --git a/src/models/repositories/follow-request.ts b/src/models/repositories/follow-request.ts
index 451ed8e2d5..0d96b8eb53 100644
--- a/src/models/repositories/follow-request.ts
+++ b/src/models/repositories/follow-request.ts
@@ -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,
diff --git a/src/models/repositories/following.ts b/src/models/repositories/following.ts
index 58728a3380..986f107e7d 100644
--- a/src/models/repositories/following.ts
+++ b/src/models/repositories/following.ts
@@ -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 = {};
 
diff --git a/src/models/repositories/games/reversi/game.ts b/src/models/repositories/games/reversi/game.ts
index c380f5251e..e23247f664 100644
--- a/src/models/repositories/games/reversi/game.ts
+++ b/src/models/repositories/games/reversi/game.ts
@@ -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 {
diff --git a/src/models/repositories/games/reversi/matching.ts b/src/models/repositories/games/reversi/matching.ts
index 86c9204456..51f17c9a4e 100644
--- a/src/models/repositories/games/reversi/matching.ts
+++ b/src/models/repositories/games/reversi/matching.ts
@@ -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,
diff --git a/src/models/repositories/messaging-message.ts b/src/models/repositories/messaging-message.ts
index d70e95bc12..0e04c25864 100644
--- a/src/models/repositories/messaging-message.ts
+++ b/src/models/repositories/messaging-message.ts
@@ -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,
diff --git a/src/models/repositories/moderation-logs.ts b/src/models/repositories/moderation-logs.ts
index d6e04795bb..3d4c075701 100644
--- a/src/models/repositories/moderation-logs.ts
+++ b/src/models/repositories/moderation-logs.ts
@@ -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,
diff --git a/src/models/repositories/muting.ts b/src/models/repositories/muting.ts
index 763e04bb3d..5fd409df78 100644
--- a/src/models/repositories/muting.ts
+++ b/src/models/repositories/muting.ts
@@ -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,
diff --git a/src/models/repositories/note-favorite.ts b/src/models/repositories/note-favorite.ts
index 37cfbc0025..eb2ffff4c1 100644
--- a/src/models/repositories/note-favorite.ts
+++ b/src/models/repositories/note-favorite.ts
@@ -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,
diff --git a/src/models/repositories/note-reaction.ts b/src/models/repositories/note-reaction.ts
index 3439f3c8cb..785a876bf8 100644
--- a/src/models/repositories/note-reaction.ts
+++ b/src/models/repositories/note-reaction.ts
@@ -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,
diff --git a/src/models/repositories/note.ts b/src/models/repositories/note.ts
index b60744bb2b..87ca5eb9ec 100644
--- a/src/models/repositories/note.ts
+++ b/src/models/repositories/note.ts
@@ -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)],
diff --git a/src/models/repositories/notification.ts b/src/models/repositories/notification.ts
index 40f43d6c15..16de6c8c25 100644
--- a/src/models/repositories/notification.ts
+++ b/src/models/repositories/notification.ts
@@ -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,
diff --git a/src/models/repositories/page-like.ts b/src/models/repositories/page-like.ts
index 3e7e803fdb..94b1685e5e 100644
--- a/src/models/repositories/page-like.ts
+++ b/src/models/repositories/page-like.ts
@@ -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,
diff --git a/src/models/repositories/page.ts b/src/models/repositories/page.ts
index 3889bf59a7..1b30b6645b 100644
--- a/src/models/repositories/page.ts
+++ b/src/models/repositories/page.ts
@@ -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[]) => {
diff --git a/src/models/repositories/user-group-invitation.ts b/src/models/repositories/user-group-invitation.ts
index 0d3ad525c3..2aa890361c 100644
--- a/src/models/repositories/user-group-invitation.ts
+++ b/src/models/repositories/user-group-invitation.ts
@@ -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,
diff --git a/src/models/repositories/user-group.ts b/src/models/repositories/user-group.ts
index 5ff75047c8..a1b226f154 100644
--- a/src/models/repositories/user-group.ts
+++ b/src/models/repositories/user-group.ts
@@ -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
diff --git a/src/models/repositories/user-list.ts b/src/models/repositories/user-list.ts
index 8842118be4..9421aeb0c7 100644
--- a/src/models/repositories/user-list.ts
+++ b/src/models/repositories/user-list.ts
@@ -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
diff --git a/src/models/repositories/user.ts b/src/models/repositories/user.ts
index a3453b1aa6..7502e7a08e 100644
--- a/src/models/repositories/user.ts
+++ b/src/models/repositories/user.ts
@@ -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;
 
diff --git a/src/prelude/ensure.ts b/src/prelude/ensure.ts
deleted file mode 100644
index 1af281c056..0000000000
--- a/src/prelude/ensure.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-/**
- * 値が null または undefined の場合はエラーを発生させ、そうでない場合は値をそのまま返します
- */
-export function ensure<T>(x: T): NonNullable<T> {
-	if (x == null) {
-		throw new Error('ぬるぽ');
-	} else {
-		return x!;
-	}
-}
diff --git a/src/queue/processors/db/export-notes.ts b/src/queue/processors/db/export-notes.ts
index 0fd8c02c4a..f76a47aacd 100644
--- a/src/queue/processors/db/export-notes.ts
+++ b/src/queue/processors/db/export-notes.ts
@@ -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) => {
diff --git a/src/remote/activitypub/db-resolver.ts b/src/remote/activitypub/db-resolver.ts
index cad2212b70..26162b6b23 100644
--- a/src/remote/activitypub/db-resolver.ts
+++ b/src/remote/activitypub/db-resolver.ts
@@ -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,
diff --git a/src/remote/activitypub/models/image.ts b/src/remote/activitypub/models/image.ts
index 84a1040b2e..dd8086cbeb 100644
--- a/src/remote/activitypub/models/image.ts
+++ b/src/remote/activitypub/models/image.ts
@@ -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);
 		}
 	}
 
diff --git a/src/remote/activitypub/models/note.ts b/src/remote/activitypub/models/note.ts
index feaee2f630..e3488800ca 100644
--- a/src/remote/activitypub/models/note.ts
+++ b/src/remote/activitypub/models/note.ts
@@ -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()) {
diff --git a/src/remote/activitypub/models/person.ts b/src/remote/activitypub/models/person.ts
index 73a2ebc023..5840d67020 100644
--- a/src/remote/activitypub/models/person.ts
+++ b/src/remote/activitypub/models/person.ts
@@ -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;
 
diff --git a/src/remote/activitypub/renderer/follow-user.ts b/src/remote/activitypub/renderer/follow-user.ts
index 6d354803e5..bfc91bb4cb 100644
--- a/src/remote/activitypub/renderer/follow-user.ts
+++ b/src/remote/activitypub/renderer/follow-user.ts
@@ -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;
 }
diff --git a/src/remote/activitypub/renderer/index.ts b/src/remote/activitypub/renderer/index.ts
index a34febff2f..e74affdadf 100644
--- a/src/remote/activitypub/renderer/index.ts
+++ b/src/remote/activitypub/renderer/index.ts
@@ -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
diff --git a/src/remote/activitypub/renderer/note.ts b/src/remote/activitypub/renderer/note.ts
index 6878a402b8..8e3e0e9ba1 100644
--- a/src/remote/activitypub/renderer/note.ts
+++ b/src/remote/activitypub/renderer/note.ts
@@ -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}`;
 
diff --git a/src/remote/activitypub/renderer/person.ts b/src/remote/activitypub/renderer/person.ts
index 4462f88315..4907e3bc6f 100644
--- a/src/remote/activitypub/renderer/person.ts
+++ b/src/remote/activitypub/renderer/person.ts
@@ -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',
diff --git a/src/remote/activitypub/request.ts b/src/remote/activitypub/request.ts
index 0edfcee1e3..2f07351635 100644
--- a/src/remote/activitypub/request.ts
+++ b/src/remote/activitypub/request.ts
@@ -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: {
diff --git a/src/server/activitypub.ts b/src/server/activitypub.ts
index c665fe28ca..bf71258625 100644
--- a/src/server/activitypub.ts
+++ b/src/server/activitypub.ts
@@ -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));
diff --git a/src/server/activitypub/featured.ts b/src/server/activitypub/featured.ts
index 80a7852f59..66ad2aa86e 100644
--- a/src/server/activitypub/featured.ts
+++ b/src/server/activitypub/featured.ts
@@ -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)));
 
diff --git a/src/server/activitypub/outbox.ts b/src/server/activitypub/outbox.ts
index 03cf65bce6..3c1b07a679 100644
--- a/src/server/activitypub/outbox.ts
+++ b/src/server/activitypub/outbox.ts
@@ -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);
 	}
 
diff --git a/src/server/api/authenticate.ts b/src/server/api/authenticate.ts
index 0785372b3b..0374ca35ea 100644
--- a/src/server/api/authenticate.ts
+++ b/src/server/api/authenticate.ts
@@ -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,
diff --git a/src/server/api/common/inject-featured.ts b/src/server/api/common/inject-featured.ts
index 098d20e72d..3f47c13385 100644
--- a/src/server/api/common/inject-featured.ts
+++ b/src/server/api/common/inject-featured.ts
@@ -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;
 	}
 
diff --git a/src/server/api/common/inject-promo.ts b/src/server/api/common/inject-promo.ts
index f694ce6ea0..2c16ca4cf7 100644
--- a/src/server/api/common/inject-promo.ts
+++ b/src/server/api/common/inject-promo.ts
@@ -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);
 
diff --git a/src/server/api/endpoints/admin/federation/remove-all-following.ts b/src/server/api/endpoints/admin/federation/remove-all-following.ts
index 76497c0dd8..e593193552 100644
--- a/src/server/api/endpoints/admin/federation/remove-all-following.ts
+++ b/src/server/api/endpoints/admin/federation/remove-all-following.ts
@@ -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) {
diff --git a/src/server/api/endpoints/auth/accept.ts b/src/server/api/endpoints/auth/accept.ts
index e98242a3c3..6d4d31fa1e 100644
--- a/src/server/api/endpoints/auth/accept.ts
+++ b/src/server/api/endpoints/auth/accept.ts
@@ -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');
diff --git a/src/server/api/endpoints/auth/session/userkey.ts b/src/server/api/endpoints/auth/session/userkey.ts
index 7b474c8295..68d0c7bdf1 100644
--- a/src/server/api/endpoints/auth/session/userkey.ts
+++ b/src/server/api/endpoints/auth/session/userkey.ts
@@ -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);
diff --git a/src/server/api/endpoints/i.ts b/src/server/api/endpoints/i.ts
index 3d0c092adb..e5b65e0930 100644
--- a/src/server/api/endpoints/i.ts
+++ b/src/server/api/endpoints/i.ts
@@ -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(),
diff --git a/src/server/api/endpoints/i/2fa/done.ts b/src/server/api/endpoints/i/2fa/done.ts
index 7d35f929e0..9a74d7675b 100644
--- a/src/server/api/endpoints/i/2fa/done.ts
+++ b/src/server/api/endpoints/i/2fa/done.ts
@@ -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('二段階認証の設定が開始されていません');
diff --git a/src/server/api/endpoints/i/2fa/key-done.ts b/src/server/api/endpoints/i/2fa/key-done.ts
index 8ac165e629..4634944ca7 100644
--- a/src/server/api/endpoints/i/2fa/key-done.ts
+++ b/src/server/api/endpoints/i/2fa/key-done.ts
@@ -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!);
diff --git a/src/server/api/endpoints/i/2fa/register-key.ts b/src/server/api/endpoints/i/2fa/register-key.ts
index e189519a4c..d5cc11c7fb 100644
--- a/src/server/api/endpoints/i/2fa/register-key.ts
+++ b/src/server/api/endpoints/i/2fa/register-key.ts
@@ -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!);
diff --git a/src/server/api/endpoints/i/2fa/register.ts b/src/server/api/endpoints/i/2fa/register.ts
index 784b276a26..a39b2963e9 100644
--- a/src/server/api/endpoints/i/2fa/register.ts
+++ b/src/server/api/endpoints/i/2fa/register.ts
@@ -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!);
diff --git a/src/server/api/endpoints/i/2fa/remove-key.ts b/src/server/api/endpoints/i/2fa/remove-key.ts
index 3eb92ba19d..135f0eb284 100644
--- a/src/server/api/endpoints/i/2fa/remove-key.ts
+++ b/src/server/api/endpoints/i/2fa/remove-key.ts
@@ -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!);
diff --git a/src/server/api/endpoints/i/2fa/unregister.ts b/src/server/api/endpoints/i/2fa/unregister.ts
index f1287b2dca..e809f40c71 100644
--- a/src/server/api/endpoints/i/2fa/unregister.ts
+++ b/src/server/api/endpoints/i/2fa/unregister.ts
@@ -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!);
diff --git a/src/server/api/endpoints/i/change-password.ts b/src/server/api/endpoints/i/change-password.ts
index bc2ec3d7b5..0a8b86e665 100644
--- a/src/server/api/endpoints/i/change-password.ts
+++ b/src/server/api/endpoints/i/change-password.ts
@@ -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!);
diff --git a/src/server/api/endpoints/i/delete-account.ts b/src/server/api/endpoints/i/delete-account.ts
index 49a3349170..0f04c4c92d 100644
--- a/src/server/api/endpoints/i/delete-account.ts
+++ b/src/server/api/endpoints/i/delete-account.ts
@@ -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!);
diff --git a/src/server/api/endpoints/i/regenerate-token.ts b/src/server/api/endpoints/i/regenerate-token.ts
index 5d322aa122..3596e20197 100644
--- a/src/server/api/endpoints/i/regenerate-token.ts
+++ b/src/server/api/endpoints/i/regenerate-token.ts
@@ -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!);
diff --git a/src/server/api/endpoints/i/update-email.ts b/src/server/api/endpoints/i/update-email.ts
index d3d7bace75..730918aebe 100644
--- a/src/server/api/endpoints/i/update-email.ts
+++ b/src/server/api/endpoints/i/update-email.ts
@@ -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!);
diff --git a/src/server/api/endpoints/i/update.ts b/src/server/api/endpoints/i/update.ts
index bf1796924a..3d7f1fa76f 100644
--- a/src/server/api/endpoints/i/update.ts
+++ b/src/server/api/endpoints/i/update.ts
@@ -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;
diff --git a/src/server/api/endpoints/notes/delete.ts b/src/server/api/endpoints/notes/delete.ts
index 65565ee3ab..5afd911ca9 100644
--- a/src/server/api/endpoints/notes/delete.ts
+++ b/src/server/api/endpoints/notes/delete.ts
@@ -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);
 });
diff --git a/src/server/api/endpoints/notes/polls/vote.ts b/src/server/api/endpoints/notes/polls/vote.ts
index 1e6ab472cc..6113d7ea9a 100644
--- a/src/server/api/endpoints/notes/polls/vote.ts
+++ b/src/server/api/endpoints/notes/polls/vote.ts
@@ -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);
 	}
diff --git a/src/server/api/endpoints/room/show.ts b/src/server/api/endpoints/room/show.ts
index 96248a8c0c..e8af68956d 100644
--- a/src/server/api/endpoints/room/show.ts
+++ b/src/server/api/endpoints/room/show.ts
@@ -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, {
diff --git a/src/server/api/private/signin.ts b/src/server/api/private/signin.ts
index 734758d63d..7a5efc6cc9 100644
--- a/src/server/api/private/signin.ts
+++ b/src/server/api/private/signin.ts
@@ -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!);
diff --git a/src/server/api/service/discord.ts b/src/server/api/service/discord.ts
index 007458066d..fce840cde5 100644
--- a/src/server/api/service/discord.ts
+++ b/src/server/api/service/discord.ts
@@ -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: {
diff --git a/src/server/api/service/github.ts b/src/server/api/service/github.ts
index 663c3cc754..2b10fa02a0 100644
--- a/src/server/api/service/github.ts
+++ b/src/server/api/service/github.ts
@@ -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: {
diff --git a/src/server/api/service/twitter.ts b/src/server/api/service/twitter.ts
index 000eb57c1b..97e9d3a7fc 100644
--- a/src/server/api/service/twitter.ts
+++ b/src/server/api/service/twitter.ts
@@ -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: {
diff --git a/src/server/web/feed.ts b/src/server/web/feed.ts
index 9c7591d744..6078fbe0f3 100644
--- a/src/server/web/feed.ts
+++ b/src/server/web/feed.ts
@@ -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: {
diff --git a/src/server/web/index.ts b/src/server/web/index.ts
index f3442c6199..8ea7e15751 100644
--- a/src/server/web/index.ts
+++ b/src/server/web/index.ts
@@ -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,
diff --git a/src/services/add-note-to-antenna.ts b/src/services/add-note-to-antenna.ts
index f11607fd43..2c893488c3 100644
--- a/src/services/add-note-to-antenna.ts
+++ b/src/services/add-note-to-antenna.ts
@@ -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)))) {
diff --git a/src/services/following/create.ts b/src/services/following/create.ts
index c5f130f49f..c0583cdb86 100644
--- a/src/services/following/create.ts
+++ b/src/services/following/create.ts
@@ -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
diff --git a/src/services/following/requests/accept-all.ts b/src/services/following/requests/accept-all.ts
index 70e7448aad..da39965349 100644
--- a/src/services/following/requests/accept-all.ts
+++ b/src/services/following/requests/accept-all.ts
@@ -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);
 	}
 }
diff --git a/src/services/messages/delete.ts b/src/services/messages/delete.ts
index 0efff85f39..c94a7b67db 100644
--- a/src/services/messages/delete.ts
+++ b/src/services/messages/delete.ts
@@ -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);
diff --git a/src/services/note/create.ts b/src/services/note/create.ts
index 62ec92f2bc..563eaac758 100644
--- a/src/services/note/create.ts
+++ b/src/services/note/create.ts
@@ -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));
 		}
 	}
 
-- 
GitLab