diff options
| author | syuilo <Syuilotan@yahoo.co.jp> | 2022-03-25 16:27:41 +0900 |
|---|---|---|
| committer | syuilo <Syuilotan@yahoo.co.jp> | 2022-03-25 16:27:41 +0900 |
| commit | ac8c66f5abe5b585a5940e172993c8e28f44ad69 (patch) | |
| tree | a08b863e070ab51e8896fc69cb857077162756a9 /packages/backend/src/server/api/authenticate.ts | |
| parent | refactor (diff) | |
| download | sharkey-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.ts | 25 |
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, |