Skip to main content

Updating Avada Core V3

Avada Core package V1

Gần đây mọi người cũng đã update package @avada/core sang bản 1.1.5 để deprecate các package @avada/shopify-auth, @avada/shopify-charge, @avada/subscription và sử dụng 1 package @avada/core duy nhất. Sau khi merge các package rồi, mình sẽ cần update @avada/core lên bản 3 để hash các accessToken để đảm bảo Protected Customer Data của Shopify tốt nhất. Xem về guide nội bộ về Protected Customer Data ở đây: https://avada-development.web.app/getting-started-shopify/#shopify-protected-data---2022-07-api-version

Avada Core V3

Bản core v3 này sẽ có update lớn ở phần hashing accessToken admin API của shop. Access Token được gen thường sẽ lưu vào field accessToken, bây giờ sẽ được hashe và lưu vào field accessTokenHash, salt của hash này sẽ lưu vào function config. Hash này ở mỗi trường staging, local mọi đều để là shopify.access_token_key với giá trị: avada-apps-access-token nhé.
Ở trên staging để là firebase functions:config:set shopify.access_token_key="avada-apps-access-token", còn production là hash riêng.

Để đọc được sẽ cần dùng hàm import {prepareShopData} from '@avada/core'; để đọc ví dụ:

/**
* Create Shopify instance with the latest API version and auto limit enabled
*
* @param {Shop} shopData
* @param {string} apiVersion
* @return {Shopify}
*/
export function initShopify(shopData, apiVersion = API_VERSION) {
const shopParsedData = prepareShopData(shopData.id, shopData, shopifyConfig.accessTokenKey);
const {shopifyDomain, accessToken} = shopParsedData;

return new Shopify({
shopName: shopifyDomain,
accessToken,
apiVersion,
autoLimit: true
});
}

Lưu ý khi update v3

Chuẩn các hàm initShopify, hoặc những hàm gọi API qua GraphQL về nhận cả shop data

// Nên để
const shop = await getShopByField(shopifyDomain);
const shopify = initShopify(shop);

// Không nên, update qua cách trên
const {accessToken, shopifyDomain} = await getShopByField(shopifyDomain);
const shopify = initShopify({accessToken, shopifyDomain});

Có gắng chỉ cần sửa ở 2 hàm initShopify và makeGraphQLApi là đủ

2 hàm này là cần lấy ra accessToken nên là cố gắng chỉ cần gọi prepareShopData để xử lí trong đây để sửa được hạn chế, không phải nhiều chỗ.

/**
*
* @param graphqlQuery
* @param shopifyDomain
* @param accessToken
* @param accessTokenHash
* @param maxRetries
* @param apiVersion
* @returns {Promise<{data: *, errors?: [], extensions: {cost: {}}}>}
*/
export async function makeGraphQlApi(
{graphqlQuery, shopifyDomain, accessToken, accessTokenHash},
{apiVersion = API_VERSION, maxRetries = 5} = {}
) {
const parsedShop = prepareShopData(
null,
{shopifyDomain, accessToken, accessTokenHash},
shopifyConfig.accessTokenKey
);
const url = `https://${shopifyDomain}/admin/api/${apiVersion}/graphql.json`;
const headers = {
'Content-Type': 'application/json',
'X-Shopify-Access-Token': parsedShop.accessToken
};
const handler = () => api(url, graphqlQuery, 'POST', {}, {headers});

return await shopifyRetryGraphQL(handler, {maxRetries});
}

M.n sau mọi chỗ cần dùng đến accessToken đều cần qua 2 hàm initShopify và makeGraphQlApi hoặc phải sử dụng hàm prepareShopData, không lấy trực tiếp nữa

Mẫu

Task update của Air Reviews trên Trello: https://trello.com/c/kqNHOQhJ