From 95f62d72945acbac295f2342fd51cea9337d7cb7 Mon Sep 17 00:00:00 2001 From: Jules Laplace Date: Wed, 3 Sep 2014 18:46:04 -0400 Subject: lastlog --- public/assets/javascripts/ui/site/ProjectList.js | 2 +- public/assets/stylesheets/app.css | 15 ++++--- public/assets/stylesheets/staff.css | 10 +++++ server/lib/auth/index.js | 4 +- server/lib/schemas/User.js | 1 + server/lib/views/staff.js | 52 +++++++++++++++++++++--- views/projects/list-projects.ejs | 2 +- views/staff/_header.ejs | 1 + views/staff/_users.ejs | 15 +++++++ views/staff/_users_recent.ejs | 20 +++++++++ views/staff/index.ejs | 11 ++--- views/staff/users/index.ejs | 2 + 12 files changed, 115 insertions(+), 20 deletions(-) create mode 100644 public/assets/stylesheets/staff.css create mode 100644 views/staff/_users.ejs create mode 100644 views/staff/_users_recent.ejs diff --git a/public/assets/javascripts/ui/site/ProjectList.js b/public/assets/javascripts/ui/site/ProjectList.js index d772b20..959aa43 100644 --- a/public/assets/javascripts/ui/site/ProjectList.js +++ b/public/assets/javascripts/ui/site/ProjectList.js @@ -1,7 +1,7 @@ var ProjectList = View.extend({ - el: "#projectList", + el: ".projectList", events: { "mouseenter td.border": 'spinOn', diff --git a/public/assets/stylesheets/app.css b/public/assets/stylesheets/app.css index 5922ab5..25bcf56 100755 --- a/public/assets/stylesheets/app.css +++ b/public/assets/stylesheets/app.css @@ -161,23 +161,25 @@ h5 { text-align:center; } -.page .profile { +.page.profile { color:white; } -.page table { +.page table.profilepage, +.page table.projectList { width: 100%; border-top: 1px solid; margin: 40px 0 0 0; border-spacing: 0; - clear:nboth; + clear: both; } -.page tr { +.page table.profilepage tr, +.page table.projectList tr { height: 400px; } .page table.showcase { height:70vh; } -.page table td.border { +.page table.projectList td.border { position: relative; border-right: 1px solid; } @@ -191,7 +193,8 @@ iframe.embed { z-index: -1; pointer-events: none; } -.page table td { +.page table.profilepage td, +.page table.projectList td { width: 33.3333%; background-size: cover; background-repeat: no-repeat; diff --git a/public/assets/stylesheets/staff.css b/public/assets/stylesheets/staff.css new file mode 100644 index 0000000..0208878 --- /dev/null +++ b/public/assets/stylesheets/staff.css @@ -0,0 +1,10 @@ +* { + font-weight: 300; +} +th, b { + font-weight: bold; +} +#users td { + text-align: left; + padding: 2px 5px; +} \ No newline at end of file diff --git a/server/lib/auth/index.js b/server/lib/auth/index.js index 99af9b5..c2275ff 100644 --- a/server/lib/auth/index.js +++ b/server/lib/auth/index.js @@ -111,6 +111,7 @@ var auth = { return info ? res.json(info) : res.redirect("/login"); } + user.last_seen = new Date () user.last_ip = util.ip2num( req.ip ) user.save(function(err, data){ if (err) console.err('error setting ip for user') }) @@ -173,7 +174,8 @@ var auth = { email: email, created_ip: util.ip2num( req.ip ), last_ip: util.ip2num( req.ip ), - created_at: new Date () + created_at: new Date (), + last_seen: new Date (), } new User(data).save(function(err, user){ if (err || ! data) { return res.json({ error: err }) } diff --git a/server/lib/schemas/User.js b/server/lib/schemas/User.js index b64f8fc..180a140 100644 --- a/server/lib/schemas/User.js +++ b/server/lib/schemas/User.js @@ -64,6 +64,7 @@ var UserSchema = new mongoose.Schema({ isStaff: { type: Boolean, default: false }, created_at: { type: Date }, updated_at: { type: Date }, + last_seen: { type: Date }, created_ip: { type: Number }, last_ip: { type: Number }, }); diff --git a/server/lib/views/staff.js b/server/lib/views/staff.js index 5dde58d..9643626 100644 --- a/server/lib/views/staff.js +++ b/server/lib/views/staff.js @@ -14,7 +14,7 @@ var User = require('../schemas/User'), var staff = module.exports = { fields: { - user: "_id username displayName created_at updated_at created_ip last_ip", + user: "_id username displayName created_at updated_at last_seen created_ip last_ip", project: "_id name slug created_at updated_at", }, @@ -28,11 +28,15 @@ var staff = module.exports = { middleware: { ensureUsers: function(req, res, next){ + var limit = Math.max( Number(req.params.limit) || 50, 200 ) var offset = Number(req.params.offset) || 0 var sort switch (req.params.sort) { case 'date': - sort = {'date': -1} + sort = {'created_at': -1} + break + case 'lastseen': + sort = {'last_seen': -1} break default: sort = {'username': 1} @@ -42,13 +46,44 @@ var staff = module.exports = { .select(staff.fields.user) .sort(sort) .skip(offset) - .limit(50) + .limit(limit) .exec(function (err, users) { res.locals.users = users.map(staff.helpers.user) next() }) }, + ensureRecentUsers: function(req, res, next){ + var dreq = { params: { sort: 'last_seen', limit: 20, offset: 0 } } + staff.middleware.ensureUsers(dreq, res, next) + }, + + ensureProjects: function(req, res, next){ + var offset = Number(req.params.offset) || 0 + var sort + switch (req.params.sort) { + case 'date': + sort = {'date': -1} + break + default: + sort = {'slug': 1} + break + } + Project.find({}) + .select(staff.fields.project) + .sort(sort) + .skip(offset) + .limit(50) + .exec(function (err, projects) { + res.locals.projects = projects.map(staff.helpers.projects) + next() + }) + }, + + ensureProjectsUsers: function(req, res, next){ + + }, + ensureProfile: function(req, res, next){ var username = req.params.username if (username) { @@ -69,7 +104,6 @@ var staff = module.exports = { }, ensureUsersCount: function(req, res, next){ - if (! res.locals.profile) { return next() } User.count({}, function(err, count){ res.locals.userCount = count || 0 next() @@ -77,7 +111,6 @@ var staff = module.exports = { }, ensureProjectsCount: function(req, res, next){ - if (! res.locals.profile) { return next() } Project.count({}, function(err, count){ res.locals.projectCount = count || 0 next() @@ -136,6 +169,7 @@ var staff = module.exports = { helpers: { user: function(user){ user = user.toObject() + user.last_seen = moment( user.last_seen || user.updated_at || user.created_at ).fromNow() user.created_ip = util.num2ip( user.created_ip ) user.last_ip = util.num2ip( user.last_ip ) return user @@ -151,7 +185,8 @@ var staff = module.exports = { app.get('/staff', middleware.ensureAuthenticated, middleware.ensureIsStaff, - + + staff.middleware.ensureRecentUsers, staff.middleware.ensureUsersCount, staff.middleware.ensureProjectsCount, @@ -180,6 +215,11 @@ var staff = module.exports = { app.get('/staff/projects', middleware.ensureAuthenticated, middleware.ensureIsStaff, + + staff.middleware.ensureProjectsCount, + + staff.middleware.ensureProjects, + staff.middleware.ensureProjectsUsers, staff.projects.index ); diff --git a/views/projects/list-projects.ejs b/views/projects/list-projects.ejs index c78bf9f..c41ae07 100644 --- a/views/projects/list-projects.ejs +++ b/views/projects/list-projects.ejs @@ -1,6 +1,6 @@ [[ if (projects.length) { ]] - +
[[ projects.forEach(function(project, i) { ]] diff --git a/views/staff/_header.ejs b/views/staff/_header.ejs index 9311948..d726b02 100644 --- a/views/staff/_header.ejs +++ b/views/staff/_header.ejs @@ -4,6 +4,7 @@ vvalls | staff [[ include ../partials/meta ]] +
diff --git a/views/staff/_users.ejs b/views/staff/_users.ejs new file mode 100644 index 0000000..ab8c9b3 --- /dev/null +++ b/views/staff/_users.ejs @@ -0,0 +1,15 @@ +
+[[ users.forEach(function(user){ ]] + + + + + +[[ }) ]] +
+ [[- user.username ]] + + [[- user.displayName ]] + + [[- user.last_seen ]] +
diff --git a/views/staff/_users_recent.ejs b/views/staff/_users_recent.ejs new file mode 100644 index 0000000..ff3fd55 --- /dev/null +++ b/views/staff/_users_recent.ejs @@ -0,0 +1,20 @@ + + + + +[[ users.forEach(function(user){ ]] + + + + + +[[ }) ]] +
+ recent users +
+ [[- user.username ]] + + [[- user.displayName ]] + + [[- user.last_seen ]] +
diff --git a/views/staff/index.ejs b/views/staff/index.ejs index fbe67a7..0cb67da 100644 --- a/views/staff/index.ejs +++ b/views/staff/index.ejs @@ -1,10 +1,11 @@ [[ include _header ]]

Staff Area

- + +users: [[- userCount ]] +projects: [[- projectCount ]] + +
+[[ include _users_recent ]] [[ include _footer ]] \ No newline at end of file diff --git a/views/staff/users/index.ejs b/views/staff/users/index.ejs index 62c0ae2..fb072d8 100644 --- a/views/staff/users/index.ejs +++ b/views/staff/users/index.ejs @@ -1,4 +1,6 @@ [[ include ../_header ]]

Users

+[[ include _users ]] + [[ include ../_footer ]] -- cgit v1.2.3-70-g09d2