UNPKG

shopee-v2-api

Version:

1,360 lines (1,216 loc) 37 kB
/* -------------------------------------------------------------------------- */ /* Imports */ /* -------------------------------------------------------------------------- */ const _ = require('lodash'); /* -------------------------------------------------------------------------- */ /* Constants */ /* -------------------------------------------------------------------------- */ const { constants } = require('./constants'); /* -------------------------------------------------------------------------- */ /* Common / Auth */ /* -------------------------------------------------------------------------- */ const { buildSignKey, buildUrl, get, post, RefreshToken } = require('./auth'); /* -------------------------------------------------------------------------- */ /* API */ /* -------------------------------------------------------------------------- */ exports.ItemLimit = async (userShop) => { try { // access token 유효 확인 let { shop_id, accessToken } = await RefreshToken(userShop); // uri const uri = '/api/v2/product/get_item_limit'; // sign key const { signKey, currentTimeStamp } = buildSignKey(uri, accessToken, shop_id); // url const url = buildUrl(uri, { partner_id: constants.partnerId, timestamp: currentTimeStamp, sign: signKey, access_token: accessToken, shop_id: shop_id }); // request && response data const responseData = await get(url); if (responseData.response) { return responseData.response; } else { return null; } } catch (err) { throw err; } } /** * 상품 카테고리 목록 조회 * @param {*} userShop * @returns */ exports.GetCategories = async (userShop) => { try { // access token 유효 확인 let { shop_id, accessToken } = await RefreshToken(userShop); // uri const uri = '/api/v2/product/get_category'; // sign key const { signKey, currentTimeStamp } = buildSignKey(uri, accessToken, shop_id); // url const url = buildUrl(uri, { partner_id: constants.partnerId, timestamp: currentTimeStamp, sign: signKey, access_token: accessToken, shop_id: shop_id }); // request && response data const responseData = await get(url); if (responseData.response && responseData.response.category_list) { return responseData.response.category_list.map((category) => ({ category_id: category.category_id, parent_id: category.parent_category_id, category_name: category.original_category_name, has_children: category.has_children, country: userShop.country, marketPlace: userShop.marketPlace })); } else { return []; } } catch (err) { throw err; } } /** * 속성 정보 조회 * @param {*} userShop * @param {*} queries * @returns */ exports.GetAttributes = async (userShop, queries) => { try { // access token 유효 확인 let { shop_id, accessToken } = await RefreshToken(userShop); // uri const uri = '/api/v2/product/get_attributes'; // sign key const { signKey, currentTimeStamp } = buildSignKey(uri, accessToken, shop_id); // url const url = buildUrl(uri, _.assign({ partner_id: constants.partnerId, timestamp: currentTimeStamp, sign: signKey, access_token: accessToken, shop_id: shop_id }, queries)); // request && response data const responseData = await get(url); if (responseData.response && responseData.response.attribute_list) { return responseData.response.attribute_list; } else { return []; } } catch (err) { throw err; } } /** * 브랜드 목록 * @param {*} userShop * @param {*} queries * @returns */ exports.GetBrandList = async (userShop, queries) => { try { // access token 유효 확인 let { shop_id, accessToken } = await RefreshToken(userShop); // uri const uri = '/api/v2/product/get_brand_list'; // sign key const { signKey, currentTimeStamp } = buildSignKey(uri, accessToken, shop_id); let brandAttribute = {}; let hasMore = true; let offset = 0; while (hasMore) { // url const url = buildUrl(uri, _.assign({ partner_id: constants.partnerId, timestamp: currentTimeStamp, sign: signKey, access_token: accessToken, shop_id: shop_id }, _.assign( queries, { page_size: 100, status: 1, offset: offset } ))); // request && response data const responseData = await get(url); if (responseData.response && responseData.response.brand_list) { // 브랜드 추가 if (!brandAttribute.brand_list) { brandAttribute.brand_list = []; } brandAttribute.brand_list = brandAttribute.brand_list.concat(responseData.response.brand_list); brandAttribute = _.assign(brandAttribute, { is_mandatory: responseData.response.is_mandatory, input_type: responseData.response.input_type, }); hasMore = responseData.response.has_next_page; offset = responseData.response.next_offset; } else { hasMore = false; } } return brandAttribute; } catch (err) { throw err; } } /** * 추천 카테고리 * @param {*} userShop * @param {*} itemName * @returns */ exports.GetRecommendCats = async (userShop, itemName) => { try { // access token 유효 확인 let { shop_id, accessToken } = await RefreshToken(userShop); // uri const uri = '/api/v2/product/category_recommend'; // sign key const { signKey, currentTimeStamp } = buildSignKey(uri, accessToken, shop_id); // url const url = buildUrl(uri, { partner_id: constants.partnerId, timestamp: currentTimeStamp, sign: signKey, access_token: accessToken, shop_id: shop_id, item_name: encodeURIComponent(itemName) }); // request && response data const responseData = await get(url); // 데이터 형식 변경 if (responseData.response && responseData.response.category_id) { return responseData.response.category_id; } else { return []; } } catch (err) { throw err; } } /** * 속성 추천 * @param {*} userShop * @param {*} itemName * @param {*} categoryId * @returns */ exports.GetRecommendAttribute = async (userShop, itemName, categoryId) => { try { // access token 유효 확인 let { shop_id, accessToken } = await RefreshToken(userShop); // uri const uri = '/api/v2/product/get_recommend_attribute'; // sign key const { signKey, currentTimeStamp } = buildSignKey(uri, accessToken, shop_id); // url const url = buildUrl(uri, { partner_id: constants.partnerId, timestamp: currentTimeStamp, sign: signKey, access_token: accessToken, shop_id: shop_id, item_name: encodeURIComponent(itemName), category_id: categoryId }); // request && response data const responseData = await get(url); // 데이터 형식 변경 return responseData.response; } catch (err) { throw err; } } /** * DTS 조회 * @param {*} userShop * @param {*} category_id * @returns */ exports.GetDTSLimit = async (userShop, category_id) => { try { // access token 유효 확인 let { shop_id, accessToken } = await RefreshToken(userShop); // uri const uri = '/api/v2/product/get_dts_limit'; // sign key const { signKey, currentTimeStamp } = buildSignKey(uri, accessToken, shop_id); // url const url = buildUrl(uri, { partner_id: constants.partnerId, timestamp: currentTimeStamp, sign: signKey, access_token: accessToken, shop_id: shop_id, category_id: category_id }); // request && response data const responseData = await get(url); // 데이터 형식 변경 if (responseData.response && responseData.response.days_to_ship_limit) { return responseData.response; } else { return null; } } catch (err) { throw err; } } /** * 사이즈 차트 지원 유무 * @param {*} userShop * @param {*} category_id * @returns */ exports.GetSupportSizeChart = async (userShop, category_id) => { try { // access token 유효 확인 let { shop_id, accessToken } = await RefreshToken(userShop); // uri const uri = '/api/v2/product/support_size_chart'; // sign key const { signKey, currentTimeStamp } = buildSignKey(uri, accessToken, shop_id); // url const url = buildUrl(uri, { partner_id: constants.partnerId, timestamp: currentTimeStamp, sign: signKey, access_token: accessToken, shop_id: shop_id, category_id: category_id }); // request && response data const responseData = await get(url); // 데이터 형식 변경 if (responseData.response) { return responseData.response; } else { return null; } } catch (err) { throw err; } } /** * 사이즈 차트 업데이트 * @param {*} userShop * @param {*} item_id * @param {*} size_chart * @returns */ exports.UpdateSizeChart = async (userShop, item_id, size_chart) => { try { // access token 유효 확인 let { shop_id, accessToken } = await RefreshToken(userShop); // uri const uri = '/api/v2/product/support_size_chart'; // sign key const { signKey, currentTimeStamp } = buildSignKey(uri, accessToken, shop_id); // url const url = buildUrl(uri, { partner_id: constants.partnerId, timestamp: currentTimeStamp, sign: signKey, access_token: accessToken, shop_id: shop_id, }); // request && response data const responseData = await post(url, JSON.stringify({ item_id: item_id, size_chart: size_chart })); // 데이터 형식 변경 if (responseData.request_id) { return true; } else { return null; } } catch (err) { throw err; } } /** * 상품 등록 * @param {*} userShop * @param {*} item * @returns */ exports.AddItem = async (userShop, item) => { try { // access token 유효 확인 let { shop_id, accessToken } = await RefreshToken(userShop); // uri const uri = '/api/v2/product/add_item'; // sign key const { signKey, currentTimeStamp } = buildSignKey(uri, accessToken, shop_id); // url const url = buildUrl(uri, { partner_id: constants.partnerId, timestamp: currentTimeStamp, sign: signKey, access_token: accessToken, shop_id: shop_id, }); // request && response data const responseData = await post(url, JSON.stringify(item)); // 데이터 형식 변경 if (responseData.response) { return responseData.response; } else { return responseData; } } catch (err) { throw err; } } /** * 상품 수정 * @param {*} userShop * @param {*} item * @returns */ exports.UpdateItem = async (userShop, item) => { try { // access token 유효 확인 let { shop_id, accessToken } = await RefreshToken(userShop); // uri const uri = '/api/v2/product/update_item'; // sign key const { signKey, currentTimeStamp } = buildSignKey(uri, accessToken, shop_id); // url const url = buildUrl(uri, { partner_id: constants.partnerId, timestamp: currentTimeStamp, sign: signKey, access_token: accessToken, shop_id: shop_id, }); // request && response data const responseData = await post(url, JSON.stringify(item)); return responseData.response; } catch (err) { throw err; } } /** * 상품 삭제 * @param {*} userShop * @param {*} item_id * @returns */ exports.DeleteItem = async (userShop, itemId) => { try { // access token 유효 확인 let { shop_id, accessToken } = await RefreshToken(userShop); // uri const uri = '/api/v2/product/delete_item'; // sign key const { signKey, currentTimeStamp } = buildSignKey(uri, accessToken, shop_id); // url const url = buildUrl(uri, { partner_id: constants.partnerId, timestamp: currentTimeStamp, sign: signKey, access_token: accessToken, shop_id: shop_id, }); // request && response data const responseData = await post(url, JSON.stringify({ item_id: itemId })); // 데이터 형식 변경 if (responseData.request_id) { return true; } else { return null; } } catch (err) { throw err; } } /** * 가격 수정 * @param {*} userShop * @param {*} itemId * @param {*} priceList * @returns */ exports.UpdatePrice = async (userShop, itemId, priceList) => { try { // access token 유효 확인 let { shop_id, accessToken } = await RefreshToken(userShop); // uri const uri = '/api/v2/product/update_price'; // sign key const { signKey, currentTimeStamp } = buildSignKey(uri, accessToken, shop_id); // url const url = buildUrl(uri, { partner_id: constants.partnerId, timestamp: currentTimeStamp, sign: signKey, access_token: accessToken, shop_id: shop_id, }); // request && response data const responseData = await post(url, JSON.stringify({ item_id: itemId, price_list: priceList // model_id, original_price })); // 데이터 형식 변경 return responseData.response } catch (err) { throw err; } } /** * 재고 수정 * @param {*} userShop * @param {*} itemId * @param {*} stockList * @returns */ exports.UpdateStock = async (userShop, itemId, stockList) => { try { // access token 유효 확인 let { shop_id, accessToken } = await RefreshToken(userShop); // uri const uri = '/api/v2/product/update_stock'; // sign key const { signKey, currentTimeStamp } = buildSignKey(uri, accessToken, shop_id); // url const url = buildUrl(uri, { partner_id: constants.partnerId, timestamp: currentTimeStamp, sign: signKey, access_token: accessToken, shop_id: shop_id, }); const responseData = await post(url, JSON.stringify({ item_id: itemId, stock_list: stockList // model_id, normal_stock })); return responseData.response } catch (err) { throw err; } } /** * 상품 목록 * @param {*} userShop * @param {*} offset * @param {*} itemPerPage * @returns */ exports.GetItemList = async (userShop, offset, itemPerPage) => { try { // access token 유효 확인 let { shop_id, accessToken } = await RefreshToken(userShop); // uri const uri = '/api/v2/product/get_item_list'; // sign key const { signKey, currentTimeStamp } = buildSignKey(uri, accessToken, shop_id); // url const url = buildUrl(uri, { partner_id: constants.partnerId, timestamp: currentTimeStamp, sign: signKey, access_token: accessToken, shop_id: shop_id, offset: offset, page_size: itemPerPage, item_status: ['NORMAL'] }); // requests && response data const responseData = await get(url); if (responseData.response) { return responseData.response; } else { return null; } } catch (err) { throw err; } } /** * 상품 상세 정보 * @param {*} userShop * @returns */ exports.GetItemDetail = async (userShop, itemId) => { try { // access token 유효 확인 let { shop_id, accessToken } = await RefreshToken(userShop); // uri const uri = '/api/v2/product/get_item_base_info'; // sign key const { signKey, currentTimeStamp } = buildSignKey(uri, accessToken, shop_id); // url const url = buildUrl(uri, { partner_id: constants.partnerId, timestamp: currentTimeStamp, sign: signKey, access_token: accessToken, shop_id: shop_id, item_id_list: [itemId] }); // requests && response data const responseData = await get(url); // 데이터 형식 변경 if (responseData.response && responseData.response.item_list) { return responseData.response.item_list.map((item) => { // attributes let attributes = []; attributes.push({ attributes_id: 0, attribute_name: 'Brand', value_id: item.brand.brand_id, value: item.brand.original_brand_name }); if (item.attribute_list) { item.attribute_list.map((attribute) => { attributes.push({ attribute_id: attribute.attribute_id, attribute_name: attribute.original_attribute_name, value_list: attribute.attribute_value_list.map((value) => ({ value_id: value.value_id, value: value.original_value_name, value_unit: value.value_unit })) }); }); } // item return { item_id: item.item_id, category_id: item.category_id, name: item.item_name, description: item.description, item_sku: item.item_sku, status: item.item_status, create_time: item.create_time, update_time: item.update_time, price: item.price_info && item.price_info.length > 0 ? item.price_info[0].current_price : 0, stock: item.stock_info_v2 && item.stock_info_v2.seller_stock.length > 0 ? item.stock_info_v2.seller_stock[0].stock : 0, images: item.image.image_url_list, has_variation: item.has_model, promotion_id: item.promotion_id, attributes: attributes, weight: Number(item.weight), logistics: item.logistic_info, item_status: item.item_status } })[0]; } else { return null; } } catch (err) { throw err; } } /** * 상품들 상세 정보 * @param {*} userShop * @returns */ exports.GetItemDetails = async (userShop, itemIds) => { try { // access token 유효 확인 let { shop_id, accessToken } = await RefreshToken(userShop); // uri const uri = '/api/v2/product/get_item_base_info'; // sign key const { signKey, currentTimeStamp } = buildSignKey(uri, accessToken, shop_id); // url const url = buildUrl(uri, { partner_id: constants.partnerId, timestamp: currentTimeStamp, sign: signKey, access_token: accessToken, shop_id: shop_id, item_id_list: itemIds }); // requests && response data const responseData = await get(url); // 데이터 형식 변경 if (responseData.response && responseData.response.item_list) { return responseData.response.item_list.map((item) => { // attributes let attributes = []; attributes.push({ attributes_id: 0, attribute_name: 'Brand', value_id: item.brand.brand_id, value: item.brand.original_brand_name }); if (item.attribute_list) { item.attribute_list.map((attribute) => { attributes.push({ attribute_id: attribute.attribute_id, attribute_name: attribute.original_attribute_name, value_list: attribute.attribute_value_list.map((value) => ({ value_id: value.value_id, value: value.original_value_name, value_unit: value.value_unit })) }); }); } // item return { item_id: item.item_id, category_id: item.category_id, name: item.item_name, description: item.description, item_sku: item.item_sku, status: item.item_status, create_time: item.create_time, update_time: item.update_time, price: item.price_info && item.price_info.length > 0 ? item.price_info[0].current_price : 0, stock: item.stock_info && item.stock_info.length > 0 ? item.stock_info[0].current_stock : 0, images: item.image.image_url_list, has_variation: item.has_model, promotion_id: item.promotion_id, attributes: attributes, weight: Number(item.weight) } }); } else { return null; } } catch (err) { throw err; } } /* -------------------------------- Variation ------------------------------- */ /** * 옵션 조회 * @param {*} userShop * @param {*} itemId * @returns */ exports.GetVariations = async (userShop, itemId) => { try { // access token 유효 확인 let { shop_id, accessToken } = await RefreshToken(userShop); // uri const uri = '/api/v2/product/get_model_list'; // sign key const { signKey, currentTimeStamp } = buildSignKey(uri, accessToken, shop_id); // url const url = buildUrl(uri, { partner_id: constants.partnerId, timestamp: currentTimeStamp, sign: signKey, access_token: accessToken, shop_id: shop_id, item_id: itemId }); // requests && response data const responseData = await get(url); if (responseData.response && responseData.response.model) { return { tier_variation: responseData.response.tier_variation.map((tier) => ({ name: tier.name, options: tier.option_list.map((optionData) => optionData.option), images_url: tier.option_list.map((optionData) => { if (optionData.image && optionData.image.image_url) { return optionData.image.image_url; } else { return null; } }) })), variations: responseData.response.model.map((model) => ({ variation_id: model.model_id, tier_index: model.tier_index, sku: model.model_sku, stock: model.stock_info_v2.summary_info.total_available_stock, price: model.price_info[0].original_price, price_info: model.price_info, discount_id: model.promotion_id })) }; } else { return null; } } catch (err) { throw err; } } /** * 옵션 삭제 * @param {*} userShop * @param {*} itemId * @param {*} modelId * @returns */ exports.DeleteVariation = async (userShop, itemId, modelId) => { try { // access token 유효 확인 let { shop_id, accessToken } = await RefreshToken(userShop); // uri const uri = '/api/v2/product/delete_model'; // sign key const { signKey, currentTimeStamp } = buildSignKey(uri, accessToken, shop_id); // url const url = buildUrl(uri, { partner_id: constants.partnerId, timestamp: currentTimeStamp, sign: signKey, access_token: accessToken, shop_id: shop_id }); // request && response data const responseData = await post(url, JSON.stringify({ item_id: itemId, model_id: modelId })); return responseData; } catch (err) { throw err; } } /** * 옵션 초기화 * @param {*} userShop * @param {*} itemId * @param {*} tierVariation * @param {*} model * @returns */ exports.InitTierVariation = async (userShop, itemId, tierVariation, model) => { try { // access token 유효 확인 let { shop_id, accessToken } = await RefreshToken(userShop); // uri const uri = '/api/v2/product/init_tier_variation'; // sign key const { signKey, currentTimeStamp } = buildSignKey(uri, accessToken, shop_id); // url const url = buildUrl(uri, { partner_id: constants.partnerId, timestamp: currentTimeStamp, sign: signKey, access_token: accessToken, shop_id: shop_id }); // request && response data const responseData = await post(url, JSON.stringify({ item_id: itemId, tier_variation: tierVariation, model: model })); return { item_id: responseData.response.item_id, tier_variation: responseData.response.tier_variation.map((tier) => ({ name: tier.name, options: tier.option_list.map((optionData) => optionData.option), images_url: tier.option_list.map((optionData) => optionData.image_url) })), variations: responseData.response.model.map((model) => ({ variation_id: model.model_id, tier_index: model.tier_index, variation_sku: model.model_sku, stock: model.seller_stock[0].stock, price: model.price_info[0].original_price, promotion_id: model.promotion_id })) }; } catch (err) { throw err; } } /** * 옵션(tier_variation) 정렬 - 추가, 삭제, 수정 * @param {*} userShop * @param {*} itemId * @param {*} tierVariation * @returns */ exports.UpdateTierVariation = async (userShop, itemId, tierVariation) => { try { // access token 유효 확인 let { shop_id, accessToken } = await RefreshToken(userShop); // uri const uri = '/api/v2/product/update_tier_variation'; // sign key const { signKey, currentTimeStamp } = buildSignKey(uri, accessToken, shop_id); // url const url = buildUrl(uri, { partner_id: constants.partnerId, timestamp: currentTimeStamp, sign: signKey, access_token: accessToken, shop_id: shop_id }); // request && response data const responseData = await post(url, JSON.stringify({ item_id: itemId, tier_variation: tierVariation })); return responseData; } catch (err) { throw err; } } /** * 옵션 sku 수정 * @param {*} userShop * @param {*} itemId * @param {*} model * @returns */ exports.UpdateVariation = async (userShop, itemId, model) => { try { // access token 유효 확인 let { shop_id, accessToken } = await RefreshToken(userShop); // uri const uri = '/api/v2/product/update_model'; // sign key const { signKey, currentTimeStamp } = buildSignKey(uri, accessToken, shop_id); // url const url = buildUrl(uri, { partner_id: constants.partnerId, timestamp: currentTimeStamp, sign: signKey, access_token: accessToken, shop_id: shop_id }); // request && response data const responseData = await post(url, JSON.stringify({ item_id: itemId, model: model })); return responseData; } catch (err) { throw err; } } /** * 옵션 추가 * @param {*} userShop * @param {*} itemId * @param {*} model * @returns */ exports.AddVariation = async (userShop, itemId, model) => { try { // access token 유효 확인 let { shop_id, accessToken } = await RefreshToken(userShop); // uri const uri = '/api/v2/product/add_model'; // sign key const { signKey, currentTimeStamp } = buildSignKey(uri, accessToken, shop_id); // url const url = buildUrl(uri, { partner_id: constants.partnerId, timestamp: currentTimeStamp, sign: signKey, access_token: accessToken, shop_id: shop_id }); // request && response data const responseData = await post(url, JSON.stringify({ item_id: itemId, model_list: model })); return { variations: responseData.response.model.map((model) => ({ variation_id: model.model_id, tier_index: model.tier_index, variation_sku: model.model_sku, stock: model.seller_stock[0].stock, price: model.price_info[0].original_price, promotion_id: model.promotion_id })) }; } catch (err) { throw err; } } /** * 상품에 대한 프로모션 정보 조회 * @param {*} userShop * @param {*} itemIdList * @returns */ exports.GetItemPromotion = async (userShop, itemIdList) => { try { // access token 유효 확인 let { shop_id, accessToken } = await RefreshToken(userShop); // uri const uri = '/api/v2/product/get_item_promotion'; // sign key const { signKey, currentTimeStamp } = buildSignKey(uri, accessToken, shop_id); // url const url = buildUrl(uri, { partner_id: constants.partnerId, timestamp: currentTimeStamp, sign: signKey, access_token: accessToken, shop_id: shop_id, item_id_list: itemIdList }); // request && response data const responseData = await get(url); return responseData; } catch (err) { throw err; } } exports.GetComment = async (userShop, cursor = '', pageSize = 100, itemId = null, commentId = null) => { try { // access token 유효 확인 let { shop_id, accessToken } = await RefreshToken(userShop); // uri const uri = '/api/v2/product/get_comment'; // sign key const { signKey, currentTimeStamp } = buildSignKey(uri, accessToken, shop_id); // url const url = buildUrl(uri, { partner_id: constants.partnerId, timestamp: currentTimeStamp, sign: signKey, access_token: accessToken, shop_id: shop_id, cursor: cursor, page_size: pageSize }); // request && response data const responseData = await get(url); return responseData.response; } catch (err) { throw err; } } exports.ReplyComment = async (userShop, commentList) => { try { // access token 유효 확인 let { shop_id, accessToken } = await RefreshToken(userShop); // uri const uri = '/api/v2/product/reply_comment'; // sign key const { signKey, currentTimeStamp } = buildSignKey(uri, accessToken, shop_id); // url const url = buildUrl(uri, { partner_id: constants.partnerId, timestamp: currentTimeStamp, sign: signKey, access_token: accessToken, shop_id: shop_id }); // request && response data const responseData = await post(url, JSON.stringify({ comment_list: commentList })); return responseData; } catch (err) { throw err; } } exports.GetModelList = async (userShop, itemId) => { try { // access token 유효 확인 let { shop_id, accessToken } = await RefreshToken(userShop); // uri const uri = '/api/v2/product/get_model_list'; // sign key const { signKey, currentTimeStamp } = buildSignKey(uri, accessToken, shop_id); // url const url = buildUrl(uri, { partner_id: constants.partnerId, timestamp: currentTimeStamp, sign: signKey, access_token: accessToken, shop_id: shop_id, item_id: itemId }); // request && response data const responseData = await get(url); return responseData.response; } catch (err) { throw err; } }