Skip to content

ユーザー情報を一括で更新する

概要

年度の変わり目などに発生する組織変更で多数のユーザーを追加・変更する場面において、手作業で一人ずつ操作するのは非常に手間がかかります。Web APIを使用することで一括でデータを更新し、作業の手間を省くことができます。
また、必要な情報を揃えておけば、必要なタイミングで自動的に実行することも可能です。

利用場面

  • 新入社員のアカウントをまとめて登録する
  • 既存メンバーの所属組織をまとめて変更する
  • 退職者のアカウントをまとめて削除する

使用するAPI

以下のAPIを使用します。

  • ユーザーの追加
  • ユーザーの変更
  • ユーザーの削除

サンプルスクリプト

//======================================================================
//  ユーザー情報を一括で更新する
//======================================================================
//======================================================================
//  外部ファイル(ライブラリ、他ファイル)のインクルード
//======================================================================

const https = require('https'); // HTTPS通信を利用する場合に設定する
const http = require('http'); // HTTP通信を利用する場合に設定する
const axios = require('axios');
const fs = require('fs');

//======================================================================
//  共通部の定義
//======================================================================

// APIを呼び出すURLを設定する
const baseURLString = 'http://yourserver/TimeTrackerNX/api';

// サーバースペックに合わせてウェイト時間を設定する
// 1分間に1500件程度の処理に収まるようするため、
// 目安として推奨スペックでは100ms程度とする 
const requestWaitTime = 100;    //単位:ms

//----------------------------------------------------------------------
//  Web API間の処理待ち関数
//----------------------------------------------------------------------
async function wait(time){
    const d1 = new Date();
    while (true) {
        const d2 = new Date();
        if (d2 - d1 > time) {
            break;
        }
    }
}

//======================================================================
//  メイン処理
//======================================================================
main();

async function main(){

    // 引数チェック    
    if (process.argv.length < 3){
        return 'enter username and password'; 
    }

    const userName = process.argv[2];
    var pass;
    var authString; //ブロック内スコープから外に出すためvarで宣言(固定値)

    // 引数でパスワードが未入力の場合は空白とみなす
    if (process.argv.length > 3){
        pass = process.argv[3];
    } else {
        pass = '';        
    }

    // 認証情報を取得する
    var sendUrl = baseURLString + '/auth/token';

    try{
        const { data } = await axios.post(
            sendUrl,
            {
                loginName : userName,
                password : pass
            },
/*
        // https通信時に使用する
        httpsAgent  : new https.Agent({
            rejectUnauthorized: false
                    })
*/    
        );
        authString = 'Bearer ' + data.token;

    } catch (err) {
        console.log(err);
    }

    // 以降のAPI通信で利用する送信ヘッダを作成する
    const request = axios.create({
        baseURL     : baseURLString,
        headers     :{
                        'Authorization'   : authString
                    },
/*
        // https通信時に使用する
        httpsAgent  : new https.Agent({
            rejectUnauthorized: false
                    })
*/    
                });

    // 新規ユーザーの登録
    // JSON形式のデータ(例:後述のnewUserData.json)を入力とする
    var filepath = './newUserData.json';

    var changeMemberData = JSON.parse(fs.readFileSync(filepath, {encoding: "utf-8"}));


    var sendUrl = '/system/users';

    // JSON形式のユーザー情報からユーザー一人分の情報を取り出す
    for (key in changeMemberData){
        var userId;

        // 新規ユーザーを追加するAPIを設定
        sendUrl = '/system/users';

        // ユーザー登録 (リクエストに1名分のユーザー情報を設定して送信)
        try {
            const { data } = await request.post(
                sendUrl,
                {
                    name            : changeMemberData[key].name,
                    loginName       : changeMemberData[key].loginName,
                    organization    : changeMemberData[key].organization,
                    systemRole      : changeMemberData[key].systemRole,
                    password        : changeMemberData[key].password,
                    passwordConfirm : changeMemberData[key].passwordConfirm
                }
            );
            // 戻り値のユーザーIDを取得(この後の休憩時間の設定に利用)
            userId = data.id;
        } catch (e) {
            console.log(e);
        }

        // 設定情報 (追加したユーザーの設定に利用)
        sendUrl = '/system/users/' + userId + '/preference';

        // 休憩時間の設定(リクエストに休憩時間の開始・終了時刻を設定して送信)
        try {
            const { data } = await request.put(
                sendUrl,
                {
                    breakTimes: [{
                        startTime   :"12:00",
                        endTime     :"13:00"
                    }]
                }
            );
        } catch (e) {
            console.log(e);
        }

        // 追加したユーザーをプロジェクト(全社活動など)のメンバーに設定
        const newProjectId = '9,20,21';
        sendUrl = '/project/projects/' + newProjectId;

        // プロジェクトメンバーの追加(リクエストに新規ユーザーの情報を設定して送信)
        try {
            const { data } = await request.put(
                sendUrl,
                {
                    memberChange:{
                        adds : [{
                            partyId     : userId,
                            partyType   : 'User',
                            unitCost    : 1000
                        }]
                    }
                }
            );
        } catch (e) {
            console.log(e);
        }
        await wait(requestWaitTime);  
    }

    // 既存ユーザーの更新

    // JSON形式のデータ(例:後述のupdateUserData.json)を入力とする
    filepath = './updateUserData.json';

    changeMemberData = JSON.parse(fs.readFileSync(filepath, {encoding: "utf-8"}));

    // JSON形式のユーザー情報からユーザー一人分の情報を取り出す
    for (key in changeMemberData){
        var userId;

        // 既存ユーザーの情報を取得するAPIを設定
        sendUrl = '/system/users';

        // ユーザーを一意に特定できる情報(コード)をもとに更新対象ユーザーのIDを取得
        try {
            const { data } = await request.get(
                sendUrl,
                {
                    params : {
                        code                : changeMemberData[key].code
                    }
                }
            );
            userId = data.data[0].id;
        } catch (e) {
            console.log(e);
        }

        // 既存ユーザーの情報を更新するAPIを設定
        sendUrl = '/system/users/' + userId;

        // ユーザー更新 (リクエストに1名分のユーザー情報を設定して送信)
        try {
            const { data } = await request.put(
                sendUrl,
                {
                    systemRole                  : changeMemberData[key].systemRole,
                    unitCost                    : changeMemberData[key].unitCost,
                    unitCostAppliedStartDate    : changeMemberData[key].unitCostAppliedStartDate
                }
            );
        } catch (e) {
            console.log(e);
        }
        await wait(requestWaitTime); 
    }

    //既存ユーザーの削除

    // JSON形式のデータ(例:後述のdeleteUserData.json)を入力とする
    filepath = './deleteUserData.json';

    changeMemberData = JSON.parse(fs.readFileSync(filepath, {encoding: "utf-8"}));

    // JSON形式のユーザー情報からユーザー一人分の情報を取り出す
    for (key in changeMemberData){
        var userId;

        // 既存ユーザーの情報を取得するAPIを設定
        sendUrl = '/system/users';

        // ユーザーを一意に特定できる情報(コード)をもとに削除対象ユーザーのIDを取得
        try {
            const { data } = await request.get(
                sendUrl,
                {
                    params: {
                        code                :changeMemberData[key].code
                    }
                }
            );
            userId = data.data[0].id;
        } catch (e) {
            console.log(e);
        }

        // 既存ユーザーの情報を削除するAPIを設定
        sendUrl = '/system/users/' + userId;

        // ユーザー削除
        try {
            const { data } = await request.delete(
                sendUrl
            );
        } catch (e) {
            console.log(e);
        }
        await wait(requestWaitTime); 
    }
}

入力情報

上記のサンプルスクリプトで使用する追加・更新・削除用のアカウント情報ファイルを以下のリンク先から参照できます。