You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
81 lines
2.1 KiB
81 lines
2.1 KiB
// resource.js
|
|
// Copyright (C) 2021 Digital Telepresence, LLC
|
|
// License: Apache-2.0
|
|
|
|
'use strict';
|
|
|
|
const { SiteService } = require('../../lib/site-lib');
|
|
|
|
const mongoose = require('mongoose');
|
|
|
|
const ResourceView = mongoose.model('ResourceView');
|
|
|
|
class ResourceService extends SiteService {
|
|
|
|
constructor (dtp) {
|
|
super(dtp, module.exports);
|
|
this.populateResourceView = [
|
|
{
|
|
path: 'resource',
|
|
},
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Records 24-hour unique view counts for a given resource happening on a
|
|
* given ExpressJS Request. Views are uniqued by stripping time from the
|
|
* current Date, and upserting a tracking object in MongoDB.
|
|
*
|
|
* @param {Request} req
|
|
* @param {String} resourceType 'Post', 'Page', or 'Newsletter'
|
|
* @param {mongoose.Types.ObjectId} resourceId The _id of the object for which
|
|
* a view is being tracked.
|
|
*/
|
|
async recordView (req, resourceType, resourceId) {
|
|
const CURRENT_DAY = new Date();
|
|
CURRENT_DAY.setHours(0, 0, 0, 0);
|
|
|
|
let uniqueKey = req.ip.toString().trim().toLowerCase();
|
|
if (req.user) {
|
|
uniqueKey += `:user:${req.user._id.toString()}`;
|
|
}
|
|
|
|
const response = await ResourceView.updateOne(
|
|
{
|
|
created: CURRENT_DAY,
|
|
resourceType,
|
|
resource: resourceId,
|
|
uniqueKey,
|
|
},
|
|
{
|
|
$inc: { viewCount: 1 },
|
|
},
|
|
{ upsert: true },
|
|
);
|
|
this.log.debug('resource view', { response });
|
|
if (response.upsertedCount > 0) {
|
|
const Model = mongoose.model(resourceType);
|
|
await Model.updateOne(
|
|
{ _id: resourceId },
|
|
{
|
|
$inc: { 'stats.totalViewCount': 1 },
|
|
},
|
|
);
|
|
}
|
|
}
|
|
|
|
async remove (resourceType, resource) {
|
|
this.log.debug('removing resource view records', { resourceType, resourceId: resource._id });
|
|
await ResourceView.deleteMany({ resource: resource._id });
|
|
|
|
this.log.debug('removing resource', { resourceType, resourceId: resource._id });
|
|
const Model = mongoose.model(resourceType);
|
|
await Model.deleteOne({ _id: resource._id });
|
|
}
|
|
}
|
|
|
|
module.exports = {
|
|
slug: 'resource',
|
|
name: 'resource',
|
|
create: (dtp) => { return new ResourceService(dtp); },
|
|
};
|