Skip to content

refactor(import): 破壊的変更の判定をサービス層に出す - #40

Merged
kentalow merged 1 commit into
mainfrom
feat/shared-destructive-summary
Aug 30, 2026
Merged

refactor(import): 破壊的変更の判定をサービス層に出す#40
kentalow merged 1 commit into
mainfrom
feat/shared-destructive-summary

Conversation

@kentalow

Copy link
Copy Markdown
Member

Summary

_destructive_summarysrc/services/import_issues.destructive_summary() として公開した。CLI はそれを呼ぶだけになる。挙動は変わらない。

なぜ

B6 のガードを cli.py の commit ゲートに置いた。CLI がトランザクションを持っているので、そこが正しい場所である。

ただし CLI が唯一の利用者ではなかった。 compeito-aws の Admin API はインポートのサービス関数を直接呼び、router.py が自分で session.commit() する(compeito-aws#100)。したがってあちらの経路はガードを通らない。

判定に必要な材料(items_moved / associations_moved / lost_associations_count / lost_associations_sample)はサービス層のレポートに載っているので、あちら側で同じ判定を組める。問題は「何を破壊的と数えるか」を二重に実装することである。 正味の損失で数える、(type, origin, destination) で比較する、並び替えは含めない、といった判断がコピーされ、片方だけ変わる。

分け方

  • 定義はサービス層: destructive_summary(report) が件数と上限つきのサンプルを返す
  • ゲートはトランザクションを持つ側: 確認を求めるか、拒否するか、commit するかは、cli.py なら CLI が、Admin API ならあちらが決める

この境界は import-logic.md の EN / JP にも書いた。

Test plan

  • uv run pytest(908 passed / ローカル)
  • uv run ruff check . / uv run ruff format --check .
  • カウンタを持たないレポート(rubric import)でゼロを返すこと
  • CASE レポートの move 件数、サンプルの上限
  • CI グリーン

🤖 Generated with Claude Code

ガードを CLI に置いたため、インポートのサービス関数を直接呼ぶ利用者には
効いていなかった(compeito-aws の Admin API がそうで、`router.py` が自分で
commit する)。判定に必要なカウンタはレポートに載っているので、あちら側で
同じ判定を組める。ただし「何を破壊的と数えるか」を二重に実装すると、いずれ
食い違う。

`_destructive_summary` を `import_issues.destructive_summary` として公開し、
CLI はそれを呼ぶだけにした。**定義はサービス層、ゲートはトランザクションを
持つ側**、という分け方である。サンプルの上限(20件)も定義側に移した。

挙動は変わらない。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@kentalow
kentalow merged commit 14a50ab into main Aug 30, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant