@@ -111,65 +111,96 @@ function disconnectSocketOnNote (note) {
111
111
}
112
112
113
113
function 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 ( {
115
124
where : {
116
- id : note . id
125
+ id : id
117
126
}
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
146
144
}
147
- } ) . catch ( function ( err ) {
148
- logger . error ( err )
149
- return callback ( err , null )
150
145
} )
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
+ }
151
156
}
152
157
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 {
158
172
title : title ,
159
173
content : body ,
160
174
authorship : note . authorship ,
161
175
lastchangeuserId : note . lastchangeuser ,
162
176
lastchangeAt : Date . now ( )
163
177
}
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
- } )
171
178
}
172
179
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
+ }
173
204
174
205
function getStatus ( callback ) {
175
206
models . Note . count ( ) . then ( function ( notecount ) {
@@ -776,7 +807,6 @@ exports = module.exports = realtime
776
807
exports . extractNoteIdFromSocket = extractNoteIdFromSocket
777
808
exports . parseNoteIdFromSocket = parseNoteIdFromSocket
778
809
exports . updateNote = updateNote
779
- exports . finishUpdateNote = finishUpdateNote
780
810
exports . failConnection = failConnection
781
811
exports . isDuplicatedInSocketQueue = isDuplicatedInSocketQueue
782
812
exports . updateUserData = updateUserData
@@ -794,6 +824,7 @@ exports.disconnectSocketOnNote = disconnectSocketOnNote
794
824
exports . queueForDisconnect = queueForDisconnect
795
825
exports . terminate = terminate
796
826
exports . getUserPool = getUserPool
827
+ exports . updateHistory = updateHistory
797
828
exports . disconnectProcessQueue = disconnectProcessQueue
798
829
exports . notes = notes
799
830
exports . users = users
0 commit comments