レストラン配信アプリ - 料品情報の修正機能実装

機能要件と設計

インターフェース設計:

  • IDによる料品の検索
  • カテゴリによる分類検索(実装済み)
  • ファイルアップロード(実装済み)
  • 料品情報の修正

まず、データの表示機能(回显)を実装し、次に修正機能を実装します。

IDによる料品検索

Controller層:


@GetMapping("/{id}")
@ApiOperation("IDで料品を検索")
public Result<DishVO> fetchDishById(@PathVariable Long id){
    log.info("IDで料品を検索: {}",id);
    DishVO dishVO = dishService.fetchDishWithFlavor(id);
    return Result.success(dishVO);
}

Service層:


DishVO fetchDishWithFlavor(Long id);

Service実装:


public DishVO fetchDishWithFlavor(Long id) {
    // IDで料品テーブルを検索
    Dish dish = dishMapper.findById(id);
    
    // 料品IDに対応する味を検索
    List<DishFlavor> dishFlavors = dishFlavorMapper.findFlavorsByDishId(id);
    
    // 検索データをVOに格納
    DishVO dishVO = new DishVO();
    BeanUtils.copyProperties(dish, dishVO);
    dishVO.setFlavors(dishFlavors);
    return dishVO;
}

Mapperインターフェース:


@Select("select * from dish_flavor where dish_id = #{dishId}")
List<DishFlavor> findFlavorsByDishId(Long dishId);

料品情報の修正

追加と修正ではデータ形式が同じなので、パラメータもDTOを使用します。

味の修正は複雑で、変更されたもの、追加されたもの、削除されたものがある可能性があります。簡単な方法として、まず既存のデータをすべて削除し、新しいデータを挿入します。

Controller層:


@PutMapping
@ApiOperation("料品情報を修正")
public Result modifyDish(@RequestBody DishDTO dishDTO){
    log.info("料品情報を修正: {}",dishDTO);
    dishService.updateDishWithFlavor(dishDTO);
    return Result.success();
}

Service実装:


public void updateDishWithFlavor(DishDTO dishDTO) {
    // 味の修正は複雑 - 変更、追加、削除の可能性がある
    // シンプルな方法: まず削除してから再挿入
    Dish dish = new Dish();
    BeanUtils.copyProperties(dishDTO, dish);
    
    // 料品基本情報を修正
    dishMapper.modifyDish(dish);
    
    // 元の味を削除
    dishFlavorMapper.removeByDishId(dishDTO.getId());
    
    // 新しい味を挿入
    List<DishFlavor> flavors = dishDTO.getFlavors();
    if (flavors != null && flavors.size() > 0){
        flavors.forEach(flavor -> {
            flavor.setDishId(dishDTO.getId());
        });
        dishFlavorMapper.batchInsert(flavors);
    }
}

注: BeanUtils.copyPropertiesの引数順序に注意してください。第一引数の属性値が第二引数にコピーされます。

タグ: Java Spring Boot MyBatis REST API 食品配信アプリ

6月12日 16:52 投稿