@@ -111,65 +111,96 @@ function disconnectSocketOnNote (note) {
111111}
112112
113113function updateNote ( note , callback ) {
114- models . Note . findOne ( {
114+ _updateNoteAsync ( note ) . then ( _note => {
115+ callback ( null , _note )
116+ } ) . catch ( ( err ) => {
117+ logger . error ( err )
118+ return callback ( err , null )
119+ } )
120+ }
121+
122+ function findNoteByIdAsync ( id ) {
123+ return models . Note . findOne ( {
115124 where : {
116- id : note . id
125+ id : id
117126 }
118- } ) . then ( function ( _note ) {
119- if ( ! _note ) return callback ( null , null )
120- // update user note history
121- var tempUsers = Object . assign ( { } , note . tempUsers )
122- note . tempUsers = { }
123- Object . keys ( tempUsers ) . forEach ( function ( key ) {
124- updateHistory ( key , note , tempUsers [ key ] )
125- } )
126- if ( note . lastchangeuser ) {
127- if ( _note . lastchangeuserId !== note . lastchangeuser ) {
128- models . User . findOne ( {
129- where : {
130- id : note . lastchangeuser
131- }
132- } ) . then ( function ( user ) {
133- if ( ! user ) return callback ( null , null )
134- note . lastchangeuserprofile = models . User . getProfile ( user )
135- return finishUpdateNote ( note , _note , callback )
136- } ) . catch ( function ( err ) {
137- logger . error ( err )
138- return callback ( err , null )
139- } )
140- } else {
141- return finishUpdateNote ( note , _note , callback )
142- }
143- } else {
144- note . lastchangeuserprofile = null
145- return finishUpdateNote ( note , _note , callback )
127+ } )
128+ }
129+
130+ function updateHistoryForEveryUserCollaborateNote ( note ) {
131+ // update history to every user in this note
132+ const tempUsers = Object . assign ( { } , note . tempUsers )
133+ note . tempUsers = { }
134+ // update history should async function, but in there return values is not matter
135+ Object . keys ( tempUsers ) . forEach ( function ( key ) {
136+ exports . updateHistory ( key , note , tempUsers [ key ] )
137+ } )
138+ }
139+
140+ async function getUserProfileByIdAsync ( id ) {
141+ const user = await models . User . findOne ( {
142+ where : {
143+ id : id
146144 }
147- } ) . catch ( function ( err ) {
148- logger . error ( err )
149- return callback ( err , null )
150145 } )
146+ if ( ! user ) return null
147+ return models . User . getProfile ( user )
148+ }
149+
150+ class UserNotFoundException extends Error {
151+ constructor ( ) {
152+ super ( 'user not found' )
153+ this . name = this . constructor . name
154+ Error . captureStackTrace ( this , this . constructor )
155+ }
151156}
152157
153- function finishUpdateNote ( note , _note , callback ) {
154- if ( ! note || ! note . server ) return callback ( null , null )
155- var body = note . server . document
156- var title = note . title = models . Note . parseNoteTitle ( body )
157- var values = {
158+ async function getLastChangeUserProfileAsync ( currentLastChangeUserId , lastChangeUserIdInDatabase , lastChangeUserProfileInDatabase ) {
159+ if ( ! currentLastChangeUserId ) return null
160+ if ( currentLastChangeUserId === lastChangeUserIdInDatabase ) return lastChangeUserProfileInDatabase
161+ const profile = await getUserProfileByIdAsync ( currentLastChangeUserId )
162+ if ( ! profile ) {
163+ throw new UserNotFoundException ( )
164+ }
165+ return profile
166+ }
167+
168+ function buildNoteUpdateData ( note ) {
169+ const body = note . server . document
170+ const title = note . title = models . Note . parseNoteTitle ( body )
171+ return {
158172 title : title ,
159173 content : body ,
160174 authorship : note . authorship ,
161175 lastchangeuserId : note . lastchangeuser ,
162176 lastchangeAt : Date . now ( )
163177 }
164- _note . update ( values ) . then ( function ( _note ) {
165- saveRevisionJob . setSaverSleep ( false )
166- return callback ( null , _note )
167- } ) . catch ( function ( err ) {
168- logger . error ( err )
169- return callback ( err , null )
170- } )
171178}
172179
180+ async function _updateNoteAsync ( note ) {
181+ let noteModel = await findNoteByIdAsync ( note . id )
182+ if ( ! noteModel ) return null
183+
184+ updateHistoryForEveryUserCollaborateNote ( note )
185+
186+ try {
187+ note . lastchangeuserprofile = await getLastChangeUserProfileAsync (
188+ note . lastchangeuser ,
189+ noteModel . lastchangeuserId ,
190+ noteModel . lastchangeuserprofile
191+ )
192+ } catch ( err ) {
193+ if ( err instanceof UserNotFoundException ) {
194+ return null
195+ }
196+ throw err
197+ }
198+
199+ if ( ! note || ! note . server ) return null
200+ noteModel = await noteModel . update ( buildNoteUpdateData ( note ) )
201+ saveRevisionJob . setSaverSleep ( false )
202+ return noteModel
203+ }
173204
174205function getStatus ( callback ) {
175206 models . Note . count ( ) . then ( function ( notecount ) {
@@ -776,7 +807,6 @@ exports = module.exports = realtime
776807exports . extractNoteIdFromSocket = extractNoteIdFromSocket
777808exports . parseNoteIdFromSocket = parseNoteIdFromSocket
778809exports . updateNote = updateNote
779- exports . finishUpdateNote = finishUpdateNote
780810exports . failConnection = failConnection
781811exports . isDuplicatedInSocketQueue = isDuplicatedInSocketQueue
782812exports . updateUserData = updateUserData
@@ -794,6 +824,7 @@ exports.disconnectSocketOnNote = disconnectSocketOnNote
794824exports . queueForDisconnect = queueForDisconnect
795825exports . terminate = terminate
796826exports . getUserPool = getUserPool
827+ exports . updateHistory = updateHistory
797828exports . disconnectProcessQueue = disconnectProcessQueue
798829exports . notes = notes
799830exports . users = users
0 commit comments