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