Start: Box: File Uploaded

開始: Box: ファイルアップロード時

This item starts a process when a file has been uploaded on a specified Box folder.

Auto Step icon
Basic Configs
Step Name
Note
Configs for this Auto Step
conf_OAuth2
C1: OAuth2 Setting *
conf_FolderId
C2: Folder ID to monitor (Root Folder if blank)
conf_idData
C3: Data item to save File ID *
conf_timestampData
C4: Data item to save File Uploaded Datetime

Notes

  • Folder ID is contained in the URL https://app.box.com/folder/(Folder ID)
  • Questetra BPM Suite will periodically poll the Box to check for new uploaded files
    • If any files have been uploaded, a process will be started
  • A Process will not be started on the first check; only the check will be done
    • You can confirm the check status from the “Process Log”
  • If a large number of files are uploaded in a short period of time, the processes may not be started for all files
    • Approx. 90 processes every 15 minutes
  • If there are too many items (files / folders) in the folder (1000 as of April 2021), the check will be aborted
    • Control the number of items so that it does not increase too much

Capture

See also

Script (click to open)
  • An XML file that contains the code below is available to download
    • box-file-uploaded.xml (C) Questetra, Inc. (MIT License)
    • If you are using Professional, you can modify the contents of this file and use it as your own add-on auto step


const DATETIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ssX";

/**
 * configs から必要な情報を取り出す
 * @returns {Object} setting 設定
 * @returns {string} setting.folderId 検索対象の フォルダ ID
 * @returns {string} setting.oauth2 OAuth2 設定名
 */
const prepare = () => {
    const oauth2 = configs.getObject("conf_OAuth2");
    let folderId = configs.get("conf_FolderId");
    if (folderId === "" || folderId === null) {
        folderId = "0";
    }

    return {
        folderId,
        oauth2
    };
};

/**
 * ファイルの検索
 * @param {number} limit ファイル数の上限
 * @param {timestamp} timestampLowerLimit timestamp の下限
 * @returns {Array} files ファイル一覧
 * @returns {string} files[].id ファイル ID
 * @returns {timestamp} files[].timestamp ファイルアップロード時刻
 */
const list = (limit, timestampLowerLimit) => {
    const {
        folderId,
        oauth2
    } = prepare();

    let files = getFiles(oauth2, folderId, timestampLowerLimit);
    // 新しい順に並べ替え
    files.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());
    // 先頭から limit で切る
    files = files.slice(0, limit);
    logFiles(files);
    return files;
};

/**
 * ファイルのログ出力
 * @param {Array} files ファイル一覧
 */
const logFiles = (files) => {
    if (files.length === 0) {
        engine.log("no files");
        return;
    }
    const replacer = (key, value) => value instanceof java.sql.Timestamp ? dateFormatter.format(DATETIME_FORMAT, value) : value;
    files.forEach(file => engine.log(JSON.stringify(file, replacer)));
};

/**
 * 指定フォルダ内の、ファイルの取得
 * フォルダ内のアイテム (ファイル+フォルダ) 数が 1000 を超える場合、エラー
 * @param {AuthSettingWrapper} oauth2 OAuth2 設定
 * @param {String} folderId 検索対象のフォルダ ID
 * @param {timestamp} timestampLowerLimit timestamp の下限
 * @returns {Array} files ファイル一覧
 * @returns {string} files[].id ファイル ID
 * @returns {timestamp} files[].timestamp ファイルアップロード時刻
 */
const getFiles = (oauth2, folderId, timestampLowerLimit) => {
    const url = `https://api.box.com/2.0/folders/${folderId}/items`;

    const LIMIT = 1000; // Box API で定める LIMIT の最大値が 1000
    const response = httpClient.begin()
        .authSetting(oauth2)
        .queryParam("fields", "id,type,name,created_at")
        // date で sort をするが、これは更新日と思われる。作成日では sort できない。
        .queryParam('sort', 'date')
        .queryParam('direction', 'DESC')
        .queryParam("limit", String(LIMIT))
        .queryParam("usemarker", "true")
        .get(url);
    const status = response.getStatusCode();
    const responseTxt = response.getResponseAsString() + "\n";
    if (status >= 300) {
        const accessLog = `---GET request--- ${status}\n${responseTxt}\n`;
        engine.log(accessLog);
        throw `Failed to get files. status: ${status}`;
    }
    const json = JSON.parse(responseTxt);

    // marker がある場合は、フォルダに まだ ファイルがあるとみなして、エラーとする
    const marker = json['next_marker'];
    if (marker !== undefined && marker !== '' && marker !== null) {
        throw `More than ${LIMIT} items are in the specified folder`;
    }

    return json.entries
        .filter(entry => entry.type === 'file') // ファイルのみに絞り込み
        .map(formatFile)
        .filter(entry => !entry.timestamp.before(timestampLowerLimit)); // timestampLowerLimit 以降のデータのみに絞り込み
}

/**
 * Box のファイルデータから、必要な部分のみ抜き出す
 * @param file ファイルデータ
 * @returns {Object} file ファイル
 * @returns {string} file.id ファイル ID
 * @returns {timestamp} file.timestamp ファイルアップロード時刻
 */
const formatFile = (file) => {
    const {
        id,
        created_at
    } = file;
    return {
        id,
        timestamp: dateFormatter.parse(DATETIME_FORMAT, created_at)
    };
};

1 thought on “Start: Box: File Uploaded”

  1. Pingback: Process Start Triggered by a File Upload to Box – Questetra Support

Comments are closed.

%d bloggers like this: