モデル設計

// ジョブ実行中のステータス(page bulk export と同じ) const AuditLogBulkExportJobInProgressStatus = { exporting: 'exporting', // ファイルシステムにエクスポート中 uploading: 'uploading', // クラウドストレージにアップロード中 } as const; // ジョブのステータス(page bulk export と同じ) const AuditLogBulkExportJobStatus = { ...AuditLogBulkExportJobInProgressStatus, completed: 'completed', failed: 'failed', } as const; type AuditLogBulkExportJobStatus = typeof AuditLogBulkExportJobStatus[keyof typeof AuditLogBulkExportJobStatus] //エクスポートするログのフィルター(audit log bulk export専用) export type AuditLogFilters = { usernames?: string[]; actions?: string[]; dates?: { start?: string; end?: string }; // 'YYYY-MM-DD' }; interface IAuditLogBulkExportJob { user: Ref<User>, // エクスポートを実行した user completedAt?: Date | null, // エクスポートが完了した日時 filters: AuditLogFilters; //フィルター format: 'json'; //今後の拡張を見据えて status: AuditLogBulkExportJobStatus, statusOnPreviousCronExec?: AuditLogBulkExportJobStatus, // 前回の cron 実行での status restartFlag: boolean, // ジョブを再実行するためのフラグ filterHash?: string, // filterにかかったログのidを合計してハッシュ化 createdAt?: Date, updatedAt?: Date, }

API

POST /_api/v3/audit-log-bulk-export

  • 指定されたページツリーをエクスポートするための AuditLogBulkExportJob を作成する。AuditLogBulkExportJob は cronjob によって実行される

query params

  • filter: exportするログ絞り込み条件(ユーザー名、期間、アクション)
  • restartJob: 既に指定した path と format で実行中のジョブがある場合、それを最初からやり直したい場合に true を指定する (デフォルト false)

実行内容

  1. 指定された filter でユーザが実行中の AuditLogBulkExportJob が既にあるかを確認する
    • ある場合
      • restartJob が true: AuditLogBulkExportJob.restartFlag を true にして終了
      • restartJob が false: 409 を返して終了
        • ユーザは1つのページのエクスポートを同時に二つ以上実行することはできない (ユーザが異なれば同じページのエクスポートの並列実行は可能)
  2. AuditLogBulkExportJob がない場合は新たに作成する

Cron job

CheckAuditLogBulkExportJobInProgressCron

基本実装はpage-bulk-exportと同じようにCheckAuditLogBulkExportJobInProgressCronがジョブを監視し、AuditLogBulkExportJobCronを起動させる。

AuditLogBulkExportJobCron

実行内容

こちらもhttps://dev.growi.org/655834752aa37f82842a2034#pagebulkexportjobcron の実装と同じように status によってそれぞれの実行内容が変わる方式をとる

相違点

  • revision idの合計のハッシュ値ではなくログのidの合計のハッシュ値をとる
  • snapshotは作成せず、Readable streamはmongo cursorを指定し、mongodbの保存されているログのid順で逐一lastExportedIdを記録することで中断->再開できるように(snapshotを作成するためのinitializingというstatusはない)
  • fsに書き込むパスは /tmp/audit-log-bulk-export/${jobId}

AuditLogBulkExportJobCleanUpCron

https://dev.growi.org/655834752aa37f82842a2034#pagebulkexportjobcleanupcron を参考