@shopify/shopify-app-remix
Version:
Shopify Remix - to simplify the building of Shopify Apps with Remix
33 lines (25 loc) • 1.05 kB
text/typescript
import {AuthScopes, Session} from '@shopify/shopify-api';
import type {BasicParams} from '../../../types';
import {redirectToInstallPage} from '../helpers/redirect-to-install-page';
import {AdminApiContext} from '../../../clients';
import {fetchScopeDetail} from './client/fetch-scopes-details';
export function requestScopesFactory(
params: BasicParams,
session: Session,
admin: AdminApiContext,
) {
return async function requestScopes(scopes: string[]) {
const {logger} = params;
logger.debug('Requesting optional scopes: ', {shop: session.shop, scopes});
if (scopes.length === 0) return;
if (await alreadyGranted(scopes, admin)) return;
throw await redirectToInstallPage(params, session.shop, scopes);
};
async function alreadyGranted(scopes: string[], admin: AdminApiContext) {
const scopesDetail = await fetchScopeDetail(admin);
const grantedScopes = scopesDetail.app.installation.accessScopes.map(
(scope) => scope.handle,
);
return new AuthScopes(grantedScopes).has(scopes);
}
}