ken_nogi/PleasanterSystem/dbbackup/lib/logUpload.js
Kenichiro NOGI ed33892f08 chore: 作業中の変更を整理しコミット(複数プロジェクト分)
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-02 11:09:50 +09:00

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 };