とくに面白みはないんだけど「DBに登録されている個人情報をサービス退会時にマスクする」という要件があったときに DDD でどんなドメインオブジェクトを定義すればいいのか考えたのでメモ。
ちなみに「マスクする」というのは名前とか住所を「****」みたいな文字列に変更してしまうということです。
# 個人情報クラス
# どの項目をどうマスクすれば良いか知ってる
class PrivateInfo
# マスクする対象のユーザを受け取る
def initialize(user)
@user = user
end
# マスクする
def mask
@user.first_name = '****'
@user.last_name = '****'
@user.address = 都道府県だけ残してマスクする
@user.email = 先頭3文字残してマスクする
@user.company.name = 関連モデルの項目もマスクする
end
end
# 例えば Rails のユーザモデル
class User < ApplicationRecord
# 個人情報モデルを返す
def private_info
PrivateInfo.new(self)
end
end
こんな感じで「個人情報」を表現するクラスを PrivateInfo
として定義して、このオブジェクトを User
から取得できるようにしておく。
退会時にデータをマスクしたいときは PrivateInfo.mask
を呼び出す。
# ユーザに直接関係ないアカウント管理のドメインロジックを持ってるオブジェクト
class UserAccount
def initialize(user)
@user = user
end
# 退会するときの処理
def withdrawal
@user.private_info.mask
@user.delete
# その他必要な退会処理
end
end
# 退会コントローラのアクション
def withdraw
user_account = UserAccount.new(current_user)
user_account.withdrawal
redirect_to :thankyou
end