@@ -63,6 +63,7 @@ module.exports = (db, server, messageHandler, userHandler, storageHandler, setti
6363
6464 const getMailboxCounter = tools . getMailboxCounter ;
6565 const getKeywordCounter = tools . getKeywordCounter ;
66+ const getFlaggedCounter = tools . getFlaggedCounter ;
6667 const extractKeywords = tools . extractKeywords ;
6768 const asyncForward = util . promisify ( forward ) ;
6869
@@ -223,6 +224,87 @@ module.exports = (db, server, messageHandler, userHandler, storageHandler, setti
223224 } )
224225 ) ;
225226
227+ server . get (
228+ {
229+ path : '/users/:user/flagged-counter' ,
230+ summary : 'Get flagged counter' ,
231+ name : 'getFlaggedCounter' ,
232+ description : 'Returns total and unseen counters for flagged messages' ,
233+ validationObjs : {
234+ requestBody : { } ,
235+ pathParams : {
236+ user : Joi . string ( ) . hex ( ) . lowercase ( ) . length ( 24 ) . required ( ) . description ( 'ID of the User' )
237+ } ,
238+ queryParams : {
239+ sess : sessSchema ,
240+ ip : sessIPSchema
241+ } ,
242+ response : {
243+ 200 : {
244+ description : 'Success' ,
245+ model : Joi . object ( {
246+ success : booleanSchema . required ( ) ,
247+ total : Joi . number ( ) . required ( ) . description ( 'Total number of flagged messages' ) ,
248+ unseen : Joi . number ( ) . required ( ) . description ( 'Unseen number of flagged messages' )
249+ } ) . $_setFlag ( 'objectName' , 'FlaggedCounterResponse' )
250+ }
251+ }
252+ } ,
253+ tags : [ 'Messages' ]
254+ } ,
255+ tools . responseWrapper ( async ( req , res ) => {
256+ res . charSet ( 'utf-8' ) ;
257+
258+ const { requestBody, queryParams, pathParams } = req . route . spec . validationObjs ;
259+
260+ const schema = Joi . object ( {
261+ ...requestBody ,
262+ ...queryParams ,
263+ ...pathParams
264+ } ) ;
265+
266+ const result = schema . validate ( req . params , {
267+ abortEarly : false ,
268+ convert : true ,
269+ allowUnknown : true
270+ } ) ;
271+
272+ if ( result . error ) {
273+ res . status ( 400 ) ;
274+ return res . json ( {
275+ error : result . error . message ,
276+ code : 'InputValidationError' ,
277+ details : tools . validationErrors ( result )
278+ } ) ;
279+ }
280+
281+ if ( req . user && req . user === result . value . user ) {
282+ req . validate ( roles . can ( req . role ) . readOwn ( 'messages' ) ) ;
283+ } else {
284+ req . validate ( roles . can ( req . role ) . readAny ( 'messages' ) ) ;
285+ }
286+
287+ const user = new ObjectId ( result . value . user ) ;
288+
289+ const userExists = await db . users . collection ( 'users' ) . countDocuments ( { _id : user } , { limit : 1 } ) ;
290+ if ( ! userExists ) {
291+ res . status ( 404 ) ;
292+ return res . json ( {
293+ error : 'This user does not exist' ,
294+ code : 'UserNotFound'
295+ } ) ;
296+ }
297+
298+ const [ total , unseen ] = await Promise . all ( [ getFlaggedCounter ( db , user ) , getFlaggedCounter ( db , user , 'unseen' ) ] ) ;
299+
300+ return res . json ( {
301+ success : true ,
302+ total,
303+ unseen
304+ } ) ;
305+ } )
306+ ) ;
307+
226308 const putMessageHandler = async ( req , res ) => {
227309 res . charSet ( 'utf-8' ) ;
228310
0 commit comments