UNPKG

@shopify/shopify-api

Version:

Shopify API Library for Node - accelerate development with support for authentication, graphql proxy, webhooks

138 lines (134 loc) 4.69 kB
'use strict'; var error = require('../error.js'); var client = require('../clients/admin/graphql/client.js'); require('@shopify/admin-api-client'); require('lossless-json'); require('../types.js'); require('compare-versions'); var check = require('./check.js'); var utils = require('./utils.js'); const CREATE_USAGE_RECORD_MUTATION = ` mutation appUsageRecordCreate($description: String!, $price: MoneyInput!, $subscriptionLineItemId: ID!) { appUsageRecordCreate(description: $description, price: $price, subscriptionLineItemId: $subscriptionLineItemId) { userErrors { field message } appUsageRecord { id description idempotencyKey price { amount currencyCode } subscriptionLineItem { id plan { pricingDetails { ... on AppUsagePricing { balanceUsed { amount currencyCode } cappedAmount { amount currencyCode } terms } } } } } } } `; function createUsageRecord(config) { return async function createUsageRecord(usageRecordInfo) { const { session, subscriptionLineItemId, description, price, idempotencyKey, isTest = true, } = usageRecordInfo; const GraphqlClient = client.graphqlClientClass({ config }); const client$1 = new GraphqlClient({ session }); // If a subscription line item ID is not passed, we will query Shopify // for an active usage subscription line item ID const usageSubscriptionLineItemId = subscriptionLineItemId ? subscriptionLineItemId : await getUsageRecordSubscriptionLineItemId({ client: client$1, isTest }); const variables = { description, price, subscriptionLineItemId: usageSubscriptionLineItemId, }; if (idempotencyKey) { variables.idempotencyKey = idempotencyKey; } try { const response = await client$1.request(CREATE_USAGE_RECORD_MUTATION, { variables, }); if (response.data?.appUsageRecordCreate?.userErrors.length) { throw new error.BillingError({ message: 'Error while creating a usage record', errorData: response.data?.appUsageRecordCreate?.userErrors, }); } const appUsageRecord = response.data?.appUsageRecordCreate?.appUsageRecord; utils.convertAppRecurringPricingMoney(appUsageRecord.price); utils.convertAppUsagePricingMoney(appUsageRecord.subscriptionLineItem.plan.pricingDetails); return appUsageRecord; } catch (error$1) { if (error$1 instanceof error.GraphqlQueryError) { throw new error.BillingError({ message: error$1.message, errorData: error$1.response?.errors, }); } else { throw error$1; } } }; } async function getUsageRecordSubscriptionLineItemId({ client, isTest, }) { const payments = await check.assessPayments({ client, isTest }); if (!payments.hasActivePayment) { throw new error.BillingError({ message: 'No active payment found', errorData: [], }); } if (!payments.appSubscriptions.length) { throw new error.BillingError({ message: 'No active subscriptions found', errorData: [], }); } if (payments.appSubscriptions) { const usageSubscriptionLineItemId = getUsageLineItemId(payments.appSubscriptions); return usageSubscriptionLineItemId; } throw new error.BillingError({ message: 'Unable to find active subscription line item', errorData: [], }); } function getUsageLineItemId(subscriptions) { for (const subscription of subscriptions) { // An app can have only one active subscription if (subscription.status === 'ACTIVE' && subscription.lineItems) { // An app can have only one usage subscription line item for (const lineItem of subscription.lineItems) { if ('balanceUsed' in lineItem.plan.pricingDetails) { return lineItem.id; } } } } throw new error.BillingError({ message: 'No active usage subscription found', errorData: [], }); } exports.createUsageRecord = createUsageRecord; //# sourceMappingURL=create-usage-record.js.map