작업 폴더에 대해 알아보기 actions-folder
이 샘플 앱의 actions
폴더에는 몇 개의 JavaScript 파일과 commerce
폴더가 있습니다. 표시된 JavaScript은 작업과 관련된 경우 재사용할 수 있는 훌륭한 예제 파일입니다. 이 폴더는 OAuth 및 REST를 사용하여 Adobe Commerce 애플리케이션에 연결할 때 개발 시간을 절약할 수 있습니다.
이 예제에서 폴더의 실제 이름은 임의적이지만 이름을 알면 샘플 코드를 해석하는 데 도움이 될 수 있습니다. 의미 있는 이름 지정 규칙을 사용하면 애플리케이션이 더 복잡해질 경우 혼동을 방지할 수 있습니다.
이 비디오는 누구의 것입니까?
- 샘플 애플리케이션의 작업 폴더에 대해 학습하고 있는 App Builder Adobe 경험이 제한된 Adobe Commerce을 처음 사용하는 개발자.
비디오 콘텐츠
actions
폴더에 중점을 둔 App Builder 및 샘플 모듈 소개- "actions" 폴더 사용 방법
actions
및commerce
폴더에 있는 JavaScript 파일의 용도- OAuth 인증 파일에 대한 빠른 개요
코드 샘플
actions/oauth1a.js
/*
* Copyright 2023 Adobe
* All Rights Reserved.
*
* NOTICE: All information contained herein is, and remains
* the property of Adobe and its suppliers, if any. The intellectual
* and technical concepts contained herein are proprietary to Adobe
* and its suppliers and are protected by all applicable intellectual
* property laws, including trade secret and copyright laws.
* Dissemination of this information or reproduction of this material
* is strictly forbidden unless prior written permission is obtained
* from Adobe.
*/
const { Core } = require('@adobe/aio-sdk')
const { errorResponse, checkMissingRequestInputs} = require('../utils')
const { getCommerceOauthClient } = require('../oauth1a')
async function main(params) {
const logger = Core.Logger('main', { level: params.LOG_LEVEL || 'info' })
try {
const requiredParams = ['operation', 'COMMERCE_BASE_URL']
const requiredHeaders = ['Authorization']
const errorMessage = checkMissingRequestInputs(params, requiredParams, requiredHeaders)
if (errorMessage) {
// return and log client errors
return errorResponse(400, errorMessage, logger)
}
const { operation } = params
const oauth = getCommerceOauthClient(
{
url: params.COMMERCE_BASE_URL,
consumerKey: params.COMMERCE_CONSUMER_KEY,
consumerSecret: params.COMMERCE_CONSUMER_SECRET,
accessToken: params.COMMERCE_ACCESS_TOKEN,
accessTokenSecret: params.COMMERCE_ACCESS_TOKEN_SECRET
},
logger
)
const content = await oauth.get(operation)
return {
statusCode: 200,
body: content
}
} catch (error) {
// log any server errors
logger.error(error)
// return with 500
return errorResponse(500, error, logger)
}
}
exports.main = main
actions/utils.js
/*
* Copyright 2023 Adobe
* All Rights Reserved.
*
* NOTICE: All information contained herein is, and remains
* the property of Adobe and its suppliers, if any. The intellectual
* and technical concepts contained herein are proprietary to Adobe
* and its suppliers and are protected by all applicable intellectual
* property laws, including trade secret and copyright laws.
* Dissemination of this information or reproduction of this material
* is strictly forbidden unless prior written permission is obtained
* from Adobe.
*/
/* This file exposes some common utilities for your actions */
/**
*
* Returns a log ready string of the action input parameters.
* The `Authorization` header content will be replaced by '<hidden>'.
*
* @param {object} params action input parameters.
*
* @returns {string}
*
*/
function stringParameters (params) {
// hide authorization token without overriding params
let headers = params.__ow_headers || {}
if (headers.authorization) {
headers = { ...headers, authorization: '<hidden>' }
}
return JSON.stringify({ ...params, __ow_headers: headers })
}
/**
*
* Returns the list of missing keys giving an object and its required keys.
* A parameter is missing if its value is undefined or ''.
* A value of 0 or null is not considered as missing.
*
* @param {object} obj object to check.
* @param {array} required list of required keys.
* Each element can be multi level deep using a '.' separator e.g. 'myRequiredObj.myRequiredKey'
*
* @returns {array}
* @private
*/
function getMissingKeys (obj, required) {
return required.filter(r => {
const splits = r.split('.')
const last = splits[splits.length - 1]
const traverse = splits.slice(0, -1).reduce((tObj, split) => { tObj = (tObj[split] || {}); return tObj }, obj)
return traverse[last] === undefined || traverse[last] === '' // missing default params are empty string
})
}
/**
*
* Returns the list of missing keys giving an object and its required keys.
* A parameter is missing if its value is undefined or ''.
* A value of 0 or null is not considered as missing.
*
* @param {object} params action input parameters.
* @param {array} requiredHeaders list of required input headers.
* @param {array} requiredParams list of required input parameters.
* Each element can be multi level deep using a '.' separator e.g. 'myRequiredObj.myRequiredKey'.
*
* @returns {string} if the return value is not null, then it holds an error message describing the missing inputs.
*
*/
function checkMissingRequestInputs (params, requiredParams = [], requiredHeaders = []) {
let errorMessage = null
// input headers are always lowercase
requiredHeaders = requiredHeaders.map(h => h.toLowerCase())
// check for missing headers
const missingHeaders = getMissingKeys(params.__ow_headers || {}, requiredHeaders)
if (missingHeaders.length > 0) {
errorMessage = `missing header(s) '${missingHeaders}'`
}
// check for missing parameters
const missingParams = getMissingKeys(params, requiredParams)
if (missingParams.length > 0) {
if (errorMessage) {
errorMessage += ' and '
} else {
errorMessage = ''
}
errorMessage += `missing parameter(s) '${missingParams}'`
}
return errorMessage
}
/**
*
* Extracts the bearer token string from the Authorization header in the request parameters.
*
* @param {object} params action input parameters.
*
* @returns {string|undefined} the token string or undefined if not set in request headers.
*
*/
function getBearerToken (params) {
if (params.__ow_headers &&
params.__ow_headers.authorization &&
params.__ow_headers.authorization.startsWith('Bearer ')) {
return params.__ow_headers.authorization.substring('Bearer '.length)
}
return undefined
}
/**
*
* Returns an error response object and attempts to log.info the status code and error message
*
* @param {number} statusCode the error status code.
* e.g. 400
* @param {string} message the error message.
* e.g. 'missing xyz parameter'
* @param {*} [logger] an optional logger instance object with an `info` method
* e.g. `new require('@adobe/aio-sdk').Core.Logger('name')`
*
* @returns {object} the error object, ready to be returned from the action main's function.
*
*/
function errorResponse (statusCode, message, logger) {
if (logger && typeof logger.info === 'function') {
logger.info(`${statusCode}: ${message}`)
}
return {
error: {
statusCode,
body: {
error: message
}
}
}
}
module.exports = {
errorResponse,
getBearerToken,
stringParameters,
checkMissingRequestInputs
}
actions/commerce/index.js
/*
* Copyright 2023 Adobe
* All Rights Reserved.
*
* NOTICE: All information contained herein is, and remains
* the property of Adobe and its suppliers, if any. The intellectual
* and technical concepts contained herein are proprietary to Adobe
* and its suppliers and are protected by all applicable intellectual
* property laws, including trade secret and copyright laws.
* Dissemination of this information or reproduction of this material
* is strictly forbidden unless prior written permission is obtained
* from Adobe.
*/
const { Core } = require('@adobe/aio-sdk')
const { errorResponse, checkMissingRequestInputs} = require('../utils')
const { getCommerceOauthClient } = require('../oauth1a')
async function main(params) {
const logger = Core.Logger('main', { level: params.LOG_LEVEL || 'info' })
try {
const requiredParams = ['operation', 'COMMERCE_BASE_URL']
const requiredHeaders = ['Authorization']
const errorMessage = checkMissingRequestInputs(params, requiredParams, requiredHeaders)
if (errorMessage) {
// return and log client errors
return errorResponse(400, errorMessage, logger)
}
const { operation } = params
const oauth = getCommerceOauthClient(
{
url: params.COMMERCE_BASE_URL,
consumerKey: params.COMMERCE_CONSUMER_KEY,
consumerSecret: params.COMMERCE_CONSUMER_SECRET,
accessToken: params.COMMERCE_ACCESS_TOKEN,
accessTokenSecret: params.COMMERCE_ACCESS_TOKEN_SECRET
},
logger
)
const content = await oauth.get(operation)
return {
statusCode: 200,
body: content
}
} catch (error) {
// log any server errors
logger.error(error)
// return with 500
return errorResponse(500, error, logger)
}
}
exports.main = main
App Builder - 첫 번째 앱 관련 페이지 작성
recommendation-more-help
3a5f7e19-f383-4af8-8983-d01154c1402f