Skip to content

ユーザーの削除方法

概要

2024年7月23日現在、web アプリケーション側にユーザー削除機能が実装されていません。ユーザーがアカウントの削除を希望する場合は、typeform にて form を提出してもらい、その情報に基づいて管理者が削除を行います。

form の回答結果は slack の #notify_typeform_account-delete チャンネルに通知されます。

ユーザー削除の流れ

大きな流れは以下のとおりです。

  1. typeform またはその他のチャンネルから削除対象のユーザーについて情報を取得する
  2. アカウント削除管理シートに必要な情報を記入する
  3. 記入した情報に基づいて、スクリプトを実行する (こちらを参照)
  4. SaaS から情報を削除する (詳細はこちら)
  5. (typeform で回答があった場合) typeform 回答の slack 通知メッセージに対して「済」スタンプを付ける

スクリプトの実行

スクリプトの実行は AWS Exec の機能を用いて行います。こちらを参考にしつつ、ECS 上のコンテナにアクセスしてください。

ECS にアクセスしたら、スクリプトを実行します。ユーザー削除のスクリプトは ./scripts/routine/delete-users.ts です。 このスクリプトでは、以下のことを実行します。

  • user document の削除
  • workspace user document の削除
  • item document の削除
  • workspace document の削除
  • cognito identity の削除・無効化

使い方は以下のとおりです。

text
yarn run:ts-node ./scripts/routine/delete-users.ts [--dry-run | --exec] <userIds> [--delete-users | --delete-workspace-users | --delete-items | --delete-workspace-users]

bash
# dry run モードで、削除対象のデータを確認する
# dry run モードにおいては、--delete-users などのオプションは考慮されません
yarn run:ts-node ./scripts/routine/delete-users.ts --dry-run "6139b139643c7d002b49a86d,613ea3d6d155b400278b873d,613ea65c7a51a90024910d04,613f263bd155b400278b8787" --delete-users --delete-workspace-users

# exec モードで、実際にユーザー削除を実行する
# --delete-users はユーザーの削除、--delete-workspace-users はワークスペースユーザーの削除を意味する
yarn run:ts-node ./scripts/routine/delete-users.ts --exec "6139b139643c7d002b49a86d,613ea3d6d155b400278b873d,613ea65c7a51a90024910d04,613f263bd155b400278b8787" --delete-users --delete-workspace-users

[!TOP] 大量のデータを扱う場合、マシンのスペックが十分でないと処理が遅くなる可能性があります。その場合、マシンのスペックを一時的に上げることを検討してください。

MongoDB Atlas でデータのアグリゲーションを行う

この aggregation を実行することで、削除対象ユーザーの email から、削除の記録に必要な情報を抽出することができます。

js
[
  {
    $match: {
      email: {
        $in: [
          "test+0@toruca.com",
        ]
      }
    }
  },
  {
    $lookup: {
      from: "workspaceusers",
      localField: "_id",
      foreignField: "user",
      as: "workspaceUser"
    }
  },
  {
    $project: {
      email: 1,
      name: 1,
      workspaceIds: {
        $map: {
          input: "$workspaceUser",
          as: "aUser",
          in: "$$aUser.workspace"
        }
      }
    }
  },
  {
    $lookup: {
      from: "workspaces",
      localField: "workspaceIds",
      foreignField: "_id",
      as: "workspaces"
    }
  },
  {
    $project: {
      userId: {
        $toString: "$_id"
      },
      email: 1,
      name: 1,
      workspaceIds: {
        $map: {
          input: "$workspaces",
          as: "aWorkspace",
          in: {
            $toString: "$$aWorkspace._id"
          }
        }
      },
      workspaceNames: {
        $map: {
          input: "$workspaces",
          as: "aWorkspace",
          in: {
            $toString: "$$aWorkspace.name"
          }
        }
      }
    }
  },
  {
    $project: {
      userId: 1,
      email: 1,
      name: 1,
      workspaceIds: {
        $reduce: {
          input: "$workspaceIds",
          initialValue: "",
          in: {
            $concat: [
              "$$value",
              {
                $cond: {
                  if: {
                    $eq: ["$$value", ""]
                  },
                  then: "",
                  else: ","
                }
              },
              "$$this"
            ]
          }
        }
      },
      workspaceNames: {
        $reduce: {
          input: "$workspaceNames",
          initialValue: "",
          in: {
            $concat: [
              "$$value",
              {
                $cond: {
                  if: {
                    $eq: ["$$value", ""]
                  },
                  then: "",
                  else: ","
                }
              },
              "$$this"
            ]
          }
        }
      }
    }
  }
]