@@ -2,6 +2,25 @@ const EventsFactory = require('../models/eventsFactory');
22const { ObjectID } = require ( 'mongodb' ) ;
33const sendPersonalNotification = require ( '../utils/personalNotifications' ) . default ;
44
5+ /**
6+ * Returns a per-request, per-project EventsFactory instance
7+ * Uses context.eventsFactoryCache to memoize by projectId
8+ * @param {any } context - GraphQL resolver context
9+ * @param {string|ObjectID } ctorProjectId - value passed to EventsFactory constructor
10+ * @param {string|ObjectID } keyProjectId - value used as cache key (string id is preferred)
11+ * @returns {EventsFactory }
12+ */
13+ function getEventsFactoryForProjectId ( context , ctorProjectId , keyProjectId ) {
14+ const cache = context . eventsFactoryCache || ( context . eventsFactoryCache = new Map ( ) ) ;
15+ const cacheKey = ( keyProjectId || ctorProjectId ) . toString ( ) ;
16+
17+ if ( ! cache . has ( cacheKey ) ) {
18+ cache . set ( cacheKey , new EventsFactory ( ctorProjectId ) ) ;
19+ }
20+
21+ return cache . get ( cacheKey ) ;
22+ }
23+
524/**
625 * See all types and fields here {@see ../typeDefs/event.graphql}
726 */
@@ -29,8 +48,8 @@ module.exports = {
2948 *
3049 * @return {RepetitionsPortion }
3150 */
32- async repetitionsPortion ( { projectId, originalEventId } , { limit, cursor } ) {
33- const factory = new EventsFactory ( projectId ) ;
51+ async repetitionsPortion ( { projectId, originalEventId } , { limit, cursor } , context ) {
52+ const factory = getEventsFactoryForProjectId ( context , projectId , projectId ) ;
3453
3554 return factory . getEventRepetitions ( originalEventId , limit , cursor ) ;
3655 } ,
@@ -49,7 +68,7 @@ module.exports = {
4968 const project = await factories . projectsFactory . findById ( projectId ) ;
5069
5170 if ( project . workspaceId . toString ( ) === '6213b6a01e6281087467cc7a' ) {
52- return [ await factories . usersFactory . findById ( user . id ) ] ;
71+ return [ await factories . usersFactory . findById ( user . id ) ] ;
5372 }
5473
5574 if ( ! visitedBy || ! visitedBy . length ) {
@@ -84,8 +103,8 @@ module.exports = {
84103 * @param {number } timezoneOffset - user's local timezone offset in minutes
85104 * @returns {Promise<ProjectChartItem[]> }
86105 */
87- async chartData ( { projectId, groupHash } , { days, timezoneOffset } ) {
88- const factory = new EventsFactory ( new ObjectID ( projectId ) ) ;
106+ async chartData ( { projectId, groupHash } , { days, timezoneOffset } , context ) {
107+ const factory = getEventsFactoryForProjectId ( context , new ObjectID ( projectId ) , projectId ) ;
89108
90109 return factory . findChartData ( days , timezoneOffset , groupHash ) ;
91110 } ,
@@ -97,8 +116,8 @@ module.exports = {
97116 * @param {String } eventId - event id
98117 * @returns {Promise<Release> }
99118 */
100- async release ( { projectId, id : eventId } ) {
101- const factory = new EventsFactory ( new ObjectID ( projectId ) ) ;
119+ async release ( { projectId, id : eventId } , _args , context ) {
120+ const factory = getEventsFactoryForProjectId ( context , new ObjectID ( projectId ) , projectId ) ;
102121 const release = await factory . getEventRelease ( eventId ) ;
103122
104123 return release ;
@@ -114,8 +133,8 @@ module.exports = {
114133 * @param {UserInContext } user - user context
115134 * @return {Promise<boolean> }
116135 */
117- async visitEvent ( _obj , { projectId, eventId } , { user } ) {
118- const factory = new EventsFactory ( projectId ) ;
136+ async visitEvent ( _obj , { projectId, eventId } , { user, ... context } ) {
137+ const factory = getEventsFactoryForProjectId ( context , projectId , projectId ) ;
119138
120139 const { result } = await factory . visitEvent ( eventId , user . id ) ;
121140
@@ -131,8 +150,8 @@ module.exports = {
131150 * @param {string } mark - mark to set
132151 * @return {Promise<boolean> }
133152 */
134- async toggleEventMark ( _obj , { project, eventId, mark } ) {
135- const factory = new EventsFactory ( project ) ;
153+ async toggleEventMark ( _obj , { project, eventId, mark } , context ) {
154+ const factory = getEventsFactoryForProjectId ( context , project , project ) ;
136155
137156 const { result } = await factory . toggleEventMark ( eventId , mark ) ;
138157
@@ -155,9 +174,9 @@ module.exports = {
155174 * @param factories - factories for working with models
156175 * @return {Promise<boolean> }
157176 */
158- async updateAssignee ( _obj , { input } , { factories, user } ) {
177+ async updateAssignee ( _obj , { input } , { factories, user, ... context } ) {
159178 const { projectId, eventId, assignee } = input ;
160- const factory = new EventsFactory ( projectId ) ;
179+ const factory = getEventsFactoryForProjectId ( context , projectId , projectId ) ;
161180
162181 const userExists = await factories . usersFactory . findById ( assignee ) ;
163182
@@ -206,9 +225,9 @@ module.exports = {
206225 * @param factories - factories for working with models
207226 * @return {Promise<boolean> }
208227 */
209- async removeAssignee ( _obj , { input } ) {
228+ async removeAssignee ( _obj , { input } , context ) {
210229 const { projectId, eventId } = input ;
211- const factory = new EventsFactory ( projectId ) ;
230+ const factory = getEventsFactoryForProjectId ( context , projectId , projectId ) ;
212231
213232 const { result } = await factory . updateAssignee ( eventId , '' ) ;
214233
0 commit comments