blob: bc0245de8f5e8c5997a05d7f3348c0254da06230 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
'use strict';
const _ = require('lodash');
// Fire me up!
module.exports = {
implements: 'services/activities',
inject: ['mongo']
};
/**
* @param mongo
* @returns {ActivitiesService}
*/
module.exports.factory = (mongo) => {
class ActivitiesService {
/**
* Update page activities.
*
* @param {Object} user - User.
* @param {String} action - Action string presentation.
* @param {String} group - Action group string presentation.
* @param {Date} [now] - Optional date to save in activity.
* @returns {Promise.<mongo.ObjectId>} that resolve activity.
*/
static merge(user, {action, group}, now = new Date()) {
const owner = user._id;
mongo.Account.findById(owner)
.then((user) => {
user.lastActivity = new Date();
return user.save();
});
const date = Date.UTC(now.getFullYear(), now.getMonth(), 1);
return mongo.Activities.findOneAndUpdate({owner, action, date},
{$set: {owner, group, action, date}, $inc: {amount: 1}}, {new: true, upsert: true}).exec();
}
static total({startDate, endDate}) {
const $match = {};
if (startDate)
$match.date = {$gte: new Date(startDate)};
if (endDate) {
$match.date = $match.date || {};
$match.date.$lt = new Date(endDate);
}
return mongo.Activities.aggregate([
{$match},
{$group: {
_id: {owner: '$owner', group: '$group'},
amount: {$sum: '$amount'}
}}
]).exec().then((data) => {
return _.reduce(data, (acc, { _id, amount }) => {
const {owner, group} = _id;
acc[owner] = _.merge(acc[owner] || {}, { [group]: amount });
return acc;
}, {});
});
}
static detail({startDate, endDate}) {
const $match = { };
if (startDate)
$match.date = {$gte: new Date(startDate)};
if (endDate) {
$match.date = $match.date || {};
$match.date.$lt = new Date(endDate);
}
return mongo.Activities.aggregate([
{$match},
{$group: {_id: {owner: '$owner', action: '$action'}, total: {$sum: '$amount'}}}
]).exec().then((data) => {
return _.reduce(data, (acc, { _id, total }) => {
const {owner, action} = _id;
acc[owner] = _.merge(acc[owner] || {}, { [action]: total });
return acc;
}, {});
});
}
}
return ActivitiesService;
};