ソースを参照

Add routes for analytics page

sbkwgh 8 年 前
コミット
5dd717f960
3 ファイル変更123 行追加3 行削除
  1. 120 2
      routes/log.js
  2. 1 1
      routes/user.js
  3. 2 0
      test/log.js

+ 120 - 2
routes/log.js

@@ -1,8 +1,57 @@
 let express = require('express')
 let router = express.Router()
 
+let { Sequelize, Log, Thread, User, Category } = require('../models')
+
 const Errors = require('../lib/errors')
-let { Sequelize, Log, Thread, User } = require('../models')
+const now = new Date()
+const lastWeek = new Date(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate() - 6)
+
+function processLogsForLineChart (logs) {
+	let normalizedDateLogs = logs.map(log => {
+		let date = new Date(log.createdAt)
+		date.setHours(0, 0, 0)
+		return { createdAt: date }
+	})
+
+	let pageViewsObj = normalizedDateLogs.reduce((obj, log) => {
+		if(!obj[log.createdAt]) {
+			obj[log.createdAt] = { date: log.createdAt, pageViews: 1 }
+		} else {
+			obj[log.createdAt].pageViews++
+		}
+
+		return obj
+	}, {})
+
+	for(let i = 0; i < 7; i++) {
+		let date = new Date(lastWeek)
+		date.setUTCDate(date.getUTCDate() + i)
+
+		if(!pageViewsObj[date]) {
+			pageViewsObj[date] = {
+				date,
+				pageViews: 0
+			}
+		}
+	}
+
+	let pageViewsArr = Object.keys(pageViewsObj).map(date => {
+		return pageViewsObj[date]
+	})
+
+	let pageViewsSorted = pageViewsArr.sort((a, b) => {
+		if(a.date < b.date) {
+			return -1
+		} else if(a.date > b.date) {
+			return 1
+		} else {
+			return 0
+		}
+	})
+
+	return pageViewsSorted
+}
 
 router.post('/', async (req, res) => {
 	try {
@@ -118,9 +167,78 @@ router.get('/top-threads', async (req, res) => {
 		})
 
 		//Return top 3
-		res.json(sortedPageViewsArr.slice(0, 3))
+		res.json(sortedPageViewsArr.slice(0, 4))
+
+	} catch (e) {
+		res.status(500)
+		res.json({
+			errors: [Errors.unknown]
+		})
+	}
+})
+
+router.get('/page-views', async (req, res) => {
+	try {
+		let logs = await Log.findAll({
+			where: {
+				createdAt: {
+					$gt: lastWeek
+				}
+			},
+			order: [['createdAt', 'ASC']]
+		})
 
+		res.json(processLogsForLineChart(logs))
 	} catch (e) {
+		console.log(e)
+
+		res.status(500)
+		res.json({
+			errors: [Errors.unknown]
+		})
+	}
+})
+
+router.get('/new-users', async (req, res) => {
+	try {
+		let users = await User.findAll({
+			where: {
+				createdAt: {
+					$gt: lastWeek
+				}
+			},
+			order: [['createdAt', 'ASC']]
+		})
+
+		res.json(processLogsForLineChart(users))
+	} catch (e) {
+		console.log(e)
+
+		res.status(500)
+		res.json({
+			errors: [Errors.unknown]
+		})
+	}
+})
+
+router.get('/categories', async (req, res) => {
+	try {
+		let categories = await Category.findAll()
+		let categoryThreadCount = []
+
+		await Promise.all(categories.map(async category => {
+			let count = await Thread.count({ where: { CategoryId: category.id } })
+			categoryThreadCount.push({
+				value: count,
+				label: category.name,
+				color: category.color
+			})
+		}))
+
+		res.json(categoryThreadCount)
+	} catch (e) {
+		console.log(e)
+
 		res.status(500)
 		res.json({
 			errors: [Errors.unknown]

+ 1 - 1
routes/user.js

@@ -60,7 +60,7 @@ router.post('/', async (req, res) => {
 router.get('/:username', async (req, res) => {
 	try {
 		let queryObj = {
-			attributes: { exclude: ['hash', 'id'] },
+			attributes: { exclude: ['hash'] },
 			where: { username: req.params.username }
 		}
 

+ 2 - 0
test/log.js

@@ -257,11 +257,13 @@ describe('Log', () => {
 			res.body[0].should.have.deep.property('Thread.name', 'thread3')
 			res.body[1].should.have.deep.property('Thread.name', 'thread')
 			res.body[2].should.have.deep.property('Thread.name', 'thread2')
+			res.body[3].should.have.deep.property('Thread.name', 'thread4')
 
 			res.body[0].should.have.property('pageViews', 7)
 			//6 because there was a previous log to the thread in previous test
 			res.body[1].should.have.property('pageViews', 6)
 			res.body[2].should.have.property('pageViews', 3)
+			res.body[3].should.have.property('pageViews', 1)
 		})
 
 		it('should return an error if not an admin', done => {