Vulcan/packages/example-forum/lib/modules/posts/helpers.js
2017-09-15 10:08:23 +02:00

177 lines
4.6 KiB
JavaScript

/*
Posts helpers
*/
import moment from 'moment';
import Posts from './collection.js';
import Users from 'meteor/vulcan:users';
import { Utils, getSetting } from 'meteor/vulcan:core';
//////////////////
// Link Helpers //
//////////////////
/**
* @summary Return a post's link if it has one, else return its post page URL
* @param {Object} post
*/
Posts.getLink = function (post, isAbsolute = false, isRedirected = true) {
const url = isRedirected ? Utils.getOutgoingUrl(post.url) : post.url;
return !!post.url ? url : Posts.getPageUrl(post, isAbsolute);
};
/**
* @summary Depending on the settings, return either a post's URL link (if it has one) or its page URL.
* @param {Object} post
*/
Posts.getShareableLink = function (post) {
return getSetting('outsideLinksPointTo', 'link') === 'link' ? Posts.getLink(post) : Posts.getPageUrl(post, true);
};
/**
* @summary Whether a post's link should open in a new tab or not
* @param {Object} post
*/
Posts.getLinkTarget = function (post) {
return !!post.url ? '_blank' : '';
};
/**
* @summary Get URL of a post page.
* @param {Object} post
*/
Posts.getPageUrl = function(post, isAbsolute = false){
const prefix = isAbsolute ? Utils.getSiteUrl().slice(0,-1) : '';
return `${prefix}/posts/${post._id}/${post.slug}`;
};
///////////////////
// Other Helpers //
///////////////////
/**
* @summary Get a post author's name
* @param {Object} post
*/
Posts.getAuthorName = function (post) {
var user = Users.findOne(post.userId);
if (user) {
return Users.getDisplayName(user);
} else {
return post.author;
}
};
/**
* @summary Get default status for new posts.
* @param {Object} user
*/
Posts.getDefaultStatus = function (user) {
const canPostApproved = typeof user === 'undefined' ? false : Users.canDo(user, 'posts.new.approved');
if (!getSetting('requirePostsApproval', false) || canPostApproved) {
// if user can post straight to 'approved', or else post approval is not required
return Posts.config.STATUS_APPROVED;
} else {
return Posts.config.STATUS_PENDING;
}
};
/**
* @summary Get status name
* @param {Object} user
*/
Posts.getStatusName = function (post) {
return Utils.findWhere(Posts.statuses, {value: post.status}).label;
};
/**
* @summary Check if a post is approved
* @param {Object} post
*/
Posts.isApproved = function (post) {
return post.status === Posts.config.STATUS_APPROVED;
};
/**
* @summary Check if a post is pending
* @param {Object} post
*/
Posts.isPending = function (post) {
return post.status === Posts.config.STATUS_PENDING;
};
/**
* @summary Check to see if post URL is unique.
* We need the current user so we know who to upvote the existing post as.
* @param {String} url
*/
Posts.checkForSameUrl = function (url) {
// check that there are no previous posts with the same link in the past 6 months
var sixMonthsAgo = moment().subtract(6, 'months').toDate();
var postWithSameLink = Posts.findOne({url: url, postedAt: {$gte: sixMonthsAgo}});
return !!postWithSameLink;
};
/**
* @summary When on a post page, return the current post
*/
Posts.current = function () {
return Posts.findOne('foo');
};
/**
* @summary Check to see if a post is a link to a video
* @param {Object} post
*/
Posts.isVideo = function (post) {
return post.media && post.media.type === 'video';
};
/**
* @summary Get the complete thumbnail url whether it is hosted on Embedly or on an external website, or locally in the app.
* @param {Object} post
*/
Posts.getThumbnailUrl = (post) => {
const thumbnailUrl = post.thumbnailUrl;
if (!!thumbnailUrl) {
return thumbnailUrl.indexOf('//') > -1 ? Utils.addHttp(thumbnailUrl) : Utils.getSiteUrl().slice(0,-1) + thumbnailUrl;
}
};
/**
* @summary Get URL for sharing on Twitter.
* @param {Object} post
*/
Posts.getTwitterShareUrl = post => {
const via = getSetting('twitterAccount', null) ? `&via=${getSetting('twitterAccount')}` : '';
return `https://twitter.com/intent/tweet?text=${ encodeURIComponent(post.title) }%20${ encodeURIComponent(Posts.getLink(post, true)) }${via}`;
};
/**
* @summary Get URL for sharing on Facebook.
* @param {Object} post
*/
Posts.getFacebookShareUrl = post => {
return `https://www.facebook.com/sharer/sharer.php?u=${ encodeURIComponent(Posts.getLink(post, true)) }`;
};
/**
* @summary Get URL for sharing by Email.
* @param {Object} post
*/
Posts.getEmailShareUrl = post => {
const subject = `Interesting link: ${post.title}`;
const body = `I thought you might find this interesting:
${post.title}
${Posts.getLink(post, true, false)}
(found via ${getSetting('siteUrl')})
`;
return `mailto:?subject=${encodeURIComponent(subject)}&body=${encodeURIComponent(body)}`;
};