From 3539216cf3f30ce83ee2262312192ea39036768c Mon Sep 17 00:00:00 2001 From: David Mehren Date: Sun, 5 Dec 2021 22:03:41 +0100 Subject: [PATCH] refactor(user): lazy-load relations Signed-off-by: David Mehren --- src/auth/auth.service.spec.ts | 4 ++-- src/auth/auth.service.ts | 4 ++-- src/seed.ts | 2 +- src/users/user.entity.ts | 24 ++++++++++++------------ 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/auth/auth.service.spec.ts b/src/auth/auth.service.spec.ts index af0c2fd12..f4276744b 100644 --- a/src/auth/auth.service.spec.ts +++ b/src/auth/auth.service.spec.ts @@ -174,7 +174,7 @@ describe('AuthService', () => { .digest('hex'); jest.spyOn(userRepo, 'findOne').mockResolvedValueOnce({ ...user, - authTokens: [authToken], + authTokens: Promise.resolve([authToken]), }); jest.spyOn(authTokenRepo, 'findOne').mockResolvedValue({ ...authToken, @@ -191,7 +191,7 @@ describe('AuthService', () => { ); expect(userByToken).toEqual({ ...user, - authTokens: [authToken], + authTokens: Promise.resolve([authToken]), }); }); describe('fails:', () => { diff --git a/src/auth/auth.service.ts b/src/auth/auth.service.ts index 343fb45a4..430ea02db 100644 --- a/src/auth/auth.service.ts +++ b/src/auth/auth.service.ts @@ -58,9 +58,9 @@ export class AuthService { identifier: string, validUntil: TimestampMillis, ): Promise { - user.authTokens = await this.getTokensByUser(user); + user.authTokens = this.getTokensByUser(user); - if (user.authTokens.length >= 200) { + if ((await user.authTokens).length >= 200) { // This is a very high ceiling unlikely to hinder legitimate usage, // but should prevent possible attack vectors throw new TooManyTokensError( diff --git a/src/seed.ts b/src/seed.ts index 8931919c6..d601c378f 100644 --- a/src/seed.ts +++ b/src/seed.ts @@ -78,7 +78,7 @@ createConnection({ notes[i].revisions = Promise.all([revision]); notes[i].userPermissions = Promise.resolve([]); notes[i].groupPermissions = Promise.resolve([]); - user.ownedNotes = [notes[i]]; + user.ownedNotes = Promise.resolve([notes[i]]); await connection.manager.save([ notes[i], user, diff --git a/src/users/user.entity.ts b/src/users/user.entity.ts index e965d63fb..4500ce2c8 100644 --- a/src/users/user.entity.ts +++ b/src/users/user.entity.ts @@ -53,25 +53,25 @@ export class User { email: string | null; @OneToMany((_) => Note, (note) => note.owner) - ownedNotes: Note[]; + ownedNotes: Promise; @OneToMany((_) => AuthToken, (authToken) => authToken.user) - authTokens: AuthToken[]; + authTokens: Promise; @OneToMany((_) => Identity, (identity) => identity.user) identities: Promise; @ManyToMany((_) => Group, (group) => group.members) - groups: Group[]; + groups: Promise; @OneToMany((_) => HistoryEntry, (historyEntry) => historyEntry.user) - historyEntries: HistoryEntry[]; + historyEntries: Promise; @OneToMany((_) => MediaUpload, (mediaUpload) => mediaUpload.user) - mediaUploads: MediaUpload[]; + mediaUploads: Promise; @OneToMany(() => Author, (author) => author.user) - authors: Author[]; + authors: Promise; // eslint-disable-next-line @typescript-eslint/no-empty-function private constructor() {} @@ -85,13 +85,13 @@ export class User { newUser.displayName = displayName; newUser.photo = null; newUser.email = null; - newUser.ownedNotes = []; - newUser.authTokens = []; + newUser.ownedNotes = Promise.resolve([]); + newUser.authTokens = Promise.resolve([]); newUser.identities = Promise.resolve([]); - newUser.groups = []; - newUser.historyEntries = []; - newUser.mediaUploads = []; - newUser.authors = []; + newUser.groups = Promise.resolve([]); + newUser.historyEntries = Promise.resolve([]); + newUser.mediaUploads = Promise.resolve([]); + newUser.authors = Promise.resolve([]); return newUser; } }