Files
DiceCloud/app/imports/api/users/patreon/tiers.js
2020-07-17 23:31:12 +02:00

90 lines
2.0 KiB
JavaScript

import { findLast } from 'lodash';
import getEntitledCents from '/imports/api/users/patreon/getEntitledCents.js';
import Invites from '/imports/api/users/Invites.js';
const TIERS = [
{
name: 'Commoner',
minimumEntitledCents: 0,
invites: 0,
paidBenefits: false,
}, {
name: 'Dreamer',
minimumEntitledCents: 100,
invites: 0,
paidBenefits: false,
}, {
name: 'Wanderer',
minimumEntitledCents: 300,
invites: 0,
paidBenefits: false,
}, {
//cost per user $5
name: 'Adventurer',
minimumEntitledCents: 500,
invites: 0,
paidBenefits: true,
}, {
//cost per user $3.33
name: 'Hero',
minimumEntitledCents: 1000,
invites: 2,
paidBenefits: true,
}, {
//cost per user $3.333
name: 'Legend',
minimumEntitledCents: 2000,
invites: 5,
paidBenefits: true,
}, {
//cost per user $3.125
name: 'Paragon',
minimumEntitledCents: 5000,
invites: 15,
paidBenefits: true,
},
];
const GUEST_TIER = {
name: 'Companion',
guest: true,
invites: 0,
paidBenefits: true,
}
export function getTierByEntitledCents(entitledCents = 0){
return findLast(TIERS, tier => entitledCents >= tier.minimumEntitledCents);
}
export function getUserTier(user){
if (!user) throw 'user must be provided';
if (typeof user === 'string'){
user = Meteor.users.findOne(user, {
fields: {
'services.patreon': 1,
}
});
if (!user) throw 'User not found';
}
const entitledCents = getEntitledCents(user);
const tier = getTierByEntitledCents(entitledCents);
if (tier.paidBenefits) return tier;
let invite = Invites.findOne({invitee: user._id, isFunded: true});
if (invite){
return GUEST_TIER;
} else {
return tier;
}
}
export function assertUserHasPaidBenefits(user){
let tier = getUserTier(user);
if (!tier.paidBenefits){
throw new Meteor.Error('Creatures.methods.insert.denied',
`The ${tier.name} tier does not allow you to insert a creature`);
}
}
export default TIERS;
export { GUEST_TIER };