Merge remote-tracking branch 'origin/develop-backend' into feature-frontend-ama

feature-frontend-ama
Amagasu 4 months ago
commit fb18965455
  1. 2
      backend/src/main/java/com/example/todoapp/controller/StocksController.java
  2. 46
      backend/src/main/java/com/example/todoapp/controller/ToBuysController.java
  3. 1
      backend/src/main/java/com/example/todoapp/model/ToBuys.java
  4. 20
      backend/src/main/java/com/example/todoapp/repository/RecipeStuffsRepository.java
  5. 4
      backend/src/main/java/com/example/todoapp/repository/StuffsRepository.java
  6. 20
      backend/src/main/java/com/example/todoapp/repository/ToBuysRepository.java
  7. 77
      backend/src/main/java/com/example/todoapp/service/ToBuysService.java

@ -1,6 +1,5 @@
package com.example.todoapp.controller;
import com.example.todoapp.dto.DeleteStockRequest;
import com.example.todoapp.dto.DeleteStockRequestDTO;
import com.example.todoapp.dto.StockResponseDTO;
import com.example.todoapp.dto.StockDTO;
@ -10,7 +9,6 @@ import com.example.todoapp.model.User;
import com.example.todoapp.repository.UserRepository;
import com.example.todoapp.service.StocksService;
import jakarta.validation.Valid;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;

@ -96,7 +96,7 @@ public class ToBuysController {
/**
* 指定されたユーザーIDに基づいてすべての買うものリストを取得する
*
* @param userId ユーザーID
* @param authentication 認証情報
* @return ユーザーに紐づく買うものリスト
*/
@GetMapping("/get")
@ -135,14 +135,14 @@ public class ToBuysController {
* ユーザーが指定したIDの買うものを削除する
*
* @param request 削除する買うものの情報を含むリクエストボディ
* @param authentication 認証情報
* @return 削除が成功した場合にtrueを含むレスポンス
*/
@DeleteMapping("/delete")
public ResponseEntity<Map<String, Boolean>> deleteToBuy(
@RequestBody DeleteToBuyRequestDTO request,
Authentication authentication) {
@RequestBody DeleteToBuyRequestDTO request) {
int deletedCount = toBuysService.deleteToBuyById(request.getTobuyId());
int deletedCount = toBuysService.deleteToBuysByTobuyId(request.getTobuyId());
Map<String, Boolean> response = new HashMap<>();
@ -160,7 +160,8 @@ public class ToBuysController {
* 買うものリストから削除し追加情報を付加して在庫リストに追加
*
* @param request 買うものの情報を含むリクエストボディ
* @return
* @param authentication 認証情報
* @return 購入処理が成功した場合にtrueを含むレスポンス
*/
@PostMapping("/buy")
public ResponseEntity<Map<String, Boolean>> buyToBuys(
@ -174,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);
}
}

@ -74,7 +74,6 @@ public class ToBuys {
/**
* 購入するお店
*/
@NotNull
@Column(nullable = false)
private String store;

@ -1,12 +1,10 @@
//--------------------------------
// RecipeStuffsRepository.java
//
//
// 更新履歴:2025/06/10 新規作成
// Copyright(c) 2025 IVIS All rights reserved.
//--------------------------------------------
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;
import jakarta.transaction.Transactional;
@ -21,14 +19,12 @@ import java.util.List;
import java.util.Optional;
/**
* 料理-材料エンティティのリポジトリインターフェース
* レシピ食材関連データのリポジトリインターフェース
* <p>
* このインターフェースは料理-材料データへのアクセスと操作を提供します
* このインターフェースはレシピと食材の関連データへのアクセスを提供します
* Spring Data JPAによって自動的に実装されます
* </p>
*/
@Repository
public interface RecipeStuffsRepository extends JpaRepository<RecipeStuffs, Long> {
/**
* レシピIDで食材情報を検索する
@ -47,4 +43,4 @@ public interface RecipeStuffsRepository extends JpaRepository<RecipeStuffs, Long
*/
Optional<RecipeStuffs> findByRecipesRecipeIdAndStuffStuffId(Long recipeId, Long stuffId);
}
}

@ -16,6 +16,7 @@ import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
/**
@ -28,7 +29,8 @@ import org.springframework.stereotype.Repository;
@Repository
public interface StuffsRepository extends JpaRepository<Stuffs, Long> {
// 材料情報を主キーで取得するメソッド(必要に応じて追加)
Stuffs findByStuffId(Long stuffId);
@Query("SELECT s FROM Stuffs s WHERE s.stuffId = ?1")
Optional<Stuffs> findByStuffId(Long stuffId);
Optional<Stuffs> findByStuffName(String stuffName);

@ -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;
@ -34,7 +37,7 @@ public interface ToBuysRepository extends JpaRepository<ToBuys, Integer> {
* @return 買うものレコード
*/
@Query("SELECT t FROM ToBuys t WHERE t.tobuyId = ?1")
ToBuys findById(Long tobuyId);
ToBuys findByTobuyId(Long tobuyId);
/**
* 指定されたユーザーIDに基づいて買うものリストを取得する
@ -43,15 +46,26 @@ public interface ToBuysRepository extends JpaRepository<ToBuys, Integer> {
* @return 買うものリスト
*/
@Query("SELECT t FROM ToBuys t WHERE t.user.id = ?1")
List<ToBuys> findByUser(Long userId);
List<ToBuys> findByUserIdOrderByTobuyIdAsc(Long userId);
/**
* 指定された買うものIDに基づいて買うものリストを削除
*
* @param tobuyId 買うものID
* @return
* @return 削除された行数
*/
@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);
}

@ -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,11 +60,15 @@ public class ToBuysService {
@Autowired
private MessageUtils messageUtils;
@Autowired
private RecipeStuffsRepository RecipeStuffsRepository;
/**
* 購入リストに新しいアイテムを追加する
*
* @param toBuyDTO 追加する購入アイテムのデータDTO
* @param authentication 認証情報
* @return 追加された購入アイテム
*/
public ToBuys addToBuys(ToBuysDTO toBuyDTO, Authentication authentication) {
@ -78,7 +86,7 @@ public class ToBuysService {
stuff = stuffsRepository.save(stuff);
} else {
// 材料情報を取得
Optional<Stuffs> optionalStuffs = stuffsRepository.findById(toBuyDTO.getStuffId());
Optional<Stuffs> optionalStuffs = stuffsRepository.findByStuffId(toBuyDTO.getStuffId());
if (!optionalStuffs.isPresent()) {
throw new RuntimeException("材料がありません");
}
@ -114,11 +122,11 @@ public class ToBuysService {
Optional<Stuffs> existingStuffs = stuffsRepository.findByStuffName(toBuyDTO.getStuffName());
// 新しい材料を作成
if (existingStuffs.isPresent()) {
// 如果存在,更新已有材料的属性
// 材料が存在する場合、更新
stuffs = existingStuffs.get();
stuffs.setCategory(toBuyDTO.getCategory()); // 可选:更新分类
} else {
// 否则新建材料
// 材料が存在しない場合、新規作成
stuffs = new Stuffs();
stuffs.setStuffName(toBuyDTO.getStuffName());
stuffs.setCategory(toBuyDTO.getCategory());
@ -154,7 +162,7 @@ public class ToBuysService {
* @return ユーザーに紐づく買うものリスト
*/
public List<ToBuys> getToBuysByUser(User user) {
return toBuysRepository.findByUser(user.getId());
return toBuysRepository.findByUserIdOrderByTobuyIdAsc(user.getId());
}
/**
@ -163,7 +171,7 @@ public class ToBuysService {
* @param tobuyId 購入リストID
*/
@Transactional
public int deleteToBuyById(Long tobuyId) {
public int deleteToBuysByTobuyId(Long tobuyId) {
return toBuysRepository.deleteByTobuyId(tobuyId);
}
@ -179,7 +187,7 @@ public class ToBuysService {
User user = getUserByUsername(username);
// Tobuy情報の取得
ToBuys tobuy = toBuysRepository.findById(dto.getTobuyId());
ToBuys tobuy = toBuysRepository.findByTobuyId(dto.getTobuyId());
// 新しい在庫を作成
Stocks stock = new Stocks();
@ -193,12 +201,64 @@ public class ToBuysService {
// 買うものリストから削除
System.out.println("tobuy.getTobuyId()=" + tobuy.getTobuyId());
deleteToBuyById(tobuy.getTobuyId());
deleteToBuysByTobuyId(tobuy.getTobuyId());
// データベースに保存
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;
}
/**
* ユーザー名からユーザーエンティティを取得する
*
@ -211,4 +271,7 @@ public class ToBuysService {
.orElseThrow(() -> new UsernameNotFoundException(messageUtils.getMessage("error.auth.user.not.found.with.name", new Object[]{username})));
}
}
Loading…
Cancel
Save