|
@@ -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]
|