@@ -122,6 +122,53 @@ module.exports = {
122122 return release ;
123123 } ,
124124 } ,
125+ Subscription : {
126+ eventOccurred : {
127+ /**
128+ * Subscribes user to events from his projects
129+ * @param {ResolverObj } _obj
130+ * @param {Object } _args - request variables (not used)
131+ * @param {UserInContext } user - current authorized user {@see ../index.js}
132+ * @param {ContextFactories } factories - factories for working with models
133+ * @return {AsyncIterator<EventSchema> }
134+ */
135+ subscribe : async ( _obj , _args , { user, factories } ) => {
136+ const userId = user . id ;
137+ const userModel = await factories . usersFactory . findById ( userId ) ;
138+ // eslint-disable-next-line no-async-promise-executor
139+ const eventsCollections = new Promise ( async resolve => {
140+ // @todo optimize query for getting all user's projects
141+
142+ // Find all user's workspaces
143+ const allWorkspacesIds = await userModel . getWorkspacesIds ( ) ;
144+ const allProjects = [ ] ;
145+
146+ // Find all user's projects
147+ await asyncForEach ( allWorkspacesIds , async workspaceId => {
148+ const allProjectsInWorkspace = await new ProjectToWorkspace ( workspaceId ) . getProjects ( ) ;
149+
150+ allProjects . push ( ...allProjectsInWorkspace ) ;
151+ } ) ;
152+
153+ resolve ( allProjects . map ( project =>
154+ mongo . databases . events
155+ . collection ( 'events:' + project . id )
156+ ) ) ;
157+ } ) ;
158+
159+ return watchController . getAsyncIteratorForCollectionChangesEvents ( eventsCollections ) ;
160+ } ,
161+
162+ /**
163+ * Sends data to user about new events
164+ * @param {Object } payload - subscription event payload (from mongoDB watch)
165+ * @return {EventSchema }
166+ */
167+ resolve : ( payload ) => {
168+ return payload . fullDocument ;
169+ } ,
170+ } ,
171+ } ,
125172 Mutation : {
126173 /**
127174 * Mark event as visited for current user
0 commit comments