Skip to content

fix(mail): メールテンプレートの更新時に削除可否を変更しないようにする (#7053) - #7079

Open
ttokoro20240902 wants to merge 1 commit into
4.4from
fix/issue-7053-mail-template-deletable
Open

fix(mail): メールテンプレートの更新時に削除可否を変更しないようにする (#7053)#7079
ttokoro20240902 wants to merge 1 commit into
4.4from
fix/issue-7053-mail-template-deletable

Conversation

@ttokoro20240902

@ttokoro20240902 ttokoro20240902 commented Aug 25, 2026

Copy link
Copy Markdown
Contributor

概要(Overview・Refs Issue)

fixes #7053

システム用テンプレート(注文受付メール等)を 1 回保存すると削除ボタンが出現し、削除できてしまう不具合を修正します。

削除すると dtb_mail_template の行だけでなく Mail/order.twig などのテンプレートファイルも消えるため(MailController::delete())、メールが送信できなくなり、復旧にはファイルの復元が必要になります。

方針(Policy)

原因は aa6f4f85be「削除ボタン表示のタイミングを調整」(2024-04-16)です。setDeletable(true)MailTypePOST_SUBMIT からコントローラへ移した際に、元々あった if (null === $data->getId())(新規のみ)の条件が落ちていました。

そのため保存パスで新規のときだけフラグを立てる形に戻します。判定方法は MailType が既に 2 箇所(file_name 項目の追加・ファイル名重複チェック)で使っている null === $data->getId() に揃えました。

delete() には既に if (!$Mail->isDeletable()) のガードがあるため、そちらは変更していません。

検討して採らなかった案

  • setDeletable(true) の行を単に削除するMailTemplate::$deletable は既定 false なので、ユーザーが作成したテンプレートも削除できなくなります。MailControllerTest::testDelete()admin-basicinfo.spec.ts の「テンプレート新規作成 → 削除」が落ちます
  • 生成時($Mail ??= new MailTemplate())に立てる / Repository に生成メソッドを新設するindex() は新規画面でもビューに Mail を渡しており、mail.twig{% if Mail.isDeletable %} で削除ボタンと削除モーダルを出し分けています。生成時に立てると未保存の新規フォームに削除ボタンが出ます。モーダルの削除リンクは url('admin_setting_shop_mail_delete', {id: Mail.id})Mail.idnull になり壊れた URL になります。これは aa6f4f85be が調整した「タイミング」そのものです

なお同じ deletable 列を持つ Block では BlockRepository::newBlock() が生成時にだけフラグを立て、BlockController の保存処理は deletable に一切触れません。本修正はこの作法と整合します。

テスト(Test)

MailControllerTest に以下を追加しました。

  • testEditKeepsNotDeletable() — 削除不可のテンプレートを更新しても削除不可のままであることを確認
  • testCreate() に「新規登録したテンプレートは削除できる」アサートを追加(aa6f4f85be の意図に対する退行ガード)

修正前は testEditKeepsNotDeletableFailed asserting that true is false. で落ちることを確認済みです(空振りでないことの担保)。

実行 結果
MailControllerTest(10 本) OK (10 tests, 39 assertions)
vendor/bin/phpstan analyse src No errors
vendor/bin/php-cs-fixer fix --dry-run(変更 2 ファイル) Found 0 of 2 files

実機(APP_ENV=dev)でも Issue の再現手順を踏んで確認しました。

  1. 注文受付メールを選択 → 削除ボタン 0 件
  2. 保存 → 「保存しました」
  3. 保存後も削除ボタン・削除モーダルとも 0 件
  4. dtb_mail_templatedeletablefalse のまま

実装に関する補足(Appendix)

  • 既にフラグが立ってしまった行は、この修正では戻りません。 退行は 4.3.0 / 4.3.0-rc / 4.3.1 / 4.3.1-p1 に出荷済みで、システム用テンプレートを 1 回でも保存した環境では deletabletrue のまま残ります。補正が必要であれば、app/DoctrineMigrations の既存の作法(Version20200303053716 のように id と旧値でガードした UPDATE)で対応できますが、Issue のスコープを超えるため本 PR には含めていません。別途ご判断ください
  • origin/4.3 にも同じ形で残っています(MailController.php:101)。4.3 系への対応が必要かはメンテナ判断にお任せします
  • e2e/tests/admin-basicinfo.spec.ts は出荷通知メール(id=8)を保存しており、修正前はこの spec を流すだけで id=8 の deletabletrue に書き換わっていました。 修正後は書き換わりません

マイナーバージョン互換性保持のための制限事項チェックリスト

  • 既存機能の仕様変更はありません
  • フックポイントの呼び出しタイミングの変更はありません
  • フックポイントのパラメータの削除・データ型の変更はありません
  • twigファイルに渡しているパラメータの削除・データ型の変更はありません
  • Serviceクラスの公開関数の、引数の削除・データ型の変更はありません
  • 入出力ファイル(CSVなど)のフォーマット変更はありません

新規登録時の挙動は従来どおり(削除可能)で、変わるのは「更新時に deletable を書き換えない」点のみです。

レビュワー確認項目

  • 動作確認
  • コードレビュー
  • E2E/Unit テスト確認(テストの追加・変更が必要かどうか)
  • 互換性が保持されているか
  • セキュリティ上の問題がないか
    • 権限を超えた操作が可能にならないか
    • 不要なファイルアップロードがないか
    • 外部へ公開されるファイルや機能の追加ではないか
    • テンプレートでのエスケープ漏れがないか

🤖 Generated with Claude Code

Summary by CodeRabbit

  • 不具合修正

    • メールテンプレート更新時に、システム用テンプレートが誤って削除可能になる問題を修正しました。
    • 新規作成したテンプレートは引き続き削除可能として保存されます。
  • テスト

    • 新規作成・更新時の削除可否と件名変更が正しく反映されることを確認するテストを追加しました。

システム用テンプレート(注文受付メール等)を1回保存すると削除ボタンが出現し、
削除できてしまう。削除すると dtb_mail_template の行だけでなく Mail/order.twig 等の
テンプレートファイルも消えるため、メールが送れなくなる。

原因は aa6f4f8「削除ボタン表示のタイミングを調整」が setDeletable(true) を
MailType の POST_SUBMIT から MailController へ移した際に、元々あった
`if (null === $data->getId())`(新規のみ)の条件を落としたこと。

保存パスで新規のときだけフラグを立てるようにする。判定は MailType が既に
2箇所(file_name 項目の追加・ファイル名重複チェック)で使っている作法に揃えた。
delete() には既に isDeletable() のガードがあるため変更不要。

なお次の形はいずれも成立しない。
- 行を単に削除する: MailTemplate::$deletable の既定が false なので、
  ユーザーが作成したテンプレートも削除できなくなる
- 生成時に立てる: 新規画面でもビューに Mail を渡しており、未保存のフォームに
  削除ボタンが出る。モーダルの削除リンクは id が null で壊れた URL になる

テストは「削除不可のテンプレートを更新しても削除不可のまま」を追加し、
新規側の退行ガードとして testCreate に isDeletable() のアサートを足した。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Aug 25, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 13f4b1e7-15e3-4cad-9ffb-6016da975805

📥 Commits

Reviewing files that changed from the base of the PR and between f03d0da and 6d11d3c.

📒 Files selected for processing (2)
  • src/Eccube/Controller/Admin/Setting/Shop/MailController.php
  • tests/Eccube/Tests/Web/Admin/Setting/Shop/MailControllerTest.php

Included review availability: Your plan provides up to 4 included reviews per hour; 3 remain after this review.


📝 Walkthrough

Walkthrough

メールテンプレートの保存時に、削除可能フラグを新規登録時だけ設定します。更新時は既存の削除可否を保持します。新規登録と更新のテストを追加します。

Changes

メールテンプレートの削除可否制御

Layer / File(s) Summary
保存処理と削除可否の検証
src/Eccube/Controller/Admin/Setting/Shop/MailController.php, tests/Eccube/Tests/Web/Admin/Setting/Shop/MailControllerTest.php
新規登録時だけ setDeletable(true) を呼び出します。新規登録後に削除可能であることを確認します。更新時に件名を保存し、削除不可の状態を保持することを確認します。

Estimated code review effort: 2 (Simple) | ~10 minutes

Merge Risk: ⚪ Minimal · up to 6d11d

This change keeps existing system mail templates non-deletable when updated while preserving deletion for newly created templates. No actionable merge-blocking risk remains after normal checks and review.

Poem

うさぎがメールをそっと保存
新規なら削除の旗を立て
更新なら旗をそのままに
件名も正しく書き換えて
テストの森を駆け抜ける

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 75.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 4 functions across 2 files. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed タイトルは、メールテンプレートの更新時に削除可否を変更しない修正内容を明確に示しています。
Linked Issues check ✅ Passed [7053] の要件を満たしています。新規テンプレートでは deletabletrue に設定し、既存テンプレートの更新時は値を変更しません。削除不可のシステム用テンプレートを維持するテストも追加されています。
Out of Scope Changes check ✅ Passed 変更は [7053] の要件に限定されています。コントローラーの保存処理と関連テストのみを変更しており、削除処理のガードなど無関係な範囲は変更していません。
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/issue-7053-mail-template-deletable

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@ttokoro20240902 ttokoro20240902 added this to the 4.4.0 milestone Aug 25, 2026
@codecov

codecov Bot commented Aug 25, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 77.71%. Comparing base (f03d0da) to head (6d11d3c).

Additional details and impacted files
@@            Coverage Diff             @@
##              4.4    #7079      +/-   ##
==========================================
+ Coverage   77.67%   77.71%   +0.03%     
==========================================
  Files         597      597              
  Lines       29333    29334       +1     
==========================================
+ Hits        22785    22796      +11     
+ Misses       6548     6538      -10     
Flag Coverage Δ
Unit 77.71% <100.00%> (+0.03%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@dotani1111

Copy link
Copy Markdown
Contributor

@ttokoro20240902
PRありがとうございます!
動作確認いたします。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

メールテンプレート保存後デフォルトシステムテンプレートも削除可能になってしまいます。

2 participants