signup-reward.js 767 Bytes
import { BillingAction } from './action-policies.js'

/** @param {{ actionPolicies:{ find:Function }, grant:Function }} billing */
export function createSignupReward(billing) {
  async function apply({ user_id }) {
    const policy = await billing.actionPolicies.find(BillingAction.SIGNUP_REWARD)
    if (policy === null || !policy.enabled) return { applied: false }

    const result = await billing.grant({
      user_id,
      amount: policy.points,
      source: 'visual_game_signup',
      credit_kind: 'admin',
      reason: 'signup_gift',
      idempotency_key: `signup_reward:${user_id}`,
    })
    return {
      applied: true,
      replayed: result.replayed,
      points: policy.points,
      ledger_id: result.ledger_id,
    }
  }

  return { apply }
}