Updating Avada Core V3
Avada Core package V1
Section titled “Avada Core package V1”Gần đây mọi người cũng đã update package @avada/core sang bản 3.3.17 để 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
Section titled “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
Section titled “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
Section titled “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ênconst {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à đủ
Section titled “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àmprepareShopData, không lấy trực tiếp nữa
Task update của Air Reviews trên Trello: https://trello.com/c/kqNHOQhJ
Get shop data from api
Section titled “Get shop data from api”Trong các endpoint của api hoặc apiSa đều đi qua middleware verifyEmbedRequest, để lấy shop data thay vì lấy
shopId rồi đọc từ db, thì gọi getCurrentShopData:
import {formatDateFields} from '@avada/firestore-utils';
/** * Get current shop id from Koa context * Shop ID was set from authentication step in Shopify login * * @param {object} ctx * @return {string} */export function getCurrentShop(ctx) { return ctx.state.user.shopID;}
/** * Get current shop id from Koa context * * @param ctx * @returns {*} */export function getCurrentUserInstance(ctx) { return ctx.state.user;}
/** * Get current shop data from Koa context * * @param ctx * @returns {*} */export function getCurrentShopData(ctx) { const shopData = ctx.state.user.shopData; if (!shopData) return null;
return formatDateFields(ctx.state.user.shopData);}
/** * Get current shopify session from Koa context * * @param ctx * @returns {*} */export function getCurrentSession(ctx) { return ctx.state.shopifySession;}