LoginSignup
1
1

昨日のデータを削除するバッチ処理の実装(TypeScript)

Posted at

はじめに

現在、React×TupeScriptでアプリを作成中です。
昨日分のデータを削除するバッチ処理の実装を行ったので、その内容をまとめます。

使用言語: TypeScript
DB(Baas): Supabase
削除したいデータ: ユーザー情報(usersテーブル)・ユーザーのスキル情報(user_skillテーブル)

やりたいこと

下記のコマンドを実行すると、昨日に登録されたユーザー情報とスキル情報がDB上から削除されるようにします。

npx tsx ./batch/index.ts

処理の流れ

1. 昨日の日付を計算する
現在の日付を取得して、現在の日付から1日前の日付を計算します。
2. 昨日の始まりと終わりを設定する
昨日の始まりは0:00(午前)で、昨日の終わりは23:59:59(午後)です。
時刻はUTC(世界協定時)で設定します。(Supabase上でのタイムスタンプはUTCを採用しているため)
3. ユーザー情報を削除する
昨日の日付に作成されたユーザー情報を削除します。
4. スキル情報を削除する
同様に、昨日の日付に作成されたスキル情報も削除します。
5. 削除結果を表示する
ユーザー情報とスキル情報の削除結果を表示します。
エラーが発生した場合は、その内容も表示します。
6. 処理の完了を通知する
データの削除が完了したことを通知します。

実装例

ts
import { supabase } from "../src/utils/supabase";

async function deleteUserData() {
  //1&2.昨日の0:00のUTC
  const startedYesterday = new Date();
  startedYesterday.setDate(startedYesterday.getDate() - 1);
  startedYesterday.setUTCHours(0, 0, 0, 0);

  //1&2.昨日の23:59:59のUTC
  const endedYesterday = new Date();
  endedYesterday.setDate(endedYesterday.getDate() - 1);
  endedYesterday.setUTCHours(23, 59, 59, 999);

  // 3.削除するユーザー情報の条件を指定
  const userDeleteResult = await supabase
    .from("users")
    .delete()
    // 削除条件を追加
    .gte("created_at", startedYesterday.toISOString())
    .lte("created_at", endedYesterday.toISOString());
  console.log("startedYesterday:", startedYesterday);
  console.log("endedYesterday:", endedYesterday);

  // 5.削除した行数をログに出力
  console.log("Deleted user data:", userDeleteResult);

  // 4.削除するスキル情報の条件を指定
  const skillDeleteResult = await supabase
    .from("user_skill")
    .delete()
    // 
    .gte("created_at", startedYesterday.toISOString())
    .lte("created_at", endedYesterday.toISOString());

  //5. 削除した行数をログに出力
  console.log("Deleted skill data:", skillDeleteResult);
}

// 6. 処理の完了を通知する
deleteUserData()
  .then(() => console.log("Deletion complete!"))
  .catch((error) => console.error("Deletion failed:", error));

注意点

日付はUTC(世界協定時)かつSO8601形式で渡さないと、Supabase側で認識されなかったため、toISOString() を使用しました。
これを使わないと、"time zone "gmt+0900" not recognized" というエラーが出てしまいます。

おわりに

使用している言語や環境が違っても、全体の処理の流れや考え方は変わらないと思うので、参考になれば幸いです。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1