Skip to the content.

0009. マルチテナント単位を Clerk Org → 自前 Team モデルに再設計する

Context

ADR 0008 で認証を Clerk → Auth.js + Magic Link に移行することを決めた。 これに伴い「アプリデータの所有単位」 (DDB pk のテナント分割キー) も Clerk Org ID から 自前のテナント概念に切り替える必要がある。

設計時の前提:

Decision

Clerk Organization 概念を捨て、自前の Team / TeamMembership モデルに再設計する

データモデル (DynamoDB Single Table):

=== App entities (Team scope) ===
pk = TEAM#{teamId}  sk = META                    (Team metadata)
pk = TEAM#{teamId}  sk = MEMBER#{userId}         (Team-centric membership)
pk = TEAM#{teamId}  sk = RES#{resourceId}        (既存 Resource、pk のみ rename)
pk = TEAM#{teamId}  sk = PRJ#{projectId}         (既存 Project、pk のみ rename)
pk = TEAM#{teamId}  sk = ASN#{startDate}#{id}    (既存 Assignment、pk のみ rename)

=== Auth.js entities (DDB adapter 管理) ===
pk = USER#{userId}        sk = META                          (User base)
pk = USER#{userId}        sk = ACCOUNT#{provider}#{accountId}
pk = SESSION#{token}      sk = META
pk = VERIFICATION#{token} sk = META  (TTL = expires)

=== GSI1 (3 用途を兼用) ===
GSI1PK = USER#email#{email}    GSI1SK = USER#email#{email}     (Auth.js: User by email)
GSI1PK = ACCOUNT#{provider}    GSI1SK = ACCOUNT#{providerAccountId} (Auth.js: User by account)
GSI1PK = USER#{userId}         GSI1SK = TEAM#{teamId}          (App: user → team 一覧)

実装方針:

PR 構成:

Consequences

Positive

Negative

Neutral

Alternatives considered

References