summaryrefslogtreecommitdiff
path: root/packages/backend/src/server/api/authenticate.ts
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2022-03-25 16:27:41 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2022-03-25 16:27:41 +0900
commitac8c66f5abe5b585a5940e172993c8e28f44ad69 (patch)
treea08b863e070ab51e8896fc69cb857077162756a9 /packages/backend/src/server/api/authenticate.ts
parentrefactor (diff)
downloadsharkey-ac8c66f5abe5b585a5940e172993c8e28f44ad69.tar.gz
sharkey-ac8c66f5abe5b585a5940e172993c8e28f44ad69.tar.bz2
sharkey-ac8c66f5abe5b585a5940e172993c8e28f44ad69.zip
perf(server): refactor and performance improvements
Diffstat (limited to 'packages/backend/src/server/api/authenticate.ts')
-rw-r--r--packages/backend/src/server/api/authenticate.ts25
1 files changed, 15 insertions, 10 deletions
diff --git a/packages/backend/src/server/api/authenticate.ts b/packages/backend/src/server/api/authenticate.ts
index 7fdf14666e..8fb397ca5f 100644
--- a/packages/backend/src/server/api/authenticate.ts
+++ b/packages/backend/src/server/api/authenticate.ts
@@ -1,7 +1,12 @@
import isNativeToken from './common/is-native-token.js';
-import { User } from '@/models/entities/user.js';
+import { CacheableLocalUser, ILocalUser } from '@/models/entities/user.js';
import { Users, AccessTokens, Apps } from '@/models/index.js';
import { AccessToken } from '@/models/entities/access-token.js';
+import { Cache } from '@/misc/cache.js';
+import { App } from '@/models/entities/app.js';
+import { localUserByIdCache, localUserByNativeTokenCache } from '@/services/user-cache.js';
+
+const appCache = new Cache<App>(Infinity);
export class AuthenticationError extends Error {
constructor(message: string) {
@@ -10,15 +15,15 @@ export class AuthenticationError extends Error {
}
}
-export default async (token: string | null): Promise<[User | null | undefined, AccessToken | null | undefined]> => {
+export default async (token: string | null): Promise<[CacheableLocalUser | null | undefined, AccessToken | null | undefined]> => {
if (token == null) {
return [null, null];
}
if (isNativeToken(token)) {
- // Fetch user
- const user = await Users
- .findOne({ token });
+ // TODO: typeorm 3.0にしたら .then(x => x || null) は消せる
+ const user = await localUserByNativeTokenCache.fetch(token,
+ () => Users.findOne({ token }).then(x => x || null) as Promise<ILocalUser | null>);
if (user == null) {
throw new AuthenticationError('user not found');
@@ -42,14 +47,14 @@ export default async (token: string | null): Promise<[User | null | undefined, A
lastUsedAt: new Date(),
});
- const user = await Users
- .findOne({
+ const user = await localUserByIdCache.fetch(accessToken.userId,
+ () => Users.findOne({
id: accessToken.userId, // findOne(accessToken.userId) のように書かないのは後方互換性のため
- });
+ }) as Promise<ILocalUser>);
if (accessToken.appId) {
- const app = await Apps
- .findOneOrFail(accessToken.appId);
+ const app = await appCache.fetch(accessToken.appId,
+ () => Apps.findOneOrFail(accessToken.appId!));
return [user, {
id: accessToken.id,