80 lines
3.2 KiB
JavaScript
80 lines
3.2 KiB
JavaScript
"use strict";
|
|
|
|
/*
|
|
* バックアップ/リストア処理の成否に関わらず、当月ログファイルを
|
|
* Pleasanter_DB_Backup/logs 配下へ上書きアップロードする。backup.js / restore.js 共用。
|
|
*/
|
|
|
|
const fs = require("fs");
|
|
|
|
const defaultLogger = require("./logger");
|
|
const { getUserAccessToken: defaultGetUserAccessToken } = require("./lineworksUserAuth");
|
|
const defaultDrive = require("./lineworksDrive");
|
|
|
|
// アップロードURL発行やアップロード失敗のエラーメッセージには、共有ドライブAPIの
|
|
// レスポンスステータスがそのまま埋め込まれる(lineworksDrive.js参照)ため、文字列判定で足りる。
|
|
function isUnauthorizedError(err) {
|
|
return /\b401\b/.test(err.message);
|
|
}
|
|
|
|
async function uploadLogFileOnce({ accessToken, sharedriveId, backupFolderId, logger, getUserAccessToken, drive }) {
|
|
let token = accessToken;
|
|
let driveId = sharedriveId;
|
|
let folderId = backupFolderId;
|
|
|
|
if (!token) {
|
|
token = await getUserAccessToken();
|
|
}
|
|
if (!driveId) {
|
|
driveId = await drive.resolveSharedDriveId(token, logger);
|
|
}
|
|
if (!folderId) {
|
|
const rootFolderName = process.env.LW_BACKUP_ROOT_FOLDER_NAME || "Pleasanter_DB_Backup";
|
|
const backupFolder = await drive.ensureFolder(token, driveId, null, rootFolderName, logger);
|
|
folderId = backupFolder.fileId;
|
|
}
|
|
|
|
const logFolderName = process.env.LW_LOG_FOLDER_NAME || "logs";
|
|
const logsFolder = await drive.ensureFolder(token, driveId, folderId, logFolderName, logger);
|
|
|
|
const logFilePath = logger.currentLogFilePath();
|
|
if (fs.existsSync(logFilePath)) {
|
|
await drive.uploadFile(token, driveId, logsFolder.fileId, logFilePath, { overwrite: true }, logger);
|
|
logger.info("ログファイルアップロード成功");
|
|
}
|
|
}
|
|
|
|
async function uploadLogFile({ accessToken, sharedriveId, backupFolderId } = {}, deps = {}) {
|
|
const logger = deps.logger || defaultLogger;
|
|
const getUserAccessToken = deps.getUserAccessToken || defaultGetUserAccessToken;
|
|
const drive = deps.drive || defaultDrive;
|
|
|
|
logger.info("ログファイルアップロード開始");
|
|
try {
|
|
await uploadLogFileOnce({ accessToken, sharedriveId, backupFolderId, logger, getUserAccessToken, drive });
|
|
} catch (err) {
|
|
if (!isUnauthorizedError(err)) {
|
|
logger.error(`ログファイルアップロード失敗: ${err.message}`);
|
|
return;
|
|
}
|
|
|
|
// トークンが3時間超経過等で失効している場合、access_tokenを再取得し1回だけリトライする。
|
|
logger.warn("ログファイルアップロード: 401検知。アクセストークンを再取得してリトライします");
|
|
try {
|
|
const freshToken = await getUserAccessToken();
|
|
await uploadLogFileOnce({
|
|
accessToken: freshToken,
|
|
sharedriveId,
|
|
backupFolderId,
|
|
logger,
|
|
getUserAccessToken,
|
|
drive,
|
|
});
|
|
} catch (retryErr) {
|
|
logger.error(`ログファイルアップロード失敗(リトライ後): ${retryErr.message}`);
|
|
}
|
|
}
|
|
}
|
|
|
|
module.exports = { uploadLogFile, isUnauthorizedError };
|