SCALE — Build Lab
開発パターン · JAVASCRIPT PATTERN

論理削除 + 期限切れ自動パージ

CATEGORY開発パターン TYPEJavaScript Pattern EFFORT30〜90分 DIFFICULTY
PRIMARY CODE
js
// 論理削除
function softDelete(item) { item.deleted_at = Date.now(); }
function restore(item) { delete item.deleted_at; }

// 期限切れパージ(30日)
const PURGE_DAYS = 30;
function purgeExpiredTrash(collection) {
  const cutoff = Date.now() - PURGE_DAYS * 86400 * 1000;
  const items = PD(collection, []);
  const kept = items.filter(it => !it.deleted_at || it.deleted_at > cutoff);
  if (kept.length !== items.length) setPD(collection, kept);
}

// アクティブ取得
function getActive(collection) {
  return PD(collection, []).filter(x => !x.deleted_at);
}
前提条件
Tailwind CSS v4TypeScript 5
USE CASES
  • 任意のダッシュボードに組み込み

論理削除 + 期限切れ自動パージ

:LiTarget: 用途

削除を deleted_at で論理化 → 30日後に物理削除。誤削除復活可能 + ストレージ節約。

:LiSparkle: 特徴

  • deleted_at で論理削除
  • 30日経過後 自動 purge
  • 復元コマンド
  • CSV 出力時除外

:LiCode: コード(コピペ用)

// 論理削除
function softDelete(item) { item.deleted_at = Date.now(); }
function restore(item) { delete item.deleted_at; }

// 期限切れパージ(30日)
const PURGE_DAYS = 30;
function purgeExpiredTrash(collection) {
  const cutoff = Date.now() - PURGE_DAYS * 86400 * 1000;
  const items = PD(collection, []);
  const kept = items.filter(it => !it.deleted_at || it.deleted_at > cutoff);
  if (kept.length !== items.length) setPD(collection, kept);
}

// アクティブ取得
function getActive(collection) {
  return PD(collection, []).filter(x => !x.deleted_at);
}

:LiHandPointer: 使い方

対象プロジェクトに該当ファイルをコピーして、props を流し込むだけ。

:LiAlertCircle: 注意事項

  • 依存パッケージを忘れず追加