Updating Avada Core V3
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
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àmprepareShopData
, 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
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
:
// packages/functions/src/helpers/auth.js
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;
}