mirror of
https://github.com/hedgedoc/hedgedoc.git
synced 2025-06-08 02:15:02 -04:00
Merge pull request #1986 from hedgedoc/fix/consistent_timestamps
This commit is contained in:
commit
9b856bf517
13 changed files with 36 additions and 36 deletions
|
@ -16,5 +16,5 @@ export class AuthTokenDto {
|
||||||
validUntil: Date;
|
validUntil: Date;
|
||||||
@IsDate()
|
@IsDate()
|
||||||
@IsOptional()
|
@IsOptional()
|
||||||
lastUsed: Date | null;
|
lastUsedAt: Date | null;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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(),
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -29,7 +29,7 @@ export class HistoryEntryDto {
|
||||||
*/
|
*/
|
||||||
@IsDate()
|
@IsDate()
|
||||||
@ApiProperty()
|
@ApiProperty()
|
||||||
lastVisited: Date;
|
lastVisitedAt: Date;
|
||||||
|
|
||||||
@IsArray()
|
@IsArray()
|
||||||
@IsString({ each: true })
|
@IsString({ each: true })
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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,
|
||||||
};
|
};
|
||||||
|
|
|
@ -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 () => {
|
||||||
|
|
|
@ -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 () => {
|
||||||
|
|
|
@ -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 () => {
|
||||||
|
|
|
@ -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());
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue