mirror of
https://github.com/hedgedoc/hedgedoc.git
synced 2024-12-22 16:11:34 +00:00
fix: save created revision on realtime note destroy
Signed-off-by: Tilman Vatteroth <git@tilmanvatteroth.de>
This commit is contained in:
parent
b3eb6e4339
commit
cf02c35b49
4 changed files with 84 additions and 4 deletions
|
@ -78,7 +78,7 @@ describe('RealtimeNoteService', () => {
|
|||
|
||||
revisionsService = Mock.of<RevisionsService>({
|
||||
getLatestRevision: jest.fn(),
|
||||
createRevision: jest.fn(),
|
||||
createAndSaveRevision: jest.fn(),
|
||||
});
|
||||
|
||||
consoleLoggerService = Mock.of<ConsoleLoggerService>({
|
||||
|
@ -294,8 +294,8 @@ describe('RealtimeNoteService', () => {
|
|||
await realtimeNoteService.getOrCreateRealtimeNote(note);
|
||||
|
||||
const createRevisionSpy = jest
|
||||
.spyOn(revisionsService, 'createRevision')
|
||||
.mockImplementation(() => Promise.resolve(Mock.of<Revision>()));
|
||||
.spyOn(revisionsService, 'createAndSaveRevision')
|
||||
.mockResolvedValue();
|
||||
|
||||
realtimeNote.emit('beforeDestroy');
|
||||
expect(createRevisionSpy).toHaveBeenCalledWith(
|
||||
|
|
|
@ -44,7 +44,7 @@ export class RealtimeNoteService implements BeforeApplicationShutdown {
|
|||
*/
|
||||
public saveRealtimeNote(realtimeNote: RealtimeNote): void {
|
||||
this.revisionsService
|
||||
.createRevision(
|
||||
.createAndSaveRevision(
|
||||
realtimeNote.getNote(),
|
||||
realtimeNote.getRealtimeDoc().getCurrentContent(),
|
||||
realtimeNote.getRealtimeDoc().encodeStateAsUpdate(),
|
||||
|
|
|
@ -364,4 +364,50 @@ describe('RevisionsService', () => {
|
|||
expect(saveSpy).not.toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
|
||||
describe('createAndSaveRevision', () => {
|
||||
it('creates and saves a new revision', async () => {
|
||||
const newRevision = Mock.of<Revision>();
|
||||
const createRevisionSpy = jest
|
||||
.spyOn(service, 'createRevision')
|
||||
.mockResolvedValue(newRevision);
|
||||
const repoSaveSpy = jest
|
||||
.spyOn(revisionRepo, 'save')
|
||||
.mockResolvedValue(newRevision);
|
||||
|
||||
const note = Mock.of<Note>({});
|
||||
const newContent = 'MockContent';
|
||||
|
||||
const yjsState = [0, 1, 2, 3, 4, 5];
|
||||
|
||||
await service.createAndSaveRevision(note, newContent, yjsState);
|
||||
expect(createRevisionSpy).toHaveBeenCalledWith(
|
||||
note,
|
||||
newContent,
|
||||
yjsState,
|
||||
);
|
||||
expect(repoSaveSpy).toHaveBeenCalledWith(newRevision);
|
||||
});
|
||||
|
||||
it("doesn't save if no revision has been created", async () => {
|
||||
const createRevisionSpy = jest
|
||||
.spyOn(service, 'createRevision')
|
||||
.mockResolvedValue(undefined);
|
||||
const repoSaveSpy = jest
|
||||
.spyOn(revisionRepo, 'save')
|
||||
.mockRejectedValue(new Error("shouldn't have been called"));
|
||||
|
||||
const note = Mock.of<Note>({});
|
||||
const newContent = 'MockContent';
|
||||
const yjsState = [0, 1, 2, 3, 4, 5];
|
||||
|
||||
await service.createAndSaveRevision(note, newContent, yjsState);
|
||||
expect(createRevisionSpy).toHaveBeenCalledWith(
|
||||
note,
|
||||
newContent,
|
||||
yjsState,
|
||||
);
|
||||
expect(repoSaveSpy).not.toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
@ -150,6 +150,17 @@ export class RevisionsService {
|
|||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates (but does not persist(!)) a new {@link Revision} for the given {@link Note}.
|
||||
* Useful if the revision is saved together with the note in one action.
|
||||
*
|
||||
* @async
|
||||
* @param note The note for which the revision should be created
|
||||
* @param newContent The new note content
|
||||
* @param yjsStateVector The yjs state vector that describes the new content
|
||||
* @return {Revision} the created revision
|
||||
* @return {undefined} if the revision couldn't be created because e.g. the content hasn't changed
|
||||
*/
|
||||
async createRevision(
|
||||
note: Note,
|
||||
newContent: string,
|
||||
|
@ -185,4 +196,27 @@ export class RevisionsService {
|
|||
tagEntities,
|
||||
) as Revision;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates and saves a new {@link Revision} for the given {@link Note}.
|
||||
*
|
||||
* @async
|
||||
* @param note The note for which the revision should be created
|
||||
* @param newContent The new note content
|
||||
* @param yjsStateVector The yjs state vector that describes the new content
|
||||
*/
|
||||
async createAndSaveRevision(
|
||||
note: Note,
|
||||
newContent: string,
|
||||
yjsStateVector?: number[],
|
||||
): Promise<void> {
|
||||
const revision = await this.createRevision(
|
||||
note,
|
||||
newContent,
|
||||
yjsStateVector,
|
||||
);
|
||||
if (revision) {
|
||||
await this.revisionRepository.save(revision);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue