モデル設計
// ジョブ実行中のステータス(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)
実行内容
- 指定された filter でユーザが実行中の AuditLogBulkExportJob が既にあるかを確認する
- ある場合
- restartJob が true: AuditLogBulkExportJob.restartFlag を true にして終了
- restartJob が false: 409 を返して終了
- ユーザは1つのページのエクスポートを同時に二つ以上実行することはできない (ユーザが異なれば同じページのエクスポートの並列実行は可能)
- ある場合
- 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 を参考