Skip to content

業務例外発生時にexceptionIdとexceptionValuesが返却されるようにする #2746

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 12 commits into
base: main
Choose a base branch
from

Conversation

fkoyama
Copy link
Contributor

@fkoyama fkoyama commented May 20, 2025

この Pull request で実施したこと

  • BusinessExceptionexceptionId の値をMaiaに合わせて修正
  • BusinessError が保持するエラーメッセージとそのプレースホルダーの値をErrorMessageクラスで管理するよう修正
  • HTTPレスポンスがexceptionIdexceptionValuesを返すよう修正

この Pull request では実施していないこと

Issues や Discussions 、関連する Web サイトなどへのリンク

なし

@fkoyama fkoyama self-assigned this May 20, 2025
@fkoyama fkoyama added the target: Dressca サンプルアプリケーションDresscaに関係がある label May 20, 2025
@fkoyama fkoyama added this to the v1.2.0 milestone May 20, 2025
@tsuna-can-se tsuna-can-se requested a review from Copilot May 21, 2025 02:35
Copy link

@Copilot Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

業務例外発生時にexceptionIdexceptionValuesをHTTPレスポンスで返却できるようにする改修です。

  • ErrorMessageクラスを導入し、エラーメッセージとプレースホルダー値を管理
  • BusinessError/BusinessExceptionexceptionIdベースにリファクタリング
  • 例外フィルターでProblemDetails拡張にexceptionId/exceptionValuesを設定
  • 各種ドメイン例外をBusinessException派生に変更し、テストを更新

Reviewed Changes

Copilot reviewed 22 out of 22 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
ErrorMessage.cs 新クラス追加: メッセージとプレースホルダー値を保持
BusinessError.cs / BusinessException.cs / BusinessErrorCollection.cs ErrorCodeExceptionIdstringErrorMessageへ変更
BusinessExceptionFilterBase.cs / BusinessExceptionDevelopmentFilter.cs exceptionId/exceptionValuesをProblemDetailsに追加
各ドメイン例外 (Ordering, Assets, Baskets, Authorization 等) BusinessException派生に変更し、ErrorMessageを使用
テストプロジェクト 上記変更に合わせてアサーションや変数名を修正
Comments suppressed due to low confidence (3)

samples/Dressca/dressca-backend/src/Dressca.Web/Runtime/BusinessExceptionFilterBase.cs:49

  • [nitpick] BusinessExceptionFilterBaseBusinessExceptionDevelopmentFilterで同一の拡張処理が重複しています。共通ロジックをヘルパーメソッドや基底クラスに切り出してDRYを意識すると保守性が向上します。
// 暫定の実装として、1つ目のBusinessErrorのexceptionIdとexceptionValuesを設定

samples/Dressca/dressca-backend/src/Dressca.Web/Runtime/BusinessExceptionFilterBase.cs:50

  • ProblemDetailsの拡張プロパティ(exceptionId/exceptionValues)を返却する挙動について、現状テストが追加されていません。HTTPレスポンスで正しく設定されることを検証する単体テストを追加しましょう。
problemDetails.Extensions.Add("exceptionId", businessEx.GetBusinessErrors.First().ExceptionId);

samples/Dressca/dressca-backend/src/Dressca.ApplicationCore/Ordering/OrderNotFoundException.cs:11

  • [nitpick] exceptionId文字列のフォーマット(キャメルケース、スネークケースなど)がクラス間で一貫していないように見えます。クライアントAPIが期待するIDフォーマットを定め、統一してください。
private const string ExceptionId = "orderNotFound";

Comment on lines 26 to 31
public string Message { get; private set; }

/// <summary>
/// エラーメッセージのプレースホルダーの値を取得します。
/// </summary>
public object[] ErrorMessageValues { get; private set; } = [];
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

コンストラクターで初期化した後、どこからも変更しないのであれば private set; は不要ではないですか?
セッターを残しておく必要があるんでしたっけ?

そして ErrorMessageValues をコンストラクターで初期化することが確定しているなら、このプロパティを空の配列で初期化する意義はないように思います。

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

コンストラクターで初期化した後は変更しない想定のため、不要なsetterと空の配列での初期化処理を削除しました。

Copy link

Test Result 📝

Test was a success.
Completed in 6282ms with 247 passed, 0 failed and 0 skipped.

Coverage 📐

Summary
Generated on: 05/23/2025 - 07:22:13
Parser: MultiReport (5x Cobertura)
Assemblies: 7
Classes: 127
Files: 120
Line coverage: 38.3% (1592 of 4148)
Covered lines: 1592
Uncovered lines: 2556
Coverable lines: 4148
Total lines: 8783
Branch coverage: 38.8% (264 of 680)
Covered branches: 264
Total branches: 680
Method coverage: Feature is only available for sponsors
Tag: 216_15204681460
Dressca.ApplicationCore - 96%
Name Line Branch
Dressca.ApplicationCore 96% 80.6%
Dressca.ApplicationCore.Accounting.Account 92.8% 100%
Dressca.ApplicationCore.Accounting.AccountItem 88.8%
Dressca.ApplicationCore.ApplicationCoreServicesExtensions 100%
Dressca.ApplicationCore.ApplicationService.AssetApplicationService 100% 70%
Dressca.ApplicationCore.ApplicationService.AssetApplicationService.AssetStr
eamInfo
100%
Dressca.ApplicationCore.ApplicationService.CatalogApplicationService 100% 75%
Dressca.ApplicationCore.ApplicationService.CatalogBrandNotExistingInReposit
oryException
100%
Dressca.ApplicationCore.ApplicationService.CatalogCategoryNotExistingInRepo
sitoryException
100%
Dressca.ApplicationCore.ApplicationService.CatalogItemNotExistingInReposito
ryException
100%
Dressca.ApplicationCore.ApplicationService.OrderApplicationService 100% 75%
Dressca.ApplicationCore.ApplicationService.ShoppingApplicationService 99% 83.3%
Dressca.ApplicationCore.ApplicationService.TransactionScopeManager 100% 100%
Dressca.ApplicationCore.Assets.Asset 94.4% 100%
Dressca.ApplicationCore.Assets.AssetNotFoundException 100%
Dressca.ApplicationCore.Assets.AssetTypes 100% 100%
Dressca.ApplicationCore.Authorization.NotConnectedUserStore 0%
Dressca.ApplicationCore.Authorization.PermissionDeniedException 100%
Dressca.ApplicationCore.Authorization.Roles 100%
Dressca.ApplicationCore.Baskets.Basket 100% 100%
Dressca.ApplicationCore.Baskets.BasketItem 84.2% 75%
Dressca.ApplicationCore.Baskets.CatalogItemNotExistingInBasketException 100%
Dressca.ApplicationCore.Catalog.CatalogBrand 84.6% 100%
Dressca.ApplicationCore.Catalog.CatalogCategory 84.6% 100%
Dressca.ApplicationCore.Catalog.CatalogDomainService 100% 60%
Dressca.ApplicationCore.Catalog.CatalogItem 91% 66.6%
Dressca.ApplicationCore.Catalog.CatalogItemAsset 92.8% 75%
Dressca.ApplicationCore.Events 100%
Dressca.ApplicationCore.Ordering.Address 94.7% 100%
Dressca.ApplicationCore.Ordering.CatalogItemOrdered 96.7% 100%
Dressca.ApplicationCore.Ordering.EmptyBasketOnCheckoutException 100%
Dressca.ApplicationCore.Ordering.NullBasketOnCheckoutException 100%
Dressca.ApplicationCore.Ordering.Order 100% 90%
Dressca.ApplicationCore.Ordering.OrderFactory 100%
Dressca.ApplicationCore.Ordering.OrderItem 88.2% 25%
Dressca.ApplicationCore.Ordering.OrderItemAsset 85.7% 75%
Dressca.ApplicationCore.Ordering.OrderNotFoundException 100%
Dressca.ApplicationCore.Ordering.ShipTo 92.3% 75%
Dressca.EfInfrastructure - 16.5%
Name Line Branch
Dressca.EfInfrastructure 16.5% 10.2%
Dressca.EfInfrastructure.Configurations.Assets.AssetConfiguration 100%
Dressca.EfInfrastructure.Configurations.Baskets.BasketConfiguration 100%
Dressca.EfInfrastructure.Configurations.Baskets.BasketItemConfiguration 100%
Dressca.EfInfrastructure.Configurations.Catalog.CatalogBrandConfiguration 100%
Dressca.EfInfrastructure.Configurations.Catalog.CatalogCategoryConfiguratio
n
100%
Dressca.EfInfrastructure.Configurations.Catalog.CatalogItemAssetConfigurati
on
100%
Dressca.EfInfrastructure.Configurations.Catalog.CatalogItemConfiguration 100%
Dressca.EfInfrastructure.Configurations.Ordering.OrderConfiguration 100% 100%
Dressca.EfInfrastructure.Configurations.Ordering.OrderItemAssetConfiguratio
n
100%
Dressca.EfInfrastructure.Configurations.Ordering.OrderItemConfiguration 100% 100%
Dressca.EfInfrastructure.DresscaDbContext 83.7% 50%
Dressca.EfInfrastructure.EfAssetRepository 0% 0%
Dressca.EfInfrastructure.EfBasketRepository 69.6% 50%
Dressca.EfInfrastructure.EfCatalogBrandRepository 20% 50%
Dressca.EfInfrastructure.EfCatalogCategoryRepository 20% 50%
Dressca.EfInfrastructure.EfCatalogRepository 28.5% 37.5%
Dressca.EfInfrastructure.EfInfrastructureServicesExtension 86.2% 75%
Dressca.EfInfrastructure.EfOrderRepository 100% 50%
Dressca.EfInfrastructure.Events 0%
Dressca.EfInfrastructure.HealthChecksBuilderExtensions 60%
Dressca.EfInfrastructure.Migrations.DresscaDbContextModelSnapshot 0% 0%
Dressca.EfInfrastructure.Migrations.InitialCreate 0% 0%
Dressca.Store.Assets.StaticFiles - 17.2%
Name Line Branch
Dressca.Store.Assets.StaticFiles 17.2% 0%
Dressca.Store.Assets.StaticFiles.Events 0%
Dressca.Store.Assets.StaticFiles.StaticFileAssetStore 0% 0%
Dressca.Store.Assets.StaticFiles.StaticFileAssetStoreServicesExtension 100%
Dressca.SystemCommon - 83.3%
Name Line Branch
Dressca.SystemCommon 83.3% 86.3%
Dressca.SystemCommon.BusinessError 100% 75%
Dressca.SystemCommon.BusinessErrorCollection 88.8% 100%
Dressca.SystemCommon.BusinessException 93.9% 100%
Dressca.SystemCommon.ErrorMessage 100% 100%
Dressca.SystemCommon.PagedList 0% 0%
Dressca.SystemCommon.Text.Json.DefaultJsonSerializerOptions 100%
System.ObjectExtensions 100% 100%
System.StringExtentions 100% 100%
Dressca.Web - 26.6%
Name Line Branch
Dressca.Web 26.6% 22.5%
__OptionValidationGeneratedAttributes 0% 0%
__OptionValidationStaticInstances 0%
Dressca.Web.Authorization.DummyAuthenticationHandler 0%
Dressca.Web.Authorization.StatusCodeMapAuthorizationMiddlewareResultHandler 0% 0%
Dressca.Web.Configuration.CookieSettingsValidator 0% 0%
Dressca.Web.Configuration.CookieSettings 0% 0%
Dressca.Web.Configuration.ValidateWebServerOptions 0% 0%
Dressca.Web.Configuration.WebServerOptions 0%
Dressca.Web.Controllers.ActionNameHelper 75% 50%
Dressca.Web.Controllers.ErrorController 8.3% 0%
Dressca.Web.Events 100%
Dressca.Web.HealthChecks.HealthCheckDescriptionProvider 7.8% 25%
Dressca.Web.HealthChecks.HealthCheckDescriptionProvider.HealthCheckControll
erMetadata
0% 0%
Dressca.Web.Runtime.BusinessExceptionDevelopmentFilter 100% 57.1%
Dressca.Web.Runtime.BusinessExceptionFilter 100% 57.1%
Dressca.Web.Runtime.BusinessExceptionFilterBase 100% 83.3%
Dressca.Web.Runtime.DbUpdateConcurrencyExceptionDevelopmentFilter 100% 50%
Dressca.Web.Runtime.DbUpdateConcurrencyExceptionFilter 100% 50%
Dressca.Web.Runtime.DbUpdateConcurrencyExceptionFilterBase 100% 75%
Dressca.Web.Consumer - 43.9%
Name Line Branch
Dressca.Web.Consumer 43.9% 28.7%
__OptionValidationGeneratedAttributes 0% 0%
__OptionValidationStaticInstances 0%
Dressca.Web.Consumer.Assets.AssetExtensions 87.5% 50%
Dressca.Web.Consumer.Baskets.BuyerIdFilterAttribute 96.5% 58.3%
Dressca.Web.Consumer.Baskets.HttpContextExtensions 100% 100%
Dressca.Web.Consumer.Configuration.CookieSettingsValidator 0% 0%
Dressca.Web.Consumer.Configuration.CookieSettings 100% 100%
Dressca.Web.Consumer.Configuration.ValidateWebServerOptions 0% 0%
Dressca.Web.Consumer.Configuration.WebServerOptions 100%
Dressca.Web.Consumer.Controllers.ApiModel.FindCatalogItemsQuery 0%
Dressca.Web.Consumer.Controllers.AssetsController 0% 0%
Dressca.Web.Consumer.Controllers.BasketItemsController 34.3% 30%
Dressca.Web.Consumer.Controllers.CatalogBrandsController 0% 0%
Dressca.Web.Consumer.Controllers.CatalogCategoriesController 0% 0%
Dressca.Web.Consumer.Controllers.CatalogItemsController 0% 0%
Dressca.Web.Consumer.Controllers.OrdersController 88.2% 50%
Dressca.Web.Consumer.Events 0%
Dressca.Web.Consumer.Mapper.BasketItemMapper 0% 0%
Dressca.Web.Consumer.Mapper.BasketMapper 9.5% 25%
Dressca.Web.Consumer.Mapper.CatalogBrandMapper 0% 0%
Dressca.Web.Consumer.Mapper.CatalogCategoryMapper 0% 0%
Dressca.Web.Consumer.Mapper.CatalogItemMapper 0% 0%
Dressca.Web.Consumer.Mapper.CatalogItemSummaryResponseMapper 0% 0%
Dressca.Web.Consumer.Mapper.DtoMapperServicesExtension 100%
Dressca.Web.Consumer.Mapper.OrderMapper 95.1% 83.3%
Program 78.7% 87.5%
Dressca.Web.Consumer.Dto - 58.4%
Name Line Branch
Dressca.Web.Consumer.Dto 58.4% ****
Dressca.Web.Consumer.Dto.Accounting.AccountResponse 100%
Dressca.Web.Consumer.Dto.Baskets.BasketItemResponse 0%
Dressca.Web.Consumer.Dto.Baskets.BasketResponse 0%
Dressca.Web.Consumer.Dto.Baskets.PostBasketItemsRequest 100%
Dressca.Web.Consumer.Dto.Baskets.PutBasketItemsRequest 0%
Dressca.Web.Consumer.Dto.Catalog.CatalogBrandResponse 0%
Dressca.Web.Consumer.Dto.Catalog.CatalogCategoryResponse 0%
Dressca.Web.Consumer.Dto.Catalog.CatalogItemResponse 0%
Dressca.Web.Consumer.Dto.Catalog.CatalogItemSummaryResponse 100%
Dressca.Web.Consumer.Dto.Ordering.OrderItemResponse 100%
Dressca.Web.Consumer.Dto.Ordering.OrderResponse 100%
Dressca.Web.Consumer.Dto.Ordering.PostOrderRequest 100%

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
target: Dressca サンプルアプリケーションDresscaに関係がある
Projects
None yet
Development

Successfully merging this pull request may close these issues.

業務例外発生時に、exceptionIdとexceptionValuesが返却されるようにする
2 participants