Skip to content

Commit 299942c

Browse files
committed
Merge branch 'development' of https://github.com/codeuino/social-platform-donut-backend into development
2 parents 75aec9c + 134674a commit 299942c

21 files changed

+376
-7
lines changed

.env.dev

+8-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
PORT=5000
22
NODE_ENV="development"
33
JWT_SECRET="thisismysupersecrettokenjustkidding"
4-
DATABASE_URL"mongodb://mongo:27017/donut-development"
4+
DATABASE_URL="mongodb://mongo:27017/donut-development"
55
SENDGRID_API_KEY='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'
66
SOCKET_PORT=8810
7-
clientbaseurl = "http://localhost:3000/"
7+
clientbaseurl = "http://localhost:3000"
8+
SOCKET_PORT=8810
9+
REDIS_HOST="redis"
10+
REDIS_PORT=6379
11+
REDIS_PASSWORD="auth"
12+
REDIS_DB=0
13+
REDIS_ACTIVITY_DB=1

app.js

+2
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ const projectRouter = require('./app/routes/project')
2323
const notificationRouter = require('./app/routes/notification')
2424
const proposalRouter = require('./app/routes/proposal')
2525
const analyticsRouter = require('./app/routes/analytics')
26+
const activityRouter = require('./app/routes/activity')
2627

2728
const app = express()
2829
const server = require('http').Server(app)
@@ -83,6 +84,7 @@ app.use('/comment', commentRouter)
8384
app.use('/project', projectRouter)
8485
app.use('/proposal', proposalRouter)
8586
app.use('/analytics', analyticsRouter)
87+
app.use('/activity', activityRouter)
8688

8789
// catch 404 and forward to error handler
8890
app.use(function (req, res, next) {

app/controllers/activity.js

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
const User = require('../models/User')
2+
const Activity = require('../models/Activity')
3+
4+
const HttpStatus = require('http-status-codes')
5+
module.exports = {
6+
7+
getActivity: async (req, res, next) => {
8+
// userID whose activity will be fetched by admin
9+
const { id } = req.params
10+
11+
try {
12+
// Check if user exists
13+
const user = await User.findById(req.user._id)
14+
if (!user) {
15+
return res.status(HttpStatus.BAD_REQUEST).json({ msg: 'No such user exists!' })
16+
}
17+
18+
// check if not admin
19+
if (user.isAdmin !== true) {
20+
return res.status(HttpStatus.BAD_REQUEST).json({ msg: 'You don\'t have permission!' })
21+
}
22+
23+
const data = await Activity.findOne({ userId: id })
24+
return res.status(HttpStatus.OK).json({ activity: data.activity })
25+
} catch (error) {
26+
if (process.env.NODE_ENV !== 'production') {
27+
console.log(error.name, '-', error.message)
28+
}
29+
return res.status(HttpStatus.BAD_REQUEST).json({ error: error.message })
30+
}
31+
}
32+
}

app/controllers/auth.js

+4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
const User = require('../models/User')
22
const HttpStatus = require('http-status-codes')
3+
const activityHelper = require('../utils/activity-helper')
4+
35
module.exports = {
46
authenticateUser: async (req, res, next) => {
57
const email = req.body.email
@@ -13,9 +15,11 @@ module.exports = {
1315
}
1416
},
1517
logout: (req, res, next) => {
18+
activityHelper.addActivityToDb(req, res)
1619
res.status(HttpStatus.OK).json({ success: 'ok' })
1720
},
1821
logoutAll: (req, res, next) => {
22+
activityHelper.addActivityToDb(req, res)
1923
res.status(HttpStatus.OK).json({ success: 'ok' })
2024
}
2125
}

app/controllers/comment.js

+6-2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ const HttpStatus = require('http-status-codes')
33
const CommentModel = require('../models/Comment')
44
const permission = require('../utils/permission')
55
const helper = require('../utils/paginate')
6+
const activityTracker = require('../utils/activity-helper')
7+
const collectionTypes = require('../utils/collections')
68

79
module.exports = {
810
// CREATE COMMENT (ISSUE IN CREATE COMMENT )
@@ -14,7 +16,8 @@ module.exports = {
1416
comment.userId = userId
1517
comment.postId = id // added postId
1618
await comment.save()
17-
res.status(HttpStatus.CREATED).json({ comment: comment })
19+
activityTracker.addToRedis(req, res, next, collectionTypes.COMMENT, comment._id)
20+
return res.status(HttpStatus.CREATED).json({ comment: comment })
1821
} catch (error) {
1922
HANDLER.handleError(res, error)
2023
}
@@ -63,7 +66,8 @@ module.exports = {
6366
comment[update] = req.body[update]
6467
})
6568
await comment.save()
66-
res.status(HttpStatus.OK).json({ comment: comment })
69+
activityTracker.addToRedis(req, res, next, collectionTypes.COMMENT, comment._id)
70+
return res.status(HttpStatus.OK).json({ comment: comment })
6771
} catch (error) {
6872
HANDLER.handleError(res, error)
6973
}

app/controllers/event.js

+10-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ const permission = require('../utils/permission')
55
const helper = require('../utils/paginate')
66
const notificationHelper = require('../utils/notif-helper')
77
const settingsHelper = require('../utils/settingHelpers')
8+
const activityTracker = require('../utils/activity-helper')
9+
const collectionTypes = require('../utils/collections')
10+
811
const notification = {
912
heading: '',
1013
content: '',
@@ -22,6 +25,7 @@ module.exports = {
2225
notification.content = `${event.eventName} is added!`
2326
notification.tag = 'New!'
2427
notificationHelper.addToNotificationForAll(req, res, notification, next)
28+
activityTracker.addToRedis(req, res, next, collectionTypes.EVENT, event._id)
2529
res.status(HttpStatus.CREATED).json({ event: event })
2630
} catch (error) {
2731
res.status(HttpStatus.BAD_REQUEST).json({ error: error })
@@ -53,6 +57,7 @@ module.exports = {
5357
notification.content = `${event.eventName} is updated!`
5458
notification.tag = 'Update'
5559
notificationHelper.addToNotificationForAll(req, res, notification, next)
60+
activityTracker.addToRedis(req, res, next, collectionTypes.EVENT, event._id)
5661
res.status(HttpStatus.OK).json({ event: event })
5762
} catch (error) {
5863
HANDLER.handleError(res, error)
@@ -163,7 +168,11 @@ module.exports = {
163168
notification.content = `Event ${deleteEvent.eventName} is deleted!`
164169
notification.tag = 'Deleted'
165170
notificationHelper.addToNotificationForAll(req, res, notification, next)
166-
return res.status(HttpStatus.OK).json({ deleteEvent: deleteEvent, message: 'Deleted the event' })
171+
activityTracker.addToRedis(req, res, next, collectionTypes.EVENT, deleteEvent._id)
172+
return res.status(HttpStatus.OK).json({
173+
deleteEvent: deleteEvent,
174+
message: 'Deleted the event'
175+
})
167176
}
168177
return res.status(HttpStatus.BAD_REQUEST).json({ msg: 'Not permitted!' })
169178
} catch (error) {

app/controllers/organization.js

+7
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ const Event = require('../models/Event')
1010
const permission = require('../utils/permission')
1111
const TAGS = require('../utils/notificationTags')
1212
const Organisation = require('../models/Organisation')
13+
const activityTracker = require('../utils/activity-helper')
14+
const collectionTypes = require('../utils/collections')
15+
1316
const notification = {
1417
heading: '',
1518
content: '',
@@ -29,6 +32,7 @@ module.exports = {
2932
notification.content = `${orgData.name} is created!`
3033
notification.tag = TAGS.NEW
3134
notificationHelper.addToNotificationForAll(req, res, notification, next)
35+
activityTracker.addToRedis(req, res, next, collectionTypes.ORG, org._id)
3236
return res.status(HttpStatus.CREATED).json({ orgData })
3337
} catch (error) {
3438
HANDLER.handleError(res, error)
@@ -71,6 +75,7 @@ module.exports = {
7175
helper.mapToDb(req, org)
7276
}
7377
await org.save()
78+
activityTracker.addToRedis(req, res, next, collectionTypes.ORG, org._id)
7479
return res.status(HttpStatus.OK).json({ organization: org })
7580
} catch (error) {
7681
HANDLER.handleError(res, error)
@@ -127,6 +132,7 @@ module.exports = {
127132
notification.content = `${org.name} is deleted!`
128133
notification.tag = TAGS.DELETE
129134
notificationHelper.addToNotificationForAll(req, res, notification, next)
135+
activityTracker.addToRedis(req, res, next, collectionTypes.ORG, org._id)
130136
return res.status(HttpStatus.OK).json({ organization: org })
131137
} catch (error) {
132138
HANDLER.handleError(res, error)
@@ -228,6 +234,7 @@ module.exports = {
228234
.status(HttpStatus.BAD_REQUEST)
229235
.json({ msg: 'Invalid update' })
230236
}
237+
activityTracker.addToRedis(req, res, next, collectionTypes.ORG, organization._id)
231238
// else not admin
232239
return res
233240
.status(HttpStatus.BAD_REQUEST)

app/controllers/post.js

+3
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ const imgUploadHelper = require('../utils/uploader')
66
const permission = require('../utils/permission')
77
const helper = require('../utils/paginate')
88
const settingsHelper = require('../utils/settingHelpers')
9+
const activityTracker = require('../utils/activity-helper')
10+
const collectionTypes = require('../utils/collections')
911

1012
module.exports = {
1113
// CREATE POST
@@ -19,6 +21,7 @@ module.exports = {
1921
try {
2022
await post.save()
2123
// req.io.emit('new post created', { data: post.content })
24+
activityTracker.addToRedis(req, res, next, collectionTypes.POST, post._id)
2225
return res.status(HttpStatus.CREATED).json({ post })
2326
} catch (error) {
2427
HANDLER.handleError(res, error)

app/controllers/project.js

+4
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,16 @@ const HttpStatus = require('http-status-codes')
44
const helper = require('../utils/paginate')
55
const permission = require('../utils/permission')
66
const settingsHelper = require('../utils/settingHelpers')
7+
const activityTracker = require('../utils/activity-helper')
8+
const collectionTypes = require('../utils/collections')
79

810
module.exports = {
911
createProject: async (req, res, next) => {
1012
try {
1113
const project = await new Project(req.body)
1214
project.createdBy = req.user._id
1315
await project.save()
16+
activityTracker.addToRedis(req, res, next, collectionTypes.PROJECT, project._id)
1417
return res.status(HttpStatus.CREATED).json({ project })
1518
} catch (error) {
1619
HANDLER.handleError(res, error)
@@ -98,6 +101,7 @@ module.exports = {
98101
await Project.findByIdAndRemove(id)
99102
return res.status(HttpStatus.OK).json({ msg: 'Project deleted!' })
100103
}
104+
activityTracker.addToRedis(req, res, next, collectionTypes.PROJECT, project._id)
101105
return res.status(HttpStatus.BAD_REQUEST).json({ msg: 'Not permitted!' })
102106
} catch (error) {
103107
HANDLER.handleError(res, error)

app/controllers/user.js

+10
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ const Events = require('../models/Event')
1010
const Organization = require('../models/Organisation')
1111
const TAGS = require('../utils/notificationTags')
1212
const settingHelper = require('../utils/settingHelpers')
13+
const Activity = require('../models/Activity')
14+
const activityHelper = require('../utils/activity-helper')
15+
1316
const notification = {
1417
heading: '',
1518
content: '',
@@ -38,6 +41,11 @@ module.exports = {
3841
const token = await user.generateAuthToken()
3942
// Added fn to send email to activate account with warm message
4043
await emailController.sendEmail(req, res, next, token)
44+
45+
// create redis db for activity for the user
46+
const activity = new Activity({ userId: data._id })
47+
await activity.save()
48+
4149
return res.status(HttpStatus.CREATED).json({ user: user, token: token })
4250
} catch (error) {
4351
return res.status(HttpStatus.NOT_ACCEPTABLE).json({ error: error })
@@ -169,6 +177,8 @@ module.exports = {
169177
try {
170178
req.user.tokens = []
171179
await req.user.save()
180+
// add all activity to db after successfully logged out
181+
activityHelper.addActivityToDb(req, res)
172182
return res.status(HttpStatus.OK).json({ msg: 'User logged out Successfully!' })
173183
} catch (error) {
174184
HANDLER.handleError(res, error)

app/middleware/activity.js

+56
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
const User = require('../models/User')
2+
const redis = require('../../config/redis')
3+
4+
const activity = async (req, res, next) => {
5+
var redisClient = redis.redisClient
6+
var route = req.originalUrl.replace(/\?.*$/, '')
7+
var method = req.method
8+
var userID = req.user.id.toString()
9+
console.log('req.body ', req.body)
10+
console.log('res.locals.data ', res.locals.data)
11+
console.log('route ', route)
12+
console.log('methods ', method)
13+
14+
if (route === '/user/logout') {
15+
var activityData = await redisClient.lrange(userID, 0, -1)
16+
const data = await User.findOne({
17+
_id: userID
18+
})
19+
var activityElement = {
20+
route: '',
21+
method: '',
22+
collectionType: '',
23+
id: '',
24+
timestamp: ''
25+
}
26+
for (let index = 0; index < activityData.length; index++) {
27+
var activityDataElement = activityData[index].split(',')
28+
activityElement.route = activityDataElement[0]
29+
activityElement.method = activityDataElement[1]
30+
activityElement.collectionType = activityDataElement[2]
31+
activityElement.id = activityDataElement[3]
32+
activityElement.timestamp = activityDataElement[4]
33+
data.activity.unshift(activityElement)
34+
}
35+
await data.update()
36+
console.log('DATA')
37+
console.log(data)
38+
// clear data from redis
39+
await redisClient.del(userID)
40+
} else if (method !== 'GET') {
41+
var objectID = res.locals.data._id
42+
userID = objectID
43+
var timeStamp = Date()
44+
var collectionType = res.locals.collectionType
45+
if (typeof res.locals.data.userId !== 'undefined') {
46+
userID = res.locals.data.userId
47+
}
48+
// example /auth/login,POST,user,5ed09e9d446f2b1c208b6ba8,Thu Jul 23 2020 20:28:29 GMT+0530 (India Standard Time)
49+
activityElement = route.concat(',', method, ',', collectionType, ',', objectID, ',', timeStamp)
50+
// userID => [(route, collection, method, objectID), (route,method, collection, objectID) ...]
51+
await redisClient.rpush(userID, activityElement)
52+
next()
53+
}
54+
}
55+
56+
module.exports = activity

app/models/Activity.js

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
const mongoose = require('mongoose')
2+
const Schema = mongoose.Schema
3+
4+
const activitySchema = new Schema({
5+
userId: {
6+
type: mongoose.Schema.Types.ObjectId,
7+
ref: 'User'
8+
},
9+
activity: [{
10+
route: {
11+
type: String,
12+
required: true
13+
},
14+
method: {
15+
type: String,
16+
required: true
17+
},
18+
collectionType: {
19+
type: String,
20+
required: true
21+
},
22+
id: {
23+
type: String,
24+
required: true
25+
},
26+
timestamp: {
27+
type: String,
28+
required: true
29+
}
30+
}]
31+
})
32+
33+
module.exports = mongoose.model('Activity', activitySchema)

app/routes/activity.js

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
const express = require('express')
2+
const router = express.Router()
3+
4+
const activityController = require('../controllers/activity')
5+
const isUnderMaintenance = require('../middleware/maintenance')
6+
const auth = require('../middleware/auth')
7+
8+
// get a User activity
9+
router.get(
10+
'/user/:id',
11+
isUnderMaintenance,
12+
auth,
13+
activityController.getActivity
14+
)
15+
16+
module.exports = router

app/routes/organisation.js

-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ router.post(
1010
'/',
1111
isUnderMaintenance,
1212
uploader.upload.single('image'),
13-
auth,
1413
OrgController.createOrganization
1514
)
1615

0 commit comments

Comments
 (0)