Skip to content
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
const moment = require('moment')

const campaignsLib = require('../../lib/campaigns')
const eventsLib = require('../../lib/events')

Expand Down Expand Up @@ -72,6 +74,10 @@ module.exports = {
return t('api/access/resolvers/AccessGrant/status/unclaimed')
}

if (grant.beginAt && moment(grant.beginAt).isAfter(moment())) {
return t('api/access/resolvers/AccessGrant/status/pending')
}

return t('api/access/resolvers/AccessGrant/status/valid')
},
events: (grant, args, { user: me, pgdb }) => {
Expand Down
14 changes: 12 additions & 2 deletions packages/backend-modules/access/graphql/resolvers/User.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,19 @@ module.exports = {

const grants = await grantsLib.findByRecipient(user, { withPast, pgdb })

debug('accessGrants', { user: user.id, grants: grants.length })
// include grants which were requested but begin in the future
// (campaigns with a grantBeginInterval); withPast already covers them
const pendingGrants = withPast
? []
: await grantsLib.findPendingByRecipient(user, { pgdb })

debug('accessGrants', {
user: user.id,
grants: grants.length,
pendingGrants: pendingGrants.length,
})

return grants
return [...pendingGrants, ...grants]
},
accessCampaigns: async (user, { withPast }, { user: me, pgdb }) => {
if (!Roles.userIsMeOrInRoles(user, me, PRIVILEDGED_ROLES)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@ const debug = require('debug')('access:mutation:claimAccess')

const { ensureSignedIn } = require('@orbiting/backend-modules-auth')

const { claim } = require('../../../lib/grants')
const { claim, ensureUserHasNoActiveMembershipOrSubscription } = require('../../../lib/grants')

module.exports = async (
_,
{ voucherCode, payload },
{ req, user, pgdb, redis, t, mail },
) => {
ensureSignedIn(req)
await ensureUserHasNoNewSubscription(user, pgdb, t)
await ensureUserHasNoActiveMembershipOrSubscription(user, pgdb, t)
debug('begin', { voucherCode, user: user.id })

const transaction = await pgdb.transactionBegin()
Expand Down Expand Up @@ -39,18 +39,3 @@ module.exports = async (
}
}

async function ensureUserHasNoNewSubscription(user, pgdb, t) {
const result = await pgdb.payments.subscriptions.findFirst(
{
userId: user.id,
status: ['active', 'past_due', 'unpaid', 'paused'],
},
{ fields: ['id'] },
)

if (result) {
throw new Error(
t('api/access/claim/can-not-claim-access-with-active-subscription'),
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,15 @@ const debug = require('debug')('access:mutation:requestAccess')

const { ensureSignedIn } = require('@orbiting/backend-modules-auth')

const { request } = require('../../../lib/grants')
const { request, ensureUserHasNoActiveMembershipOrSubscription } = require('../../../lib/grants')

module.exports = async (
_,
{ campaignId, payload },
{ req, user, pgdb, redis, t, mail },
) => {
ensureSignedIn(req)
await ensureUserHasNoActiveMembershipOrSubscription(user, pgdb, t)
debug('begin', { campaignId, user: user.id })

const transaction = await pgdb.transactionBegin()
Expand Down Expand Up @@ -37,3 +38,4 @@ module.exports = async (
throw e
}
}

26 changes: 26 additions & 0 deletions packages/backend-modules/access/lib/AccessScheduler.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ const init = async (context) => {
1000 * intervalSecs,
)

await activateDeferredGrants(t, pgdb, redis, mail)
await recommendations(t, pgdb, mail)
await expireGrants(t, pgdb, mail)
await followupGrants(t, pgdb, mail)
Expand Down Expand Up @@ -79,6 +80,31 @@ const init = async (context) => {

module.exports = { init }

/**
* Activates begun grants whose activation was deferred by a campaign's
* grantBeginInterval: applies perks, member role and onboarding emails
* once beginAt is reached.
*/
const activateDeferredGrants = async (t, pgdb, redis, mail) => {
debug('activateGrants...')
for (const grant of await grantsLib.findUnactivatedDeferred(pgdb)) {
const transaction = await pgdb.transactionBegin()

try {
await grantsLib.activateGrant(grant, t, transaction, redis, mail)
await transaction.transactionCommit()
} catch (e) {
await transaction.transactionRollback()

console.error('activateDeferredGrants, grant failed', {
error: e,
grant: grant.id,
})
}
}
debug('activateGrants done')
}

/**
* Sends recommendations on current grants (only for campaigns with active recommendations)
*/
Expand Down
Loading
Loading