This commit is contained in:
Dobie Wollert
2015-12-16 09:12:35 -08:00
parent f9c9672818
commit f94ca33b9e
805 changed files with 67409 additions and 24609 deletions

60
app/routes/exceptions.js Normal file
View File

@ -0,0 +1,60 @@
"use strict";
const moment = require('moment-timezone');
const _ = require('lodash');
/**
* GET /api/exceptions
*/
function index(req, res) {
req.check('user').isMongoId();
req.check('date').optional().isISO8601();
req.check('week').optional().isISO8601();
if (!req.query.date && !req.query.week) {
return res.json({
error: {
message: 'Must specify a date filter.'
}
});
}
const query = {
user: req.query.user
};
if (req.query.date) {
const date = moment(req.query.date);
const startOfDay = date.clone().startOf('day');
const endOfDay = date.clone().endOf('day');
query.date = {
$gte: startOfDay,
$lte: endOfDay
};
}
if (req.query.week) {
const week = moment(req.query.week);
const startOfWeek = week.clone().startOf('week');
const endOfWeek = week.clone().endOf('week');
query.date = {
$gte: startOfWeek,
$lte: endOfWeek
};
}
var results = req.db.TimeClockException
.find(query)
.sort('date')
.exec();
res.promise(results);
}
module.exports = {
index
};

9
app/routes/index.js Normal file
View File

@ -0,0 +1,9 @@
'use strict';
module.exports = {
exceptions: require('./exceptions'),
misc: require('./misc'),
spans: require('./spans'),
users: require('./users'),
workorders: require('./workorders')
};

53
app/routes/misc.js Normal file
View File

@ -0,0 +1,53 @@
"use strict";
const email = require('../util/email');
const moment = require('moment-timezone');
const _ = require('lodash');
var config = require('../../config/config')['prod'];
var partsRequestTemplate = email.template(
'partsRequest.html.tmpl',
'partsRequest.text.tmpl',
'Parts Request',
[
'techName',
'requestDate',
'customerId',
'customerName',
'customerContact',
'customerPhone',
'biomedId',
'manufacture',
'model',
'serialNumber',
'vendor',
'vendorPhone',
'partNumber',
'description',
'specialNotes'
]
);
/**
* POST /api/misc/partsRequest
*/
function partsRequest(req, res) {
const message = {
to: config.email.partsRequest
};
const defaultValues = {
techName: `${req.user.name.first} ${req.user.name.last}`,
requestDate: moment().format('LLLL')
};
const values = _.assign({}, req.body, defaultValues);
res.promise(email.send(message, partsRequestTemplate, values));
}
module.exports = {
partsRequest
};

97
app/routes/spans.js Normal file
View File

@ -0,0 +1,97 @@
"use strict";
const moment = require('moment-timezone');
const _ = require('lodash');
/**
* GET /api/spans
*/
function index(req, res) {
req.check('user').optional().isMongoId();
req.check('workorder').optional().isMongoId();
req.check('date').optional().isISO8601();
req.check('week').optional().isISO8601();
if (!req.query.user && !req.query.workorder) {
return res.json({
error: {
message: 'Must specify a type filter.'
}
});
}
if (req.query.user && !req.query.date && !req.query.week) {
return res.json({
error: {
message: 'Must specify a date filter.'
}
});
}
const query = {};
if (req.query.user) {
query.user = req.query.user;
}
if (req.query.workorder) {
query.workorder = req.query.workorder;
}
if (req.query.date) {
const date = moment(req.query.date);
const startOfDay = date.clone().startOf('day');
const endOfDay = date.clone().endOf('day');
query.start = {
$gte: startOfDay,
$lte: endOfDay
};
}
if (req.query.week) {
const week = moment(req.query.week);
const startOfWeek = week.clone().startOf('week');
const endOfWeek = week.clone().endOf('week');
query.start = {
$gte: startOfWeek,
$lte: endOfWeek
};
}
var results = req.db.TimeClockSpan
.find(query)
.sort('start')
.exec();
res.promise(results);
}
/**
* POST /api/spans/:user_id
*/
function update(req, res) {
req.check('id').isMongoId();
var data = req.body;
delete data._id;
delete data.__v;
const result = req.db.TimeClockSpan
.findById(req.params.id)
.exec()
.then((entity) => {
_.assign(entity, data);
return entity.save();
});
res.promise(result);
}
module.exports = {
index,
update
};

184
app/routes/users.js Normal file
View File

@ -0,0 +1,184 @@
"use strict";
const Promise = require('bluebird');
const moment = require('moment-timezone');
const _ = require('lodash');
function filterFields(user) {
const obj = user.toObject();
delete obj.accessToken;
delete obj.refreshToken;
return obj
}
/**
* GET /api/users/:id
*/
function fetch(req, res) {
let result;
if (req.params.id === 'me') {
result = Promise.resolve(req.user);
} else {
result = req.db.User.findById(req.params.id);
}
res.promise(result.then(filterFields));
}
/**
* POST /api/users/:id
*/
function update(req, res) {
req.check('id').isMongoId();
var data = req.body;
delete data._id;
delete data.__v;
delete data.name;
delete data.email;
delete data.accessToken;
delete data.refreshToken;
delete data.deleted;
const result = req.db.User
.findById(req.params.id)
.exec()
.then((entity) => {
_.assign(entity, data);
return entity.save();
})
.then(filterFields);
res.promise(result);
}
/**
* GET /api/users/:id/daysWorked
*/
function daysWorked(req, res) {
const id = req.params.id === 'me' ? req.user.id : req.params.id;
const query = {
user: id,
type: 'workday'
};
const result = req.db.TimeClockSpan
.find(query)
.exec()
.then((records) => _.chain(records).reduce(accumulateDaysWorked, []).values());
res.promise(result);
}
/**
* GET /api/users/:id/weeksWorked
*/
function weeksWorked(req, res) {
const id = req.params.id === 'me' ? req.user.id : req.params.id;
const query = {
user: id,
type: 'workday'
};
const result = req.db.TimeClockSpan
.find(query)
.exec()
.then((records) => _.chain(records).reduce(accumulateWeeksWorked, []).values());
res.promise(result);
}
/**
* GET /api/users/:id/timeClock
*/
function timeClock(req, res) {
const id = req.params.id === 'me' ? req.user.id : req.params.id;
const date = moment(req.query.date);
const startOfDay = date.clone().startOf('day');
const endOfDay = date.clone().endOf('day');
var spans = req.db.TimeClockSpan
.find({
user: id,
start: {
$gte: startOfDay,
$lte: endOfDay
}
})
.sort({ start: 1 })
.exec();
var exceptions = req.db.TimeClockException
.find({
user: id,
date: {
$gte: startOfDay,
$lte: endOfDay
}
})
.exec();
var workorders = spans
.then(extractIds('workorder'))
.then((ids) => {
return req.db.Workorder
.find({
_id: {
$in: ids
}
})
.populate('client', 'name identifier')
.exec();
})
.then(indexById);
res.promise(Promise.props({
spans,
exceptions,
workorders
}));
}
function accumulateDaysWorked(result, record) {
const date = moment(record.start).local().startOf('day').format('YYYY-MM-DD');
if (result.indexOf(date) === -1) {
result.push(date);
}
return result;
}
function accumulateWeeksWorked(result, record) {
const date = moment(record.start).local().startOf('week').format('YYYY-MM-DD');
if (result.indexOf(date) === -1) {
result.push(date);
}
return result;
}
function extractIds(field) {
return (data) => _(data)
.pluck(field)
.reject(_.isUndefined)
.uniq((id) => id.toString())
.value();
}
function indexById(data) {
return _.indexBy(data, 'id')
}
module.exports = {
fetch,
update,
daysWorked,
weeksWorked,
timeClock
};

67
app/routes/workorders.js Normal file
View File

@ -0,0 +1,67 @@
"use strict";
const Promise = require('bluebird');
const moment = require('moment-timezone');
const _ = require('lodash');
/**
* GET /api/workorders/:id/timeClock
*/
function timeClock(req, res) {
req.check('id').isMongoId();
const id = req.params.id;
const spans = req.db.TimeClockSpan
.find({
workorder: id
})
.exec();
const users = spans
.then(extractIds('user'))
.then((ids) => {
return req.db.User
.find({
_id: {
$in: ids
}
})
.select('name picture')
.exec();
})
.then(indexById);
const duration = spans
.then((spans) => {
let result = 0;
spans.forEach((span) => {
if (span.duration) {
result += span.duration;
}
});
return result;
});
res.promise(Promise.props({
duration,
spans,
users
}));
}
function extractIds(field) {
return (data) => _(data)
.pluck(field)
.reject(_.isUndefined)
.uniq((id) => id.toString())
.value();
}
function indexById(data) {
return _.indexBy(data, 'id')
}
module.exports = {
timeClock
};