Merge pull request #19547 from overleaf/jpa-move-v2-doc-versions

[overleaf-editor-core] keep v2DocVersions in-sync with fileMap

GitOrigin-RevId: 23491dfe51b71561837c96b8c550f75b0835a176
This commit is contained in:
Jakob Ackermann 2024-08-01 12:45:22 +02:00 committed by Copybot
parent a39ce05a09
commit e43491a04f
3 changed files with 40 additions and 0 deletions

View file

@ -133,6 +133,7 @@ class Snapshot {
*/ */
moveFile(pathname, newPathname) { moveFile(pathname, newPathname) {
this.fileMap.moveFile(pathname, newPathname) this.fileMap.moveFile(pathname, newPathname)
if (this.v2DocVersions) this.v2DocVersions.moveFile(pathname, newPathname)
} }
/** /**

View file

@ -50,6 +50,23 @@ class V2DocVersions {
_.assign(snapshot.v2DocVersions.data, this.data) _.assign(snapshot.v2DocVersions.data, this.data)
} }
} }
/**
* Move or remove a doc.
* Must be called after FileMap#moveFile, which validates the paths.
*/
moveFile(pathname, newPathname) {
for (const [id, v] of Object.entries(this.data)) {
if (v.pathname !== pathname) continue
if (newPathname === '') {
delete this.data[id]
} else {
v.pathname = newPathname
}
break
}
}
} }
module.exports = V2DocVersions module.exports = V2DocVersions

View file

@ -5,6 +5,9 @@ const ot = require('..')
const File = ot.File const File = ot.File
const MoveFileOperation = ot.MoveFileOperation const MoveFileOperation = ot.MoveFileOperation
const Snapshot = ot.Snapshot const Snapshot = ot.Snapshot
const Operation = ot.Operation
const V2DocVersions = ot.V2DocVersions
const TextOperation = ot.TextOperation
describe('MoveFileOperation', function () { describe('MoveFileOperation', function () {
function makeEmptySnapshot() { function makeEmptySnapshot() {
@ -39,4 +42,23 @@ describe('MoveFileOperation', function () {
expect(snapshot.getFile('a').getContent()).to.equal('test: foo') expect(snapshot.getFile('a').getContent()).to.equal('test: foo')
expect(snapshot.getFile('bar').getContent()).to.equal('test: bar') expect(snapshot.getFile('bar').getContent()).to.equal('test: bar')
}) })
it('should keep v2DocVersions in-sync', function () {
const snapshot = makeTwoFileSnapshot()
snapshot.setV2DocVersions(
V2DocVersions.fromRaw({
id1: { pathname: 'foo', v: 1 },
id2: { pathname: 'bar', v: 1 },
})
)
Operation.moveFile('foo', 'foo-after').applyTo(snapshot)
Operation.editFile(
'foo-after',
TextOperation.fromJSON({ textOperation: [9, 'edit'] })
).applyTo(snapshot)
Operation.removeFile('bar').applyTo(snapshot)
expect(snapshot.getV2DocVersions().toRaw()).to.deep.equal({
id1: { pathname: 'foo-after', v: 1 },
})
})
}) })