commerce/lib/sfcc/scapi.ts
Alex 83856a4941 Squashed commit of the following:
commit 408d6eb7583470eb84fd0e85895f97dad864b981
Author: Alex <alex.hawley@vercel.com>
Date:   Wed Sep 4 21:28:45 2024 -0500

    added content

commit af62089872de543c8f741c3092f431a8b790feec
Author: Alex <alex.hawley@vercel.com>
Date:   Wed Sep 4 20:43:02 2024 -0500

    fixed product recommendations

commit 5c921be7b1eab4ea3b4acc922d2bde842bb0c5c8
Author: Alex <alex.hawley@vercel.com>
Date:   Wed Sep 4 20:33:28 2024 -0500

    fixed cart total

commit 63e150e822ab0b4f7690221ee5d1eafaaf5f930a
Author: Alex <alex.hawley@vercel.com>
Date:   Wed Sep 4 20:14:47 2024 -0500

    fixed update cart

commit 85bd6bee403e19c7b3f66c0d6e938a8432cee62b
Author: Alex <alex.hawley@vercel.com>
Date:   Wed Sep 4 19:00:42 2024 -0500

    remove unnecessary cookie usage from sfcc calls

commit 2401bed81143508993fdd403d9d5a419ac8904e5
Author: Alex <alex.hawley@vercel.com>
Date:   Wed Sep 4 18:55:39 2024 -0500

    fixed issue with broken getCart

commit f8cc8c3c3c1c64d7cf4b69a60ed87497ad626e65
Author: Alex <alex.hawley@vercel.com>
Date:   Wed Sep 4 18:23:03 2024 -0500

    updated lib/sfcc for guest tokens

commit bd6129e3ca15125c87c8186e9ff27d835fb2f683
Author: Alex <alex.hawley@vercel.com>
Date:   Wed Sep 4 15:19:40 2024 -0500

    added now required channel_id

commit eeb805fd11219d8512c1cadefe047019d63d4b60
Author: Alex <alex.hawley@vercel.com>
Date:   Tue Sep 3 17:43:27 2024 -0500

    split out scapi

commit e4f3bb1c827137245367152c1ff0401db76e7082
Author: Alex <alex.hawley@vercel.com>
Date:   Tue Sep 3 16:55:11 2024 -0500

    carried over sfcc work

commit 2616869f56f330f44ad3dfff9ad488eaaf1dbe51
Author: Alex <alex.hawley@vercel.com>
Date:   Thu Aug 22 15:03:30 2024 -0400

    initial sfcc work
2024-09-04 21:47:12 -05:00

56 lines
1.8 KiB
TypeScript

import { Collection } from './types';
import { ExtractVariables, salesforceFetch } from './utils';
export async function scapiFetch<T>(options: {
method: 'POST' | 'GET';
apiEndpoint: string;
cache?: RequestCache;
headers?: HeadersInit;
tags?: string[];
variables?: ExtractVariables<T>;
}): Promise<{ status: number; body: T } | never> {
const scapiDomain = `https://${process.env.SFCC_SHORTCODE}.api.commercecloud.salesforce.com`;
const apiEndpoint = `${scapiDomain}${options.apiEndpoint}?siteId=${process.env.SFCC_SITEID}`;
return salesforceFetch<T>({
...options,
apiEndpoint
});
}
export async function fetchAccessToken() {
const response = await scapiFetch<{ access_token: string }>({
method: 'POST',
apiEndpoint: `/shopper/auth/v1/organizations/${process.env.SFCC_ORGANIZATIONID}/oauth2/token?grant_type=client_credentials&channel_id=${process.env.SFCC_SITEID}`,
headers: {
Authorization: `Basic ${Buffer.from(
`${process.env.SFCC_CLIENT_ID}:${process.env.SFCC_SECRET}`
).toString('base64')}`,
'content-type': 'application/x-www-form-urlencoded'
}
});
if (response.status !== 200 || !response.body.access_token) {
throw new Error('Failed to fetch access token');
}
return response.body.access_token;
}
export async function fetchCollection(handle: string): Promise<Collection | undefined> {
const accessToken = await fetchAccessToken();
const response = await scapiFetch<Collection>({
method: 'GET',
apiEndpoint: `/product/shopper-products/v1/organizations/${process.env.SFCC_ORGANIZATIONID}/products/${handle}`,
headers: {
Authorization: `Bearer ${accessToken}`
}
});
if (response.status !== 200) {
throw new Error('Failed to fetch collection');
}
return response.body;
}