summaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2019-04-13 01:43:22 +0900
committerGitHub <noreply@github.com>2019-04-13 01:43:22 +0900
commit987168b863c52d0548050ffbac569782bb9a8cef (patch)
treec9aa2243dcdcbd044688d201a51c601574bff259 /src/server
parentFix bug (diff)
downloadsharkey-987168b863c52d0548050ffbac569782bb9a8cef.tar.gz
sharkey-987168b863c52d0548050ffbac569782bb9a8cef.tar.bz2
sharkey-987168b863c52d0548050ffbac569782bb9a8cef.zip
strictNullChecks (#4666)
* wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip
Diffstat (limited to 'src/server')
-rw-r--r--src/server/activitypub.ts13
-rw-r--r--src/server/activitypub/featured.ts6
-rw-r--r--src/server/activitypub/followers.ts6
-rw-r--r--src/server/activitypub/following.ts6
-rw-r--r--src/server/activitypub/outbox.ts9
-rw-r--r--src/server/api/api-handler.ts14
-rw-r--r--src/server/api/authenticate.ts2
-rw-r--r--src/server/api/call.ts10
-rw-r--r--src/server/api/common/make-pagination-query.ts2
-rw-r--r--src/server/api/define.ts10
-rw-r--r--src/server/api/endpoints/admin/abuse-user-reports.ts2
-rw-r--r--src/server/api/endpoints/admin/drive/files.ts4
-rw-r--r--src/server/api/endpoints/admin/emoji/list.ts2
-rw-r--r--src/server/api/endpoints/admin/federation/remove-all-following.ts7
-rw-r--r--src/server/api/endpoints/admin/logs.ts2
-rw-r--r--src/server/api/endpoints/admin/queue/jobs.ts4
-rw-r--r--src/server/api/endpoints/admin/show-users.ts2
-rw-r--r--src/server/api/endpoints/admin/update-remote-user.ts2
-rw-r--r--src/server/api/endpoints/ap/show.ts4
-rw-r--r--src/server/api/endpoints/auth/accept.ts3
-rw-r--r--src/server/api/endpoints/auth/session/userkey.ts3
-rw-r--r--src/server/api/endpoints/blocking/list.ts2
-rw-r--r--src/server/api/endpoints/charts/active-users.ts2
-rw-r--r--src/server/api/endpoints/charts/drive.ts2
-rw-r--r--src/server/api/endpoints/charts/federation.ts2
-rw-r--r--src/server/api/endpoints/charts/hashtag.ts2
-rw-r--r--src/server/api/endpoints/charts/instance.ts2
-rw-r--r--src/server/api/endpoints/charts/network.ts2
-rw-r--r--src/server/api/endpoints/charts/notes.ts2
-rw-r--r--src/server/api/endpoints/charts/user/drive.ts2
-rw-r--r--src/server/api/endpoints/charts/user/following.ts2
-rw-r--r--src/server/api/endpoints/charts/user/notes.ts2
-rw-r--r--src/server/api/endpoints/charts/user/reactions.ts2
-rw-r--r--src/server/api/endpoints/charts/users.ts2
-rw-r--r--src/server/api/endpoints/drive/files.ts2
-rw-r--r--src/server/api/endpoints/drive/files/create.ts2
-rw-r--r--src/server/api/endpoints/drive/files/show.ts10
-rw-r--r--src/server/api/endpoints/drive/folders.ts2
-rw-r--r--src/server/api/endpoints/drive/folders/update.ts6
-rw-r--r--src/server/api/endpoints/drive/stream.ts2
-rw-r--r--src/server/api/endpoints/federation/instances.ts2
-rw-r--r--src/server/api/endpoints/games/reversi/games.ts2
-rw-r--r--src/server/api/endpoints/games/reversi/match.ts4
-rw-r--r--src/server/api/endpoints/hashtags/list.ts2
-rw-r--r--src/server/api/endpoints/hashtags/search.ts2
-rw-r--r--src/server/api/endpoints/hashtags/users.ts2
-rw-r--r--src/server/api/endpoints/i/2fa/done.ts3
-rw-r--r--src/server/api/endpoints/i/2fa/register.ts5
-rw-r--r--src/server/api/endpoints/i/2fa/unregister.ts5
-rw-r--r--src/server/api/endpoints/i/authorized-apps.ts2
-rw-r--r--src/server/api/endpoints/i/change-password.ts5
-rw-r--r--src/server/api/endpoints/i/delete-account.ts5
-rw-r--r--src/server/api/endpoints/i/favorites.ts2
-rw-r--r--src/server/api/endpoints/i/notifications.ts6
-rw-r--r--src/server/api/endpoints/i/regenerate-token.ts5
-rw-r--r--src/server/api/endpoints/i/signin-history.ts2
-rw-r--r--src/server/api/endpoints/i/update-email.ts5
-rw-r--r--src/server/api/endpoints/i/update.ts6
-rw-r--r--src/server/api/endpoints/messaging/history.ts2
-rw-r--r--src/server/api/endpoints/mute/list.ts2
-rw-r--r--src/server/api/endpoints/my/apps.ts2
-rw-r--r--src/server/api/endpoints/notes.ts2
-rw-r--r--src/server/api/endpoints/notes/children.ts2
-rw-r--r--src/server/api/endpoints/notes/conversation.ts5
-rw-r--r--src/server/api/endpoints/notes/create.ts27
-rw-r--r--src/server/api/endpoints/notes/delete.ts3
-rw-r--r--src/server/api/endpoints/notes/featured.ts2
-rw-r--r--src/server/api/endpoints/notes/global-timeline.ts2
-rw-r--r--src/server/api/endpoints/notes/hybrid-timeline.ts2
-rw-r--r--src/server/api/endpoints/notes/local-timeline.ts8
-rw-r--r--src/server/api/endpoints/notes/mentions.ts2
-rw-r--r--src/server/api/endpoints/notes/polls/recommendation.ts2
-rw-r--r--src/server/api/endpoints/notes/polls/vote.ts7
-rw-r--r--src/server/api/endpoints/notes/reactions.ts2
-rw-r--r--src/server/api/endpoints/notes/renotes.ts2
-rw-r--r--src/server/api/endpoints/notes/replies.ts2
-rw-r--r--src/server/api/endpoints/notes/search-by-tag.ts4
-rw-r--r--src/server/api/endpoints/notes/search.ts2
-rw-r--r--src/server/api/endpoints/notes/timeline.ts2
-rw-r--r--src/server/api/endpoints/notes/user-list-timeline.ts2
-rw-r--r--src/server/api/endpoints/users.ts2
-rw-r--r--src/server/api/endpoints/users/followers.ts4
-rw-r--r--src/server/api/endpoints/users/following.ts4
-rw-r--r--src/server/api/endpoints/users/get-frequently-replied-users.ts2
-rw-r--r--src/server/api/endpoints/users/notes.ts8
-rw-r--r--src/server/api/endpoints/users/recommendation.ts2
-rw-r--r--src/server/api/endpoints/users/search.ts6
-rw-r--r--src/server/api/endpoints/users/show.ts6
-rw-r--r--src/server/api/error.ts4
-rw-r--r--src/server/api/limiter.ts6
-rw-r--r--src/server/api/private/signin.ts5
-rw-r--r--src/server/api/private/signup.ts4
-rw-r--r--src/server/api/service/discord.ts91
-rw-r--r--src/server/api/service/github.ts45
-rw-r--r--src/server/api/service/twitter.ts25
-rw-r--r--src/server/api/stream/channels/admin.ts2
-rw-r--r--src/server/api/stream/channels/drive.ts2
-rw-r--r--src/server/api/stream/channels/games/reversi-game.ts80
-rw-r--r--src/server/api/stream/channels/games/reversi.ts4
-rw-r--r--src/server/api/stream/channels/home-timeline.ts8
-rw-r--r--src/server/api/stream/channels/hybrid-timeline.ts10
-rw-r--r--src/server/api/stream/channels/main.ts4
-rw-r--r--src/server/api/stream/channels/messaging-index.ts2
-rw-r--r--src/server/api/stream/channels/messaging.ts4
-rw-r--r--src/server/api/stream/index.ts20
-rw-r--r--src/server/file/send-drive-file.ts2
-rw-r--r--src/server/index.ts2
-rw-r--r--src/server/web/docs.ts6
-rw-r--r--src/server/web/feed.ts9
-rw-r--r--src/server/web/index.ts5
-rw-r--r--src/server/web/url-preview.ts2
-rw-r--r--src/server/well-known.ts4
112 files changed, 373 insertions, 321 deletions
diff --git a/src/server/activitypub.ts b/src/server/activitypub.ts
index 3b39977d47..12fccbfa7d 100644
--- a/src/server/activitypub.ts
+++ b/src/server/activitypub.ts
@@ -17,6 +17,7 @@ import { isSelfHost } from '../misc/convert-host';
import { Notes, Users, Emojis, UserKeypairs, Polls } from '../models';
import { ILocalUser, User } from '../models/entities/user';
import { In } from 'typeorm';
+import { ensure } from '../prelude/ensure';
// Init router
const router = new Router();
@@ -123,8 +124,8 @@ router.get('/questions/:question', async (ctx, next) => {
return;
}
- const user = await Users.findOne(pollNote.userId);
- const poll = await Polls.findOne({ noteId: pollNote.id });
+ const user = await Users.findOne(pollNote.userId).then(ensure);
+ const poll = await Polls.findOne({ noteId: pollNote.id }).then(ensure);
ctx.body = renderActivity(await renderQuestion(user as ILocalUser, pollNote, poll));
setResponseType(ctx);
@@ -156,9 +157,7 @@ router.get('/users/:user/publickey', async ctx => {
return;
}
- const keypair = await UserKeypairs.findOne({
- userId: user.id
- });
+ const keypair = await UserKeypairs.findOne(user.id).then(ensure);
if (Users.isLocalUser(user)) {
ctx.body = renderActivity(renderKey(user, keypair));
@@ -189,7 +188,7 @@ router.get('/users/:user', async (ctx, next) => {
const user = await Users.findOne({
id: userId,
host: null
- });
+ }).then(ensure);
await userInfo(ctx, user);
});
@@ -200,7 +199,7 @@ router.get('/@:user', async (ctx, next) => {
const user = await Users.findOne({
usernameLower: ctx.params.user.toLowerCase(),
host: null
- });
+ }).then(ensure);
await userInfo(ctx, user);
});
diff --git a/src/server/activitypub/featured.ts b/src/server/activitypub/featured.ts
index f43312d79a..86ec1000c7 100644
--- a/src/server/activitypub/featured.ts
+++ b/src/server/activitypub/featured.ts
@@ -5,6 +5,7 @@ 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.IRouterContext) => {
const userId = ctx.params.user;
@@ -22,13 +23,14 @@ export default async (ctx: Router.IRouterContext) => {
const pinings = await UserNotePinings.find({ userId: user.id });
- const pinnedNotes = await Promise.all(pinings.map(pining => Notes.findOne(pining.noteId)));
+ const pinnedNotes = await Promise.all(pinings.map(pining =>
+ Notes.findOne(pining.noteId).then(ensure)));
const renderedNotes = await Promise.all(pinnedNotes.map(note => renderNote(note)));
const rendered = renderOrderedCollection(
`${config.url}/users/${userId}/collections/featured`,
- renderedNotes.length, null, null, renderedNotes
+ renderedNotes.length, undefined, undefined, renderedNotes
);
ctx.body = renderActivity(rendered);
diff --git a/src/server/activitypub/followers.ts b/src/server/activitypub/followers.ts
index 62c54399ed..e48dc57f7a 100644
--- a/src/server/activitypub/followers.ts
+++ b/src/server/activitypub/followers.ts
@@ -69,18 +69,18 @@ export default async (ctx: Router.IRouterContext) => {
cursor
})}`,
user.followersCount, renderedFollowers, partOf,
- null,
+ undefined,
inStock ? `${partOf}?${url.query({
page: 'true',
cursor: followings[followings.length - 1].id
- })}` : null
+ })}` : undefined
);
ctx.body = renderActivity(rendered);
setResponseType(ctx);
} else {
// index page
- const rendered = renderOrderedCollection(partOf, user.followersCount, `${partOf}?page=true`, null);
+ const rendered = renderOrderedCollection(partOf, user.followersCount, `${partOf}?page=true`);
ctx.body = renderActivity(rendered);
ctx.set('Cache-Control', 'private, max-age=0, must-revalidate');
setResponseType(ctx);
diff --git a/src/server/activitypub/following.ts b/src/server/activitypub/following.ts
index 4894aac1f8..4a7314e0ce 100644
--- a/src/server/activitypub/following.ts
+++ b/src/server/activitypub/following.ts
@@ -70,18 +70,18 @@ export default async (ctx: Router.IRouterContext) => {
cursor
})}`,
user.followingCount, renderedFollowees, partOf,
- null,
+ undefined,
inStock ? `${partOf}?${url.query({
page: 'true',
cursor: followings[followings.length - 1].id
- })}` : null
+ })}` : undefined
);
ctx.body = renderActivity(rendered);
setResponseType(ctx);
} else {
// index page
- const rendered = renderOrderedCollection(partOf, user.followingCount, `${partOf}?page=true`, null);
+ const rendered = renderOrderedCollection(partOf, user.followingCount, `${partOf}?page=true`);
ctx.body = renderActivity(rendered);
ctx.set('Cache-Control', 'private, max-age=0, must-revalidate');
setResponseType(ctx);
diff --git a/src/server/activitypub/outbox.ts b/src/server/activitypub/outbox.ts
index 377f43c986..118d8f00a9 100644
--- a/src/server/activitypub/outbox.ts
+++ b/src/server/activitypub/outbox.ts
@@ -15,6 +15,7 @@ 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.IRouterContext) => {
const userId = ctx.params.user;
@@ -73,11 +74,11 @@ export default async (ctx: Router.IRouterContext) => {
notes.length ? `${partOf}?${url.query({
page: 'true',
since_id: notes[0].id
- })}` : null,
+ })}` : undefined,
notes.length ? `${partOf}?${url.query({
page: 'true',
until_id: notes[notes.length - 1].id
- })}` : null
+ })}` : undefined
);
ctx.body = renderActivity(rendered);
@@ -99,9 +100,9 @@ export default async (ctx: Router.IRouterContext) => {
* Pack Create<Note> or Announce Activity
* @param note Note
*/
-export async function packActivity(note: Note): Promise<object> {
+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);
+ const renote = await Notes.findOne(note.renoteId).then(ensure);
return renderAnnounce(renote.uri ? renote.uri : `${config.url}/notes/${renote.id}`, note);
}
diff --git a/src/server/api/api-handler.ts b/src/server/api/api-handler.ts
index 827aecdf25..2de6994f32 100644
--- a/src/server/api/api-handler.ts
+++ b/src/server/api/api-handler.ts
@@ -15,11 +15,11 @@ export default (endpoint: IEndpoint, ctx: Koa.BaseContext) => new Promise((res)
ctx.status = x;
ctx.body = {
error: {
- message: y.message,
- code: y.code,
- id: y.id,
- kind: y.kind,
- ...(y.info ? { info: y.info } : {})
+ message: y!.message,
+ code: y!.code,
+ id: y!.id,
+ kind: y!.kind,
+ ...(y!.info ? { info: y!.info } : {})
}
};
} else {
@@ -31,9 +31,9 @@ export default (endpoint: IEndpoint, ctx: Koa.BaseContext) => new Promise((res)
// Authentication
authenticate(body['i']).then(([user, app]) => {
// API invoking
- call(endpoint.name, user, app, body, (ctx.req as any).file).then(res => {
+ call(endpoint.name, user, app, body, (ctx.req as any).file).then((res: any) => {
reply(res);
- }).catch(e => {
+ }).catch((e: ApiError) => {
reply(e.httpStatusCode ? e.httpStatusCode : e.kind == 'client' ? 400 : 500, e);
});
}).catch(() => {
diff --git a/src/server/api/authenticate.ts b/src/server/api/authenticate.ts
index e293e3fed0..5c2b7e45cf 100644
--- a/src/server/api/authenticate.ts
+++ b/src/server/api/authenticate.ts
@@ -3,7 +3,7 @@ import { User } from '../../models/entities/user';
import { App } from '../../models/entities/app';
import { Users, AccessTokens, Apps } from '../../models';
-export default async (token: string): Promise<[User, App]> => {
+export default async (token: string): Promise<[User | null | undefined, App | null | undefined]> => {
if (token == null) {
return [null, null];
}
diff --git a/src/server/api/call.ts b/src/server/api/call.ts
index d72f2cc9e6..c79f8eef5d 100644
--- a/src/server/api/call.ts
+++ b/src/server/api/call.ts
@@ -12,7 +12,7 @@ const accessDenied = {
id: '56f35758-7dd5-468b-8439-5d6fb8ec9b8e'
};
-export default async (endpoint: string, user: User, app: App, data: any, file?: any) => {
+export default async (endpoint: string, user: User | null | undefined, app: App | null | undefined, data: any, file?: any) => {
const isSecure = user != null && app == null;
const ep = endpoints.find(e => e.name === endpoint);
@@ -39,15 +39,15 @@ export default async (endpoint: string, user: User, app: App, data: any, file?:
});
}
- if (ep.meta.requireCredential && user.isSuspended) {
+ if (ep.meta.requireCredential && user!.isSuspended) {
throw new ApiError(accessDenied, { reason: 'Your account has been suspended.' });
}
- if (ep.meta.requireAdmin && !user.isAdmin) {
+ if (ep.meta.requireAdmin && !user!.isAdmin) {
throw new ApiError(accessDenied, { reason: 'You are not the admin.' });
}
- if (ep.meta.requireModerator && !user.isAdmin && !user.isModerator) {
+ if (ep.meta.requireModerator && !user!.isAdmin && !user!.isModerator) {
throw new ApiError(accessDenied, { reason: 'You are not a moderator.' });
}
@@ -61,7 +61,7 @@ export default async (endpoint: string, user: User, app: App, data: any, file?:
if (ep.meta.requireCredential && ep.meta.limit) {
// Rate limit
- await limiter(ep, user).catch(e => {
+ await limiter(ep, user!).catch(e => {
throw new ApiError({
message: 'Rate limit exceeded. Please try again later.',
code: 'RATE_LIMIT_EXCEEDED',
diff --git a/src/server/api/common/make-pagination-query.ts b/src/server/api/common/make-pagination-query.ts
index 0c859a4f8d..51c11e5dff 100644
--- a/src/server/api/common/make-pagination-query.ts
+++ b/src/server/api/common/make-pagination-query.ts
@@ -1,6 +1,6 @@
import { SelectQueryBuilder } from 'typeorm';
-export function makePaginationQuery<T>(q: SelectQueryBuilder<T>, sinceId: string, untilId: string, sinceDate?: number, untilDate?: number) {
+export function makePaginationQuery<T>(q: SelectQueryBuilder<T>, sinceId?: string, untilId?: string, sinceDate?: number, untilDate?: number) {
if (sinceId && untilId) {
q.andWhere(`${q.alias}.id > :sinceId`, { sinceId: sinceId });
q.andWhere(`${q.alias}.id < :untilId`, { untilId: untilId });
diff --git a/src/server/api/define.ts b/src/server/api/define.ts
index a18419bcf6..990cbf2a86 100644
--- a/src/server/api/define.ts
+++ b/src/server/api/define.ts
@@ -5,9 +5,9 @@ import { ApiError } from './error';
import { App } from '../../models/entities/app';
type Params<T extends IEndpointMeta> = {
- [P in keyof T['params']]: T['params'][P]['transform'] extends Function
- ? ReturnType<T['params'][P]['transform']>
- : ReturnType<T['params'][P]['validator']['get']>[0];
+ [P in keyof T['params']]: NonNullable<T['params']>[P]['transform'] extends Function
+ ? ReturnType<NonNullable<T['params']>[P]['transform']>
+ : ReturnType<NonNullable<T['params']>[P]['validator']['get']>[0];
};
export type Response = Record<string, any> | void;
@@ -34,11 +34,11 @@ export default function <T extends IEndpointMeta>(meta: T, cb: (params: Params<T
};
}
-function getParams<T extends IEndpointMeta>(defs: T, params: any): [Params<T>, ApiError] {
+function getParams<T extends IEndpointMeta>(defs: T, params: any): [Params<T>, ApiError | null] {
if (defs.params == null) return [params, null];
const x: any = {};
- let err: ApiError = null;
+ let err: ApiError | null = null;
Object.entries(defs.params).some(([k, def]) => {
const [v, e] = def.validator.get(params[k]);
if (e) {
diff --git a/src/server/api/endpoints/admin/abuse-user-reports.ts b/src/server/api/endpoints/admin/abuse-user-reports.ts
index 5c5a734c1d..63d1dd795c 100644
--- a/src/server/api/endpoints/admin/abuse-user-reports.ts
+++ b/src/server/api/endpoints/admin/abuse-user-reports.ts
@@ -29,7 +29,7 @@ export const meta = {
export default define(meta, async (ps) => {
const query = makePaginationQuery(AbuseUserReports.createQueryBuilder('report'), ps.sinceId, ps.untilId);
- const reports = await query.take(ps.limit).getMany();
+ const reports = await query.take(ps.limit!).getMany();
return await AbuseUserReports.packMany(reports);
});
diff --git a/src/server/api/endpoints/admin/drive/files.ts b/src/server/api/endpoints/admin/drive/files.ts
index 1ccabc92d9..7c6672e6de 100644
--- a/src/server/api/endpoints/admin/drive/files.ts
+++ b/src/server/api/endpoints/admin/drive/files.ts
@@ -56,8 +56,8 @@ export default define(meta, async (ps, me) => {
const files = await DriveFiles.find({
where: q,
- take: ps.limit,
- order: sort[ps.sort] || sort[fallback],
+ take: ps.limit!,
+ order: sort[ps.sort!] || sort[fallback],
skip: ps.offset
});
diff --git a/src/server/api/endpoints/admin/emoji/list.ts b/src/server/api/endpoints/admin/emoji/list.ts
index 26385d4e23..cf73e4cc75 100644
--- a/src/server/api/endpoints/admin/emoji/list.ts
+++ b/src/server/api/endpoints/admin/emoji/list.ts
@@ -23,7 +23,7 @@ export const meta = {
export default define(meta, async (ps) => {
const emojis = await Emojis.find({
- host: toPuny(ps.host)
+ host: ps.host ? toPuny(ps.host) : null
});
return emojis.map(e => ({
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 fca76e7086..25aae6db88 100644
--- a/src/server/api/endpoints/admin/federation/remove-all-following.ts
+++ b/src/server/api/endpoints/admin/federation/remove-all-following.ts
@@ -2,6 +2,7 @@ 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'],
@@ -22,13 +23,11 @@ export default define(meta, async (ps, me) => {
});
const pairs = await Promise.all(followings.map(f => Promise.all([
- Users.findOne(f.followerId),
- Users.findOne(f.followeeId)
+ Users.findOne(f.followerId).then(ensure),
+ Users.findOne(f.followeeId).then(ensure)
])));
for (const pair of pairs) {
deleteFollowing(pair[0], pair[1]);
}
-
- return;
});
diff --git a/src/server/api/endpoints/admin/logs.ts b/src/server/api/endpoints/admin/logs.ts
index 907b1fdc14..e1419bdfe1 100644
--- a/src/server/api/endpoints/admin/logs.ts
+++ b/src/server/api/endpoints/admin/logs.ts
@@ -65,7 +65,7 @@ export default define(meta, async (ps) => {
}
}
- const logs = await query.orderBy('log.createdAt', 'DESC').take(ps.limit).getMany();
+ const logs = await query.orderBy('log.createdAt', 'DESC').take(ps.limit!).getMany();
return logs;
});
diff --git a/src/server/api/endpoints/admin/queue/jobs.ts b/src/server/api/endpoints/admin/queue/jobs.ts
index c2496d7ef7..4e47775692 100644
--- a/src/server/api/endpoints/admin/queue/jobs.ts
+++ b/src/server/api/endpoints/admin/queue/jobs.ts
@@ -28,9 +28,9 @@ export default define(meta, async (ps) => {
const queue =
ps.domain === 'deliver' ? deliverQueue :
ps.domain === 'inbox' ? inboxQueue :
- null;
+ null as never;
- const jobs = await queue.getJobs([ps.state], 0, ps.limit);
+ const jobs = await queue.getJobs([ps.state], 0, ps.limit!);
return jobs.map(job => ({
id: job.id,
diff --git a/src/server/api/endpoints/admin/show-users.ts b/src/server/api/endpoints/admin/show-users.ts
index 73976b9872..97760ae797 100644
--- a/src/server/api/endpoints/admin/show-users.ts
+++ b/src/server/api/endpoints/admin/show-users.ts
@@ -82,7 +82,7 @@ export default define(meta, async (ps, me) => {
default: query.orderBy('user.id', 'ASC'); break;
}
- query.take(ps.limit);
+ query.take(ps.limit!);
query.skip(ps.offset);
const users = await query.getMany();
diff --git a/src/server/api/endpoints/admin/update-remote-user.ts b/src/server/api/endpoints/admin/update-remote-user.ts
index 0be9047d5a..f9716328d5 100644
--- a/src/server/api/endpoints/admin/update-remote-user.ts
+++ b/src/server/api/endpoints/admin/update-remote-user.ts
@@ -28,5 +28,5 @@ export const meta = {
export default define(meta, async (ps) => {
const user = await getRemoteUser(ps.userId);
- await updatePerson(user.uri);
+ await updatePerson(user.uri!);
});
diff --git a/src/server/api/endpoints/ap/show.ts b/src/server/api/endpoints/ap/show.ts
index 35c5dd318d..1b992eeaa7 100644
--- a/src/server/api/endpoints/ap/show.ts
+++ b/src/server/api/endpoints/ap/show.ts
@@ -123,14 +123,14 @@ async function fetchAny(uri: string) {
const note = await createNote(object.id);
return {
type: 'Note',
- object: await Notes.pack(note, null, { detail: true })
+ object: await Notes.pack(note!, null, { detail: true })
};
}
return null;
}
-async function mergePack(user: User, note: Note) {
+async function mergePack(user: User | null | undefined, note: Note | null | undefined) {
if (user != null) {
return {
type: 'User',
diff --git a/src/server/api/endpoints/auth/accept.ts b/src/server/api/endpoints/auth/accept.ts
index 0baa6b111c..55898b59db 100644
--- a/src/server/api/endpoints/auth/accept.ts
+++ b/src/server/api/endpoints/auth/accept.ts
@@ -5,6 +5,7 @@ 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';
export const meta = {
tags: ['auth'],
@@ -48,7 +49,7 @@ export default define(meta, async (ps, user) => {
if (exist == null) {
// Lookup app
- const app = await Apps.findOne(session.appId);
+ const app = await Apps.findOne(session.appId).then(ensure);
// 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 8524b96f94..7126ac52c1 100644
--- a/src/server/api/endpoints/auth/session/userkey.ts
+++ b/src/server/api/endpoints/auth/session/userkey.ts
@@ -2,6 +2,7 @@ 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'],
@@ -90,7 +91,7 @@ export default define(meta, async (ps) => {
const accessToken = await AccessTokens.findOne({
appId: app.id,
userId: session.userId
- });
+ }).then(ensure);
// Delete session
AuthSessions.delete(session.id);
diff --git a/src/server/api/endpoints/blocking/list.ts b/src/server/api/endpoints/blocking/list.ts
index a078891ab0..97f353579d 100644
--- a/src/server/api/endpoints/blocking/list.ts
+++ b/src/server/api/endpoints/blocking/list.ts
@@ -44,7 +44,7 @@ export default define(meta, async (ps, me) => {
.andWhere(`blocking.blockerId = :meId`, { meId: me.id });
const blockings = await query
- .take(ps.limit)
+ .take(ps.limit!)
.getMany();
return await Blockings.packMany(blockings, me);
diff --git a/src/server/api/endpoints/charts/active-users.ts b/src/server/api/endpoints/charts/active-users.ts
index 60fa72c5c7..f0349b17f3 100644
--- a/src/server/api/endpoints/charts/active-users.ts
+++ b/src/server/api/endpoints/charts/active-users.ts
@@ -33,5 +33,5 @@ export const meta = {
};
export default define(meta, async (ps) => {
- return await activeUsersChart.getChart(ps.span as any, ps.limit);
+ return await activeUsersChart.getChart(ps.span as any, ps.limit!);
});
diff --git a/src/server/api/endpoints/charts/drive.ts b/src/server/api/endpoints/charts/drive.ts
index a9676e1586..ae6d894407 100644
--- a/src/server/api/endpoints/charts/drive.ts
+++ b/src/server/api/endpoints/charts/drive.ts
@@ -33,5 +33,5 @@ export const meta = {
};
export default define(meta, async (ps) => {
- return await driveChart.getChart(ps.span as any, ps.limit);
+ return await driveChart.getChart(ps.span as any, ps.limit!);
});
diff --git a/src/server/api/endpoints/charts/federation.ts b/src/server/api/endpoints/charts/federation.ts
index 95f16c76a7..34e9bfee5f 100644
--- a/src/server/api/endpoints/charts/federation.ts
+++ b/src/server/api/endpoints/charts/federation.ts
@@ -33,5 +33,5 @@ export const meta = {
};
export default define(meta, async (ps) => {
- return await federationChart.getChart(ps.span as any, ps.limit);
+ return await federationChart.getChart(ps.span as any, ps.limit!);
});
diff --git a/src/server/api/endpoints/charts/hashtag.ts b/src/server/api/endpoints/charts/hashtag.ts
index a7ec12707e..eceb0b275c 100644
--- a/src/server/api/endpoints/charts/hashtag.ts
+++ b/src/server/api/endpoints/charts/hashtag.ts
@@ -40,5 +40,5 @@ export const meta = {
};
export default define(meta, async (ps) => {
- return await hashtagChart.getChart(ps.span as any, ps.limit, ps.tag);
+ return await hashtagChart.getChart(ps.span as any, ps.limit!, ps.tag);
});
diff --git a/src/server/api/endpoints/charts/instance.ts b/src/server/api/endpoints/charts/instance.ts
index cf3094f7e1..e99c17ae65 100644
--- a/src/server/api/endpoints/charts/instance.ts
+++ b/src/server/api/endpoints/charts/instance.ts
@@ -41,5 +41,5 @@ export const meta = {
};
export default define(meta, async (ps) => {
- return await instanceChart.getChart(ps.span as any, ps.limit, ps.host);
+ return await instanceChart.getChart(ps.span as any, ps.limit!, ps.host);
});
diff --git a/src/server/api/endpoints/charts/network.ts b/src/server/api/endpoints/charts/network.ts
index c0fcd95fe9..648588fbe5 100644
--- a/src/server/api/endpoints/charts/network.ts
+++ b/src/server/api/endpoints/charts/network.ts
@@ -33,5 +33,5 @@ export const meta = {
};
export default define(meta, async (ps) => {
- return await networkChart.getChart(ps.span as any, ps.limit);
+ return await networkChart.getChart(ps.span as any, ps.limit!);
});
diff --git a/src/server/api/endpoints/charts/notes.ts b/src/server/api/endpoints/charts/notes.ts
index 86f30e4b89..074c4978cd 100644
--- a/src/server/api/endpoints/charts/notes.ts
+++ b/src/server/api/endpoints/charts/notes.ts
@@ -33,5 +33,5 @@ export const meta = {
};
export default define(meta, async (ps) => {
- return await notesChart.getChart(ps.span as any, ps.limit);
+ return await notesChart.getChart(ps.span as any, ps.limit!);
});
diff --git a/src/server/api/endpoints/charts/user/drive.ts b/src/server/api/endpoints/charts/user/drive.ts
index e3696dfda1..918fb62c6a 100644
--- a/src/server/api/endpoints/charts/user/drive.ts
+++ b/src/server/api/endpoints/charts/user/drive.ts
@@ -42,5 +42,5 @@ export const meta = {
};
export default define(meta, async (ps) => {
- return await perUserDriveChart.getChart(ps.span as any, ps.limit, ps.userId);
+ return await perUserDriveChart.getChart(ps.span as any, ps.limit!, ps.userId);
});
diff --git a/src/server/api/endpoints/charts/user/following.ts b/src/server/api/endpoints/charts/user/following.ts
index 8feba0bd16..5d86e85d31 100644
--- a/src/server/api/endpoints/charts/user/following.ts
+++ b/src/server/api/endpoints/charts/user/following.ts
@@ -42,5 +42,5 @@ export const meta = {
};
export default define(meta, async (ps) => {
- return await perUserFollowingChart.getChart(ps.span as any, ps.limit, ps.userId);
+ return await perUserFollowingChart.getChart(ps.span as any, ps.limit!, ps.userId);
});
diff --git a/src/server/api/endpoints/charts/user/notes.ts b/src/server/api/endpoints/charts/user/notes.ts
index 8c1db54f76..d39a20df16 100644
--- a/src/server/api/endpoints/charts/user/notes.ts
+++ b/src/server/api/endpoints/charts/user/notes.ts
@@ -42,5 +42,5 @@ export const meta = {
};
export default define(meta, async (ps) => {
- return await perUserNotesChart.getChart(ps.span as any, ps.limit, ps.userId);
+ return await perUserNotesChart.getChart(ps.span as any, ps.limit!, ps.userId);
});
diff --git a/src/server/api/endpoints/charts/user/reactions.ts b/src/server/api/endpoints/charts/user/reactions.ts
index 7c9b2508ae..5b88a1d715 100644
--- a/src/server/api/endpoints/charts/user/reactions.ts
+++ b/src/server/api/endpoints/charts/user/reactions.ts
@@ -42,5 +42,5 @@ export const meta = {
};
export default define(meta, async (ps) => {
- return await perUserReactionsChart.getChart(ps.span as any, ps.limit, ps.userId);
+ return await perUserReactionsChart.getChart(ps.span as any, ps.limit!, ps.userId);
});
diff --git a/src/server/api/endpoints/charts/users.ts b/src/server/api/endpoints/charts/users.ts
index 3ed5e09349..17de5756da 100644
--- a/src/server/api/endpoints/charts/users.ts
+++ b/src/server/api/endpoints/charts/users.ts
@@ -33,5 +33,5 @@ export const meta = {
};
export default define(meta, async (ps) => {
- return await usersChart.getChart(ps.span as any, ps.limit);
+ return await usersChart.getChart(ps.span as any, ps.limit!);
});
diff --git a/src/server/api/endpoints/drive/files.ts b/src/server/api/endpoints/drive/files.ts
index 400b73d3b7..4e4db6c780 100644
--- a/src/server/api/endpoints/drive/files.ts
+++ b/src/server/api/endpoints/drive/files.ts
@@ -66,7 +66,7 @@ export default define(meta, async (ps, user) => {
}
}
- const files = await query.take(ps.limit).getMany();
+ const files = await query.take(ps.limit!).getMany();
return await DriveFiles.packMany(files, { detail: false, self: true });
});
diff --git a/src/server/api/endpoints/drive/files/create.ts b/src/server/api/endpoints/drive/files/create.ts
index 5702c70fc0..340a39a41c 100644
--- a/src/server/api/endpoints/drive/files/create.ts
+++ b/src/server/api/endpoints/drive/files/create.ts
@@ -92,6 +92,6 @@ export default define(meta, async (ps, user, app, file, cleanup) => {
apiLogger.error(e);
throw new ApiError();
} finally {
- cleanup();
+ cleanup!();
}
});
diff --git a/src/server/api/endpoints/drive/files/show.ts b/src/server/api/endpoints/drive/files/show.ts
index b516ec2df6..e8c0e683c9 100644
--- a/src/server/api/endpoints/drive/files/show.ts
+++ b/src/server/api/endpoints/drive/files/show.ts
@@ -63,7 +63,7 @@ export const meta = {
};
export default define(meta, async (ps, user) => {
- let file: DriveFile;
+ let file: DriveFile | undefined;
if (ps.fileId) {
file = await DriveFiles.findOne(ps.fileId);
@@ -81,14 +81,14 @@ export default define(meta, async (ps, user) => {
throw new ApiError(meta.errors.fileIdOrUrlRequired);
}
- if (!user.isAdmin && !user.isModerator && (file.userId !== user.id)) {
- throw new ApiError(meta.errors.accessDenied);
- }
-
if (file == null) {
throw new ApiError(meta.errors.noSuchFile);
}
+ if (!user.isAdmin && !user.isModerator && (file.userId !== user.id)) {
+ throw new ApiError(meta.errors.accessDenied);
+ }
+
return await DriveFiles.pack(file, {
detail: true,
self: true
diff --git a/src/server/api/endpoints/drive/folders.ts b/src/server/api/endpoints/drive/folders.ts
index f5c3816407..08ae2ff709 100644
--- a/src/server/api/endpoints/drive/folders.ts
+++ b/src/server/api/endpoints/drive/folders.ts
@@ -54,7 +54,7 @@ export default define(meta, async (ps, user) => {
query.andWhere('folder.parentId IS NULL');
}
- const folders = await query.take(ps.limit).getMany();
+ const folders = await query.take(ps.limit!).getMany();
return await Promise.all(folders.map(folder => DriveFolders.pack(folder)));
});
diff --git a/src/server/api/endpoints/drive/folders/update.ts b/src/server/api/endpoints/drive/folders/update.ts
index 90129bed63..7d3ece00a3 100644
--- a/src/server/api/endpoints/drive/folders/update.ts
+++ b/src/server/api/endpoints/drive/folders/update.ts
@@ -102,10 +102,10 @@ export default define(meta, async (ps, user) => {
id: folderId
});
- if (folder2.id === folder.id) {
+ if (folder2!.id === folder!.id) {
return true;
- } else if (folder2.parentId) {
- return await checkCircle(folder2.parentId);
+ } else if (folder2!.parentId) {
+ return await checkCircle(folder2!.parentId);
} else {
return false;
}
diff --git a/src/server/api/endpoints/drive/stream.ts b/src/server/api/endpoints/drive/stream.ts
index 9a84627767..96d9f82421 100644
--- a/src/server/api/endpoints/drive/stream.ts
+++ b/src/server/api/endpoints/drive/stream.ts
@@ -50,7 +50,7 @@ export default define(meta, async (ps, user) => {
}
}
- const files = await query.take(ps.limit).getMany();
+ const files = await query.take(ps.limit!).getMany();
return await DriveFiles.packMany(files, { detail: false, self: true });
});
diff --git a/src/server/api/endpoints/federation/instances.ts b/src/server/api/endpoints/federation/instances.ts
index 1946d26dec..301338ed96 100644
--- a/src/server/api/endpoints/federation/instances.ts
+++ b/src/server/api/endpoints/federation/instances.ts
@@ -86,7 +86,7 @@ export default define(meta, async (ps, me) => {
}
}
- const instances = await query.take(ps.limit).skip(ps.offset).getMany();
+ const instances = await query.take(ps.limit!).skip(ps.offset).getMany();
return instances;
});
diff --git a/src/server/api/endpoints/games/reversi/games.ts b/src/server/api/endpoints/games/reversi/games.ts
index 07736e0424..7267157e0e 100644
--- a/src/server/api/endpoints/games/reversi/games.ts
+++ b/src/server/api/endpoints/games/reversi/games.ts
@@ -41,7 +41,7 @@ export default define(meta, async (ps, user) => {
}
// Fetch games
- const games = await query.take(ps.limit).getMany();
+ const games = await query.take(ps.limit!).getMany();
return await Promise.all(games.map((g) => ReversiGames.pack(g, user, {
detail: false
diff --git a/src/server/api/endpoints/games/reversi/match.ts b/src/server/api/endpoints/games/reversi/match.ts
index e34d3c67f4..da367b5978 100644
--- a/src/server/api/endpoints/games/reversi/match.ts
+++ b/src/server/api/endpoints/games/reversi/match.ts
@@ -70,7 +70,7 @@ export default define(meta, async (ps, user) => {
map: eighteight.data,
bw: 'random',
isLlotheo: false
- } as ReversiGame);
+ } as Partial<ReversiGame>);
publishReversiStream(exist.parentId, 'matched', await ReversiGames.pack(game, exist.parentId));
@@ -107,6 +107,6 @@ export default define(meta, async (ps, user) => {
publishReversiStream(child.id, 'invited', packed);
publishMainStream(child.id, 'reversiInvited', packed);
- return null;
+ return;
}
});
diff --git a/src/server/api/endpoints/hashtags/list.ts b/src/server/api/endpoints/hashtags/list.ts
index 7996c81669..2998bc1a13 100644
--- a/src/server/api/endpoints/hashtags/list.ts
+++ b/src/server/api/endpoints/hashtags/list.ts
@@ -86,7 +86,7 @@ export default define(meta, async (ps, me) => {
'tag.attachedRemoteUsersCount',
]);
- const tags = await query.take(ps.limit).getMany();
+ const tags = await query.take(ps.limit!).getMany();
return tags;
});
diff --git a/src/server/api/endpoints/hashtags/search.ts b/src/server/api/endpoints/hashtags/search.ts
index fd91a2ebcc..6a9a2df6ef 100644
--- a/src/server/api/endpoints/hashtags/search.ts
+++ b/src/server/api/endpoints/hashtags/search.ts
@@ -48,7 +48,7 @@ export default define(meta, async (ps) => {
const hashtags = await Hashtags.createQueryBuilder('tag')
.where('tag.name like :q', { q: ps.query.toLowerCase() + '%' })
.orderBy('tag.count', 'DESC')
- .take(ps.limit)
+ .take(ps.limit!)
.skip(ps.offset)
.getMany();
diff --git a/src/server/api/endpoints/hashtags/users.ts b/src/server/api/endpoints/hashtags/users.ts
index 20cba96d0e..fa58f2f2c0 100644
--- a/src/server/api/endpoints/hashtags/users.ts
+++ b/src/server/api/endpoints/hashtags/users.ts
@@ -79,7 +79,7 @@ export default define(meta, async (ps, me) => {
case '-updatedAt': query.orderBy('user.updatedAt', 'ASC'); break;
}
- const users = await query.take(ps.limit).getMany();
+ const users = await query.take(ps.limit!).getMany();
return await Users.packMany(users, me, { detail: true });
});
diff --git a/src/server/api/endpoints/i/2fa/done.ts b/src/server/api/endpoints/i/2fa/done.ts
index edc7cefd26..e23678dcbb 100644
--- a/src/server/api/endpoints/i/2fa/done.ts
+++ b/src/server/api/endpoints/i/2fa/done.ts
@@ -2,6 +2,7 @@ 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,
@@ -18,7 +19,7 @@ export const meta = {
export default define(meta, async (ps, user) => {
const token = ps.token.replace(/\s/g, '');
- const profile = await UserProfiles.findOne({ userId: user.id });
+ const profile = await UserProfiles.findOne({ userId: user.id }).then(ensure);
if (profile.twoFactorTempSecret == null) {
throw new Error('二段階認証の設定が開始されていません');
diff --git a/src/server/api/endpoints/i/2fa/register.ts b/src/server/api/endpoints/i/2fa/register.ts
index db9a2fe944..76d79b3a49 100644
--- a/src/server/api/endpoints/i/2fa/register.ts
+++ b/src/server/api/endpoints/i/2fa/register.ts
@@ -5,6 +5,7 @@ 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,
@@ -19,10 +20,10 @@ export const meta = {
};
export default define(meta, async (ps, user) => {
- const profile = await UserProfiles.findOne({ userId: user.id });
+ const profile = await UserProfiles.findOne({ userId: user.id }).then(ensure);
// Compare password
- const same = await bcrypt.compare(ps.password, profile.password);
+ const same = await bcrypt.compare(ps.password, profile.password!);
if (!same) {
throw new Error('incorrect password');
diff --git a/src/server/api/endpoints/i/2fa/unregister.ts b/src/server/api/endpoints/i/2fa/unregister.ts
index fa25b74391..9c7857e7ef 100644
--- a/src/server/api/endpoints/i/2fa/unregister.ts
+++ b/src/server/api/endpoints/i/2fa/unregister.ts
@@ -2,6 +2,7 @@ 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,
@@ -16,10 +17,10 @@ export const meta = {
};
export default define(meta, async (ps, user) => {
- const profile = await UserProfiles.findOne({ userId: user.id });
+ const profile = await UserProfiles.findOne({ userId: user.id }).then(ensure);
// Compare password
- const same = await bcrypt.compare(ps.password, profile.password);
+ const same = await bcrypt.compare(ps.password, profile.password!);
if (!same) {
throw new Error('incorrect password');
diff --git a/src/server/api/endpoints/i/authorized-apps.ts b/src/server/api/endpoints/i/authorized-apps.ts
index ebf04fcb58..3e9fea19e2 100644
--- a/src/server/api/endpoints/i/authorized-apps.ts
+++ b/src/server/api/endpoints/i/authorized-apps.ts
@@ -31,7 +31,7 @@ export default define(meta, async (ps, user) => {
where: {
userId: user.id
},
- take: ps.limit,
+ take: ps.limit!,
skip: ps.offset,
order: {
id: ps.sort == 'asc' ? 1 : -1
diff --git a/src/server/api/endpoints/i/change-password.ts b/src/server/api/endpoints/i/change-password.ts
index d0e0695e18..0dda125b9c 100644
--- a/src/server/api/endpoints/i/change-password.ts
+++ b/src/server/api/endpoints/i/change-password.ts
@@ -2,6 +2,7 @@ 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,
@@ -20,10 +21,10 @@ export const meta = {
};
export default define(meta, async (ps, user) => {
- const profile = await UserProfiles.findOne({ userId: user.id });
+ const profile = await UserProfiles.findOne({ userId: user.id }).then(ensure);
// Compare password
- const same = await bcrypt.compare(ps.currentPassword, profile.password);
+ const same = await bcrypt.compare(ps.currentPassword, profile.password!);
if (!same) {
throw new Error('incorrect password');
diff --git a/src/server/api/endpoints/i/delete-account.ts b/src/server/api/endpoints/i/delete-account.ts
index 7ef7aa5fac..389d0b3212 100644
--- a/src/server/api/endpoints/i/delete-account.ts
+++ b/src/server/api/endpoints/i/delete-account.ts
@@ -2,6 +2,7 @@ import $ from 'cafy';
import * as bcrypt from 'bcryptjs';
import define from '../../define';
import { Users, UserProfiles } from '../../../../models';
+import { ensure } from '../../../../prelude/ensure';
export const meta = {
requireCredential: true,
@@ -16,10 +17,10 @@ export const meta = {
};
export default define(meta, async (ps, user) => {
- const profile = await UserProfiles.findOne({ userId: user.id });
+ const profile = await UserProfiles.findOne({ userId: user.id }).then(ensure);
// Compare password
- const same = await bcrypt.compare(ps.password, profile.password);
+ const same = await bcrypt.compare(ps.password, profile.password!);
if (!same) {
throw new Error('incorrect password');
diff --git a/src/server/api/endpoints/i/favorites.ts b/src/server/api/endpoints/i/favorites.ts
index d2d149b2d1..2c25250bea 100644
--- a/src/server/api/endpoints/i/favorites.ts
+++ b/src/server/api/endpoints/i/favorites.ts
@@ -38,7 +38,7 @@ export default define(meta, async (ps, user) => {
.leftJoinAndSelect('favorite.note', 'note');
const favorites = await query
- .take(ps.limit)
+ .take(ps.limit!)
.getMany();
return await NoteFavorites.packMany(favorites, user);
diff --git a/src/server/api/endpoints/i/notifications.ts b/src/server/api/endpoints/i/notifications.ts
index 9b016e0a2d..56074c9d00 100644
--- a/src/server/api/endpoints/i/notifications.ts
+++ b/src/server/api/endpoints/i/notifications.ts
@@ -81,13 +81,13 @@ export default define(meta, async (ps, user) => {
query.setParameters(followingQuery.getParameters());
}
- if (ps.includeTypes.length > 0) {
+ if (ps.includeTypes!.length > 0) {
query.andWhere(`notification.type IN (:...includeTypes)`, { includeTypes: ps.includeTypes });
- } else if (ps.excludeTypes.length > 0) {
+ } else if (ps.excludeTypes!.length > 0) {
query.andWhere(`notification.type NOT IN (:...excludeTypes)`, { excludeTypes: ps.excludeTypes });
}
- const notifications = await query.take(ps.limit).getMany();
+ const notifications = await query.take(ps.limit!).getMany();
// Mark all as read
if (notifications.length > 0 && ps.markAsRead) {
diff --git a/src/server/api/endpoints/i/regenerate-token.ts b/src/server/api/endpoints/i/regenerate-token.ts
index ec53bca979..56c0362c88 100644
--- a/src/server/api/endpoints/i/regenerate-token.ts
+++ b/src/server/api/endpoints/i/regenerate-token.ts
@@ -4,6 +4,7 @@ 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,
@@ -18,10 +19,10 @@ export const meta = {
};
export default define(meta, async (ps, user) => {
- const profile = await UserProfiles.findOne({ userId: user.id });
+ const profile = await UserProfiles.findOne({ userId: user.id }).then(ensure);
// Compare password
- const same = await bcrypt.compare(ps.password, profile.password);
+ const same = await bcrypt.compare(ps.password, profile.password!);
if (!same) {
throw new Error('incorrect password');
diff --git a/src/server/api/endpoints/i/signin-history.ts b/src/server/api/endpoints/i/signin-history.ts
index e9ae19d734..74648951fd 100644
--- a/src/server/api/endpoints/i/signin-history.ts
+++ b/src/server/api/endpoints/i/signin-history.ts
@@ -29,7 +29,7 @@ export default define(meta, async (ps, user) => {
const query = makePaginationQuery(Signins.createQueryBuilder('signin'), ps.sinceId, ps.untilId)
.andWhere(`signin.userId = :meId`, { meId: user.id });
- const history = await query.take(ps.limit).getMany();
+ const history = await query.take(ps.limit!).getMany();
return await Promise.all(history.map(record => Signins.pack(record)));
});
diff --git a/src/server/api/endpoints/i/update-email.ts b/src/server/api/endpoints/i/update-email.ts
index d98f0d753e..8b05f3c8cb 100644
--- a/src/server/api/endpoints/i/update-email.ts
+++ b/src/server/api/endpoints/i/update-email.ts
@@ -9,6 +9,7 @@ import * as ms from 'ms';
import * as bcrypt from 'bcryptjs';
import { apiLogger } from '../../logger';
import { Users, UserProfiles } from '../../../../models';
+import { ensure } from '../../../../prelude/ensure';
export const meta = {
requireCredential: true,
@@ -32,10 +33,10 @@ export const meta = {
};
export default define(meta, async (ps, user) => {
- const profile = await UserProfiles.findOne({ userId: user.id });
+ const profile = await UserProfiles.findOne({ userId: user.id }).then(ensure);
// Compare password
- const same = await bcrypt.compare(ps.password, profile.password);
+ const same = await bcrypt.compare(ps.password, profile.password!);
if (!same) {
throw new Error('incorrect password');
diff --git a/src/server/api/endpoints/i/update.ts b/src/server/api/endpoints/i/update.ts
index 3cb514d939..d06ab621c6 100644
--- a/src/server/api/endpoints/i/update.ts
+++ b/src/server/api/endpoints/i/update.ts
@@ -206,13 +206,13 @@ export default define(meta, async (ps, user, app) => {
if (updates.name != null) {
const tokens = parsePlain(updates.name);
- emojis = emojis.concat(extractEmojis(tokens));
+ emojis = emojis.concat(extractEmojis(tokens!));
}
if (profile.description != null) {
const tokens = parse(profile.description);
- emojis = emojis.concat(extractEmojis(tokens));
- tags = extractHashtags(tokens).map(tag => tag.toLowerCase());
+ emojis = emojis.concat(extractEmojis(tokens!));
+ tags = extractHashtags(tokens!).map(tag => tag.toLowerCase());
}
updates.emojis = emojis;
diff --git a/src/server/api/endpoints/messaging/history.ts b/src/server/api/endpoints/messaging/history.ts
index c0aec61212..c12378eb7e 100644
--- a/src/server/api/endpoints/messaging/history.ts
+++ b/src/server/api/endpoints/messaging/history.ts
@@ -38,7 +38,7 @@ export default define(meta, async (ps, user) => {
const history: MessagingMessage[] = [];
- for (let i = 0; i < ps.limit; i++) {
+ for (let i = 0; i < ps.limit!; i++) {
const found = history.map(m => (m.userId === user.id) ? m.recipientId : m.userId);
const query = MessagingMessages.createQueryBuilder('message')
diff --git a/src/server/api/endpoints/mute/list.ts b/src/server/api/endpoints/mute/list.ts
index 5f2d184472..0fd8a4860d 100644
--- a/src/server/api/endpoints/mute/list.ts
+++ b/src/server/api/endpoints/mute/list.ts
@@ -44,7 +44,7 @@ export default define(meta, async (ps, me) => {
.andWhere(`muting.muterId = :meId`, { meId: me.id });
const mutings = await query
- .take(ps.limit)
+ .take(ps.limit!)
.getMany();
return await Mutings.packMany(mutings, me);
diff --git a/src/server/api/endpoints/my/apps.ts b/src/server/api/endpoints/my/apps.ts
index d205d1674c..e8b26362a4 100644
--- a/src/server/api/endpoints/my/apps.ts
+++ b/src/server/api/endpoints/my/apps.ts
@@ -32,7 +32,7 @@ export default define(meta, async (ps, user) => {
const apps = await Apps.find({
where: query,
- take: ps.limit,
+ take: ps.limit!,
skip: ps.offset,
});
diff --git a/src/server/api/endpoints/notes.ts b/src/server/api/endpoints/notes.ts
index 10f6e39845..17ba969350 100644
--- a/src/server/api/endpoints/notes.ts
+++ b/src/server/api/endpoints/notes.ts
@@ -100,7 +100,7 @@ export default define(meta, async (ps) => {
// query.isBot = bot;
//}
- const notes = await query.take(ps.limit).getMany();
+ const notes = await query.take(ps.limit!).getMany();
return await Notes.packMany(notes);
});
diff --git a/src/server/api/endpoints/notes/children.ts b/src/server/api/endpoints/notes/children.ts
index 72f2c39d6a..2b4ae2a312 100644
--- a/src/server/api/endpoints/notes/children.ts
+++ b/src/server/api/endpoints/notes/children.ts
@@ -66,7 +66,7 @@ export default define(meta, async (ps, user) => {
if (user) generateVisibilityQuery(query, user);
if (user) generateMuteQuery(query, user);
- const notes = await query.take(ps.limit).getMany();
+ const notes = await query.take(ps.limit!).getMany();
return await Notes.packMany(notes, user);
});
diff --git a/src/server/api/endpoints/notes/conversation.ts b/src/server/api/endpoints/notes/conversation.ts
index 6defd79042..6b26e31c07 100644
--- a/src/server/api/endpoints/notes/conversation.ts
+++ b/src/server/api/endpoints/notes/conversation.ts
@@ -64,12 +64,13 @@ export default define(meta, async (ps, user) => {
async function get(id: any) {
i++;
const p = await Notes.findOne(id);
+ if (p == null) return;
- if (i > ps.offset) {
+ if (i > ps.offset!) {
conversation.push(p);
}
- if (conversation.length == ps.limit) {
+ if (conversation.length == ps.limit!) {
return;
}
diff --git a/src/server/api/endpoints/notes/create.ts b/src/server/api/endpoints/notes/create.ts
index 138f05fb3b..83649015d8 100644
--- a/src/server/api/endpoints/notes/create.ts
+++ b/src/server/api/endpoints/notes/create.ts
@@ -225,23 +225,24 @@ export const meta = {
export default define(meta, async (ps, user, app) => {
let visibleUsers: User[] = [];
if (ps.visibleUserIds) {
- visibleUsers = await Promise.all(ps.visibleUserIds.map(id => Users.findOne(id)));
+ visibleUsers = (await Promise.all(ps.visibleUserIds.map(id => Users.findOne(id))))
+ .filter(x => x != null) as User[];
}
let files: DriveFile[] = [];
const fileIds = ps.fileIds != null ? ps.fileIds : ps.mediaIds != null ? ps.mediaIds : null;
if (fileIds != null) {
- files = await Promise.all(fileIds.map(fileId => {
- return DriveFiles.findOne({
+ files = (await Promise.all(fileIds.map(fileId =>
+ DriveFiles.findOne({
id: fileId,
userId: user.id
- });
- }));
+ })
+ ))).filter(file => file != null) as DriveFile[];
- files = files.filter(file => file != null);
+ files = files;
}
- let renote: Note = null;
+ let renote: Note | undefined;
if (ps.renoteId != null) {
// Fetch renote to note
renote = await Notes.findOne(ps.renoteId);
@@ -253,7 +254,7 @@ export default define(meta, async (ps, user, app) => {
}
}
- let reply: Note = null;
+ let reply: Note | undefined;
if (ps.replyId != null) {
// Fetch reply
reply = await Notes.findOne(ps.replyId);
@@ -290,8 +291,8 @@ export default define(meta, async (ps, user, app) => {
choices: ps.poll.choices,
multiple: ps.poll.multiple || false,
expiresAt: ps.poll.expiresAt ? new Date(ps.poll.expiresAt) : null
- } : null,
- text: ps.text,
+ } : undefined,
+ text: ps.text || undefined,
reply,
renote,
cw: ps.cw,
@@ -300,9 +301,9 @@ export default define(meta, async (ps, user, app) => {
localOnly: ps.localOnly,
visibility: ps.visibility,
visibleUsers,
- apMentions: ps.noExtractMentions ? [] : null,
- apHashtags: ps.noExtractHashtags ? [] : null,
- apEmojis: ps.noExtractEmojis ? [] : null,
+ apMentions: ps.noExtractMentions ? [] : undefined,
+ apHashtags: ps.noExtractHashtags ? [] : undefined,
+ apEmojis: ps.noExtractEmojis ? [] : undefined,
geo: ps.geo
});
diff --git a/src/server/api/endpoints/notes/delete.ts b/src/server/api/endpoints/notes/delete.ts
index dbaf91bca3..17d44c424d 100644
--- a/src/server/api/endpoints/notes/delete.ts
+++ b/src/server/api/endpoints/notes/delete.ts
@@ -6,6 +6,7 @@ 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 = {
stability: 'stable',
@@ -63,5 +64,5 @@ export default define(meta, async (ps, user) => {
}
// この操作を行うのが投稿者とは限らない(例えばモデレーター)ため
- await deleteNote(await Users.findOne(note.userId), note);
+ await deleteNote(await Users.findOne(note.userId).then(ensure), note);
});
diff --git a/src/server/api/endpoints/notes/featured.ts b/src/server/api/endpoints/notes/featured.ts
index c44a5275bb..5d2e5b7d44 100644
--- a/src/server/api/endpoints/notes/featured.ts
+++ b/src/server/api/endpoints/notes/featured.ts
@@ -41,7 +41,7 @@ export default define(meta, async (ps, user) => {
if (user) generateMuteQuery(query, user);
- const notes = await query.orderBy('note.score', 'DESC').take(ps.limit).getMany();
+ const notes = await query.orderBy('note.score', 'DESC').take(ps.limit!).getMany();
return await Notes.packMany(notes, user);
});
diff --git a/src/server/api/endpoints/notes/global-timeline.ts b/src/server/api/endpoints/notes/global-timeline.ts
index 7bf62f366b..ceffb1cf4a 100644
--- a/src/server/api/endpoints/notes/global-timeline.ts
+++ b/src/server/api/endpoints/notes/global-timeline.ts
@@ -84,7 +84,7 @@ export default define(meta, async (ps, user) => {
}
//#endregion
- const timeline = await query.take(ps.limit).getMany();
+ const timeline = await query.take(ps.limit!).getMany();
if (user) {
activeUsersChart.update(user);
diff --git a/src/server/api/endpoints/notes/hybrid-timeline.ts b/src/server/api/endpoints/notes/hybrid-timeline.ts
index 76f1682a95..6dfb143003 100644
--- a/src/server/api/endpoints/notes/hybrid-timeline.ts
+++ b/src/server/api/endpoints/notes/hybrid-timeline.ts
@@ -185,7 +185,7 @@ export default define(meta, async (ps, user) => {
}
//#endregion
- const timeline = await query.take(ps.limit).getMany();
+ const timeline = await query.take(ps.limit!).getMany();
if (user) {
activeUsersChart.update(user);
diff --git a/src/server/api/endpoints/notes/local-timeline.ts b/src/server/api/endpoints/notes/local-timeline.ts
index cd07341342..c10c0d7482 100644
--- a/src/server/api/endpoints/notes/local-timeline.ts
+++ b/src/server/api/endpoints/notes/local-timeline.ts
@@ -100,11 +100,11 @@ export default define(meta, async (ps, user) => {
query.andWhere('note.fileIds != \'{}\'');
}
- if (ps.fileType) {
+ if (ps.fileType != null) {
query.andWhere('note.fileIds != \'{}\'');
query.andWhere(new Brackets(qb => {
- for (const type of ps.fileType) {
- const i = ps.fileType.indexOf(type);
+ for (const type of ps.fileType!) {
+ const i = ps.fileType!.indexOf(type);
qb.orWhere(`:type${i} = ANY(note.attachedFileTypes)`, { [`type${i}`]: type });
}
}));
@@ -120,7 +120,7 @@ export default define(meta, async (ps, user) => {
}
//#endregion
- const timeline = await query.take(ps.limit).getMany();
+ const timeline = await query.take(ps.limit!).getMany();
if (user) {
activeUsersChart.update(user);
diff --git a/src/server/api/endpoints/notes/mentions.ts b/src/server/api/endpoints/notes/mentions.ts
index 0bbe7d3327..b7f614915b 100644
--- a/src/server/api/endpoints/notes/mentions.ts
+++ b/src/server/api/endpoints/notes/mentions.ts
@@ -74,7 +74,7 @@ export default define(meta, async (ps, user) => {
query.setParameters(followingQuery.getParameters());
}
- const mentions = await query.take(ps.limit).getMany();
+ const mentions = await query.take(ps.limit!).getMany();
for (const note of mentions) {
read(user.id, note.id);
diff --git a/src/server/api/endpoints/notes/polls/recommendation.ts b/src/server/api/endpoints/notes/polls/recommendation.ts
index ff838d4f4f..cbd4d35cd4 100644
--- a/src/server/api/endpoints/notes/polls/recommendation.ts
+++ b/src/server/api/endpoints/notes/polls/recommendation.ts
@@ -58,7 +58,7 @@ export default define(meta, async (ps, user) => {
query.setParameters(mutingQuery.getParameters());
//#endregion
- const polls = await query.take(ps.limit).skip(ps.offset).getMany();
+ const polls = await query.take(ps.limit!).skip(ps.offset).getMany();
if (polls.length === 0) return [];
diff --git a/src/server/api/endpoints/notes/polls/vote.ts b/src/server/api/endpoints/notes/polls/vote.ts
index dd4d93c7ac..68dee66828 100644
--- a/src/server/api/endpoints/notes/polls/vote.ts
+++ b/src/server/api/endpoints/notes/polls/vote.ts
@@ -14,6 +14,7 @@ import { PollVotes, NoteWatchings, Users, Polls, UserProfiles } from '../../../.
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 +88,7 @@ export default define(meta, async (ps, user) => {
throw new ApiError(meta.errors.noPoll);
}
- const poll = await Polls.findOne({ noteId: note.id });
+ const poll = await Polls.findOne({ noteId: note.id }).then(ensure);
if (poll.expiresAt && poll.expiresAt < createdAt) {
throw new ApiError(meta.errors.alreadyExpired);
@@ -149,7 +150,7 @@ export default define(meta, async (ps, user) => {
}
});
- const profile = await UserProfiles.findOne({ userId: user.id });
+ const profile = await UserProfiles.findOne({ userId: user.id }).then(ensure);
// この投稿をWatchする
if (profile.autoWatch !== false) {
@@ -158,7 +159,7 @@ export default define(meta, async (ps, user) => {
// リモート投票の場合リプライ送信
if (note.userHost != null) {
- const pollOwner: IRemoteUser = await Users.findOne(note.userId);
+ const pollOwner = await Users.findOne(note.userId).then(ensure) as IRemoteUser;
deliver(user, renderActivity(await renderVote(user, vote, note, poll, pollOwner)), pollOwner.inbox);
}
diff --git a/src/server/api/endpoints/notes/reactions.ts b/src/server/api/endpoints/notes/reactions.ts
index b1b5ca9d33..bcb0b6d1ec 100644
--- a/src/server/api/endpoints/notes/reactions.ts
+++ b/src/server/api/endpoints/notes/reactions.ts
@@ -71,7 +71,7 @@ export default define(meta, async (ps, user) => {
const reactions = await NoteReactions.find({
where: query,
- take: ps.limit,
+ take: ps.limit!,
skip: ps.offset,
order: {
id: -1
diff --git a/src/server/api/endpoints/notes/renotes.ts b/src/server/api/endpoints/notes/renotes.ts
index 81b899836d..74a8ea918e 100644
--- a/src/server/api/endpoints/notes/renotes.ts
+++ b/src/server/api/endpoints/notes/renotes.ts
@@ -70,7 +70,7 @@ export default define(meta, async (ps, user) => {
if (user) generateVisibilityQuery(query, user);
if (user) generateMuteQuery(query, user);
- const renotes = await query.take(ps.limit).getMany();
+ const renotes = await query.take(ps.limit!).getMany();
return await Notes.packMany(renotes, user);
});
diff --git a/src/server/api/endpoints/notes/replies.ts b/src/server/api/endpoints/notes/replies.ts
index 09b0f17164..980ff2446e 100644
--- a/src/server/api/endpoints/notes/replies.ts
+++ b/src/server/api/endpoints/notes/replies.ts
@@ -61,7 +61,7 @@ export default define(meta, async (ps, user) => {
if (user) generateVisibilityQuery(query, user);
if (user) generateMuteQuery(query, user);
- const timeline = await query.take(ps.limit).getMany();
+ const timeline = await query.take(ps.limit!).getMany();
return await Notes.packMany(timeline, user);
});
diff --git a/src/server/api/endpoints/notes/search-by-tag.ts b/src/server/api/endpoints/notes/search-by-tag.ts
index 48de88d36e..cba3724b6f 100644
--- a/src/server/api/endpoints/notes/search-by-tag.ts
+++ b/src/server/api/endpoints/notes/search-by-tag.ts
@@ -100,7 +100,7 @@ export default define(meta, async (ps, me) => {
} else {
let i = 0;
query.andWhere(new Brackets(qb => {
- for (const tags of ps.query) {
+ for (const tags of ps.query!) {
qb.orWhere(new Brackets(qb => {
for (const tag of tags) {
qb.andWhere(`:tag${i} = ANY(note.tags)`, { [`tag${i}`]: tag });
@@ -140,7 +140,7 @@ export default define(meta, async (ps, me) => {
}
// Search notes
- const notes = await query.take(ps.limit).getMany();
+ const notes = await query.take(ps.limit!).getMany();
return await Notes.packMany(notes, me);
});
diff --git a/src/server/api/endpoints/notes/search.ts b/src/server/api/endpoints/notes/search.ts
index cc88fb9380..4d5ac6fbe0 100644
--- a/src/server/api/endpoints/notes/search.ts
+++ b/src/server/api/endpoints/notes/search.ts
@@ -54,7 +54,7 @@ export default define(meta, async (ps, me) => {
index: 'misskey',
type: 'note',
body: {
- size: ps.limit,
+ size: ps.limit!,
from: ps.offset,
query: {
simple_query_string: {
diff --git a/src/server/api/endpoints/notes/timeline.ts b/src/server/api/endpoints/notes/timeline.ts
index e22db4d1b0..c27f3df1b7 100644
--- a/src/server/api/endpoints/notes/timeline.ts
+++ b/src/server/api/endpoints/notes/timeline.ts
@@ -171,7 +171,7 @@ export default define(meta, async (ps, user) => {
}
//#endregion
- const timeline = await query.take(ps.limit).getMany();
+ const timeline = await query.take(ps.limit!).getMany();
activeUsersChart.update(user);
diff --git a/src/server/api/endpoints/notes/user-list-timeline.ts b/src/server/api/endpoints/notes/user-list-timeline.ts
index deda04acb4..05f171af8b 100644
--- a/src/server/api/endpoints/notes/user-list-timeline.ts
+++ b/src/server/api/endpoints/notes/user-list-timeline.ts
@@ -189,7 +189,7 @@ export default define(meta, async (ps, user) => {
}
//#endregion
- const timeline = await query.take(ps.limit).getMany();
+ const timeline = await query.take(ps.limit!).getMany();
activeUsersChart.update(user);
diff --git a/src/server/api/endpoints/users.ts b/src/server/api/endpoints/users.ts
index f99165f3d5..18af0a2685 100644
--- a/src/server/api/endpoints/users.ts
+++ b/src/server/api/endpoints/users.ts
@@ -88,7 +88,7 @@ export default define(meta, async (ps, me) => {
if (me) generateMuteQueryForUsers(query, me);
- query.take(ps.limit);
+ query.take(ps.limit!);
query.skip(ps.offset);
const users = await query.getMany();
diff --git a/src/server/api/endpoints/users/followers.ts b/src/server/api/endpoints/users/followers.ts
index 64d63e2d03..88a474be7c 100644
--- a/src/server/api/endpoints/users/followers.ts
+++ b/src/server/api/endpoints/users/followers.ts
@@ -66,7 +66,7 @@ export const meta = {
export default define(meta, async (ps, me) => {
const user = await Users.findOne(ps.userId != null
? { id: ps.userId }
- : { usernameLower: ps.username.toLowerCase(), host: toPuny(ps.host) });
+ : { usernameLower: ps.username!.toLowerCase(), host: toPuny(ps.host!) });
if (user == null) {
throw new ApiError(meta.errors.noSuchUser);
@@ -76,7 +76,7 @@ export default define(meta, async (ps, me) => {
.andWhere(`following.followeeId = :userId`, { userId: user.id });
const followings = await query
- .take(ps.limit)
+ .take(ps.limit!)
.getMany();
return await Followings.packMany(followings, me, { populateFollower: true });
diff --git a/src/server/api/endpoints/users/following.ts b/src/server/api/endpoints/users/following.ts
index 0e28001680..5e017150e8 100644
--- a/src/server/api/endpoints/users/following.ts
+++ b/src/server/api/endpoints/users/following.ts
@@ -66,7 +66,7 @@ export const meta = {
export default define(meta, async (ps, me) => {
const user = await Users.findOne(ps.userId != null
? { id: ps.userId }
- : { usernameLower: ps.username.toLowerCase(), host: toPuny(ps.host) });
+ : { usernameLower: ps.username!.toLowerCase(), host: toPuny(ps.host!) });
if (user == null) {
throw new ApiError(meta.errors.noSuchUser);
@@ -76,7 +76,7 @@ export default define(meta, async (ps, me) => {
.andWhere(`following.followerId = :userId`, { userId: user.id });
const followings = await query
- .take(ps.limit)
+ .take(ps.limit!)
.getMany();
return await Followings.packMany(followings, me, { populateFollowee: true });
diff --git a/src/server/api/endpoints/users/get-frequently-replied-users.ts b/src/server/api/endpoints/users/get-frequently-replied-users.ts
index f82f437629..a1d140c6c9 100644
--- a/src/server/api/endpoints/users/get-frequently-replied-users.ts
+++ b/src/server/api/endpoints/users/get-frequently-replied-users.ts
@@ -94,7 +94,7 @@ export default define(meta, async (ps, me) => {
const repliedUsersSorted = Object.keys(repliedUsers).sort((a, b) => repliedUsers[b] - repliedUsers[a]);
// Extract top replied users
- const topRepliedUsers = repliedUsersSorted.slice(0, ps.limit);
+ const topRepliedUsers = repliedUsersSorted.slice(0, ps.limit!);
// Make replies object (includes weights)
const repliesObj = await Promise.all(topRepliedUsers.map(async (user) => ({
diff --git a/src/server/api/endpoints/users/notes.ts b/src/server/api/endpoints/users/notes.ts
index 6df394cbb1..da23be3c55 100644
--- a/src/server/api/endpoints/users/notes.ts
+++ b/src/server/api/endpoints/users/notes.ts
@@ -153,11 +153,11 @@ export default define(meta, async (ps, me) => {
query.andWhere('note.fileIds != \'{}\'');
}
- if (ps.fileType) {
+ if (ps.fileType != null) {
query.andWhere('note.fileIds != \'{}\'');
query.andWhere(new Brackets(qb => {
- for (const type of ps.fileType) {
- const i = ps.fileType.indexOf(type);
+ for (const type of ps.fileType!) {
+ const i = ps.fileType!.indexOf(type);
qb.orWhere(`:type${i} = ANY(note.attachedFileTypes)`, { [`type${i}`]: type });
}
}));
@@ -194,7 +194,7 @@ export default define(meta, async (ps, me) => {
//#endregion
- const timeline = await query.take(ps.limit).getMany();
+ const timeline = await query.take(ps.limit!).getMany();
return await Notes.packMany(timeline, user);
});
diff --git a/src/server/api/endpoints/users/recommendation.ts b/src/server/api/endpoints/users/recommendation.ts
index 2c82d6613e..9e16e34e39 100644
--- a/src/server/api/endpoints/users/recommendation.ts
+++ b/src/server/api/endpoints/users/recommendation.ts
@@ -53,7 +53,7 @@ export default define(meta, async (ps, me) => {
query.setParameters(followingQuery.getParameters());
- const users = await query.take(ps.limit).skip(ps.offset).getMany();
+ const users = await query.take(ps.limit!).skip(ps.offset).getMany();
return await Users.packMany(users, me, { detail: true });
});
diff --git a/src/server/api/endpoints/users/search.ts b/src/server/api/endpoints/users/search.ts
index 443bd507f3..96da221d97 100644
--- a/src/server/api/endpoints/users/search.ts
+++ b/src/server/api/endpoints/users/search.ts
@@ -71,16 +71,16 @@ export default define(meta, async (ps, me) => {
.where('user.host IS NULL')
.andWhere('user.isSuspended = FALSE')
.andWhere('user.usernameLower like :username', { username: ps.query.replace('@', '').toLowerCase() + '%' })
- .take(ps.limit)
+ .take(ps.limit!)
.skip(ps.offset)
.getMany();
- if (users.length < ps.limit && !ps.localOnly) {
+ if (users.length < ps.limit! && !ps.localOnly) {
const otherUsers = await Users.createQueryBuilder('user')
.where('user.host IS NOT NULL')
.andWhere('user.isSuspended = FALSE')
.andWhere('user.usernameLower like :username', { username: ps.query.replace('@', '').toLowerCase() + '%' })
- .take(ps.limit - users.length)
+ .take(ps.limit! - users.length)
.getMany();
users = users.concat(otherUsers);
diff --git a/src/server/api/endpoints/users/show.ts b/src/server/api/endpoints/users/show.ts
index ae93e40eaa..2be193f89b 100644
--- a/src/server/api/endpoints/users/show.ts
+++ b/src/server/api/endpoints/users/show.ts
@@ -74,7 +74,7 @@ export default define(meta, async (ps, me) => {
})));
} else {
// Lookup user
- if (typeof ps.host === 'string') {
+ if (typeof ps.host === 'string' && typeof ps.username === 'string') {
user = await resolveUser(ps.username, ps.host).catch(e => {
apiLogger.warn(`failed to resolve remote user: ${e}`);
throw new ApiError(meta.errors.failedToResolveRemoteUser);
@@ -82,7 +82,7 @@ export default define(meta, async (ps, me) => {
} else {
const q: any = ps.userId != null
? { id: ps.userId }
- : { usernameLower: ps.username.toLowerCase(), host: null };
+ : { usernameLower: ps.username!.toLowerCase(), host: null };
user = await Users.findOne(q);
}
@@ -94,7 +94,7 @@ export default define(meta, async (ps, me) => {
// ユーザー情報更新
if (Users.isRemoteUser(user)) {
if (user.lastFetchedAt == null || Date.now() - user.lastFetchedAt.getTime() > 1000 * 60 * 60 * 24) {
- resolveUser(ps.username, ps.host, { }, true);
+ resolveUser(user.username, user.host, { }, true);
}
}
diff --git a/src/server/api/error.ts b/src/server/api/error.ts
index ca441d5811..cb0bdc9f47 100644
--- a/src/server/api/error.ts
+++ b/src/server/api/error.ts
@@ -1,3 +1,5 @@
+type E = { message: string, code: string, id: string, kind?: 'client' | 'server', httpStatusCode?: number };
+
export class ApiError extends Error {
public message: string;
public code: string;
@@ -6,7 +8,7 @@ export class ApiError extends Error {
public httpStatusCode?: number;
public info?: any;
- constructor(e?: { message: string, code: string, id: string, kind?: 'client' | 'server', httpStatusCode?: number }, info?: any) {
+ constructor(e?: E | null | undefined, info?: any | null | undefined) {
if (e == null) e = {
message: 'Internal error occurred. Please contact us if the error persists.',
code: 'INTERNAL_ERROR',
diff --git a/src/server/api/limiter.ts b/src/server/api/limiter.ts
index e29c061337..8a6c94458e 100644
--- a/src/server/api/limiter.ts
+++ b/src/server/api/limiter.ts
@@ -14,7 +14,7 @@ export default (endpoint: IEndpoint, user: User) => new Promise((ok, reject) =>
return;
}
- const limitation = endpoint.meta.limit;
+ const limitation = endpoint.meta.limit!;
const key = limitation.hasOwnProperty('key')
? limitation.key
@@ -41,7 +41,7 @@ export default (endpoint: IEndpoint, user: User) => new Promise((ok, reject) =>
id: `${user.id}:${key}:min`,
duration: limitation.minInterval,
max: 1,
- db: limiterDB
+ db: limiterDB!
});
minIntervalLimiter.get((err, info) => {
@@ -69,7 +69,7 @@ export default (endpoint: IEndpoint, user: User) => new Promise((ok, reject) =>
id: `${user.id}:${key}`,
duration: limitation.duration,
max: limitation.max,
- db: limiterDB
+ db: limiterDB!
});
limiter.get((err, info) => {
diff --git a/src/server/api/private/signin.ts b/src/server/api/private/signin.ts
index fe2e5577c2..676546f2aa 100644
--- a/src/server/api/private/signin.ts
+++ b/src/server/api/private/signin.ts
@@ -7,6 +7,7 @@ import config from '../../../config';
import { Users, Signins, UserProfiles } from '../../../models';
import { ILocalUser } from '../../../models/entities/user';
import { genId } from '../../../misc/gen-id';
+import { ensure } from '../../../prelude/ensure';
export default async (ctx: Koa.BaseContext) => {
ctx.set('Access-Control-Allow-Origin', config.url);
@@ -45,10 +46,10 @@ export default async (ctx: Koa.BaseContext) => {
return;
}
- const profile = await UserProfiles.findOne({ userId: user.id });
+ const profile = await UserProfiles.findOne({ userId: user.id }).then(ensure);
// Compare password
- const same = await bcrypt.compare(password, profile.password);
+ const same = await bcrypt.compare(password, profile.password!);
if (same) {
if (profile.twoFactorEnabled) {
diff --git a/src/server/api/private/signup.ts b/src/server/api/private/signup.ts
index 03d83efd94..ea4df060f8 100644
--- a/src/server/api/private/signup.ts
+++ b/src/server/api/private/signup.ts
@@ -21,7 +21,7 @@ export default async (ctx: Koa.BaseContext) => {
// Verify recaptcha
// ただしテスト時はこの機構は障害となるため無効にする
- if (process.env.NODE_ENV !== 'test' && instance.enableRecaptcha) {
+ if (process.env.NODE_ENV !== 'test' && instance.enableRecaptcha && instance.recaptchaSecretKey) {
recaptcha.init({
secret_key: instance.recaptchaSecretKey
});
@@ -100,7 +100,7 @@ export default async (ctx: Koa.BaseContext) => {
e ? j(e) : s([publicKey, privateKey])
));
- let account: User;
+ let account!: User;
// Start transaction
await getConnection().transaction(async transactionalEntityManager => {
diff --git a/src/server/api/service/discord.ts b/src/server/api/service/discord.ts
index 879b8b4849..b2561dee61 100644
--- a/src/server/api/service/discord.ts
+++ b/src/server/api/service/discord.ts
@@ -10,6 +10,7 @@ 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.BaseContext) {
return ((ctx.headers['cookie'] || '').match(/i=(!\w+)/) || [null, null])[1];
@@ -43,7 +44,7 @@ router.get('/disconnect/discord', async ctx => {
const user = await Users.findOne({
host: null,
token: userToken
- });
+ }).then(ensure);
await UserProfiles.update({
userId: user.id
@@ -71,8 +72,8 @@ async function getOAuth2() {
if (meta.enableDiscordIntegration) {
return new OAuth2(
- meta.discordClientId,
- meta.discordClientSecret,
+ meta.discordClientId!,
+ meta.discordClientSecret!,
'https://discordapp.com/',
'api/oauth2/authorize',
'api/oauth2/token');
@@ -82,6 +83,8 @@ async function getOAuth2() {
}
router.get('/connect/discord', async ctx => {
+ if (redis == null) return;
+
if (!compareOrigin(ctx)) {
ctx.throw(400, 'invalid origin');
return;
@@ -103,10 +106,12 @@ router.get('/connect/discord', async ctx => {
redis.set(userToken, JSON.stringify(params));
const oauth2 = await getOAuth2();
- ctx.redirect(oauth2.getAuthorizeUrl(params));
+ ctx.redirect(oauth2!.getAuthorizeUrl(params));
});
router.get('/signin/discord', async ctx => {
+ if (redis == null) return;
+
const sessid = uuid();
const params = {
@@ -129,10 +134,12 @@ router.get('/signin/discord', async ctx => {
redis.set(sessid, JSON.stringify(params));
const oauth2 = await getOAuth2();
- ctx.redirect(oauth2.getAuthorizeUrl(params));
+ ctx.redirect(oauth2!.getAuthorizeUrl(params));
});
router.get('/dc/cb', async ctx => {
+ if (redis == null) return;
+
const userToken = getUserToken(ctx);
const oauth2 = await getOAuth2();
@@ -153,7 +160,7 @@ router.get('/dc/cb', async ctx => {
}
const { redirect_uri, state } = await new Promise<any>((res, rej) => {
- redis.get(sessid, async (_, state) => {
+ redis!.get(sessid, async (_, state) => {
res(JSON.parse(state));
});
});
@@ -164,24 +171,22 @@ router.get('/dc/cb', async ctx => {
}
const { accessToken, refreshToken, expiresDate } = await new Promise<any>((res, rej) =>
- oauth2.getOAuthAccessToken(
- code,
- {
- grant_type: 'authorization_code',
- redirect_uri
- },
- (err, accessToken, refreshToken, result) => {
- if (err)
- rej(err);
- else if (result.error)
- rej(result.error);
- else
+ oauth2!.getOAuthAccessToken(code, {
+ grant_type: 'authorization_code',
+ redirect_uri
+ }, (err, accessToken, refreshToken, result) => {
+ if (err) {
+ rej(err);
+ } else if (result.error) {
+ rej(result.error);
+ } else {
res({
accessToken,
refreshToken,
expiresDate: Date.now() + Number(result.expires_in) * 1000
});
- }));
+ }
+ }));
const { id, username, discriminator } = await new Promise<any>((res, rej) =>
request({
@@ -191,10 +196,11 @@ router.get('/dc/cb', async ctx => {
'User-Agent': config.userAgent
}
}, (err, response, body) => {
- if (err)
+ if (err) {
rej(err);
- else
+ } else {
res(JSON.parse(body));
+ }
}));
if (!id || !username || !discriminator) {
@@ -235,7 +241,7 @@ router.get('/dc/cb', async ctx => {
}
const { redirect_uri, state } = await new Promise<any>((res, rej) => {
- redis.get(userToken, async (_, state) => {
+ redis!.get(userToken, async (_, state) => {
res(JSON.parse(state));
});
});
@@ -246,24 +252,22 @@ router.get('/dc/cb', async ctx => {
}
const { accessToken, refreshToken, expiresDate } = await new Promise<any>((res, rej) =>
- oauth2.getOAuthAccessToken(
- code,
- {
- grant_type: 'authorization_code',
- redirect_uri
- },
- (err, accessToken, refreshToken, result) => {
- if (err)
- rej(err);
- else if (result.error)
- rej(result.error);
- else
- res({
- accessToken,
- refreshToken,
- expiresDate: Date.now() + Number(result.expires_in) * 1000
- });
- }));
+ oauth2!.getOAuthAccessToken(code, {
+ grant_type: 'authorization_code',
+ redirect_uri
+ }, (err, accessToken, refreshToken, result) => {
+ if (err) {
+ rej(err);
+ } else if (result.error) {
+ rej(result.error);
+ } else {
+ res({
+ accessToken,
+ refreshToken,
+ expiresDate: Date.now() + Number(result.expires_in) * 1000
+ });
+ }
+ }));
const { id, username, discriminator } = await new Promise<any>((res, rej) =>
request({
@@ -273,10 +277,11 @@ router.get('/dc/cb', async ctx => {
'User-Agent': config.userAgent
}
}, (err, response, body) => {
- if (err)
+ if (err) {
rej(err);
- else
+ } else {
res(JSON.parse(body));
+ }
}));
if (!id || !username || !discriminator) {
@@ -287,7 +292,7 @@ router.get('/dc/cb', async ctx => {
const user = await Users.findOne({
host: null,
token: userToken
- });
+ }).then(ensure);
await UserProfiles.update({ userId: user.id }, {
discord: true,
diff --git a/src/server/api/service/github.ts b/src/server/api/service/github.ts
index 580947811b..4878d8c529 100644
--- a/src/server/api/service/github.ts
+++ b/src/server/api/service/github.ts
@@ -10,6 +10,7 @@ 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.BaseContext) {
return ((ctx.headers['cookie'] || '').match(/i=(!\w+)/) || [null, null])[1];
@@ -43,7 +44,7 @@ router.get('/disconnect/github', async ctx => {
const user = await Users.findOne({
host: null,
token: userToken
- });
+ }).then(ensure);
await UserProfiles.update({
userId: user.id
@@ -66,7 +67,7 @@ router.get('/disconnect/github', async ctx => {
async function getOath2() {
const meta = await fetchMeta();
- if (meta.enableGithubIntegration) {
+ if (meta.enableGithubIntegration && meta.githubClientId && meta.githubClientSecret) {
return new OAuth2(
meta.githubClientId,
meta.githubClientSecret,
@@ -79,6 +80,8 @@ async function getOath2() {
}
router.get('/connect/github', async ctx => {
+ if (redis == null) return;
+
if (!compareOrigin(ctx)) {
ctx.throw(400, 'invalid origin');
return;
@@ -99,10 +102,12 @@ router.get('/connect/github', async ctx => {
redis.set(userToken, JSON.stringify(params));
const oauth2 = await getOath2();
- ctx.redirect(oauth2.getAuthorizeUrl(params));
+ ctx.redirect(oauth2!.getAuthorizeUrl(params));
});
router.get('/signin/github', async ctx => {
+ if (redis == null) return;
+
const sessid = uuid();
const params = {
@@ -124,10 +129,12 @@ router.get('/signin/github', async ctx => {
redis.set(sessid, JSON.stringify(params));
const oauth2 = await getOath2();
- ctx.redirect(oauth2.getAuthorizeUrl(params));
+ ctx.redirect(oauth2!.getAuthorizeUrl(params));
});
router.get('/gh/cb', async ctx => {
+ if (redis == null) return;
+
const userToken = getUserToken(ctx);
const oauth2 = await getOath2();
@@ -148,7 +155,7 @@ router.get('/gh/cb', async ctx => {
}
const { redirect_uri, state } = await new Promise<any>((res, rej) => {
- redis.get(sessid, async (_, state) => {
+ redis!.get(sessid, async (_, state) => {
res(JSON.parse(state));
});
});
@@ -159,17 +166,17 @@ router.get('/gh/cb', async ctx => {
}
const { accessToken } = await new Promise<any>((res, rej) =>
- oauth2.getOAuthAccessToken(
- code,
- { redirect_uri },
- (err, accessToken, refresh, result) => {
- if (err)
- rej(err);
- else if (result.error)
- rej(result.error);
- else
- res({ accessToken });
- }));
+ oauth2!.getOAuthAccessToken(code, {
+ redirect_uri
+ }, (err, accessToken, refresh, result) => {
+ if (err) {
+ rej(err);
+ } else if (result.error) {
+ rej(result.error);
+ } else {
+ res({ accessToken });
+ }
+ }));
const { login, id } = await new Promise<any>((res, rej) =>
request({
@@ -215,7 +222,7 @@ router.get('/gh/cb', async ctx => {
}
const { redirect_uri, state } = await new Promise<any>((res, rej) => {
- redis.get(userToken, async (_, state) => {
+ redis!.get(userToken, async (_, state) => {
res(JSON.parse(state));
});
});
@@ -226,7 +233,7 @@ router.get('/gh/cb', async ctx => {
}
const { accessToken } = await new Promise<any>((res, rej) =>
- oauth2.getOAuthAccessToken(
+ oauth2!.getOAuthAccessToken(
code,
{ redirect_uri },
(err, accessToken, refresh, result) => {
@@ -261,7 +268,7 @@ router.get('/gh/cb', async ctx => {
const user = await Users.findOne({
host: null,
token: userToken
- });
+ }).then(ensure);
await UserProfiles.update({ userId: user.id }, {
github: true,
diff --git a/src/server/api/service/twitter.ts b/src/server/api/service/twitter.ts
index c0c762c6c3..b35ee8c479 100644
--- a/src/server/api/service/twitter.ts
+++ b/src/server/api/service/twitter.ts
@@ -9,6 +9,7 @@ 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.BaseContext) {
return ((ctx.headers['cookie'] || '').match(/i=(!\w+)/) || [null, null])[1];
@@ -42,7 +43,7 @@ router.get('/disconnect/twitter', async ctx => {
const user = await Users.findOne({
host: null,
token: userToken
- });
+ }).then(ensure);
await UserProfiles.update({
userId: user.id
@@ -66,7 +67,7 @@ router.get('/disconnect/twitter', async ctx => {
async function getTwAuth() {
const meta = await fetchMeta();
- if (meta.enableTwitterIntegration) {
+ if (meta.enableTwitterIntegration && meta.twitterConsumerKey && meta.twitterConsumerSecret) {
return autwh({
consumerKey: meta.twitterConsumerKey,
consumerSecret: meta.twitterConsumerSecret,
@@ -78,6 +79,8 @@ async function getTwAuth() {
}
router.get('/connect/twitter', async ctx => {
+ if (redis == null) return;
+
if (!compareOrigin(ctx)) {
ctx.throw(400, 'invalid origin');
return;
@@ -90,14 +93,16 @@ router.get('/connect/twitter', async ctx => {
}
const twAuth = await getTwAuth();
- const twCtx = await twAuth.begin();
+ const twCtx = await twAuth!.begin();
redis.set(userToken, JSON.stringify(twCtx));
ctx.redirect(twCtx.url);
});
router.get('/signin/twitter', async ctx => {
+ if (redis == null) return;
+
const twAuth = await getTwAuth();
- const twCtx = await twAuth.begin();
+ const twCtx = await twAuth!.begin();
const sessid = uuid();
@@ -117,6 +122,8 @@ router.get('/signin/twitter', async ctx => {
});
router.get('/tw/cb', async ctx => {
+ if (redis == null) return;
+
const userToken = getUserToken(ctx);
const twAuth = await getTwAuth();
@@ -130,14 +137,14 @@ router.get('/tw/cb', async ctx => {
}
const get = new Promise<any>((res, rej) => {
- redis.get(sessid, async (_, twCtx) => {
+ redis!.get(sessid, async (_, twCtx) => {
res(twCtx);
});
});
const twCtx = await get;
- const result = await twAuth.done(JSON.parse(twCtx), ctx.query.oauth_verifier);
+ const result = await twAuth!.done(JSON.parse(twCtx), ctx.query.oauth_verifier);
const link = await UserProfiles.createQueryBuilder()
.where('twitter @> :twitter', {
@@ -163,19 +170,19 @@ router.get('/tw/cb', async ctx => {
}
const get = new Promise<any>((res, rej) => {
- redis.get(userToken, async (_, twCtx) => {
+ redis!.get(userToken, async (_, twCtx) => {
res(twCtx);
});
});
const twCtx = await get;
- const result = await twAuth.done(JSON.parse(twCtx), verifier);
+ const result = await twAuth!.done(JSON.parse(twCtx), verifier);
const user = await Users.findOne({
host: null,
token: userToken
- });
+ }).then(ensure);
await UserProfiles.update({ userId: user.id }, {
twitter: true,
diff --git a/src/server/api/stream/channels/admin.ts b/src/server/api/stream/channels/admin.ts
index e2eba10f78..1ff932d1dd 100644
--- a/src/server/api/stream/channels/admin.ts
+++ b/src/server/api/stream/channels/admin.ts
@@ -9,7 +9,7 @@ export default class extends Channel {
@autobind
public async init(params: any) {
// Subscribe admin stream
- this.subscriber.on(`adminStream:${this.user.id}`, data => {
+ this.subscriber.on(`adminStream:${this.user!.id}`, data => {
this.send(data);
});
}
diff --git a/src/server/api/stream/channels/drive.ts b/src/server/api/stream/channels/drive.ts
index 671aad4366..4112dd9b04 100644
--- a/src/server/api/stream/channels/drive.ts
+++ b/src/server/api/stream/channels/drive.ts
@@ -9,7 +9,7 @@ export default class extends Channel {
@autobind
public async init(params: any) {
// Subscribe drive stream
- this.subscriber.on(`driveStream:${this.user.id}`, data => {
+ this.subscriber.on(`driveStream:${this.user!.id}`, data => {
this.send(data);
});
}
diff --git a/src/server/api/stream/channels/games/reversi-game.ts b/src/server/api/stream/channels/games/reversi-game.ts
index 158f108c4e..d708eae9f7 100644
--- a/src/server/api/stream/channels/games/reversi-game.ts
+++ b/src/server/api/stream/channels/games/reversi-game.ts
@@ -12,7 +12,7 @@ export default class extends Channel {
public static shouldShare = false;
public static requireCredential = false;
- private gameId: ReversiGame['id'];
+ private gameId: ReversiGame['id'] | null = null;
@autobind
public async init(params: any) {
@@ -40,7 +40,10 @@ export default class extends Channel {
@autobind
private async updateSettings(key: string, value: any) {
- const game = await ReversiGames.findOne(this.gameId);
+ if (this.user == null) return;
+
+ const game = await ReversiGames.findOne(this.gameId!);
+ if (game == null) throw 'game not found';
if (game.isStarted) return;
if ((game.user1Id !== this.user.id) && (game.user2Id !== this.user.id)) return;
@@ -49,11 +52,11 @@ export default class extends Channel {
if (!['map', 'bw', 'isLlotheo', 'canPutEverywhere', 'loopedBoard'].includes(key)) return;
- await ReversiGames.update({ id: this.gameId }, {
+ await ReversiGames.update(this.gameId!, {
[key]: value
});
- publishReversiGameStream(this.gameId, 'updateSettings', {
+ publishReversiGameStream(this.gameId!, 'updateSettings', {
key: key,
value: value
});
@@ -61,7 +64,10 @@ export default class extends Channel {
@autobind
private async initForm(form: any) {
- const game = await ReversiGames.findOne(this.gameId);
+ if (this.user == null) return;
+
+ const game = await ReversiGames.findOne(this.gameId!);
+ if (game == null) throw 'game not found';
if (game.isStarted) return;
if ((game.user1Id !== this.user.id) && (game.user2Id !== this.user.id)) return;
@@ -72,9 +78,9 @@ export default class extends Channel {
form2: form
};
- await ReversiGames.update({ id: this.gameId }, set);
+ await ReversiGames.update(this.gameId!, set);
- publishReversiGameStream(this.gameId, 'initForm', {
+ publishReversiGameStream(this.gameId!, 'initForm', {
userId: this.user.id,
form
});
@@ -82,7 +88,10 @@ export default class extends Channel {
@autobind
private async updateForm(id: string, value: any) {
- const game = await ReversiGames.findOne({ id: this.gameId });
+ if (this.user == null) return;
+
+ const game = await ReversiGames.findOne(this.gameId!);
+ if (game == null) throw 'game not found';
if (game.isStarted) return;
if ((game.user1Id !== this.user.id) && (game.user2Id !== this.user.id)) return;
@@ -101,9 +110,9 @@ export default class extends Channel {
form1: form
};
- await ReversiGames.update({ id: this.gameId }, set);
+ await ReversiGames.update(this.gameId!, set);
- publishReversiGameStream(this.gameId, 'updateForm', {
+ publishReversiGameStream(this.gameId!, 'updateForm', {
userId: this.user.id,
id,
value
@@ -112,8 +121,10 @@ export default class extends Channel {
@autobind
private async message(message: any) {
+ if (this.user == null) return;
+
message.id = Math.random();
- publishReversiGameStream(this.gameId, 'message', {
+ publishReversiGameStream(this.gameId!, 'message', {
userId: this.user.id,
message
});
@@ -121,29 +132,32 @@ export default class extends Channel {
@autobind
private async accept(accept: boolean) {
- const game = await ReversiGames.findOne(this.gameId);
+ if (this.user == null) return;
+
+ const game = await ReversiGames.findOne(this.gameId!);
+ if (game == null) throw 'game not found';
if (game.isStarted) return;
let bothAccepted = false;
if (game.user1Id === this.user.id) {
- await ReversiGames.update({ id: this.gameId }, {
+ await ReversiGames.update(this.gameId!, {
user1Accepted: accept
});
- publishReversiGameStream(this.gameId, 'changeAccepts', {
+ publishReversiGameStream(this.gameId!, 'changeAccepts', {
user1: accept,
user2: game.user2Accepted
});
if (accept && game.user2Accepted) bothAccepted = true;
} else if (game.user2Id === this.user.id) {
- await ReversiGames.update({ id: this.gameId }, {
+ await ReversiGames.update(this.gameId!, {
user2Accepted: accept
});
- publishReversiGameStream(this.gameId, 'changeAccepts', {
+ publishReversiGameStream(this.gameId!, 'changeAccepts', {
user1: game.user1Accepted,
user2: accept
});
@@ -156,7 +170,7 @@ export default class extends Channel {
if (bothAccepted) {
// 3秒後、まだacceptされていたらゲーム開始
setTimeout(async () => {
- const freshGame = await ReversiGames.findOne(this.gameId);
+ const freshGame = await ReversiGames.findOne(this.gameId!);
if (freshGame == null || freshGame.isStarted || freshGame.isEnded) return;
if (!freshGame.user1Accepted || !freshGame.user2Accepted) return;
@@ -175,7 +189,7 @@ export default class extends Channel {
const map = freshGame.map != null ? freshGame.map : getRandomMap();
- await ReversiGames.update({ id: this.gameId }, {
+ await ReversiGames.update(this.gameId!, {
startedAt: new Date(),
isStarted: true,
black: bw,
@@ -199,22 +213,20 @@ export default class extends Channel {
winner = null;
}
- await ReversiGames.update({
- id: this.gameId
- }, {
+ await ReversiGames.update(this.gameId!, {
isEnded: true,
winnerId: winner
});
- publishReversiGameStream(this.gameId, 'ended', {
+ publishReversiGameStream(this.gameId!, 'ended', {
winnerId: winner,
- game: await ReversiGames.pack(this.gameId, this.user)
+ game: await ReversiGames.pack(this.gameId!, this.user)
});
}
//#endregion
- publishReversiGameStream(this.gameId, 'started',
- await ReversiGames.pack(this.gameId, this.user));
+ publishReversiGameStream(this.gameId!, 'started',
+ await ReversiGames.pack(this.gameId!, this.user));
}, 3000);
}
}
@@ -222,7 +234,10 @@ export default class extends Channel {
// 石を打つ
@autobind
private async set(pos: number) {
- const game = await ReversiGames.findOne(this.gameId);
+ if (this.user == null) return;
+
+ const game = await ReversiGames.findOne(this.gameId!);
+ if (game == null) throw 'game not found';
if (!game.isStarted) return;
if (game.isEnded) return;
@@ -267,30 +282,29 @@ export default class extends Channel {
game.logs.push(log);
- await ReversiGames.update({
- id: this.gameId
- }, {
+ await ReversiGames.update(this.gameId!, {
crc32,
isEnded: o.isEnded,
winnerId: winner,
logs: game.logs
});
- publishReversiGameStream(this.gameId, 'set', Object.assign(log, {
+ publishReversiGameStream(this.gameId!, 'set', Object.assign(log, {
next: o.turn
}));
if (o.isEnded) {
- publishReversiGameStream(this.gameId, 'ended', {
+ publishReversiGameStream(this.gameId!, 'ended', {
winnerId: winner,
- game: await ReversiGames.pack(this.gameId, this.user)
+ game: await ReversiGames.pack(this.gameId!, this.user)
});
}
}
@autobind
private async check(crc32: string) {
- const game = await ReversiGames.findOne(this.gameId);
+ const game = await ReversiGames.findOne(this.gameId!);
+ if (game == null) throw 'game not found';
if (!game.isStarted) return;
diff --git a/src/server/api/stream/channels/games/reversi.ts b/src/server/api/stream/channels/games/reversi.ts
index 0498e5e017..3db338386a 100644
--- a/src/server/api/stream/channels/games/reversi.ts
+++ b/src/server/api/stream/channels/games/reversi.ts
@@ -11,7 +11,7 @@ export default class extends Channel {
@autobind
public async init(params: any) {
// Subscribe reversi stream
- this.subscriber.on(`reversiStream:${this.user.id}`, data => {
+ this.subscriber.on(`reversiStream:${this.user!.id}`, data => {
this.send(data);
});
}
@@ -22,7 +22,7 @@ export default class extends Channel {
case 'ping':
if (body.id == null) return;
const matching = await ReversiMatchings.findOne({
- parentId: this.user.id,
+ parentId: this.user!.id,
childId: body.id
});
if (matching == null) return;
diff --git a/src/server/api/stream/channels/home-timeline.ts b/src/server/api/stream/channels/home-timeline.ts
index 2cece0947f..61960657b4 100644
--- a/src/server/api/stream/channels/home-timeline.ts
+++ b/src/server/api/stream/channels/home-timeline.ts
@@ -17,10 +17,10 @@ export default class extends Channel {
@autobind
private async onNote(note: any) {
// その投稿のユーザーをフォローしていなかったら弾く
- if (this.user.id !== note.userId && !this.following.includes(note.userId)) return;
+ if (this.user!.id !== note.userId && !this.following.includes(note.userId)) return;
if (['followers', 'specified'].includes(note.visibility)) {
- note = await Notes.pack(note.id, this.user, {
+ note = await Notes.pack(note.id, this.user!, {
detail: true
});
@@ -30,13 +30,13 @@ export default class extends Channel {
} else {
// リプライなら再pack
if (note.replyId != null) {
- note.reply = await Notes.pack(note.replyId, this.user, {
+ note.reply = await Notes.pack(note.replyId, this.user!, {
detail: true
});
}
// Renoteなら再pack
if (note.renoteId != null) {
- note.renote = await Notes.pack(note.renoteId, this.user, {
+ note.renote = await Notes.pack(note.renoteId, this.user!, {
detail: true
});
}
diff --git a/src/server/api/stream/channels/hybrid-timeline.ts b/src/server/api/stream/channels/hybrid-timeline.ts
index 30643aeda8..18e6aa8350 100644
--- a/src/server/api/stream/channels/hybrid-timeline.ts
+++ b/src/server/api/stream/channels/hybrid-timeline.ts
@@ -12,7 +12,7 @@ export default class extends Channel {
@autobind
public async init(params: any) {
const meta = await fetchMeta();
- if (meta.disableLocalTimeline && !this.user.isAdmin && !this.user.isModerator) return;
+ if (meta.disableLocalTimeline && !this.user!.isAdmin && !this.user!.isModerator) return;
// Subscribe events
this.subscriber.on('notesStream', this.onNote);
@@ -22,13 +22,13 @@ export default class extends Channel {
private async onNote(note: any) {
// 自分自身の投稿 または その投稿のユーザーをフォローしている または ローカルの投稿 の場合だけ
if (!(
- this.user.id === note.userId ||
+ this.user!.id === note.userId ||
this.following.includes(note.userId) ||
note.user.host == null
)) return;
if (['followers', 'specified'].includes(note.visibility)) {
- note = await Notes.pack(note.id, this.user, {
+ note = await Notes.pack(note.id, this.user!, {
detail: true
});
@@ -38,13 +38,13 @@ export default class extends Channel {
} else {
// リプライなら再pack
if (note.replyId != null) {
- note.reply = await Notes.pack(note.replyId, this.user, {
+ note.reply = await Notes.pack(note.replyId, this.user!, {
detail: true
});
}
// Renoteなら再pack
if (note.renoteId != null) {
- note.renote = await Notes.pack(note.renoteId, this.user, {
+ note.renote = await Notes.pack(note.renoteId, this.user!, {
detail: true
});
}
diff --git a/src/server/api/stream/channels/main.ts b/src/server/api/stream/channels/main.ts
index 0d9bf3149d..1100f87acb 100644
--- a/src/server/api/stream/channels/main.ts
+++ b/src/server/api/stream/channels/main.ts
@@ -9,10 +9,10 @@ export default class extends Channel {
@autobind
public async init(params: any) {
- const mute = await Mutings.find({ muterId: this.user.id });
+ const mute = await Mutings.find({ muterId: this.user!.id });
// Subscribe main stream channel
- this.subscriber.on(`mainStream:${this.user.id}`, async data => {
+ this.subscriber.on(`mainStream:${this.user!.id}`, async data => {
const { type, body } = data;
switch (type) {
diff --git a/src/server/api/stream/channels/messaging-index.ts b/src/server/api/stream/channels/messaging-index.ts
index 648badc1dc..0c495398ab 100644
--- a/src/server/api/stream/channels/messaging-index.ts
+++ b/src/server/api/stream/channels/messaging-index.ts
@@ -9,7 +9,7 @@ export default class extends Channel {
@autobind
public async init(params: any) {
// Subscribe messaging index stream
- this.subscriber.on(`messagingIndexStream:${this.user.id}`, data => {
+ this.subscriber.on(`messagingIndexStream:${this.user!.id}`, data => {
this.send(data);
});
}
diff --git a/src/server/api/stream/channels/messaging.ts b/src/server/api/stream/channels/messaging.ts
index b81fbb9d4c..8397f849ff 100644
--- a/src/server/api/stream/channels/messaging.ts
+++ b/src/server/api/stream/channels/messaging.ts
@@ -14,7 +14,7 @@ export default class extends Channel {
this.otherpartyId = params.otherparty as string;
// Subscribe messaging stream
- this.subscriber.on(`messagingStream:${this.user.id}-${this.otherpartyId}`, data => {
+ this.subscriber.on(`messagingStream:${this.user!.id}-${this.otherpartyId}`, data => {
this.send(data);
});
}
@@ -23,7 +23,7 @@ export default class extends Channel {
public onMessage(type: string, body: any) {
switch (type) {
case 'read':
- read(this.user.id, this.otherpartyId, body.id);
+ read(this.user!.id, this.otherpartyId, body.id);
break;
}
}
diff --git a/src/server/api/stream/index.ts b/src/server/api/stream/index.ts
index abbd91ec81..f73f3229d5 100644
--- a/src/server/api/stream/index.ts
+++ b/src/server/api/stream/index.ts
@@ -28,13 +28,13 @@ export default class Connection {
constructor(
wsConnection: websocket.connection,
subscriber: EventEmitter,
- user: User,
- app: App
+ user: User | null | undefined,
+ app: App | null | undefined
) {
this.wsConnection = wsConnection;
- this.user = user;
- this.app = app;
this.subscriber = subscriber;
+ if (user) this.user = user;
+ if (app) this.app = app;
this.wsConnection.on('message', this.onWsConnectionMessage);
@@ -52,6 +52,8 @@ export default class Connection {
*/
@autobind
private async onWsConnectionMessage(data: websocket.IMessage) {
+ if (data.utf8Data == null) return;
+
const { type, body } = JSON.parse(data.utf8Data);
switch (type) {
@@ -89,7 +91,7 @@ export default class Connection {
@autobind
private onReadNotification(payload: any) {
if (!payload.id) return;
- readNotification(this.user.id, [payload.id]);
+ readNotification(this.user!.id, [payload.id]);
}
/**
@@ -109,7 +111,7 @@ export default class Connection {
this.subscriber.on(`noteStream:${payload.id}`, this.onNoteStreamMessage);
}
- if (payload.read) {
+ if (payload.read && this.user) {
readNote(this.user.id, payload.id);
}
}
@@ -221,7 +223,7 @@ export default class Connection {
private async updateFollowing() {
const followings = await Followings.find({
where: {
- followerId: this.user.id
+ followerId: this.user!.id
},
select: ['followeeId']
});
@@ -233,7 +235,7 @@ export default class Connection {
private async updateMuting() {
const mutings = await Mutings.find({
where: {
- muterId: this.user.id
+ muterId: this.user!.id
},
select: ['muteeId']
});
@@ -247,7 +249,7 @@ export default class Connection {
@autobind
public dispose() {
for (const c of this.channels.filter(c => c.dispose)) {
- c.dispose();
+ if (c.dispose) c.dispose();
}
if (this.followingClock) clearInterval(this.followingClock);
diff --git a/src/server/file/send-drive-file.ts b/src/server/file/send-drive-file.ts
index f9b067b79c..5da3d79eb5 100644
--- a/src/server/file/send-drive-file.ts
+++ b/src/server/file/send-drive-file.ts
@@ -50,7 +50,7 @@ export default async function(ctx: Koa.BaseContext) {
ctx.set('Content-Disposition', contentDisposition('attachment', `${file.name}`));
}
- const readable = InternalStorage.read(file.accessKey);
+ const readable = InternalStorage.read(file.accessKey!);
readable.on('error', commonReadableHandlerGenerator(ctx));
ctx.set('Content-Type', file.type);
ctx.body = readable;
diff --git a/src/server/index.ts b/src/server/index.ts
index 9c153f0167..601e288f3b 100644
--- a/src/server/index.ts
+++ b/src/server/index.ts
@@ -32,7 +32,7 @@ export const serverLogger = new Logger('server', 'gray', false);
const app = new Koa();
app.proxy = true;
-if (!['production', 'test'].includes(process.env.NODE_ENV)) {
+if (!['production', 'test'].includes(process.env.NODE_ENV || '')) {
// Logger
app.use(koaLogger(str => {
serverLogger.info(str);
diff --git a/src/server/web/docs.ts b/src/server/web/docs.ts
index d9ba14a8ed..374dbf3bd2 100644
--- a/src/server/web/docs.ts
+++ b/src/server/web/docs.ts
@@ -34,14 +34,14 @@ async function genVars(lang: string): Promise<{ [key: string]: any }> {
const docs = glob.sync(`src/docs/**/*.${lang}.md`, { cwd });
vars['docs'] = {};
for (const x of docs) {
- const [, name] = x.match(/docs\/(.+?)\.(.+?)\.md$/);
+ const [, name] = x.match(/docs\/(.+?)\.(.+?)\.md$/)!;
if (vars['docs'][name] == null) {
vars['docs'][name] = {
name,
title: {}
};
}
- vars['docs'][name]['title'][lang] = fs.readFileSync(cwd + x, 'utf-8').match(/^# (.+?)\r?\n/)[1];
+ vars['docs'][name]['title'][lang] = fs.readFileSync(cwd + x, 'utf-8').match(/^# (.+?)\r?\n/)![1];
}
vars['kebab'] = (string: string) => string.replace(/([a-z])([A-Z])/g, '$1-$2').replace(/\s+/g, '-').toLowerCase();
@@ -97,7 +97,7 @@ router.get('/*/*', async ctx => {
await ctx.render('../../../../src/docs/article', Object.assign({
id: doc,
html: conv.makeHtml(md),
- title: md.match(/^# (.+?)\r?\n/)[1],
+ title: md.match(/^# (.+?)\r?\n/)![1],
src: `https://github.com/syuilo/misskey/tree/master/src/docs/${doc}.${lang}.md`
}, await genVars(lang)));
diff --git a/src/server/web/feed.ts b/src/server/web/feed.ts
index 94f0643f75..285c20fcdb 100644
--- a/src/server/web/feed.ts
+++ b/src/server/web/feed.ts
@@ -3,6 +3,7 @@ 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: Author = {
@@ -10,7 +11,7 @@ export default async function(user: User) {
name: user.name || user.username
};
- const profile = await UserProfiles.findOne({ userId: user.id });
+ const profile = await UserProfiles.findOne({ userId: user.id }).then(ensure);
const notes = await Notes.find({
where: {
@@ -47,9 +48,9 @@ export default async function(user: User) {
title: `New note by ${author.name}`,
link: `${config.url}/notes/${note.id}`,
date: note.createdAt,
- description: note.cw,
- content: note.text,
- image: file ? DriveFiles.getPublicUrl(file) : null
+ description: note.cw || undefined,
+ content: note.text || undefined,
+ image: file ? DriveFiles.getPublicUrl(file) : undefined
});
}
diff --git a/src/server/web/index.ts b/src/server/web/index.ts
index d1a15e3929..5cadf1b124 100644
--- a/src/server/web/index.ts
+++ b/src/server/web/index.ts
@@ -19,6 +19,7 @@ import config from '../../config';
import { Users, Notes, Emojis, UserProfiles } from '../../models';
import parseAcct from '../../misc/acct/parse';
import getNoteSummary from '../../misc/get-note-summary';
+import { ensure } from '../../prelude/ensure';
const client = `${__dirname}/../../client/`;
@@ -149,11 +150,9 @@ router.get('/@:user', async (ctx, next) => {
usernameLower: username.toLowerCase(),
host
});
- const profile = await UserProfiles.findOne({
- userId: user.id
- });
if (user != null) {
+ const profile = await UserProfiles.findOne(user.id).then(ensure);
const meta = await fetchMeta();
await ctx.render('user', {
user, profile,
diff --git a/src/server/web/url-preview.ts b/src/server/web/url-preview.ts
index aed475e6ff..7d0080b4d2 100644
--- a/src/server/web/url-preview.ts
+++ b/src/server/web/url-preview.ts
@@ -43,7 +43,7 @@ module.exports = async (ctx: Koa.BaseContext) => {
}
};
-function wrap(url: string): string {
+function wrap(url?: string): string | null {
return url != null
? url.match(/^https?:\/\//)
? `${config.url}/proxy/preview.jpg?${query({
diff --git a/src/server/well-known.ts b/src/server/well-known.ts
index 7c5684d2ce..d29b7a8888 100644
--- a/src/server/well-known.ts
+++ b/src/server/well-known.ts
@@ -54,9 +54,9 @@ router.get(webFingerPath, async ctx => {
const generateQuery = (resource: string) =>
resource.startsWith(`${config.url.toLowerCase()}/users/`) ?
- fromId(resource.split('/').pop()) :
+ fromId(resource.split('/').pop()!) :
fromAcct(parseAcct(
- resource.startsWith(`${config.url.toLowerCase()}/@`) ? resource.split('/').pop() :
+ resource.startsWith(`${config.url.toLowerCase()}/@`) ? resource.split('/').pop()! :
resource.startsWith('acct:') ? resource.slice('acct:'.length) :
resource));