SCALE — Build Lab
開発パターン · CLOUDFLARE FUNCTION

変更履歴 API(監査ログ)

CATEGORY開発パターン TYPECloudflare Function EFFORT60〜180分 DIFFICULTY
PRIMARY CODE
ts · scale-crm:functions/api/changes.ts
// GET /api/changes?since=<ISO8601>
// 指定時刻以降に更新されたキーを返す(30秒ポーリング用)
import { corsResponse, corsError, handleOptions } from '../_lib/cors';

interface Env { DB: D1Database }

export const onRequestOptions = () => handleOptions();

export const onRequestGet: PagesFunction<Env> = async ({ request, env }) => {
  try {
    const url = new URL(request.url);
    const since = url.searchParams.get('since') || new Date(Date.now() - 60000).toISOString();
    const limit = parseInt(url.searchParams.get('limit') || '500', 10);

    const { results } = await env.DB.prepare(
      'SELECT key, value, updated_at, updated_by FROM app_data WHERE updated_at > ? ORDER BY updated_at LIMIT ?'
    ).bind(since, limit).all();

    return corsResponse({
      ok: true,
      since,
      now: new Date().toISOString(),
      count: results.length,
      changes: results,
    });
  } catch (e: any) {
    return corsError(e.message);
  }
};

前提条件
Tailwind CSS v4TypeScript 5
USE CASES
  • 監査対応
  • コンプライアンス対応

変更履歴 API(監査ログ)

:LiTarget: 用途

誰がいつ何を変更したかを記録する変更履歴 API。GET で時系列取得・POST で追加。

:LiSparkle: 特徴

  • 全変更の自動記録
  • ユーザー別フィルタ
  • 時系列ソート
  • CSV出力

:LiCode: 実コード(SCALE Base より自動抽出)

:LiInfo: scale-crm:functions/api/changes.ts の中身そのもの。コピペ即可。

// GET /api/changes?since=<ISO8601>
// 指定時刻以降に更新されたキーを返す(30秒ポーリング用)
import { corsResponse, corsError, handleOptions } from '../_lib/cors';

interface Env { DB: D1Database }

export const onRequestOptions = () => handleOptions();

export const onRequestGet: PagesFunction<Env> = async ({ request, env }) => {
  try {
    const url = new URL(request.url);
    const since = url.searchParams.get('since') || new Date(Date.now() - 60000).toISOString();
    const limit = parseInt(url.searchParams.get('limit') || '500', 10);

    const { results } = await env.DB.prepare(
      'SELECT key, value, updated_at, updated_by FROM app_data WHERE updated_at > ? ORDER BY updated_at LIMIT ?'
    ).bind(since, limit).all();

    return corsResponse({
      ok: true,
      since,
      now: new Date().toISOString(),
      count: results.length,
      changes: results,
    });
  } catch (e: any) {
    return corsError(e.message);
  }
};

:LiFolder: ソースファイルのパス

/Users/oogushiyuuki/株式会社SCALE/scale-lead/functions/api/changes.ts

:LiHandPointer: 使い方

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

:LiAlertCircle: 注意事項

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