1. recipesStuffsRepository → recipeStuffsRepository

既存のrecipeStuffsRepository.javaを削除したら、本来のrecipesStuffsRepositoryをrecipeStuffsRepositorに変わる
2. tobuy/addByRecipeを実装しました
feature-backend-tobuy-addByRecipe
zhang.pengcheng 4 months ago
parent fed5a2e923
commit e3ba1d5b49
  1. 4
      backend/src/main/java/com/example/todoapp/config/InitTables.java
  2. 35
      backend/src/main/java/com/example/todoapp/controller/ToBuysController.java
  3. 42
      backend/src/main/java/com/example/todoapp/repository/RecipeStuffsRepository.java
  4. 37
      backend/src/main/java/com/example/todoapp/repository/RecipesStuffsRepository.java
  5. 14
      backend/src/main/java/com/example/todoapp/repository/ToBuysRepository.java
  6. 20
      backend/src/main/java/com/example/todoapp/service/RecipeService.java
  7. 61
      backend/src/main/java/com/example/todoapp/service/ToBuysService.java

@ -36,7 +36,7 @@ public class InitTables {
@Autowired
private RecipesRepository recipesRepository;
@Autowired
private RecipeStuffsRepository recipeStuffsRepository;
private RecipeStuffsRepository RecipeStuffsRepository;
@Autowired
private StuffsRepository stuffsRepository;
@ -128,6 +128,6 @@ public class InitTables {
recipeStuff.setRecipes(recipe);
recipeStuff.setRecipeStuffsId(stuffId);
recipeStuff.setAmount(amount);
recipeStuffsRepository.save(recipeStuff);
RecipeStuffsRepository.save(recipeStuff);
}
}

@ -175,4 +175,39 @@ public class ToBuysController {
return ResponseEntity.ok(response);
}
/**
* レシピから買うものを追加する
*
* @param payload レシピIDを含むペイロード
* @param authentication 認証情報
* @return 追加された買うもののリスト
*/
@PostMapping("/addByRecipe")
public ResponseEntity<Map<String, Object>> addByRecipe(
@RequestBody Map<String, Long> payload,
Authentication authentication) {
Long recipeId = payload.get("recipeId");
List<ToBuyResponseDTO> responseList = toBuysService.addByRecipeId(recipeId, authentication);
//shopのフィールドを削除
List<Map<String, Object>> filteredList = responseList.stream()
.map(dto -> {
Map<String, Object> map = new HashMap<>();
map.put("tobuyId", dto.getTobuyId());
map.put("stuffId", dto.getStuffId());
map.put("stuffName", dto.getStuffName());
map.put("amount", dto.getAmount());
return map;
})
.collect(Collectors.toList());
Map<String, Object> response = new HashMap<>();
response.put("result", true);
response.put("data", filteredList);
return ResponseEntity.ok(response);
}
}

@ -1,27 +1,37 @@
//--------------------------------
// RecipeStuffsRepository.java
//
//
// 更新履歴:2025/06/10 新規作成
// Copyright(c) 2025 IVIS All rights reserved.
//--------------------------------------------
package com.example.todoapp.repository;
import com.example.todoapp.model.RecipeStuffs;
import java.util.List;
import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import com.example.todoapp.model.RecipeStuffs;
/**
* 料理-材料エンティティのリポジトリインターフェース
* レシピ食材関連データのリポジトリインターフェース
* <p>
* このインターフェースは料理-材料データへのアクセスと操作を提供します
* このインターフェースはレシピと食材の関連データへのアクセスを提供します
* Spring Data JPAによって自動的に実装されます
* </p>
*/
@Repository
public interface RecipeStuffsRepository extends JpaRepository<RecipeStuffs, Long> {
}
/**
* レシピIDで食材情報を検索する
*
* @param recipeId 検索するレシピID
* @return 関連する食材情報リスト
*/
List<RecipeStuffs> findByRecipesRecipeId(Long recipeId);
/**
* レシピIDと食材IDで関連情報を検索する
*
* @param recipeId 検索するレシピID
* @param stuffId 検索する食材ID
* @return 関連情報存在する場合
*/
Optional<RecipeStuffs> findByRecipesRecipeIdAndStuffStuffId(Long recipeId, Long stuffId);
}

@ -1,37 +0,0 @@
package com.example.todoapp.repository;
import java.util.List;
import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;
import com.example.todoapp.model.RecipeStuffs;
/**
* レシピ食材関連データのリポジトリインターフェース
* <p>
* このインターフェースはレシピと食材の関連データへのアクセスを提供します
* Spring Data JPAによって自動的に実装されます
* </p>
*/
public interface RecipesStuffsRepository extends JpaRepository<RecipeStuffs, Long> {
/**
* レシピIDで食材情報を検索する
*
* @param recipeId 検索するレシピID
* @return 関連する食材情報リスト
*/
List<RecipeStuffs> findByRecipesRecipeId(Long recipeId);
/**
* レシピIDと食材IDで関連情報を検索する
*
* @param recipeId 検索するレシピID
* @param stuffId 検索する食材ID
* @return 関連情報存在する場合
*/
Optional<RecipeStuffs> findByRecipesRecipeIdAndStuffStuffId(Long recipeId, Long stuffId);
}

@ -7,9 +7,12 @@
//--------------------------------------------
package com.example.todoapp.repository;
import com.example.todoapp.model.Stuffs;
import com.example.todoapp.model.ToBuys;
import com.example.todoapp.model.User;
import java.util.List;
import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
@ -54,4 +57,15 @@ public interface ToBuysRepository extends JpaRepository<ToBuys, Integer> {
@Modifying
@Query("DELETE FROM ToBuys t WHERE t.tobuyId = :tobuyId")
int deleteByTobuyId(@Param("tobuyId") Long tobuyId);
/**
* ユーザーとスタッフに基づいて買うものレコードを取得する
*
* @param user ユーザー
* @param stuff スタッフ
* @return 買うものレコード
*/
@Query("SELECT t FROM ToBuys t WHERE t.user = :user AND t.stuff = :stuff")
Optional<ToBuys> findByUserAndStuff(@Param("user") User user, @Param("stuff") Stuffs stuff);
}

@ -24,7 +24,7 @@ import com.example.todoapp.dto.StuffRequestDTO;
import com.example.todoapp.model.RecipeStuffs;
import com.example.todoapp.model.Recipes;
import com.example.todoapp.model.Stuffs;
import com.example.todoapp.repository.RecipesStuffsRepository;
import com.example.todoapp.repository.RecipeStuffsRepository;
import com.example.todoapp.repository.RecipesRepository;
import com.example.todoapp.repository.StuffsRepository;
@ -47,7 +47,7 @@ public class RecipeService {
private StuffsRepository stuffsRepository;
@Autowired
private RecipesStuffsRepository recipeStuffsRepository;
private RecipeStuffsRepository RecipeStuffsRepository;
/**
* レシピを新規登録する
@ -89,7 +89,7 @@ public class RecipeService {
recipeStuffsList.add(recipeStuffs);
}
recipeStuffsRepository.saveAll(recipeStuffsList);
RecipeStuffsRepository.saveAll(recipeStuffsList);
return recipe;
}
@ -113,7 +113,7 @@ public class RecipeService {
Recipes recipe = recipesRepository.findById(recipeId)
.orElseThrow(() -> new RuntimeException("レシピが見つかりません"));
List<RecipeStuffs> recipeStuffsList = recipeStuffsRepository.findByRecipesRecipeId(recipeId);
List<RecipeStuffs> recipeStuffsList = RecipeStuffsRepository.findByRecipesRecipeId(recipeId);
List<StuffDetailDTO> stuffList = recipeStuffsList.stream()
.map(rs -> {
@ -168,19 +168,19 @@ public class RecipeService {
rs.setRecipes(recipe);
rs.setStuff(newStuff);
rs.setAmount(stuffDTO.getAmount());
recipeStuffsRepository.save(rs);
RecipeStuffsRepository.save(rs);
incomingStuffIds.add(newStuff.getStuffId());
} else {
// 材料IDが提供されている場合、既存のRecipeStuffsエントリを検索
Optional<RecipeStuffs> optionalRs = recipeStuffsRepository
Optional<RecipeStuffs> optionalRs = RecipeStuffsRepository
.findByRecipesRecipeIdAndStuffStuffId(dto.getRecipeId(), stuffDTO.getStuffId());
if (optionalRs.isPresent()) {
// RecipeStuffsエントリが存在する場合、数量を更新
RecipeStuffs rs = optionalRs.get();
rs.setAmount(stuffDTO.getAmount());
recipeStuffsRepository.save(rs);
RecipeStuffsRepository.save(rs);
incomingStuffIds.add(rs.getStuff().getStuffId());
} else {
// オプション:見つからない場合、新しいRecipeStuffsエントリを作成
@ -191,17 +191,17 @@ public class RecipeService {
rs.setRecipes(recipe);
rs.setStuff(existingStuff);
rs.setAmount(stuffDTO.getAmount());
recipeStuffsRepository.save(rs);
RecipeStuffsRepository.save(rs);
incomingStuffIds.add(existingStuff.getStuffId());
}
}
}
// 入ってきたリストにないRecipeStuffsエントリを削除
List<RecipeStuffs> existingStuffs = recipeStuffsRepository.findByRecipesRecipeId(dto.getRecipeId());
List<RecipeStuffs> existingStuffs = RecipeStuffsRepository.findByRecipesRecipeId(dto.getRecipeId());
for (RecipeStuffs rs : existingStuffs) {
if (!incomingStuffIds.contains(rs.getStuff().getStuffId())) {
recipeStuffsRepository.delete(rs);
RecipeStuffsRepository.delete(rs);
}
}

@ -10,11 +10,14 @@ package com.example.todoapp.service;
import com.example.todoapp.util.MessageUtils;
import com.example.todoapp.dto.BuyRequestDTO;
import com.example.todoapp.dto.ToBuyResponseDTO;
import com.example.todoapp.dto.ToBuysDTO;
import com.example.todoapp.model.RecipeStuffs;
import com.example.todoapp.model.Stocks;
import com.example.todoapp.model.Stuffs;
import com.example.todoapp.model.ToBuys;
import com.example.todoapp.model.User;
import com.example.todoapp.repository.RecipeStuffsRepository;
import com.example.todoapp.repository.StocksRepository;
import com.example.todoapp.repository.StuffsRepository;
import com.example.todoapp.repository.ToBuysRepository;
@ -27,6 +30,7 @@ import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
@ -56,6 +60,8 @@ public class ToBuysService {
@Autowired
private MessageUtils messageUtils;
@Autowired
private RecipeStuffsRepository RecipeStuffsRepository;
/**
* 購入リストに新しいアイテムを追加する
@ -201,6 +207,58 @@ public class ToBuysService {
return stocksRepository.save(stock);
}
/**
* 指定されたレシピIDに基づいて買うものを追加する
*
* @param recipeId レシピID
* @param authentication 認証情報
* @return 追加された買うもののリスト
*/
public List<ToBuyResponseDTO> addByRecipeId(Long recipeId, Authentication authentication) {
// ユーザー情報を取得
String username = authentication.getName();
User user = userRepository.findByUsername(username)
.orElseThrow(() -> new RuntimeException("ユーザーが見つかりません: " + username));
// 料理情報を取得
List<RecipeStuffs> recipeStuffsList = RecipeStuffsRepository.findByRecipesRecipeId(recipeId);
List<ToBuyResponseDTO> result = new ArrayList<>();
for (RecipeStuffs rs : recipeStuffsList) {
Stuffs stuff = rs.getStuff();
int requiredAmount = rs.getAmount();
Optional<ToBuys> existingToBuyOpt = toBuysRepository.findByUserAndStuff(user, stuff);
ToBuys toBuy;
if (existingToBuyOpt.isPresent()) {
toBuy = existingToBuyOpt.get();
toBuy.setAmount(toBuy.getAmount() + requiredAmount); // 既存の数量を更新
} else {
toBuy = new ToBuys();
toBuy.setUser(user);
toBuy.setStuff(stuff);
toBuy.setAmount(requiredAmount);
toBuy.setStore("");
}
toBuy = toBuysRepository.save(toBuy);
// ToBuyResponseDTOに変換
ToBuyResponseDTO dto = new ToBuyResponseDTO();
dto.setTobuyId(toBuy.getTobuyId());
dto.setStuffId(toBuy.getStuff().getStuffId());
dto.setStuffName(toBuy.getStuff().getStuffName());
dto.setAmount(toBuy.getAmount());
result.add(dto);
}
return result;
}
/**
* ユーザー名からユーザーエンティティを取得する
*
@ -213,4 +271,7 @@ public class ToBuysService {
.orElseThrow(() -> new UsernameNotFoundException(messageUtils.getMessage("error.auth.user.not.found.with.name", new Object[]{username})));
}
}
Loading…
Cancel
Save