refactor: resolve #7139

This commit is contained in:
syuilo 2021-02-13 15:33:38 +09:00
parent ebadd7fd3f
commit 91172654e4
76 changed files with 107 additions and 221 deletions

View file

@ -240,36 +240,6 @@ SQLでは配列のインデックスは**1始まり**。
MongoDBの時とは違い、findOneでレコードを取得する時に対象レコードが存在しない場合 **`undefined`** が返ってくるので注意。 MongoDBの時とは違い、findOneでレコードを取得する時に対象レコードが存在しない場合 **`undefined`** が返ってくるので注意。
MongoDBは`null`で返してきてたので、その感覚で`if (x === null)`とか書くとバグる。代わりに`if (x == null)`と書いてください 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作成方法 ### Migration作成方法
``` ```
npx ts-node ./node_modules/typeorm/cli.js migration:generate -n 変更の名前 npx ts-node ./node_modules/typeorm/cli.js migration:generate -n 変更の名前

View file

@ -4,7 +4,6 @@ import { User } from '../models/entities/user';
import { UserListJoinings, UserGroupJoinings } from '../models'; import { UserListJoinings, UserGroupJoinings } from '../models';
import parseAcct from './acct/parse'; import parseAcct from './acct/parse';
import { getFullApAccount } from './convert-host'; 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> { export async function checkHitAntenna(antenna: Antenna, note: Note, noteUser: User, followers: User['id'][]): Promise<boolean> {
if (note.visibility === 'specified') return false; 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; if (!listUsers.includes(note.userId)) return false;
} else if (antenna.src === 'group') { } 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({ const groupUsers = (await UserGroupJoinings.find({
userGroupId: joining.userGroupId userGroupId: joining.userGroupId

View file

@ -1,10 +1,9 @@
import { fetchMeta } from './fetch-meta'; import { fetchMeta } from './fetch-meta';
import { ILocalUser } from '../models/entities/user'; import { ILocalUser } from '../models/entities/user';
import { Users } from '../models'; import { Users } from '../models';
import { ensure } from '../prelude/ensure';
export async function fetchProxyAccount(): Promise<ILocalUser | null> { export async function fetchProxyAccount(): Promise<ILocalUser | null> {
const meta = await fetchMeta(); const meta = await fetchMeta();
if (meta.proxyAccountId == null) return null; if (meta.proxyAccountId == null) return null;
return await Users.findOne(meta.proxyAccountId).then(ensure) as ILocalUser; return await Users.findOneOrFail(meta.proxyAccountId) as ILocalUser;
} }

View file

@ -1,7 +1,6 @@
import { EntityRepository, Repository } from 'typeorm'; import { EntityRepository, Repository } from 'typeorm';
import { Users } from '..'; import { Users } from '..';
import { AbuseUserReport } from '../entities/abuse-user-report'; import { AbuseUserReport } from '../entities/abuse-user-report';
import { ensure } from '../../prelude/ensure';
import { awaitAll } from '../../prelude/await-all'; import { awaitAll } from '../../prelude/await-all';
@EntityRepository(AbuseUserReport) @EntityRepository(AbuseUserReport)
@ -9,7 +8,7 @@ export class AbuseUserReportRepository extends Repository<AbuseUserReport> {
public async pack( public async pack(
src: AbuseUserReport['id'] | AbuseUserReport, 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({ return await awaitAll({
id: report.id, id: report.id,

View file

@ -1,6 +1,5 @@
import { EntityRepository, Repository } from 'typeorm'; import { EntityRepository, Repository } from 'typeorm';
import { Antenna } from '../entities/antenna'; import { Antenna } from '../entities/antenna';
import { ensure } from '../../prelude/ensure';
import { SchemaType } from '../../misc/schema'; import { SchemaType } from '../../misc/schema';
import { AntennaNotes, UserGroupJoinings } from '..'; import { AntennaNotes, UserGroupJoinings } from '..';
@ -11,7 +10,7 @@ export class AntennaRepository extends Repository<Antenna> {
public async pack( public async pack(
src: Antenna['id'] | Antenna, src: Antenna['id'] | Antenna,
): Promise<PackedAntenna> { ): 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 hasUnreadNote = (await AntennaNotes.findOne({ antennaId: antenna.id, read: false })) != null;
const userGroupJoining = antenna.userGroupJoiningId ? await UserGroupJoinings.findOne(antenna.userGroupJoiningId) : null; const userGroupJoining = antenna.userGroupJoiningId ? await UserGroupJoinings.findOne(antenna.userGroupJoiningId) : null;

View file

@ -1,7 +1,6 @@
import { EntityRepository, Repository } from 'typeorm'; import { EntityRepository, Repository } from 'typeorm';
import { App } from '../entities/app'; import { App } from '../entities/app';
import { AccessTokens } from '..'; import { AccessTokens } from '..';
import { ensure } from '../../prelude/ensure';
import { SchemaType } from '../../misc/schema'; import { SchemaType } from '../../misc/schema';
export type PackedApp = SchemaType<typeof packedAppSchema>; export type PackedApp = SchemaType<typeof packedAppSchema>;
@ -23,7 +22,7 @@ export class AppRepository extends Repository<App> {
includeProfileImageIds: false includeProfileImageIds: false
}, options); }, options);
const app = typeof src === 'object' ? src : await this.findOne(src).then(ensure); const app = typeof src === 'object' ? src : await this.findOneOrFail(src);
return { return {
id: app.id, id: app.id,

View file

@ -1,7 +1,6 @@
import { EntityRepository, Repository } from 'typeorm'; import { EntityRepository, Repository } from 'typeorm';
import { Apps } from '..'; import { Apps } from '..';
import { AuthSession } from '../entities/auth-session'; import { AuthSession } from '../entities/auth-session';
import { ensure } from '../../prelude/ensure';
import { awaitAll } from '../../prelude/await-all'; import { awaitAll } from '../../prelude/await-all';
@EntityRepository(AuthSession) @EntityRepository(AuthSession)
@ -10,7 +9,7 @@ export class AuthSessionRepository extends Repository<AuthSession> {
src: AuthSession['id'] | AuthSession, src: AuthSession['id'] | AuthSession,
me?: any 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({ return await awaitAll({
id: session.id, id: session.id,

View file

@ -1,7 +1,6 @@
import { EntityRepository, Repository } from 'typeorm'; import { EntityRepository, Repository } from 'typeorm';
import { Users } from '..'; import { Users } from '..';
import { Blocking } from '../entities/blocking'; import { Blocking } from '../entities/blocking';
import { ensure } from '../../prelude/ensure';
import { awaitAll } from '../../prelude/await-all'; import { awaitAll } from '../../prelude/await-all';
import { SchemaType } from '../../misc/schema'; import { SchemaType } from '../../misc/schema';
@ -13,7 +12,7 @@ export class BlockingRepository extends Repository<Blocking> {
src: Blocking['id'] | Blocking, src: Blocking['id'] | Blocking,
me?: any me?: any
): Promise<PackedBlocking> { ): 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({ return await awaitAll({
id: blocking.id, id: blocking.id,

View file

@ -1,6 +1,5 @@
import { EntityRepository, Repository } from 'typeorm'; import { EntityRepository, Repository } from 'typeorm';
import { Channel } from '../entities/channel'; import { Channel } from '../entities/channel';
import { ensure } from '../../prelude/ensure';
import { SchemaType } from '../../misc/schema'; import { SchemaType } from '../../misc/schema';
import { DriveFiles, ChannelFollowings, NoteUnreads } from '..'; import { DriveFiles, ChannelFollowings, NoteUnreads } from '..';
import { User } from '../entities/user'; import { User } from '../entities/user';
@ -13,7 +12,7 @@ export class ChannelRepository extends Repository<Channel> {
src: Channel['id'] | Channel, src: Channel['id'] | Channel,
me?: User['id'] | User | null | undefined, me?: User['id'] | User | null | undefined,
): Promise<PackedChannel> { ): 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 meId = me ? typeof me === 'string' ? me : me.id : null;
const banner = channel.bannerId ? await DriveFiles.findOne(channel.bannerId) : null; const banner = channel.bannerId ? await DriveFiles.findOne(channel.bannerId) : null;

View file

@ -1,6 +1,5 @@
import { EntityRepository, Repository } from 'typeorm'; import { EntityRepository, Repository } from 'typeorm';
import { Clip } from '../entities/clip'; import { Clip } from '../entities/clip';
import { ensure } from '../../prelude/ensure';
import { SchemaType } from '../../misc/schema'; import { SchemaType } from '../../misc/schema';
import { Users } from '..'; import { Users } from '..';
import { awaitAll } from '../../prelude/await-all'; import { awaitAll } from '../../prelude/await-all';
@ -12,7 +11,7 @@ export class ClipRepository extends Repository<Clip> {
public async pack( public async pack(
src: Clip['id'] | Clip, src: Clip['id'] | Clip,
): Promise<PackedClip> { ): 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({ return await awaitAll({
id: clip.id, id: clip.id,

View file

@ -3,7 +3,6 @@ import { DriveFile } from '../entities/drive-file';
import { Users, DriveFolders } from '..'; import { Users, DriveFolders } from '..';
import { User } from '../entities/user'; import { User } from '../entities/user';
import { toPuny } from '../../misc/convert-host'; import { toPuny } from '../../misc/convert-host';
import { ensure } from '../../prelude/ensure';
import { awaitAll } from '../../prelude/await-all'; import { awaitAll } from '../../prelude/await-all';
import { SchemaType } from '../../misc/schema'; import { SchemaType } from '../../misc/schema';
import config from '../../config'; import config from '../../config';
@ -103,7 +102,7 @@ export class DriveFileRepository extends Repository<DriveFile> {
self: false self: false
}, options); }, 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(); const meta = await fetchMeta();

View file

@ -1,7 +1,6 @@
import { EntityRepository, Repository } from 'typeorm'; import { EntityRepository, Repository } from 'typeorm';
import { DriveFolders, DriveFiles } from '..'; import { DriveFolders, DriveFiles } from '..';
import { DriveFolder } from '../entities/drive-folder'; import { DriveFolder } from '../entities/drive-folder';
import { ensure } from '../../prelude/ensure';
import { awaitAll } from '../../prelude/await-all'; import { awaitAll } from '../../prelude/await-all';
import { SchemaType } from '../../misc/schema'; import { SchemaType } from '../../misc/schema';
@ -26,7 +25,7 @@ export class DriveFolderRepository extends Repository<DriveFolder> {
detail: false detail: false
}, options); }, 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({ return await awaitAll({
id: folder.id, id: folder.id,

View file

@ -1,13 +1,12 @@
import { EntityRepository, Repository } from 'typeorm'; import { EntityRepository, Repository } from 'typeorm';
import { Emoji } from '../entities/emoji'; import { Emoji } from '../entities/emoji';
import { ensure } from '../../prelude/ensure';
@EntityRepository(Emoji) @EntityRepository(Emoji)
export class EmojiRepository extends Repository<Emoji> { export class EmojiRepository extends Repository<Emoji> {
public async pack( public async pack(
src: Emoji['id'] | Emoji, 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 { return {
id: emoji.id, id: emoji.id,

View file

@ -1,7 +1,6 @@
import { EntityRepository, Repository } from 'typeorm'; import { EntityRepository, Repository } from 'typeorm';
import { FollowRequest } from '../entities/follow-request'; import { FollowRequest } from '../entities/follow-request';
import { Users } from '..'; import { Users } from '..';
import { ensure } from '../../prelude/ensure';
@EntityRepository(FollowRequest) @EntityRepository(FollowRequest)
export class FollowRequestRepository extends Repository<FollowRequest> { export class FollowRequestRepository extends Repository<FollowRequest> {
@ -9,7 +8,7 @@ export class FollowRequestRepository extends Repository<FollowRequest> {
src: FollowRequest['id'] | FollowRequest, src: FollowRequest['id'] | FollowRequest,
me?: any 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 { return {
id: request.id, id: request.id,

View file

@ -1,7 +1,6 @@
import { EntityRepository, Repository } from 'typeorm'; import { EntityRepository, Repository } from 'typeorm';
import { Users } from '..'; import { Users } from '..';
import { Following } from '../entities/following'; import { Following } from '../entities/following';
import { ensure } from '../../prelude/ensure';
import { awaitAll } from '../../prelude/await-all'; import { awaitAll } from '../../prelude/await-all';
import { SchemaType } from '../../misc/schema'; import { SchemaType } from '../../misc/schema';
@ -57,7 +56,7 @@ export class FollowingRepository extends Repository<Following> {
populateFollower?: boolean; populateFollower?: boolean;
} }
): Promise<PackedFollowing> { ): 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 = {}; if (opts == null) opts = {};

View file

@ -1,7 +1,6 @@
import { EntityRepository, Repository } from 'typeorm'; import { EntityRepository, Repository } from 'typeorm';
import { Users } from '../../..'; import { Users } from '../../..';
import { ReversiGame } from '../../../entities/games/reversi/game'; import { ReversiGame } from '../../../entities/games/reversi/game';
import { ensure } from '../../../../prelude/ensure';
@EntityRepository(ReversiGame) @EntityRepository(ReversiGame)
export class ReversiGameRepository extends Repository<ReversiGame> { export class ReversiGameRepository extends Repository<ReversiGame> {
@ -16,7 +15,7 @@ export class ReversiGameRepository extends Repository<ReversiGame> {
detail: true detail: true
}, options); }, 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; const meId = me ? typeof me === 'string' ? me : me.id : null;
return { return {

View file

@ -1,7 +1,6 @@
import { EntityRepository, Repository } from 'typeorm'; import { EntityRepository, Repository } from 'typeorm';
import { ReversiMatching } from '../../../entities/games/reversi/matching'; import { ReversiMatching } from '../../../entities/games/reversi/matching';
import { Users } from '../../..'; import { Users } from '../../..';
import { ensure } from '../../../../prelude/ensure';
import { awaitAll } from '../../../../prelude/await-all'; import { awaitAll } from '../../../../prelude/await-all';
@EntityRepository(ReversiMatching) @EntityRepository(ReversiMatching)
@ -10,7 +9,7 @@ export class ReversiMatchingRepository extends Repository<ReversiMatching> {
src: ReversiMatching['id'] | ReversiMatching, src: ReversiMatching['id'] | ReversiMatching,
me: any 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({ return await awaitAll({
id: matching.id, id: matching.id,

View file

@ -1,7 +1,6 @@
import { EntityRepository, Repository } from 'typeorm'; import { EntityRepository, Repository } from 'typeorm';
import { MessagingMessage } from '../entities/messaging-message'; import { MessagingMessage } from '../entities/messaging-message';
import { Users, DriveFiles, UserGroups } from '..'; import { Users, DriveFiles, UserGroups } from '..';
import { ensure } from '../../prelude/ensure';
import { SchemaType } from '../../misc/schema'; import { SchemaType } from '../../misc/schema';
export type PackedMessagingMessage = SchemaType<typeof packedMessagingMessageSchema>; export type PackedMessagingMessage = SchemaType<typeof packedMessagingMessageSchema>;
@ -25,7 +24,7 @@ export class MessagingMessageRepository extends Repository<MessagingMessage> {
populateGroup: true, 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 { return {
id: message.id, id: message.id,

View file

@ -1,7 +1,6 @@
import { EntityRepository, Repository } from 'typeorm'; import { EntityRepository, Repository } from 'typeorm';
import { Users } from '..'; import { Users } from '..';
import { ModerationLog } from '../entities/moderation-log'; import { ModerationLog } from '../entities/moderation-log';
import { ensure } from '../../prelude/ensure';
import { awaitAll } from '../../prelude/await-all'; import { awaitAll } from '../../prelude/await-all';
@EntityRepository(ModerationLog) @EntityRepository(ModerationLog)
@ -9,7 +8,7 @@ export class ModerationLogRepository extends Repository<ModerationLog> {
public async pack( public async pack(
src: ModerationLog['id'] | ModerationLog, 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({ return await awaitAll({
id: log.id, id: log.id,

View file

@ -1,7 +1,6 @@
import { EntityRepository, Repository } from 'typeorm'; import { EntityRepository, Repository } from 'typeorm';
import { Users } from '..'; import { Users } from '..';
import { Muting } from '../entities/muting'; import { Muting } from '../entities/muting';
import { ensure } from '../../prelude/ensure';
import { awaitAll } from '../../prelude/await-all'; import { awaitAll } from '../../prelude/await-all';
import { SchemaType } from '../../misc/schema'; import { SchemaType } from '../../misc/schema';
@ -13,7 +12,7 @@ export class MutingRepository extends Repository<Muting> {
src: Muting['id'] | Muting, src: Muting['id'] | Muting,
me?: any me?: any
): Promise<PackedMuting> { ): 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({ return await awaitAll({
id: muting.id, id: muting.id,

View file

@ -1,7 +1,6 @@
import { EntityRepository, Repository } from 'typeorm'; import { EntityRepository, Repository } from 'typeorm';
import { NoteFavorite } from '../entities/note-favorite'; import { NoteFavorite } from '../entities/note-favorite';
import { Notes } from '..'; import { Notes } from '..';
import { ensure } from '../../prelude/ensure';
@EntityRepository(NoteFavorite) @EntityRepository(NoteFavorite)
export class NoteFavoriteRepository extends Repository<NoteFavorite> { export class NoteFavoriteRepository extends Repository<NoteFavorite> {
@ -9,7 +8,7 @@ export class NoteFavoriteRepository extends Repository<NoteFavorite> {
src: NoteFavorite['id'] | NoteFavorite, src: NoteFavorite['id'] | NoteFavorite,
me?: any 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 { return {
id: favorite.id, id: favorite.id,

View file

@ -1,7 +1,6 @@
import { EntityRepository, Repository } from 'typeorm'; import { EntityRepository, Repository } from 'typeorm';
import { NoteReaction } from '../entities/note-reaction'; import { NoteReaction } from '../entities/note-reaction';
import { Users } from '..'; import { Users } from '..';
import { ensure } from '../../prelude/ensure';
import { SchemaType } from '../../misc/schema'; import { SchemaType } from '../../misc/schema';
import { convertLegacyReaction } from '../../misc/reaction-lib'; import { convertLegacyReaction } from '../../misc/reaction-lib';
@ -13,7 +12,7 @@ export class NoteReactionRepository extends Repository<NoteReaction> {
src: NoteReaction['id'] | NoteReaction, src: NoteReaction['id'] | NoteReaction,
me?: any me?: any
): Promise<PackedNoteReaction> { ): 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 { return {
id: reaction.id, id: reaction.id,

View file

@ -2,7 +2,6 @@ import { EntityRepository, Repository, In } from 'typeorm';
import { Note } from '../entities/note'; import { Note } from '../entities/note';
import { User } from '../entities/user'; import { User } from '../entities/user';
import { Emojis, Users, PollVotes, DriveFiles, NoteReactions, Followings, Polls, Channels } from '..'; import { Emojis, Users, PollVotes, DriveFiles, NoteReactions, Followings, Polls, Channels } from '..';
import { ensure } from '../../prelude/ensure';
import { SchemaType } from '../../misc/schema'; import { SchemaType } from '../../misc/schema';
import { awaitAll } from '../../prelude/await-all'; import { awaitAll } from '../../prelude/await-all';
import { convertLegacyReaction, convertLegacyReactions, decodeReaction } from '../../misc/reaction-lib'; import { convertLegacyReaction, convertLegacyReactions, decodeReaction } from '../../misc/reaction-lib';
@ -92,11 +91,11 @@ export class NoteRepository extends Repository<Note> {
}, options); }, options);
const meId = me ? typeof me === 'string' ? me : me.id : null; 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; const host = note.userHost;
async function populatePoll() { 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 => ({ const choices = poll.choices.map(c => ({
text: c, text: c,
votes: poll.votes[poll.choices.indexOf(c)], votes: poll.votes[poll.choices.indexOf(c)],

View file

@ -1,7 +1,6 @@
import { EntityRepository, Repository } from 'typeorm'; import { EntityRepository, Repository } from 'typeorm';
import { Users, Notes, UserGroupInvitations, AccessTokens } from '..'; import { Users, Notes, UserGroupInvitations, AccessTokens } from '..';
import { Notification } from '../entities/notification'; import { Notification } from '../entities/notification';
import { ensure } from '../../prelude/ensure';
import { awaitAll } from '../../prelude/await-all'; import { awaitAll } from '../../prelude/await-all';
import { SchemaType } from '../../misc/schema'; import { SchemaType } from '../../misc/schema';
@ -12,8 +11,8 @@ export class NotificationRepository extends Repository<Notification> {
public async pack( public async pack(
src: Notification['id'] | Notification, src: Notification['id'] | Notification,
): Promise<PackedNotification> { ): Promise<PackedNotification> {
const notification = typeof src === 'object' ? src : await this.findOne(src).then(ensure); const notification = typeof src === 'object' ? src : await this.findOneOrFail(src);
const token = notification.appAccessTokenId ? await AccessTokens.findOne(notification.appAccessTokenId).then(ensure) : null; const token = notification.appAccessTokenId ? await AccessTokens.findOneOrFail(notification.appAccessTokenId) : null;
return await awaitAll({ return await awaitAll({
id: notification.id, id: notification.id,

View file

@ -1,7 +1,6 @@
import { EntityRepository, Repository } from 'typeorm'; import { EntityRepository, Repository } from 'typeorm';
import { PageLike } from '../entities/page-like'; import { PageLike } from '../entities/page-like';
import { Pages } from '..'; import { Pages } from '..';
import { ensure } from '../../prelude/ensure';
@EntityRepository(PageLike) @EntityRepository(PageLike)
export class PageLikeRepository extends Repository<PageLike> { export class PageLikeRepository extends Repository<PageLike> {
@ -9,7 +8,7 @@ export class PageLikeRepository extends Repository<PageLike> {
src: PageLike['id'] | PageLike, src: PageLike['id'] | PageLike,
me?: any 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 { return {
id: like.id, id: like.id,

View file

@ -5,7 +5,6 @@ import { Users, DriveFiles, PageLikes } from '..';
import { awaitAll } from '../../prelude/await-all'; import { awaitAll } from '../../prelude/await-all';
import { DriveFile } from '../entities/drive-file'; import { DriveFile } from '../entities/drive-file';
import { User } from '../entities/user'; import { User } from '../entities/user';
import { ensure } from '../../prelude/ensure';
export type PackedPage = SchemaType<typeof packedPageSchema>; export type PackedPage = SchemaType<typeof packedPageSchema>;
@ -16,7 +15,7 @@ export class PageRepository extends Repository<Page> {
me?: User['id'] | User | null | undefined, me?: User['id'] | User | null | undefined,
): Promise<PackedPage> { ): Promise<PackedPage> {
const meId = me ? typeof me === 'string' ? me : me.id : null; 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 attachedFiles: Promise<DriveFile | undefined>[] = [];
const collectFile = (xs: any[]) => { const collectFile = (xs: any[]) => {

View file

@ -1,14 +1,13 @@
import { EntityRepository, Repository } from 'typeorm'; import { EntityRepository, Repository } from 'typeorm';
import { UserGroupInvitation } from '../entities/user-group-invitation'; import { UserGroupInvitation } from '../entities/user-group-invitation';
import { UserGroups } from '..'; import { UserGroups } from '..';
import { ensure } from '../../prelude/ensure';
@EntityRepository(UserGroupInvitation) @EntityRepository(UserGroupInvitation)
export class UserGroupInvitationRepository extends Repository<UserGroupInvitation> { export class UserGroupInvitationRepository extends Repository<UserGroupInvitation> {
public async pack( public async pack(
src: UserGroupInvitation['id'] | UserGroupInvitation, 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 { return {
id: invitation.id, id: invitation.id,

View file

@ -1,6 +1,5 @@
import { EntityRepository, Repository } from 'typeorm'; import { EntityRepository, Repository } from 'typeorm';
import { UserGroup } from '../entities/user-group'; import { UserGroup } from '../entities/user-group';
import { ensure } from '../../prelude/ensure';
import { UserGroupJoinings } from '..'; import { UserGroupJoinings } from '..';
import { SchemaType } from '../../misc/schema'; import { SchemaType } from '../../misc/schema';
@ -11,7 +10,7 @@ export class UserGroupRepository extends Repository<UserGroup> {
public async pack( public async pack(
src: UserGroup['id'] | UserGroup, src: UserGroup['id'] | UserGroup,
): Promise<PackedUserGroup> { ): 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({ const users = await UserGroupJoinings.find({
userGroupId: userGroup.id userGroupId: userGroup.id

View file

@ -1,6 +1,5 @@
import { EntityRepository, Repository } from 'typeorm'; import { EntityRepository, Repository } from 'typeorm';
import { UserList } from '../entities/user-list'; import { UserList } from '../entities/user-list';
import { ensure } from '../../prelude/ensure';
import { UserListJoinings } from '..'; import { UserListJoinings } from '..';
import { SchemaType } from '../../misc/schema'; import { SchemaType } from '../../misc/schema';
@ -11,7 +10,7 @@ export class UserListRepository extends Repository<UserList> {
public async pack( public async pack(
src: UserList['id'] | UserList, src: UserList['id'] | UserList,
): Promise<PackedUserList> { ): 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({ const users = await UserListJoinings.find({
userListId: userList.id userListId: userList.id

View file

@ -2,7 +2,6 @@ import $ from 'cafy';
import { EntityRepository, Repository, In, Not } from 'typeorm'; import { EntityRepository, Repository, In, Not } from 'typeorm';
import { User, ILocalUser, IRemoteUser } from '../entities/user'; 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 { 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 config from '../../config';
import { SchemaType } from '../../misc/schema'; import { SchemaType } from '../../misc/schema';
import { awaitAll } from '../../prelude/await-all'; import { awaitAll } from '../../prelude/await-all';
@ -157,7 +156,7 @@ export class UserRepository extends Repository<User> {
includeSecrets: false includeSecrets: false
}, options); }, 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 meId = me ? typeof me === 'string' ? me : me.id : null;
const relation = meId && (meId !== user.id) && opts.detail ? await this.getRelation(meId, user.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 }, where: { userId: user.id },
order: { id: 'DESC' } 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; const falsy = opts.detail ? false : undefined;

View file

@ -1,10 +0,0 @@
/**
* null undefined
*/
export function ensure<T>(x: T): NonNullable<T> {
if (x == null) {
throw new Error('ぬるぽ');
} else {
return x!;
}
}

View file

@ -9,7 +9,6 @@ import { Users, Notes, Polls } from '../../../models';
import { MoreThan } from 'typeorm'; import { MoreThan } from 'typeorm';
import { Note } from '../../../models/entities/note'; import { Note } from '../../../models/entities/note';
import { Poll } from '../../../models/entities/poll'; import { Poll } from '../../../models/entities/poll';
import { ensure } from '../../../prelude/ensure';
const logger = queueLogger.createSubLogger('export-notes'); 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) { for (const note of notes) {
let poll: Poll | undefined; let poll: Poll | undefined;
if (note.hasPoll) { 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)); const content = JSON.stringify(serialize(note, poll));
await new Promise((res, rej) => { await new Promise((res, rej) => {

View file

@ -6,7 +6,6 @@ import { MessagingMessage } from '../../models/entities/messaging-message';
import { Notes, Users, UserPublickeys, MessagingMessages } from '../../models'; import { Notes, Users, UserPublickeys, MessagingMessages } from '../../models';
import { IObject, getApId } from './type'; import { IObject, getApId } from './type';
import { resolvePerson } from './models/person'; import { resolvePerson } from './models/person';
import { ensure } from '../../prelude/ensure';
import escapeRegexp = require('escape-regexp'); import escapeRegexp = require('escape-regexp');
export default class DbResolver { export default class DbResolver {
@ -99,7 +98,7 @@ export default class DbResolver {
if (user == null) return null; if (user == null) return null;
const key = await UserPublickeys.findOne(user.id).then(ensure); const key = await UserPublickeys.findOneOrFail(user.id);
return { return {
user, user,

View file

@ -5,7 +5,6 @@ import { fetchMeta } from '../../../misc/fetch-meta';
import { apLogger } from '../logger'; import { apLogger } from '../logger';
import { DriveFile } from '../../../models/entities/drive-file'; import { DriveFile } from '../../../models/entities/drive-file';
import { DriveFiles } from '../../../models'; import { DriveFiles } from '../../../models';
import { ensure } from '../../../prelude/ensure';
const logger = apLogger; const logger = apLogger;
@ -40,7 +39,7 @@ export async function createImage(actor: IRemoteUser, value: any): Promise<Drive
uri: image.url uri: image.url
}); });
file = await DriveFiles.findOne(file.id).then(ensure); file = await DriveFiles.findOneOrFail(file.id);
} }
} }

View file

@ -21,7 +21,6 @@ import { IObject, getOneApId, getApId, getOneApHrefNullable, validPost, IPost, i
import { Emoji } from '../../../models/entities/emoji'; import { Emoji } from '../../../models/entities/emoji';
import { genId } from '../../../misc/gen-id'; import { genId } from '../../../misc/gen-id';
import { fetchMeta } from '../../../misc/fetch-meta'; import { fetchMeta } from '../../../misc/fetch-meta';
import { ensure } from '../../../prelude/ensure';
import { getApLock } from '../../../misc/app-lock'; import { getApLock } from '../../../misc/app-lock';
import { createMessage } from '../../../services/messages/create'; import { createMessage } from '../../../services/messages/create';
import { parseAudience } from '../audience'; import { parseAudience } from '../audience';
@ -201,7 +200,7 @@ export async function createNote(value: string | IObject, resolver?: Resolver, s
// vote // vote
if (reply && reply.hasPoll) { 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> => { const tryCreateVote = async (name: string, index: number): Promise<null> => {
if (poll.expiresAt && Date.now() > new Date(poll.expiresAt).getTime()) { if (poll.expiresAt && Date.now() > new Date(poll.expiresAt).getTime()) {

View file

@ -24,7 +24,6 @@ import { toPuny } from '../../../misc/convert-host';
import { UserProfile } from '../../../models/entities/user-profile'; import { UserProfile } from '../../../models/entities/user-profile';
import { validActor } from '../../../remote/activitypub/type'; import { validActor } from '../../../remote/activitypub/type';
import { getConnection } from 'typeorm'; import { getConnection } from 'typeorm';
import { ensure } from '../../../prelude/ensure';
import { toArray } from '../../../prelude/array'; import { toArray } from '../../../prelude/array';
import { fetchInstanceMetadata } from '../../../services/fetch-instance-metadata'; import { fetchInstanceMetadata } from '../../../services/fetch-instance-metadata';
import { normalizeForSearch } from '../../../misc/normalize-for-search'; 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']) { 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 (!Users.isRemoteUser(user)) return;
if (!user.featured) return; if (!user.featured) return;

View file

@ -1,13 +1,12 @@
import config from '../../../config'; import config from '../../../config';
import { Users } from '../../../models'; import { Users } from '../../../models';
import { User } from '../../../models/entities/user'; import { User } from '../../../models/entities/user';
import { ensure } from '../../../prelude/ensure';
/** /**
* Convert (local|remote)(Follower|Followee)ID to URL * Convert (local|remote)(Follower|Followee)ID to URL
* @param id Follower|Followee ID * @param id Follower|Followee ID
*/ */
export default async function renderFollowUser(id: User['id']): Promise<any> { 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; return Users.isLocalUser(user) ? `${config.url}/users/${user.id}` : user.uri;
} }

View file

@ -4,7 +4,6 @@ import { IActivity } from '../type';
import { LdSignature } from '../misc/ld-signature'; import { LdSignature } from '../misc/ld-signature';
import { ILocalUser } from '../../../models/entities/user'; import { ILocalUser } from '../../../models/entities/user';
import { UserKeypairs } from '../../../models'; import { UserKeypairs } from '../../../models';
import { ensure } from '../../../prelude/ensure';
export const renderActivity = (x: any): IActivity | null => { export const renderActivity = (x: any): IActivity | null => {
if (x == null) return 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> => { export const attachLdSignature = async (activity: any, user: ILocalUser): Promise<IActivity | null> => {
if (activity == null) return null; if (activity == null) return null;
const keypair = await UserKeypairs.findOne({ const keypair = await UserKeypairs.findOneOrFail({
userId: user.id userId: user.id
}).then(ensure); });
const obj = { const obj = {
// as non-standards // as non-standards

View file

@ -10,7 +10,6 @@ import { DriveFiles, Notes, Users, Emojis, Polls } from '../../../models';
import { In } from 'typeorm'; import { In } from 'typeorm';
import { Emoji } from '../../../models/entities/emoji'; import { Emoji } from '../../../models/entities/emoji';
import { Poll } from '../../../models/entities/poll'; import { Poll } from '../../../models/entities/poll';
import { ensure } from '../../../prelude/ensure';
export default async function renderNote(note: Note, dive = true, isTalk = false): Promise<any> { export default async function renderNote(note: Note, dive = true, isTalk = false): Promise<any> {
const getPromisedFiles = async (ids: string[]) => { 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}`; const attributedTo = `${config.url}/users/${user.id}`;

View file

@ -9,7 +9,6 @@ import renderEmoji from './emoji';
import { IIdentifier } from '../models/identifier'; import { IIdentifier } from '../models/identifier';
import renderHashtag from './hashtag'; import renderHashtag from './hashtag';
import { DriveFiles, UserProfiles, UserKeypairs } from '../../../models'; import { DriveFiles, UserProfiles, UserKeypairs } from '../../../models';
import { ensure } from '../../../prelude/ensure';
export async function renderPerson(user: ILocalUser) { export async function renderPerson(user: ILocalUser) {
const id = `${config.url}/users/${user.id}`; const id = `${config.url}/users/${user.id}`;
@ -18,7 +17,7 @@ export async function renderPerson(user: ILocalUser) {
const [avatar, banner, profile] = await Promise.all([ const [avatar, banner, profile] = await Promise.all([
user.avatarId ? DriveFiles.findOne(user.avatarId) : Promise.resolve(undefined), user.avatarId ? DriveFiles.findOne(user.avatarId) : Promise.resolve(undefined),
user.bannerId ? DriveFiles.findOne(user.bannerId) : Promise.resolve(undefined), user.bannerId ? DriveFiles.findOne(user.bannerId) : Promise.resolve(undefined),
UserProfiles.findOne(user.id).then(ensure) UserProfiles.findOneOrFail(user.id)
]); ]);
const attachment: { const attachment: {
@ -50,7 +49,7 @@ export async function renderPerson(user: ILocalUser) {
...hashtagTags, ...hashtagTags,
]; ];
const keypair = await UserKeypairs.findOne(user.id).then(ensure); const keypair = await UserKeypairs.findOneOrFail(user.id);
const person = { const person = {
type: isSystem ? 'Application' : user.isBot ? 'Service' : 'Person', type: isSystem ? 'Application' : user.isBot ? 'Service' : 'Person',

View file

@ -6,7 +6,6 @@ import * as crypto from 'crypto';
import config from '../../config'; import config from '../../config';
import { ILocalUser } from '../../models/entities/user'; import { ILocalUser } from '../../models/entities/user';
import { UserKeypairs } from '../../models'; import { UserKeypairs } from '../../models';
import { ensure } from '../../prelude/ensure';
import { getAgentByUrl } from '../../misc/fetch'; import { getAgentByUrl } from '../../misc/fetch';
import { URL } from 'url'; import { URL } from 'url';
import got from 'got'; import got from 'got';
@ -23,9 +22,9 @@ export default async (user: ILocalUser, url: string, object: any) => {
sha256.update(data); sha256.update(data);
const hash = sha256.digest('base64'); const hash = sha256.digest('base64');
const keypair = await UserKeypairs.findOne({ const keypair = await UserKeypairs.findOneOrFail({
userId: user.id userId: user.id
}).then(ensure); });
await new Promise((resolve, reject) => { await new Promise((resolve, reject) => {
const req = https.request({ 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) { export async function signedGet(url: string, user: ILocalUser) {
const timeout = 10 * 1000; const timeout = 10 * 1000;
const keypair = await UserKeypairs.findOne({ const keypair = await UserKeypairs.findOneOrFail({
userId: user.id userId: user.id
}).then(ensure); });
const req = got.get<any>(url, { const req = got.get<any>(url, {
headers: { headers: {

View file

@ -16,7 +16,6 @@ import { isSelfHost } from '../misc/convert-host';
import { Notes, Users, Emojis, UserKeypairs, NoteReactions } from '../models'; import { Notes, Users, Emojis, UserKeypairs, NoteReactions } from '../models';
import { ILocalUser, User } from '../models/entities/user'; import { ILocalUser, User } from '../models/entities/user';
import { In } from 'typeorm'; import { In } from 'typeorm';
import { ensure } from '../prelude/ensure';
import { renderLike } from '../remote/activitypub/renderer/like'; import { renderLike } from '../remote/activitypub/renderer/like';
// Init router // Init router
@ -136,7 +135,7 @@ router.get('/users/:user/publickey', async ctx => {
return; return;
} }
const keypair = await UserKeypairs.findOne(user.id).then(ensure); const keypair = await UserKeypairs.findOneOrFail(user.id);
if (Users.isLocalUser(user)) { if (Users.isLocalUser(user)) {
ctx.body = renderActivity(renderKey(user, keypair)); ctx.body = renderActivity(renderKey(user, keypair));

View file

@ -5,7 +5,6 @@ import renderOrderedCollection from '../../remote/activitypub/renderer/ordered-c
import { setResponseType } from '../activitypub'; import { setResponseType } from '../activitypub';
import renderNote from '../../remote/activitypub/renderer/note'; import renderNote from '../../remote/activitypub/renderer/note';
import { Users, Notes, UserNotePinings } from '../../models'; import { Users, Notes, UserNotePinings } from '../../models';
import { ensure } from '../../prelude/ensure';
export default async (ctx: Router.RouterContext) => { export default async (ctx: Router.RouterContext) => {
const userId = ctx.params.user; const userId = ctx.params.user;
@ -27,7 +26,7 @@ export default async (ctx: Router.RouterContext) => {
}); });
const pinnedNotes = await Promise.all(pinings.map(pining => 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))); const renderedNotes = await Promise.all(pinnedNotes.map(note => renderNote(note)));

View file

@ -15,7 +15,6 @@ import { Users, Notes } from '../../models';
import { makePaginationQuery } from '../api/common/make-pagination-query'; import { makePaginationQuery } from '../api/common/make-pagination-query';
import { Brackets } from 'typeorm'; import { Brackets } from 'typeorm';
import { Note } from '../../models/entities/note'; import { Note } from '../../models/entities/note';
import { ensure } from '../../prelude/ensure';
export default async (ctx: Router.RouterContext) => { export default async (ctx: Router.RouterContext) => {
const userId = ctx.params.user; const userId = ctx.params.user;
@ -101,7 +100,7 @@ export default async (ctx: Router.RouterContext) => {
*/ */
export async function packActivity(note: Note): Promise<any> { export async function packActivity(note: Note): Promise<any> {
if (note.renoteId && note.text == null && !note.hasPoll && (note.fileIds == null || note.fileIds.length === 0)) { 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); return renderAnnounce(renote.uri ? renote.uri : `${config.url}/notes/${renote.id}`, note);
} }

View file

@ -1,7 +1,6 @@
import isNativeToken from './common/is-native-token'; import isNativeToken from './common/is-native-token';
import { User } from '../../models/entities/user'; import { User } from '../../models/entities/user';
import { Users, AccessTokens, Apps } from '../../models'; import { Users, AccessTokens, Apps } from '../../models';
import { ensure } from '../../prelude/ensure';
import { AccessToken } from '../../models/entities/access-token'; import { AccessToken } from '../../models/entities/access-token';
export default async (token: string): Promise<[User | null | undefined, AccessToken | null | undefined]> => { 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) { if (accessToken.appId) {
const app = await Apps const app = await Apps
.findOne(accessToken.appId).then(ensure); .findOneOrFail(accessToken.appId);
return [user, { return [user, {
id: accessToken.id, id: accessToken.id,

View file

@ -3,7 +3,6 @@ import { Note } from '../../../models/entities/note';
import { User } from '../../../models/entities/user'; import { User } from '../../../models/entities/user';
import { Notes, UserProfiles, NoteReactions } from '../../../models'; import { Notes, UserProfiles, NoteReactions } from '../../../models';
import { generateMutedUserQuery } from './generate-muted-user-query'; import { generateMutedUserQuery } from './generate-muted-user-query';
import { ensure } from '../../../prelude/ensure';
// TODO: リアクション、Renote、返信などをしたートは除外する // TODO: リアクション、Renote、返信などをしたートは除外する
@ -11,7 +10,7 @@ export async function injectFeatured(timeline: Note[], user?: User | null) {
if (timeline.length < 5) return; if (timeline.length < 5) return;
if (user) { if (user) {
const profile = await UserProfiles.findOne(user.id).then(ensure); const profile = await UserProfiles.findOneOrFail(user.id);
if (!profile.injectFeaturedNote) return; if (!profile.injectFeaturedNote) return;
} }

View file

@ -2,7 +2,6 @@ import rndstr from 'rndstr';
import { Note } from '../../../models/entities/note'; import { Note } from '../../../models/entities/note';
import { User } from '../../../models/entities/user'; import { User } from '../../../models/entities/user';
import { PromoReads, PromoNotes, Notes, Users } from '../../../models'; import { PromoReads, PromoNotes, Notes, Users } from '../../../models';
import { ensure } from '../../../prelude/ensure';
export async function injectPromo(timeline: Note[], user?: User | null) { export async function injectPromo(timeline: Note[], user?: User | null) {
if (timeline.length < 5) return; if (timeline.length < 5) return;
@ -23,10 +22,10 @@ export async function injectPromo(timeline: Note[], user?: User | null) {
// Pick random promo // Pick random promo
const promo = promos[Math.floor(Math.random() * promos.length)]; 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 // 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); (note as any)._prId_ = rndstr('a-z0-9', 8);

View file

@ -2,7 +2,6 @@ import $ from 'cafy';
import define from '../../../define'; import define from '../../../define';
import deleteFollowing from '../../../../../services/following/delete'; import deleteFollowing from '../../../../../services/following/delete';
import { Followings, Users } from '../../../../../models'; import { Followings, Users } from '../../../../../models';
import { ensure } from '../../../../../prelude/ensure';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],
@ -23,8 +22,8 @@ export default define(meta, async (ps, me) => {
}); });
const pairs = await Promise.all(followings.map(f => Promise.all([ const pairs = await Promise.all(followings.map(f => Promise.all([
Users.findOne(f.followerId).then(ensure), Users.findOneOrFail(f.followerId),
Users.findOne(f.followeeId).then(ensure) Users.findOneOrFail(f.followeeId)
]))); ])));
for (const pair of pairs) { for (const pair of pairs) {

View file

@ -4,7 +4,6 @@ import define from '../../define';
import { ApiError } from '../../error'; import { ApiError } from '../../error';
import { AuthSessions, AccessTokens, Apps } from '../../../../models'; import { AuthSessions, AccessTokens, Apps } from '../../../../models';
import { genId } from '../../../../misc/gen-id'; import { genId } from '../../../../misc/gen-id';
import { ensure } from '../../../../prelude/ensure';
import { secureRndstr } from '../../../../misc/secure-rndstr'; import { secureRndstr } from '../../../../misc/secure-rndstr';
export const meta = { export const meta = {
@ -49,7 +48,7 @@ export default define(meta, async (ps, user) => {
if (exist == null) { if (exist == null) {
// Lookup app // Lookup app
const app = await Apps.findOne(session.appId).then(ensure); const app = await Apps.findOneOrFail(session.appId);
// Generate Hash // Generate Hash
const sha256 = crypto.createHash('sha256'); const sha256 = crypto.createHash('sha256');

View file

@ -2,7 +2,6 @@ import $ from 'cafy';
import define from '../../../define'; import define from '../../../define';
import { ApiError } from '../../../error'; import { ApiError } from '../../../error';
import { Apps, AuthSessions, AccessTokens, Users } from '../../../../../models'; import { Apps, AuthSessions, AccessTokens, Users } from '../../../../../models';
import { ensure } from '../../../../../prelude/ensure';
export const meta = { export const meta = {
tags: ['auth'], tags: ['auth'],
@ -92,10 +91,10 @@ export default define(meta, async (ps) => {
} }
// Lookup access token // Lookup access token
const accessToken = await AccessTokens.findOne({ const accessToken = await AccessTokens.findOneOrFail({
appId: app.id, appId: app.id,
userId: session.userId userId: session.userId
}).then(ensure); });
// Delete session // Delete session
AuthSessions.delete(session.id); AuthSessions.delete(session.id);

View file

@ -1,6 +1,5 @@
import define from '../define'; import define from '../define';
import { RegistryItems, UserProfiles, Users } from '../../../models'; import { RegistryItems, UserProfiles, Users } from '../../../models';
import { ensure } from '../../../prelude/ensure';
import { genId } from '../../../misc/gen-id'; import { genId } from '../../../misc/gen-id';
export const meta = { export const meta = {
@ -25,7 +24,7 @@ export default define(meta, async (ps, user, token) => {
const isSecure = token == null; const isSecure = token == null;
// TODO: そのうち消す // 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)) { for (const [k, v] of Object.entries(profile.clientData)) {
await RegistryItems.insert({ await RegistryItems.insert({
id: genId(), id: genId(),

View file

@ -2,7 +2,6 @@ import $ from 'cafy';
import * as speakeasy from 'speakeasy'; import * as speakeasy from 'speakeasy';
import define from '../../../define'; import define from '../../../define';
import { UserProfiles } from '../../../../../models'; import { UserProfiles } from '../../../../../models';
import { ensure } from '../../../../../prelude/ensure';
export const meta = { export const meta = {
requireCredential: true as const, requireCredential: true as const,
@ -19,7 +18,7 @@ export const meta = {
export default define(meta, async (ps, user) => { export default define(meta, async (ps, user) => {
const token = ps.token.replace(/\s/g, ''); 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) { if (profile.twoFactorTempSecret == null) {
throw new Error('二段階認証の設定が開始されていません'); throw new Error('二段階認証の設定が開始されていません');

View file

@ -9,7 +9,6 @@ import {
AttestationChallenges, AttestationChallenges,
Users Users
} from '../../../../../models'; } from '../../../../../models';
import { ensure } from '../../../../../prelude/ensure';
import config from '../../../../../config'; import config from '../../../../../config';
import { procedures, hash } from '../../../2fa'; import { procedures, hash } from '../../../2fa';
import { publishMainStream } from '../../../../../services/stream'; import { publishMainStream } from '../../../../../services/stream';
@ -43,7 +42,7 @@ export const meta = {
const rpIdHashReal = hash(Buffer.from(config.hostname, 'utf-8')); const rpIdHashReal = hash(Buffer.from(config.hostname, 'utf-8'));
export default define(meta, async (ps, user) => { 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 // Compare password
const same = await bcrypt.compare(ps.password, profile.password!); const same = await bcrypt.compare(ps.password, profile.password!);

View file

@ -2,7 +2,6 @@ import $ from 'cafy';
import * as bcrypt from 'bcryptjs'; import * as bcrypt from 'bcryptjs';
import define from '../../../define'; import define from '../../../define';
import { UserProfiles, AttestationChallenges } from '../../../../../models'; import { UserProfiles, AttestationChallenges } from '../../../../../models';
import { ensure } from '../../../../../prelude/ensure';
import { promisify } from 'util'; import { promisify } from 'util';
import * as crypto from 'crypto'; import * as crypto from 'crypto';
import { genId } from '../../../../../misc/gen-id'; import { genId } from '../../../../../misc/gen-id';
@ -23,7 +22,7 @@ export const meta = {
}; };
export default define(meta, async (ps, user) => { 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 // Compare password
const same = await bcrypt.compare(ps.password, profile.password!); const same = await bcrypt.compare(ps.password, profile.password!);

View file

@ -5,7 +5,6 @@ import * as QRCode from 'qrcode';
import config from '../../../../../config'; import config from '../../../../../config';
import define from '../../../define'; import define from '../../../define';
import { UserProfiles } from '../../../../../models'; import { UserProfiles } from '../../../../../models';
import { ensure } from '../../../../../prelude/ensure';
export const meta = { export const meta = {
requireCredential: true as const, requireCredential: true as const,
@ -20,7 +19,7 @@ export const meta = {
}; };
export default define(meta, async (ps, user) => { 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 // Compare password
const same = await bcrypt.compare(ps.password, profile.password!); const same = await bcrypt.compare(ps.password, profile.password!);

View file

@ -2,7 +2,6 @@ import $ from 'cafy';
import * as bcrypt from 'bcryptjs'; import * as bcrypt from 'bcryptjs';
import define from '../../../define'; import define from '../../../define';
import { UserProfiles, UserSecurityKeys, Users } from '../../../../../models'; import { UserProfiles, UserSecurityKeys, Users } from '../../../../../models';
import { ensure } from '../../../../../prelude/ensure';
import { publishMainStream } from '../../../../../services/stream'; import { publishMainStream } from '../../../../../services/stream';
export const meta = { export const meta = {
@ -21,7 +20,7 @@ export const meta = {
}; };
export default define(meta, async (ps, user) => { 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 // Compare password
const same = await bcrypt.compare(ps.password, profile.password!); const same = await bcrypt.compare(ps.password, profile.password!);

View file

@ -2,7 +2,6 @@ import $ from 'cafy';
import * as bcrypt from 'bcryptjs'; import * as bcrypt from 'bcryptjs';
import define from '../../../define'; import define from '../../../define';
import { UserProfiles } from '../../../../../models'; import { UserProfiles } from '../../../../../models';
import { ensure } from '../../../../../prelude/ensure';
export const meta = { export const meta = {
requireCredential: true as const, requireCredential: true as const,
@ -17,7 +16,7 @@ export const meta = {
}; };
export default define(meta, async (ps, user) => { 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 // Compare password
const same = await bcrypt.compare(ps.password, profile.password!); const same = await bcrypt.compare(ps.password, profile.password!);

View file

@ -2,7 +2,6 @@ import $ from 'cafy';
import * as bcrypt from 'bcryptjs'; import * as bcrypt from 'bcryptjs';
import define from '../../define'; import define from '../../define';
import { UserProfiles } from '../../../../models'; import { UserProfiles } from '../../../../models';
import { ensure } from '../../../../prelude/ensure';
export const meta = { export const meta = {
requireCredential: true as const, requireCredential: true as const,
@ -21,7 +20,7 @@ export const meta = {
}; };
export default define(meta, async (ps, user) => { 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 // Compare password
const same = await bcrypt.compare(ps.currentPassword, profile.password!); const same = await bcrypt.compare(ps.currentPassword, profile.password!);

View file

@ -2,7 +2,6 @@ import $ from 'cafy';
import * as bcrypt from 'bcryptjs'; import * as bcrypt from 'bcryptjs';
import define from '../../define'; import define from '../../define';
import { Users, UserProfiles } from '../../../../models'; import { Users, UserProfiles } from '../../../../models';
import { ensure } from '../../../../prelude/ensure';
import { doPostSuspend } from '../../../../services/suspend-user'; import { doPostSuspend } from '../../../../services/suspend-user';
export const meta = { export const meta = {
@ -18,7 +17,7 @@ export const meta = {
}; };
export default define(meta, async (ps, user) => { 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 // Compare password
const same = await bcrypt.compare(ps.password, profile.password!); const same = await bcrypt.compare(ps.password, profile.password!);

View file

@ -4,7 +4,6 @@ import { publishMainStream } from '../../../../services/stream';
import generateUserToken from '../../common/generate-native-user-token'; import generateUserToken from '../../common/generate-native-user-token';
import define from '../../define'; import define from '../../define';
import { Users, UserProfiles } from '../../../../models'; import { Users, UserProfiles } from '../../../../models';
import { ensure } from '../../../../prelude/ensure';
export const meta = { export const meta = {
requireCredential: true as const, requireCredential: true as const,
@ -19,7 +18,7 @@ export const meta = {
}; };
export default define(meta, async (ps, user) => { 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 // Compare password
const same = await bcrypt.compare(ps.password, profile.password!); const same = await bcrypt.compare(ps.password, profile.password!);

View file

@ -6,7 +6,6 @@ import config from '../../../../config';
import * as ms from 'ms'; import * as ms from 'ms';
import * as bcrypt from 'bcryptjs'; import * as bcrypt from 'bcryptjs';
import { Users, UserProfiles } from '../../../../models'; import { Users, UserProfiles } from '../../../../models';
import { ensure } from '../../../../prelude/ensure';
import { sendEmail } from '../../../../services/send-email'; import { sendEmail } from '../../../../services/send-email';
import { ApiError } from '../../error'; import { ApiError } from '../../error';
@ -40,7 +39,7 @@ export const meta = {
}; };
export default define(meta, async (ps, user) => { 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 // Compare password
const same = await bcrypt.compare(ps.password, profile.password!); const same = await bcrypt.compare(ps.password, profile.password!);

View file

@ -13,7 +13,6 @@ import { ApiError } from '../../error';
import { Users, DriveFiles, UserProfiles, Pages } from '../../../../models'; import { Users, DriveFiles, UserProfiles, Pages } from '../../../../models';
import { User } from '../../../../models/entities/user'; import { User } from '../../../../models/entities/user';
import { UserProfile } from '../../../../models/entities/user-profile'; import { UserProfile } from '../../../../models/entities/user-profile';
import { ensure } from '../../../../prelude/ensure';
import { notificationTypes } from '../../../../types'; import { notificationTypes } from '../../../../types';
import { normalizeForSearch } from '../../../../misc/normalize-for-search'; 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 updates = {} as Partial<User>;
const profileUpdates = {} as Partial<UserProfile>; 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.name !== undefined) updates.name = ps.name;
if (ps.description !== undefined) profileUpdates.description = ps.description; if (ps.description !== undefined) profileUpdates.description = ps.description;

View file

@ -6,7 +6,6 @@ import * as ms from 'ms';
import { getNote } from '../../common/getters'; import { getNote } from '../../common/getters';
import { ApiError } from '../../error'; import { ApiError } from '../../error';
import { Users } from '../../../../models'; import { Users } from '../../../../models';
import { ensure } from '../../../../prelude/ensure';
export const meta = { export const meta = {
desc: { 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);
}); });

View file

@ -13,7 +13,6 @@ import { PollVotes, NoteWatchings, Users, Polls } from '../../../../../models';
import { Not } from 'typeorm'; import { Not } from 'typeorm';
import { IRemoteUser } from '../../../../../models/entities/user'; import { IRemoteUser } from '../../../../../models/entities/user';
import { genId } from '../../../../../misc/gen-id'; import { genId } from '../../../../../misc/gen-id';
import { ensure } from '../../../../../prelude/ensure';
export const meta = { export const meta = {
desc: { desc: {
@ -87,7 +86,7 @@ export default define(meta, async (ps, user) => {
throw new ApiError(meta.errors.noPoll); 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) { if (poll.expiresAt && poll.expiresAt < createdAt) {
throw new ApiError(meta.errors.alreadyExpired); throw new ApiError(meta.errors.alreadyExpired);
@ -153,7 +152,7 @@ export default define(meta, async (ps, user) => {
// リモート投票の場合リプライ送信 // リモート投票の場合リプライ送信
if (note.userHost != null) { 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); deliver(user, renderActivity(await renderVote(user, vote, note, poll, pollOwner)), pollOwner.inbox);
} }

View file

@ -3,7 +3,6 @@ import define from '../../define';
import { ApiError } from '../../error'; import { ApiError } from '../../error';
import { Users, UserProfiles } from '../../../../models'; import { Users, UserProfiles } from '../../../../models';
import { ID } from '../../../../misc/cafy-id'; import { ID } from '../../../../misc/cafy-id';
import { ensure } from '../../../../prelude/ensure';
import { toPunyNullable } from '../../../../misc/convert-host'; import { toPunyNullable } from '../../../../misc/convert-host';
export const meta = { export const meta = {
@ -51,7 +50,7 @@ export default define(meta, async (ps, me) => {
throw new ApiError(meta.errors.noSuchUser); 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) { if (profile.room.furnitures == null) {
await UserProfiles.update(user.id, { await UserProfiles.update(user.id, {

View file

@ -6,7 +6,6 @@ import config from '../../../config';
import { Users, Signins, UserProfiles, UserSecurityKeys, AttestationChallenges } from '../../../models'; import { Users, Signins, UserProfiles, UserSecurityKeys, AttestationChallenges } from '../../../models';
import { ILocalUser } from '../../../models/entities/user'; import { ILocalUser } from '../../../models/entities/user';
import { genId } from '../../../misc/gen-id'; import { genId } from '../../../misc/gen-id';
import { ensure } from '../../../prelude/ensure';
import { verifyLogin, hash } from '../2fa'; import { verifyLogin, hash } from '../2fa';
import { randomBytes } from 'crypto'; import { randomBytes } from 'crypto';
@ -47,7 +46,7 @@ export default async (ctx: Koa.Context) => {
return; return;
} }
const profile = await UserProfiles.findOne(user.id).then(ensure); const profile = await UserProfiles.findOneOrFail(user.id);
// Compare password // Compare password
const same = await bcrypt.compare(password, profile.password!); const same = await bcrypt.compare(password, profile.password!);

View file

@ -10,7 +10,6 @@ import signin from '../common/signin';
import { fetchMeta } from '../../../misc/fetch-meta'; import { fetchMeta } from '../../../misc/fetch-meta';
import { Users, UserProfiles } from '../../../models'; import { Users, UserProfiles } from '../../../models';
import { ILocalUser } from '../../../models/entities/user'; import { ILocalUser } from '../../../models/entities/user';
import { ensure } from '../../../prelude/ensure';
function getUserToken(ctx: Koa.Context) { function getUserToken(ctx: Koa.Context) {
return ((ctx.headers['cookie'] || '').match(/igi=(\w+)/) || [null, null])[1]; return ((ctx.headers['cookie'] || '').match(/igi=(\w+)/) || [null, null])[1];
@ -41,12 +40,12 @@ router.get('/disconnect/discord', async ctx => {
return; return;
} }
const user = await Users.findOne({ const user = await Users.findOneOrFail({
host: null, host: null,
token: userToken token: userToken
}).then(ensure); });
const profile = await UserProfiles.findOne(user.id).then(ensure); const profile = await UserProfiles.findOneOrFail(user.id);
delete profile.integrations.discord; delete profile.integrations.discord;
@ -253,12 +252,12 @@ router.get('/dc/cb', async ctx => {
return; return;
} }
const user = await Users.findOne({ const user = await Users.findOneOrFail({
host: null, host: null,
token: userToken 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, { await UserProfiles.update(user.id, {
integrations: { integrations: {

View file

@ -10,7 +10,6 @@ import signin from '../common/signin';
import { fetchMeta } from '../../../misc/fetch-meta'; import { fetchMeta } from '../../../misc/fetch-meta';
import { Users, UserProfiles } from '../../../models'; import { Users, UserProfiles } from '../../../models';
import { ILocalUser } from '../../../models/entities/user'; import { ILocalUser } from '../../../models/entities/user';
import { ensure } from '../../../prelude/ensure';
function getUserToken(ctx: Koa.Context) { function getUserToken(ctx: Koa.Context) {
return ((ctx.headers['cookie'] || '').match(/igi=(\w+)/) || [null, null])[1]; return ((ctx.headers['cookie'] || '').match(/igi=(\w+)/) || [null, null])[1];
@ -41,12 +40,12 @@ router.get('/disconnect/github', async ctx => {
return; return;
} }
const user = await Users.findOne({ const user = await Users.findOneOrFail({
host: null, host: null,
token: userToken token: userToken
}).then(ensure); });
const profile = await UserProfiles.findOne(user.id).then(ensure); const profile = await UserProfiles.findOneOrFail(user.id);
delete profile.integrations.github; delete profile.integrations.github;
@ -227,12 +226,12 @@ router.get('/gh/cb', async ctx => {
return; return;
} }
const user = await Users.findOne({ const user = await Users.findOneOrFail({
host: null, host: null,
token: userToken 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, { await UserProfiles.update(user.id, {
integrations: { integrations: {

View file

@ -9,7 +9,6 @@ import signin from '../common/signin';
import { fetchMeta } from '../../../misc/fetch-meta'; import { fetchMeta } from '../../../misc/fetch-meta';
import { Users, UserProfiles } from '../../../models'; import { Users, UserProfiles } from '../../../models';
import { ILocalUser } from '../../../models/entities/user'; import { ILocalUser } from '../../../models/entities/user';
import { ensure } from '../../../prelude/ensure';
function getUserToken(ctx: Koa.Context) { function getUserToken(ctx: Koa.Context) {
return ((ctx.headers['cookie'] || '').match(/igi=(\w+)/) || [null, null])[1]; return ((ctx.headers['cookie'] || '').match(/igi=(\w+)/) || [null, null])[1];
@ -40,12 +39,12 @@ router.get('/disconnect/twitter', async ctx => {
return; return;
} }
const user = await Users.findOne({ const user = await Users.findOneOrFail({
host: null, host: null,
token: userToken token: userToken
}).then(ensure); });
const profile = await UserProfiles.findOne(user.id).then(ensure); const profile = await UserProfiles.findOneOrFail(user.id);
delete profile.integrations.twitter; delete profile.integrations.twitter;
@ -163,12 +162,12 @@ router.get('/tw/cb', async ctx => {
const result = await twAuth!.done(JSON.parse(twCtx), verifier); const result = await twAuth!.done(JSON.parse(twCtx), verifier);
const user = await Users.findOne({ const user = await Users.findOneOrFail({
host: null, host: null,
token: userToken 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, { await UserProfiles.update(user.id, {
integrations: { integrations: {

View file

@ -3,7 +3,6 @@ import config from '../../config';
import { User } from '../../models/entities/user'; import { User } from '../../models/entities/user';
import { Notes, DriveFiles, UserProfiles } from '../../models'; import { Notes, DriveFiles, UserProfiles } from '../../models';
import { In } from 'typeorm'; import { In } from 'typeorm';
import { ensure } from '../../prelude/ensure';
export default async function(user: User) { export default async function(user: User) {
const author = { const author = {
@ -11,7 +10,7 @@ export default async function(user: User) {
name: user.name || user.username 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({ const notes = await Notes.find({
where: { where: {

View file

@ -20,7 +20,6 @@ import config from '../../config';
import { Users, Notes, Emojis, UserProfiles, Pages, Channels, Clips } from '../../models'; import { Users, Notes, Emojis, UserProfiles, Pages, Channels, Clips } from '../../models';
import parseAcct from '../../misc/acct/parse'; import parseAcct from '../../misc/acct/parse';
import { getNoteSummary } from '../../misc/get-note-summary'; import { getNoteSummary } from '../../misc/get-note-summary';
import { ensure } from '../../prelude/ensure';
import { getConnection } from 'typeorm'; import { getConnection } from 'typeorm';
import redis from '../../db/redis'; import redis from '../../db/redis';
import locales = require('../../../locales'); import locales = require('../../../locales');
@ -199,7 +198,7 @@ router.get(['/@:user', '/@:user/:sub'], async (ctx, next) => {
}); });
if (user != null) { if (user != null) {
const profile = await UserProfiles.findOne(user.id).then(ensure); const profile = await UserProfiles.findOneOrFail(user.id);
const meta = await fetchMeta(); const meta = await fetchMeta();
const me = profile.fields const me = profile.fields
? profile.fields ? profile.fields
@ -242,7 +241,7 @@ router.get('/notes/:note', async ctx => {
if (note) { if (note) {
const _note = await Notes.pack(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(); const meta = await fetchMeta();
await ctx.render('note', { await ctx.render('note', {
note: _note, note: _note,
@ -282,7 +281,7 @@ router.get('/@:user/pages/:page', async ctx => {
if (page) { if (page) {
const _page = await Pages.pack(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(); const meta = await fetchMeta();
await ctx.render('page', { await ctx.render('page', {
page: _page, page: _page,
@ -311,7 +310,7 @@ router.get('/clips/:clip', async ctx => {
if (clip) { if (clip) {
const _clip = await Clips.pack(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(); const meta = await fetchMeta();
await ctx.render('clip', { await ctx.render('clip', {
clip: _clip, clip: _clip,

View file

@ -3,7 +3,6 @@ import { Note } from '../models/entities/note';
import { AntennaNotes, Mutings, Notes } from '../models'; import { AntennaNotes, Mutings, Notes } from '../models';
import { genId } from '../misc/gen-id'; import { genId } from '../misc/gen-id';
import { isMutedUserRelated } from '../misc/is-muted-user-related'; import { isMutedUserRelated } from '../misc/is-muted-user-related';
import { ensure } from '../prelude/ensure';
import { publishAntennaStream, publishMainStream } from './stream'; import { publishAntennaStream, publishMainStream } from './stream';
import { User } from '../models/entities/user'; import { User } from '../models/entities/user';
@ -34,10 +33,10 @@ export async function addNoteToAntenna(antenna: Antenna, note: Note, noteUser: U
}; };
if (note.replyId != null) { if (note.replyId != null) {
_note.reply = await Notes.findOne(note.replyId).then(ensure); _note.reply = await Notes.findOneOrFail(note.replyId);
} }
if (note.renoteId != null) { 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)))) { if (isMutedUserRelated(_note, new Set<string>(mutings.map(x => x.muteeId)))) {

View file

@ -14,7 +14,6 @@ import { instanceChart, perUserFollowingChart } from '../chart';
import { genId } from '../../misc/gen-id'; import { genId } from '../../misc/gen-id';
import { createNotification } from '../create-notification'; import { createNotification } from '../create-notification';
import { isDuplicateKeyValueError } from '../../misc/is-duplicate-key-value-error'; import { isDuplicateKeyValueError } from '../../misc/is-duplicate-key-value-error';
import { ensure } from '../../prelude/ensure';
const logger = new Logger('following/create'); 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'); 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 // フォロー対象が鍵アカウントである or
// フォロワーがBotであり、フォロー対象がBotからのフォローに慎重である or // フォロワーがBotであり、フォロー対象がBotからのフォローに慎重である or

View file

@ -1,7 +1,6 @@
import accept from './accept'; import accept from './accept';
import { User } from '../../../models/entities/user'; import { User } from '../../../models/entities/user';
import { FollowRequests, Users } from '../../../models'; 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) { for (const request of requests) {
const follower = await Users.findOne(request.followerId).then(ensure); const follower = await Users.findOneOrFail(request.followerId);
accept(user, follower); accept(user, follower);
} }
} }

View file

@ -1,5 +1,4 @@
import config from '../../config'; import config from '../../config';
import { ensure } from '../../prelude/ensure';
import { MessagingMessages, Users } from '../../models'; import { MessagingMessages, Users } from '../../models';
import { MessagingMessage } from '../../models/entities/messaging-message'; import { MessagingMessage } from '../../models/entities/messaging-message';
import { publishGroupMessagingStream, publishMessagingStream } from '../stream'; import { publishGroupMessagingStream, publishMessagingStream } from '../stream';
@ -15,8 +14,8 @@ export async function deleteMessage(message: MessagingMessage) {
async function postDeleteMessage(message: MessagingMessage) { async function postDeleteMessage(message: MessagingMessage) {
if (message.recipientId) { if (message.recipientId) {
const user = await Users.findOne(message.userId).then(ensure); const user = await Users.findOneOrFail(message.userId);
const recipient = await Users.findOne(message.recipientId).then(ensure); const recipient = await Users.findOneOrFail(message.recipientId);
if (Users.isLocalUser(user)) publishMessagingStream(message.userId, message.recipientId, 'deleted', message.id); if (Users.isLocalUser(user)) publishMessagingStream(message.userId, message.recipientId, 'deleted', message.id);
if (Users.isLocalUser(recipient)) publishMessagingStream(message.recipientId, message.userId, 'deleted', message.id); if (Users.isLocalUser(recipient)) publishMessagingStream(message.recipientId, message.userId, 'deleted', message.id);

View file

@ -26,7 +26,6 @@ import { notesChart, perUserNotesChart, activeUsersChart, instanceChart } from '
import { Poll, IPoll } from '../../models/entities/poll'; import { Poll, IPoll } from '../../models/entities/poll';
import { createNotification } from '../create-notification'; import { createNotification } from '../create-notification';
import { isDuplicateKeyValueError } from '../../misc/is-duplicate-key-value-error'; import { isDuplicateKeyValueError } from '../../misc/is-duplicate-key-value-error';
import { ensure } from '../../prelude/ensure';
import { checkHitAntenna } from '../../misc/check-hit-antenna'; import { checkHitAntenna } from '../../misc/check-hit-antenna';
import { checkWordMute } from '../../misc/check-word-mute'; import { checkWordMute } from '../../misc/check-word-mute';
import { addNoteToAntenna } from '../add-note-to-antenna'; 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); 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)) { 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') { 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)) { 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));
} }
} }