Merge pull request #1986 from hedgedoc/fix/consistent_timestamps

This commit is contained in:
Yannick Bungers 2022-01-16 23:05:13 +01:00 committed by GitHub
commit 9b856bf517
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
13 changed files with 36 additions and 36 deletions

View file

@ -16,5 +16,5 @@ export class AuthTokenDto {
validUntil: Date; validUntil: Date;
@IsDate() @IsDate()
@IsOptional() @IsOptional()
lastUsed: Date | null; lastUsedAt: Date | null;
} }

View file

@ -42,7 +42,7 @@ export class AuthToken {
nullable: true, nullable: true,
type: 'date', type: 'date',
}) })
lastUsed: Date | null; lastUsedAt: Date | null;
public static create( public static create(
keyId: string, keyId: string,
@ -57,7 +57,7 @@ export class AuthToken {
newToken.label = label; newToken.label = label;
newToken.accessTokenHash = accessToken; newToken.accessTokenHash = accessToken;
newToken.validUntil = validUntil; newToken.validUntil = validUntil;
newToken.lastUsed = null; newToken.lastUsedAt = null;
return newToken; return newToken;
} }
} }

View file

@ -143,14 +143,14 @@ describe('AuthService', () => {
jest.spyOn(authTokenRepo, 'findOne').mockResolvedValueOnce({ jest.spyOn(authTokenRepo, 'findOne').mockResolvedValueOnce({
...authToken, ...authToken,
user: Promise.resolve(user), user: Promise.resolve(user),
lastUsed: new Date(1549312452000), lastUsedAt: new Date(1549312452000),
}); });
jest jest
.spyOn(authTokenRepo, 'save') .spyOn(authTokenRepo, 'save')
.mockImplementationOnce( .mockImplementationOnce(
async (authTokenSaved, _): Promise<AuthToken> => { async (authTokenSaved, _): Promise<AuthToken> => {
expect(authTokenSaved.keyId).toEqual(authToken.keyId); expect(authTokenSaved.keyId).toEqual(authToken.keyId);
expect(authTokenSaved.lastUsed).not.toEqual(1549312452000); expect(authTokenSaved.lastUsedAt).not.toEqual(1549312452000);
return authToken; return authToken;
}, },
); );
@ -242,7 +242,7 @@ describe('AuthService', () => {
.spyOn(authTokenRepo, 'save') .spyOn(authTokenRepo, 'save')
.mockImplementationOnce( .mockImplementationOnce(
async (authTokenSaved: AuthToken, _): Promise<AuthToken> => { async (authTokenSaved: AuthToken, _): Promise<AuthToken> => {
expect(authTokenSaved.lastUsed).toBeNull(); expect(authTokenSaved.lastUsedAt).toBeNull();
return authTokenSaved; return authTokenSaved;
}, },
); );
@ -252,7 +252,7 @@ describe('AuthService', () => {
token.validUntil.getTime() - token.validUntil.getTime() -
(new Date().getTime() + 2 * 365 * 24 * 60 * 60 * 1000), (new Date().getTime() + 2 * 365 * 24 * 60 * 60 * 1000),
).toBeLessThanOrEqual(10000); ).toBeLessThanOrEqual(10000);
expect(token.lastUsed).toBeNull(); expect(token.lastUsedAt).toBeNull();
expect(token.secret.startsWith(token.keyId)).toBeTruthy(); expect(token.secret.startsWith(token.keyId)).toBeTruthy();
}); });
it('with validUntil not 0', async () => { it('with validUntil not 0', async () => {
@ -261,7 +261,7 @@ describe('AuthService', () => {
.spyOn(authTokenRepo, 'save') .spyOn(authTokenRepo, 'save')
.mockImplementationOnce( .mockImplementationOnce(
async (authTokenSaved: AuthToken, _): Promise<AuthToken> => { async (authTokenSaved: AuthToken, _): Promise<AuthToken> => {
expect(authTokenSaved.lastUsed).toBeNull(); expect(authTokenSaved.lastUsedAt).toBeNull();
return authTokenSaved; return authTokenSaved;
}, },
); );
@ -273,7 +273,7 @@ describe('AuthService', () => {
); );
expect(token.label).toEqual(identifier); expect(token.label).toEqual(identifier);
expect(token.validUntil.getTime()).toEqual(validUntil); expect(token.validUntil.getTime()).toEqual(validUntil);
expect(token.lastUsed).toBeNull(); expect(token.lastUsedAt).toBeNull();
expect(token.secret.startsWith(token.keyId)).toBeTruthy(); expect(token.secret.startsWith(token.keyId)).toBeTruthy();
}); });
}); });
@ -290,7 +290,7 @@ describe('AuthService', () => {
authToken.validUntil = new Date(); authToken.validUntil = new Date();
const tokenDto = service.toAuthTokenDto(authToken); const tokenDto = service.toAuthTokenDto(authToken);
expect(tokenDto.keyId).toEqual(authToken.keyId); expect(tokenDto.keyId).toEqual(authToken.keyId);
expect(tokenDto.lastUsed).toBeNull(); expect(tokenDto.lastUsedAt).toBeNull();
expect(tokenDto.label).toEqual(authToken.label); expect(tokenDto.label).toEqual(authToken.label);
expect(tokenDto.validUntil.getTime()).toEqual( expect(tokenDto.validUntil.getTime()).toEqual(
authToken.validUntil.getTime(), authToken.validUntil.getTime(),

View file

@ -108,7 +108,7 @@ export class AuthService {
if (accessToken === undefined) { if (accessToken === undefined) {
throw new NotInDBError(`AuthToken for key '${keyId}' not found`); throw new NotInDBError(`AuthToken for key '${keyId}' not found`);
} }
accessToken.lastUsed = new Date(); accessToken.lastUsedAt = new Date();
await this.authTokenRepository.save(accessToken); await this.authTokenRepository.save(accessToken);
} }
@ -175,11 +175,11 @@ export class AuthService {
keyId: authToken.keyId, keyId: authToken.keyId,
createdAt: authToken.createdAt, createdAt: authToken.createdAt,
validUntil: authToken.validUntil, validUntil: authToken.validUntil,
lastUsed: null, lastUsedAt: null,
}; };
if (authToken.lastUsed) { if (authToken.lastUsedAt) {
tokenDto.lastUsed = new Date(authToken.lastUsed); tokenDto.lastUsedAt = new Date(authToken.lastUsedAt);
} }
return tokenDto; return tokenDto;

View file

@ -29,7 +29,7 @@ export class HistoryEntryDto {
*/ */
@IsDate() @IsDate()
@ApiProperty() @ApiProperty()
lastVisited: Date; lastVisitedAt: Date;
@IsArray() @IsArray()
@IsString({ each: true }) @IsString({ each: true })

View file

@ -189,7 +189,7 @@ export class HistoryService {
async toHistoryEntryDto(entry: HistoryEntry): Promise<HistoryEntryDto> { async toHistoryEntryDto(entry: HistoryEntry): Promise<HistoryEntryDto> {
return { return {
identifier: await getIdentifier(entry), identifier: await getIdentifier(entry),
lastVisited: entry.updatedAt, lastVisitedAt: entry.updatedAt,
tags: await this.notesService.toTagList(entry.note), tags: await this.notesService.toTagList(entry.note),
title: entry.note.title ?? '', title: entry.note.title ?? '',
pinStatus: entry.pinStatus, pinStatus: entry.pinStatus,

View file

@ -72,7 +72,7 @@ export class NoteMetadataDto {
*/ */
@IsDate() @IsDate()
@ApiProperty() @ApiProperty()
updateTime: Date; updatedAt: Date;
/** /**
* User that last edited the note * User that last edited the note
@ -96,7 +96,7 @@ export class NoteMetadataDto {
*/ */
@IsDate() @IsDate()
@ApiProperty() @ApiProperty()
createTime: Date; createdAt: Date;
/** /**
* List of usernames that edited the note * List of usernames that edited the note

View file

@ -773,7 +773,7 @@ describe('NotesService', () => {
expect(metadataDto.aliases).toHaveLength(1); expect(metadataDto.aliases).toHaveLength(1);
expect(metadataDto.aliases[0]).toEqual((await note.aliases)[0].name); expect(metadataDto.aliases[0]).toEqual((await note.aliases)[0].name);
expect(metadataDto.title).toEqual(note.title); expect(metadataDto.title).toEqual(note.title);
expect(metadataDto.createTime).toEqual(revisions[0].createdAt); expect(metadataDto.createdAt).toEqual(revisions[0].createdAt);
expect(metadataDto.description).toEqual(note.description); expect(metadataDto.description).toEqual(note.description);
expect(metadataDto.editedBy).toHaveLength(1); expect(metadataDto.editedBy).toHaveLength(1);
expect(metadataDto.editedBy[0]).toEqual(user.username); expect(metadataDto.editedBy[0]).toEqual(user.username);
@ -790,7 +790,7 @@ describe('NotesService', () => {
expect(metadataDto.permissions.sharedToGroups[0].canEdit).toEqual(true); expect(metadataDto.permissions.sharedToGroups[0].canEdit).toEqual(true);
expect(metadataDto.tags).toHaveLength(1); expect(metadataDto.tags).toHaveLength(1);
expect(metadataDto.tags[0]).toEqual((await note.tags)[0].name); expect(metadataDto.tags[0]).toEqual((await note.tags)[0].name);
expect(metadataDto.updateTime).toEqual(revisions[0].createdAt); expect(metadataDto.updatedAt).toEqual(revisions[0].createdAt);
expect(metadataDto.updateUser.username).toEqual(user.username); expect(metadataDto.updateUser.username).toEqual(user.username);
expect(metadataDto.viewCount).toEqual(note.viewCount); expect(metadataDto.viewCount).toEqual(note.viewCount);
}); });
@ -875,7 +875,7 @@ describe('NotesService', () => {
expect(noteDto.metadata.aliases).toHaveLength(1); expect(noteDto.metadata.aliases).toHaveLength(1);
expect(noteDto.metadata.aliases[0]).toEqual((await note.aliases)[0].name); expect(noteDto.metadata.aliases[0]).toEqual((await note.aliases)[0].name);
expect(noteDto.metadata.title).toEqual(note.title); expect(noteDto.metadata.title).toEqual(note.title);
expect(noteDto.metadata.createTime).toEqual(revisions[0].createdAt); expect(noteDto.metadata.createdAt).toEqual(revisions[0].createdAt);
expect(noteDto.metadata.description).toEqual(note.description); expect(noteDto.metadata.description).toEqual(note.description);
expect(noteDto.metadata.editedBy).toHaveLength(1); expect(noteDto.metadata.editedBy).toHaveLength(1);
expect(noteDto.metadata.editedBy[0]).toEqual(user.username); expect(noteDto.metadata.editedBy[0]).toEqual(user.username);
@ -898,7 +898,7 @@ describe('NotesService', () => {
); );
expect(noteDto.metadata.tags).toHaveLength(1); expect(noteDto.metadata.tags).toHaveLength(1);
expect(noteDto.metadata.tags[0]).toEqual((await note.tags)[0].name); expect(noteDto.metadata.tags[0]).toEqual((await note.tags)[0].name);
expect(noteDto.metadata.updateTime).toEqual(revisions[0].createdAt); expect(noteDto.metadata.updatedAt).toEqual(revisions[0].createdAt);
expect(noteDto.metadata.updateUser.username).toEqual(user.username); expect(noteDto.metadata.updateUser.username).toEqual(user.username);
expect(noteDto.metadata.viewCount).toEqual(note.viewCount); expect(noteDto.metadata.viewCount).toEqual(note.viewCount);
expect(noteDto.content).toEqual(content); expect(noteDto.content).toEqual(content);

View file

@ -400,12 +400,12 @@ export class NotesService {
), ),
primaryAlias: (await getPrimaryAlias(note)) ?? null, primaryAlias: (await getPrimaryAlias(note)) ?? null,
title: note.title ?? '', title: note.title ?? '',
createTime: (await this.getFirstRevision(note)).createdAt, createdAt: (await this.getFirstRevision(note)).createdAt,
description: note.description ?? '', description: note.description ?? '',
editedBy: (await this.getAuthorUsers(note)).map((user) => user.username), editedBy: (await this.getAuthorUsers(note)).map((user) => user.username),
permissions: await this.toNotePermissionsDto(note), permissions: await this.toNotePermissionsDto(note),
tags: await this.toTagList(note), tags: await this.toTagList(note),
updateTime: (await this.getLatestRevision(note)).createdAt, updatedAt: (await this.getLatestRevision(note)).createdAt,
updateUser: updateUser ? this.usersService.toUserDto(updateUser) : null, updateUser: updateUser ? this.usersService.toUserDto(updateUser) : null,
viewCount: note.viewCount, viewCount: note.viewCount,
}; };

View file

@ -79,8 +79,8 @@ describe('History', () => {
expect(response.body[0].title).toEqual(entryDto.title); expect(response.body[0].title).toEqual(entryDto.title);
expect(response.body[0].tags).toEqual(entryDto.tags); expect(response.body[0].tags).toEqual(entryDto.tags);
expect(response.body[0].pinStatus).toEqual(entryDto.pinStatus); expect(response.body[0].pinStatus).toEqual(entryDto.pinStatus);
expect(response.body[0].lastVisited).toEqual( expect(response.body[0].lastVisitedAt).toEqual(
entryDto.lastVisited.toISOString(), entryDto.lastVisitedAt.toISOString(),
); );
}); });
@ -218,7 +218,7 @@ describe('History', () => {
expect(userEntryDto.title).toEqual(entryDto.title); expect(userEntryDto.title).toEqual(entryDto.title);
expect(userEntryDto.tags).toEqual(entryDto.tags); expect(userEntryDto.tags).toEqual(entryDto.tags);
expect(userEntryDto.pinStatus).toEqual(entryDto.pinStatus); expect(userEntryDto.pinStatus).toEqual(entryDto.pinStatus);
expect(userEntryDto.lastVisited).toEqual(entryDto.lastVisited); expect(userEntryDto.lastVisitedAt).toEqual(entryDto.lastVisitedAt);
}); });
afterAll(async () => { afterAll(async () => {

View file

@ -47,7 +47,7 @@ describe('Tokens', () => {
keyId = response.body.keyId; keyId = response.body.keyId;
expect(response.body.label).toBe(tokenName); expect(response.body.label).toBe(tokenName);
expect(response.body.validUntil).toBe(null); expect(response.body.validUntil).toBe(null);
expect(response.body.lastUsed).toBe(null); expect(response.body.lastUsedAt).toBe(null);
expect(response.body.secret.length).toBe(98); expect(response.body.secret.length).toBe(98);
}); });
@ -59,7 +59,7 @@ describe('Tokens', () => {
.expect(200); .expect(200);
expect(response.body[0].label).toBe(tokenName); expect(response.body[0].label).toBe(tokenName);
expect(response.body[0].validUntil).toBe(null); expect(response.body[0].validUntil).toBe(null);
expect(response.body[0].lastUsed).toBe(null); expect(response.body[0].lastUsedAt).toBe(null);
expect(response.body[0].secret).not.toBeDefined(); expect(response.body[0].secret).not.toBeDefined();
}); });
it(`DELETE /tokens/:keyid`, async () => { it(`DELETE /tokens/:keyid`, async () => {

View file

@ -59,8 +59,8 @@ describe('Me', () => {
expect(historyEntry.title).toEqual(historyDto.title); expect(historyEntry.title).toEqual(historyDto.title);
expect(historyEntry.tags).toEqual(historyDto.tags); expect(historyEntry.tags).toEqual(historyDto.tags);
expect(historyEntry.pinStatus).toEqual(historyDto.pinStatus); expect(historyEntry.pinStatus).toEqual(historyDto.pinStatus);
expect(historyEntry.lastVisited).toEqual( expect(historyEntry.lastVisitedAt).toEqual(
historyDto.lastVisited.toISOString(), historyDto.lastVisitedAt.toISOString(),
); );
} }
}); });
@ -83,8 +83,8 @@ describe('Me', () => {
expect(historyEntry.title).toEqual(historyEntryDto.title); expect(historyEntry.title).toEqual(historyEntryDto.title);
expect(historyEntry.tags).toEqual(historyEntryDto.tags); expect(historyEntry.tags).toEqual(historyEntryDto.tags);
expect(historyEntry.pinStatus).toEqual(historyEntryDto.pinStatus); expect(historyEntry.pinStatus).toEqual(historyEntryDto.pinStatus);
expect(historyEntry.lastVisited).toEqual( expect(historyEntry.lastVisitedAt).toEqual(
historyEntryDto.lastVisited.toISOString(), historyEntryDto.lastVisitedAt.toISOString(),
); );
}); });
it('fails with a non-existing note', async () => { it('fails with a non-existing note', async () => {

View file

@ -274,13 +274,13 @@ describe('Notes', () => {
expect(metadata.body.primaryAlias).toEqual('test5'); expect(metadata.body.primaryAlias).toEqual('test5');
expect(metadata.body.title).toEqual(''); expect(metadata.body.title).toEqual('');
expect(metadata.body.description).toEqual(''); expect(metadata.body.description).toEqual('');
expect(typeof metadata.body.createTime).toEqual('string'); expect(typeof metadata.body.createdAt).toEqual('string');
expect(metadata.body.editedBy).toEqual([]); expect(metadata.body.editedBy).toEqual([]);
expect(metadata.body.permissions.owner.username).toEqual('hardcoded'); expect(metadata.body.permissions.owner.username).toEqual('hardcoded');
expect(metadata.body.permissions.sharedToUsers).toEqual([]); expect(metadata.body.permissions.sharedToUsers).toEqual([]);
expect(metadata.body.permissions.sharedToUsers).toEqual([]); expect(metadata.body.permissions.sharedToUsers).toEqual([]);
expect(metadata.body.tags).toEqual([]); expect(metadata.body.tags).toEqual([]);
expect(typeof metadata.body.updateTime).toEqual('string'); expect(typeof metadata.body.updatedAt).toEqual('string');
expect(typeof metadata.body.updateUser.displayName).toEqual('string'); expect(typeof metadata.body.updateUser.displayName).toEqual('string');
expect(typeof metadata.body.updateUser.username).toEqual('string'); expect(typeof metadata.body.updateUser.username).toEqual('string');
expect(typeof metadata.body.updateUser.email).toEqual('string'); expect(typeof metadata.body.updateUser.email).toEqual('string');
@ -320,7 +320,7 @@ describe('Notes', () => {
const metadata = await request(testSetup.app.getHttpServer()) const metadata = await request(testSetup.app.getHttpServer())
.get('/api/v2/notes/test5a/metadata') .get('/api/v2/notes/test5a/metadata')
.expect(200); .expect(200);
expect(metadata.body.createTime).toEqual(createDate.toISOString()); expect(metadata.body.createdAt).toEqual(createDate.toISOString());
expect(metadata.body.updateTime).not.toEqual(createDate.toISOString()); expect(metadata.body.updateTime).not.toEqual(createDate.toISOString());
}); });
}); });