From 5f078bb6c5869d391a439418003f3812ee42e18d Mon Sep 17 00:00:00 2001 From: "zhang.pengcheng" Date: Mon, 9 Jun 2025 16:23:29 +0900 Subject: [PATCH 1/3] =?UTF-8?q?1.=20stock:=20update,=20delete=E3=82=92?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=202.=20tobuy=E3=82=B3=E3=83=A1=E3=83=B3?= =?UTF-8?q?=E3=83=88=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../todoapp/controller/StocksController.java | 63 +++++++++++++++---- .../todoapp/controller/ToBuysController.java | 13 ++-- .../todoapp/dto/DeleteStockRequest.java | 8 +++ .../com/example/todoapp/model/Stocks.java | 15 +---- .../todoapp/repository/StocksRepository.java | 7 ++- .../todoapp/service/StocksService.java | 24 +++---- 6 files changed, 86 insertions(+), 44 deletions(-) create mode 100644 backend/src/main/java/com/example/todoapp/dto/DeleteStockRequest.java diff --git a/backend/src/main/java/com/example/todoapp/controller/StocksController.java b/backend/src/main/java/com/example/todoapp/controller/StocksController.java index 8bdf482..4ce265b 100644 --- a/backend/src/main/java/com/example/todoapp/controller/StocksController.java +++ b/backend/src/main/java/com/example/todoapp/controller/StocksController.java @@ -1,15 +1,21 @@ package com.example.todoapp.controller; +import com.example.todoapp.dto.DeleteStockRequest; import com.example.todoapp.dto.StockDTO; import com.example.todoapp.model.Stocks; +import com.example.todoapp.model.User; +import com.example.todoapp.repository.UserRepository; import com.example.todoapp.service.StocksService; import jakarta.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.security.core.Authentication; +import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.web.bind.annotation.*; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; /** @@ -26,6 +32,9 @@ public class StocksController { @Autowired private StocksService stockService; + @Autowired + private UserRepository userRepository; + /** * ログインユーザーのすべての在庫を取得する * @@ -64,7 +73,7 @@ public class StocksController { * @param stock 作成する在庫の情報 * @return 作成された在庫 */ - @PostMapping + @PostMapping("/add") public ResponseEntity createStock( Authentication authentication, @Valid @RequestBody Stocks stock) { @@ -80,13 +89,25 @@ public class StocksController { * @param stockDetails 更新内容 * @return 更新された在庫 */ - @PutMapping("/{id}") - public ResponseEntity updateStock( + @PutMapping("/update") + public ResponseEntity> updateStock( Authentication authentication, - @PathVariable("id") Long stockId, - @Valid @RequestBody Stocks stockDetails) { - Stocks updatedStock = stockService.updateStocks(authentication.getName(), stockId, stockDetails); - return ResponseEntity.ok(StockDTO.fromEntity(updatedStock)); + @Valid @RequestBody StockDTO stockDTO) { + + Stocks updatedStock = stockService.updateStocks(authentication.getName(), stockDTO); + + Map response = new HashMap<>(); + + if (updatedStock == null) { + response.put("result", false); + response.put("message", "指定されたIDの在庫が見つかりませんでした"); + return ResponseEntity.ok(response); + }else { + response.put("result", true); + response.put("message", "变更成功しました"); + } + + return ResponseEntity.ok(response); } /** @@ -96,11 +117,31 @@ public class StocksController { * @param taskId 削除する在庫のID * @return 空のレスポンス */ - @DeleteMapping("/{id}") + @DeleteMapping("/delete") public ResponseEntity deleteStock( Authentication authentication, - @PathVariable("id") Long stockId) { - stockService.deleteStock(authentication.getName(), stockId); - return ResponseEntity.ok().build(); + @RequestBody DeleteStockRequest request + ) { + + // 認証されたユーザー名を取得 + String username = authentication.getName(); + + // ユーザー情報を取得 + User user = userRepository.findByUsername(username) + .orElseThrow(() -> new UsernameNotFoundException("User not found")); + + int deletedCount = stockService.deleteStockById(user.getId(), request.getStockId()); + + Map response = new HashMap<>(); + + if (deletedCount > 0) { + response.put("result", true); + response.put("message", "削除成功しました"); + } else { + response.put("result", false); + response.put("message", "指定された在庫が見つかりませんでした"); + } + + return ResponseEntity.ok(response); } } \ No newline at end of file diff --git a/backend/src/main/java/com/example/todoapp/controller/ToBuysController.java b/backend/src/main/java/com/example/todoapp/controller/ToBuysController.java index 03c7e30..e37c75d 100644 --- a/backend/src/main/java/com/example/todoapp/controller/ToBuysController.java +++ b/backend/src/main/java/com/example/todoapp/controller/ToBuysController.java @@ -14,7 +14,6 @@ import com.example.todoapp.model.Stuffs; import com.example.todoapp.model.ToBuys; import com.example.todoapp.model.User; import com.example.todoapp.repository.UserRepository; -import com.example.todoapp.repository.StuffsRepository; import com.example.todoapp.service.ToBuysService; import jakarta.validation.Valid; @@ -46,9 +45,6 @@ public class ToBuysController { @Autowired private UserRepository userRepository; - @Autowired - private StuffsRepository stuffsRepository; - /** * 新しい購入アイテムを追加する * @@ -63,7 +59,6 @@ public class ToBuysController { ToBuys createdToBuy = toBuysService.addToBuys(dto, authentication); - // 构建响应体 Map response = new HashMap<>(); response.put("result", true); response.put("tobuyId", createdToBuy.getTobuyId()); @@ -73,6 +68,13 @@ public class ToBuysController { return ResponseEntity.ok(response); } + /** + * 指定されたIDの在庫を更新する + * + * @param authentication 認証情報 + * @param dto 更新内容 + * @return 更新された + */ @PutMapping("/update") public ResponseEntity> updateToBuys( @Valid @RequestBody ToBuysDTO dto, @@ -81,7 +83,6 @@ public class ToBuysController { ToBuys updatedToBuy = toBuysService.updateToBuys(dto, authentication); - Map response = new HashMap<>(); response.put("tobuyId", updatedToBuy.getTobuyId()); response.put("stuffId", updatedToBuy.getStuff().getStuffId()); diff --git a/backend/src/main/java/com/example/todoapp/dto/DeleteStockRequest.java b/backend/src/main/java/com/example/todoapp/dto/DeleteStockRequest.java new file mode 100644 index 0000000..7eee296 --- /dev/null +++ b/backend/src/main/java/com/example/todoapp/dto/DeleteStockRequest.java @@ -0,0 +1,8 @@ +package com.example.todoapp.dto; + +import lombok.Data; + +@Data +public class DeleteStockRequest { + private Long stockId; +} \ No newline at end of file diff --git a/backend/src/main/java/com/example/todoapp/model/Stocks.java b/backend/src/main/java/com/example/todoapp/model/Stocks.java index 1b8ede7..c9c47b2 100644 --- a/backend/src/main/java/com/example/todoapp/model/Stocks.java +++ b/backend/src/main/java/com/example/todoapp/model/Stocks.java @@ -54,20 +54,7 @@ public class Stocks { ) private Stuffs stuff; - - // /** - // * ユーザーテーブル参照用の外部キー - // */ - // @NotNull - // @ManyToOne(fetch = FetchType.LAZY) - // @JoinColumn( - // name = "userId", - // referencedColumnName = "id", - // nullable = false - // ) - // private User user; - - /** + /** * タスクの所有者(ユーザー) * 多対一の関係で、遅延ロードを使用 */ diff --git a/backend/src/main/java/com/example/todoapp/repository/StocksRepository.java b/backend/src/main/java/com/example/todoapp/repository/StocksRepository.java index b121415..9d275e1 100644 --- a/backend/src/main/java/com/example/todoapp/repository/StocksRepository.java +++ b/backend/src/main/java/com/example/todoapp/repository/StocksRepository.java @@ -58,5 +58,10 @@ public interface StocksRepository extends JpaRepository { * @param stockId 削除する在庫 * @param userId 削除するユーザー */ - void deleteStocksByStockIdAndUserId(Long stockId, Long userId); + // void deleteStocksByStockIdAndUserId(Long stockId, Long userId); + + @Modifying + @Transactional + @Query("DELETE FROM Stocks t WHERE t.user.id = :userId AND t.stockId = :stockId") + int deleteByUserIdAndStockId(@Param("userId") Long userId, @Param("stockId") Long stockId); } \ No newline at end of file diff --git a/backend/src/main/java/com/example/todoapp/service/StocksService.java b/backend/src/main/java/com/example/todoapp/service/StocksService.java index 07dad3c..7f33b6c 100644 --- a/backend/src/main/java/com/example/todoapp/service/StocksService.java +++ b/backend/src/main/java/com/example/todoapp/service/StocksService.java @@ -1,5 +1,6 @@ package com.example.todoapp.service; +import com.example.todoapp.dto.StockDTO; import com.example.todoapp.model.Stocks; import com.example.todoapp.util.MessageUtils; import com.example.todoapp.model.User; @@ -75,25 +76,24 @@ public class StocksService { * @param stockDetails 編集内容(新しい情報) * @return 編集された在庫エンティティ */ - public Stocks updateStocks(String username, Long stockId, Stocks stockDetails) { - Stocks stock = getStockById(username, stockId); - stock.setAmount(stockDetails.getAmount()); - stock.setPrice(stockDetails.getPrice()); - stock.setLastUpdate(stockDetails.getLastUpdate()); - stock.setBuyDate(stockDetails.getBuyDate()); - stock.setExpDate(stockDetails.getExpDate()); + public Stocks updateStocks(String username, StockDTO stockDto) { + Stocks stock = getStockById(username, stockDto.getStockId()); + stock.setAmount(stockDto.getAmount()); + stock.setPrice(stockDto.getPrice()); + stock.setLastUpdate(stockDto.getLastUpdate()); + stock.setBuyDate(stockDto.getBuyDate()); + stock.setExpDate(stockDto.getExpDate()); return stocksRepository.save(stock); } /** * 指定された在庫を削除する * - * @param username ユーザー名 - * @param taskId 削除する在庫のID + * @param userId ユーザー名 + * @param stockId 削除する在庫のID */ - public void deleteStock(String username, Long stockId) { - Stocks stock = getStockById(username, stockId); - stocksRepository.delete(stock); + public int deleteStockById(Long userId, Long stockId) { + return stocksRepository.deleteByUserIdAndStockId(userId, stockId); } From 044718ecf74345440b47d8f45338bd37bb5d76df Mon Sep 17 00:00:00 2001 From: "zhang.pengcheng" Date: Tue, 10 Jun 2025 16:16:54 +0900 Subject: [PATCH 2/3] =?UTF-8?q?1.=20recipes:=20add,=20getAll,=20getById,?= =?UTF-8?q?=20update=20=E3=82=92=E5=AE=9F=E8=A3=85=E3=81=97=E3=81=BE?= =?UTF-8?q?=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../todoapp/controller/RecipesController.java | 92 ++++++++ .../todoapp/controller/StocksController.java | 8 +- .../todoapp/controller/ToBuysController.java | 1 - .../example/todoapp/dto/RecipeDetailDTO.java | 14 ++ .../example/todoapp/dto/RecipeRequestDTO.java | 13 ++ .../todoapp/dto/RecipeResponseDTO.java | 11 + ...nseStockDTO.java => StockDTOResponse.java} | 6 +- .../example/todoapp/dto/StuffDetailDTO.java | 10 + .../example/todoapp/dto/StuffRequestDTO.java | 10 + .../example/todoapp/model/RecipeStuffs.java | 12 +- .../com/example/todoapp/model/Recipes.java | 2 +- .../repository/RecipeStuffsRepository.java | 18 ++ .../todoapp/repository/RecipesRepository.java | 7 + .../todoapp/service/RecipeService.java | 197 ++++++++++++++++++ 14 files changed, 386 insertions(+), 15 deletions(-) create mode 100644 backend/src/main/java/com/example/todoapp/controller/RecipesController.java create mode 100644 backend/src/main/java/com/example/todoapp/dto/RecipeDetailDTO.java create mode 100644 backend/src/main/java/com/example/todoapp/dto/RecipeRequestDTO.java create mode 100644 backend/src/main/java/com/example/todoapp/dto/RecipeResponseDTO.java rename backend/src/main/java/com/example/todoapp/dto/{ResponseStockDTO.java => StockDTOResponse.java} (91%) create mode 100644 backend/src/main/java/com/example/todoapp/dto/StuffDetailDTO.java create mode 100644 backend/src/main/java/com/example/todoapp/dto/StuffRequestDTO.java create mode 100644 backend/src/main/java/com/example/todoapp/repository/RecipeStuffsRepository.java create mode 100644 backend/src/main/java/com/example/todoapp/repository/RecipesRepository.java create mode 100644 backend/src/main/java/com/example/todoapp/service/RecipeService.java diff --git a/backend/src/main/java/com/example/todoapp/controller/RecipesController.java b/backend/src/main/java/com/example/todoapp/controller/RecipesController.java new file mode 100644 index 0000000..45702a3 --- /dev/null +++ b/backend/src/main/java/com/example/todoapp/controller/RecipesController.java @@ -0,0 +1,92 @@ +package com.example.todoapp.controller; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.Authentication; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.example.todoapp.dto.RecipeDetailDTO; +import com.example.todoapp.dto.RecipeRequestDTO; +import com.example.todoapp.dto.RecipeResponseDTO; +import com.example.todoapp.model.Recipes; +import com.example.todoapp.service.RecipeService; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + + +@RestController +@RequestMapping("/recipes") +public class RecipesController { + + @Autowired + private RecipeService recipeService; + + @PostMapping("/add") + public ResponseEntity> addRecipe(@RequestBody RecipeRequestDTO dto) { + Recipes createAllReipes = recipeService.addRecipe(dto); + + Map response = new HashMap<>(); + response.put("result", true); + response.put("recipeId", createAllReipes.getRecipeId()); + response.put("message", "追加に成功しました"); + + return ResponseEntity.ok(response); + } + + @GetMapping("/getAll") + public ResponseEntity> getRecipe(Authentication authentication) { + List recipes = recipeService.getAllRecipes(); + // エンティティからDTOへの変換 + List responseList = recipes.stream() + .map(recipe -> { + RecipeResponseDTO dto = new RecipeResponseDTO(); + dto.setRecipeId(recipe.getRecipeId()); + dto.setRecipeName(recipe.getRecipeName()); + dto.setSummary(recipe.getSummary()); + return dto; + }) + .collect(Collectors.toList()); + return ResponseEntity.ok(responseList); + } + + /** + * 指定されたIDの在庫を取得する + * + * @param authentication 認証情報 + * @param recipeId 在庫ID + * @return 在庫情報 + */ + @GetMapping("/getById") + public ResponseEntity getRecipeById( + Authentication authentication, + @RequestParam Long recipeId) { + recipeService.getRecipeDetailsById(recipeId); + return ResponseEntity.ok(recipeService.getRecipeDetailsById(recipeId)); + } + + @PutMapping("/update") + public ResponseEntity> updateRecipe(@RequestBody RecipeDetailDTO dto) { + Recipes recipes = recipeService.updateRecipe(dto); + Map response = new HashMap<>(); + + if (recipes != null) { + response.put("result",true ); + response.put("message", "料理リストの編集が完了しました"); + } else { + response.put("result", false); + response.put("message", "編集に失敗しました"); + + } + return ResponseEntity.ok(response); + } + +} \ No newline at end of file diff --git a/backend/src/main/java/com/example/todoapp/controller/StocksController.java b/backend/src/main/java/com/example/todoapp/controller/StocksController.java index ffa7910..b2866c5 100644 --- a/backend/src/main/java/com/example/todoapp/controller/StocksController.java +++ b/backend/src/main/java/com/example/todoapp/controller/StocksController.java @@ -1,7 +1,7 @@ package com.example.todoapp.controller; import com.example.todoapp.dto.DeleteStockRequest; -import com.example.todoapp.dto.ResponseStockDTO; +import com.example.todoapp.dto.StockDTOResponse; import com.example.todoapp.dto.StockDTO; import com.example.todoapp.model.Stocks; import com.example.todoapp.model.User; @@ -43,11 +43,11 @@ public class StocksController { * @return ユーザーの在庫リスト */ @GetMapping("/get") - public ResponseEntity> getAllStocks(Authentication authentication) { + public ResponseEntity> getAllStocks(Authentication authentication) { List stocks = stockService.getALLStocksByUser(authentication.getName()); // エンティティからDTOへの変換 - List stockDTOs = stocks.stream() - .map(ResponseStockDTO::fromEntity) + List stockDTOs = stocks.stream() + .map(StockDTOResponse::fromEntity) .collect(Collectors.toList()); return ResponseEntity.ok(stockDTOs); } diff --git a/backend/src/main/java/com/example/todoapp/controller/ToBuysController.java b/backend/src/main/java/com/example/todoapp/controller/ToBuysController.java index 8467c37..6c3f84f 100644 --- a/backend/src/main/java/com/example/todoapp/controller/ToBuysController.java +++ b/backend/src/main/java/com/example/todoapp/controller/ToBuysController.java @@ -22,7 +22,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -import java.util.Collections; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; diff --git a/backend/src/main/java/com/example/todoapp/dto/RecipeDetailDTO.java b/backend/src/main/java/com/example/todoapp/dto/RecipeDetailDTO.java new file mode 100644 index 0000000..dea793f --- /dev/null +++ b/backend/src/main/java/com/example/todoapp/dto/RecipeDetailDTO.java @@ -0,0 +1,14 @@ +package com.example.todoapp.dto; + +import java.util.List; + +import lombok.Data; + +@Data +public class RecipeDetailDTO { + private Long recipeId; + private String recipeName; + private String summary; + + private List stuffs; +} \ No newline at end of file diff --git a/backend/src/main/java/com/example/todoapp/dto/RecipeRequestDTO.java b/backend/src/main/java/com/example/todoapp/dto/RecipeRequestDTO.java new file mode 100644 index 0000000..5b26b9b --- /dev/null +++ b/backend/src/main/java/com/example/todoapp/dto/RecipeRequestDTO.java @@ -0,0 +1,13 @@ +package com.example.todoapp.dto; + +import java.util.List; + +import lombok.Data; + +@Data +public class RecipeRequestDTO { + private Long recipeId; + private String recipeName; + private String summary; + private List stuffAndAmountArray; +} \ No newline at end of file diff --git a/backend/src/main/java/com/example/todoapp/dto/RecipeResponseDTO.java b/backend/src/main/java/com/example/todoapp/dto/RecipeResponseDTO.java new file mode 100644 index 0000000..2464cbc --- /dev/null +++ b/backend/src/main/java/com/example/todoapp/dto/RecipeResponseDTO.java @@ -0,0 +1,11 @@ +package com.example.todoapp.dto; + +import lombok.Data; + +@Data +public class RecipeResponseDTO { + private Long recipeId; + private String recipeName; + private String summary; + +} diff --git a/backend/src/main/java/com/example/todoapp/dto/ResponseStockDTO.java b/backend/src/main/java/com/example/todoapp/dto/StockDTOResponse.java similarity index 91% rename from backend/src/main/java/com/example/todoapp/dto/ResponseStockDTO.java rename to backend/src/main/java/com/example/todoapp/dto/StockDTOResponse.java index 1de5012..e2eb002 100644 --- a/backend/src/main/java/com/example/todoapp/dto/ResponseStockDTO.java +++ b/backend/src/main/java/com/example/todoapp/dto/StockDTOResponse.java @@ -16,7 +16,7 @@ import java.time.LocalDate; */ @Data -public class ResponseStockDTO { +public class StockDTOResponse { private Long stockId; private Long stuffId; private Long userId; @@ -34,8 +34,8 @@ public class ResponseStockDTO { * @param stock 変換元の在庫エンティティ * @return 変換されたStockDTOオブジェクト */ - public static ResponseStockDTO fromEntity(Stocks stock) { - ResponseStockDTO dto = new ResponseStockDTO(); + public static StockDTOResponse fromEntity(Stocks stock) { + StockDTOResponse dto = new StockDTOResponse(); Stuffs stuff = stock.getStuff(); dto.setStockId(stock.getStockId()); diff --git a/backend/src/main/java/com/example/todoapp/dto/StuffDetailDTO.java b/backend/src/main/java/com/example/todoapp/dto/StuffDetailDTO.java new file mode 100644 index 0000000..adde9bb --- /dev/null +++ b/backend/src/main/java/com/example/todoapp/dto/StuffDetailDTO.java @@ -0,0 +1,10 @@ +package com.example.todoapp.dto; + +import lombok.Data; + +@Data +public class StuffDetailDTO { + private Long stuffId; + private String stuffName; + private Integer amount; +} \ No newline at end of file diff --git a/backend/src/main/java/com/example/todoapp/dto/StuffRequestDTO.java b/backend/src/main/java/com/example/todoapp/dto/StuffRequestDTO.java new file mode 100644 index 0000000..ce06291 --- /dev/null +++ b/backend/src/main/java/com/example/todoapp/dto/StuffRequestDTO.java @@ -0,0 +1,10 @@ +package com.example.todoapp.dto; +import lombok.Data; + +@Data +public class StuffRequestDTO { + private String stuffId; + private String stuffName; + private String category; + private String amount; +} \ No newline at end of file diff --git a/backend/src/main/java/com/example/todoapp/model/RecipeStuffs.java b/backend/src/main/java/com/example/todoapp/model/RecipeStuffs.java index 74d5738..c21eb9a 100644 --- a/backend/src/main/java/com/example/todoapp/model/RecipeStuffs.java +++ b/backend/src/main/java/com/example/todoapp/model/RecipeStuffs.java @@ -1,5 +1,5 @@ //-------------------------------- -// RecipiesStuffs.java +// RecipesStuffs.java // // 分類:社員管理システムV2・ビジネスロジック層 // @@ -18,7 +18,7 @@ import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; -import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.Data; import lombok.NoArgsConstructor; @@ -43,7 +43,7 @@ public class RecipeStuffs { /** * 料理の一意識別子 FK */ - @NotBlank + @NotNull @ManyToOne(fetch = FetchType.LAZY) @JoinColumn( name = "recipeId", @@ -56,7 +56,7 @@ public class RecipeStuffs { /** * 材料の一意識別子 FK */ - @NotBlank + @NotNull @ManyToOne(fetch = FetchType.LAZY) @JoinColumn( name = "stuffId", @@ -68,8 +68,8 @@ public class RecipeStuffs { /** * 材料の数量(デフォルト1) */ - @NotBlank + @NotNull @Column(nullable = false) - private int amount = 1; + private Integer amount = 1; } diff --git a/backend/src/main/java/com/example/todoapp/model/Recipes.java b/backend/src/main/java/com/example/todoapp/model/Recipes.java index c4a986d..35a9b36 100644 --- a/backend/src/main/java/com/example/todoapp/model/Recipes.java +++ b/backend/src/main/java/com/example/todoapp/model/Recipes.java @@ -43,7 +43,7 @@ public class Recipes { */ @NotNull @Column(name="recipeName", unique = true, length = 255, nullable = false) - private String recipieName; + private String recipeName; /** * カテゴリ diff --git a/backend/src/main/java/com/example/todoapp/repository/RecipeStuffsRepository.java b/backend/src/main/java/com/example/todoapp/repository/RecipeStuffsRepository.java new file mode 100644 index 0000000..000574b --- /dev/null +++ b/backend/src/main/java/com/example/todoapp/repository/RecipeStuffsRepository.java @@ -0,0 +1,18 @@ +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; + +public interface RecipeStuffsRepository extends JpaRepository { + List findByRecipesRecipeId(Long recipeId); + + + Optional findByRecipesRecipeIdAndStuffStuffId(Long recipeId, Long stuffId); +} + + + diff --git a/backend/src/main/java/com/example/todoapp/repository/RecipesRepository.java b/backend/src/main/java/com/example/todoapp/repository/RecipesRepository.java new file mode 100644 index 0000000..6151530 --- /dev/null +++ b/backend/src/main/java/com/example/todoapp/repository/RecipesRepository.java @@ -0,0 +1,7 @@ +package com.example.todoapp.repository; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.example.todoapp.model.Recipes; + +public interface RecipesRepository extends JpaRepository {} diff --git a/backend/src/main/java/com/example/todoapp/service/RecipeService.java b/backend/src/main/java/com/example/todoapp/service/RecipeService.java new file mode 100644 index 0000000..9b50deb --- /dev/null +++ b/backend/src/main/java/com/example/todoapp/service/RecipeService.java @@ -0,0 +1,197 @@ +//-------------------------------- +// RecipeService.java +// +// +// 更新履歴:2025/06/05 新規作成 +// Copyright(c) 2025 IVIS All rights reserved. +//-------------------------------------------- +package com.example.todoapp.service; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.example.todoapp.dto.RecipeDetailDTO; +import com.example.todoapp.dto.RecipeRequestDTO; +import com.example.todoapp.dto.StuffDetailDTO; +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.RecipeStuffsRepository; +import com.example.todoapp.repository.RecipesRepository; +import com.example.todoapp.repository.StuffsRepository; + +import jakarta.transaction.Transactional; + +/** + * レシピ管理サービスクラス + *

+ * このクラスは、レシピの登録処理を提供します。 + * 材料の存在確認・新規作成・数量管理などの機能を含みます。 + *

+ */ +@Service +public class RecipeService { + + @Autowired + private RecipesRepository recipesRepository; + + @Autowired + private StuffsRepository stuffsRepository; + + @Autowired + private RecipeStuffsRepository recipeStuffsRepository; + + /** + * レシピを新規登録する + * + * @param dto レシピ登録情報(レシピ名、概要、材料情報含む) + * @return レシピ登録結果(成功/失敗、レシピID含む) + */ + @Transactional // トランザクション管理を実施 + public Recipes addRecipe(RecipeRequestDTO dto) { + Recipes recipe = new Recipes(); + recipe.setRecipeName(dto.getRecipeName()); + recipe.setSummary(dto.getSummary()); + recipe = recipesRepository.save(recipe); + + List recipeStuffsList = new ArrayList<>(); + for (StuffRequestDTO stuffDTO : dto.getStuffAndAmountArray()) { + Stuffs stuff; + if (stuffDTO.getStuffId() != null && !stuffDTO.getStuffId().isEmpty()) { + // stuffIdが存在する + stuff = stuffsRepository.findById(Long.valueOf(stuffDTO.getStuffId())) + .orElseThrow(() -> new RuntimeException("材料がありません")); + } else { + // stuffIdが存在しない + stuff = new Stuffs(); + stuff.setStuffName(stuffDTO.getStuffName()); + stuff.setCategory(stuffDTO.getCategory()); + stuff = stuffsRepository.save(stuff); + } + + RecipeStuffs recipeStuffs = new RecipeStuffs(); + recipeStuffs.setRecipes(recipe); // 関連レシピ設定 + recipeStuffs.setStuff(stuff); // 関連材料設定 + + // 数量設定、defaultは1 + if (stuffDTO.getAmount() == null || stuffDTO.getAmount().isEmpty()) { + stuffDTO.setAmount("1"); + } + recipeStuffs.setAmount(Integer.parseInt(stuffDTO.getAmount())); + recipeStuffsList.add(recipeStuffs); + } + + recipeStuffsRepository.saveAll(recipeStuffsList); + return recipe; + } + + /** + * 登録済のレシピを取得する + * + * @param authentication 認証情報 + * @return 登録済のレシピ情報 + */ + public List getAllRecipes() { + return recipesRepository.findAll(); + } + + /** + * レシピをIDで取得する + * + * @param recipeId 検索するレシピID + * @return 検索結果のレシピ情報 + */ + public RecipeDetailDTO getRecipeDetailsById(Long recipeId) { + Recipes recipe = recipesRepository.findById(recipeId) + .orElseThrow(() -> new RuntimeException("レシピが見つかりません")); + + List recipeStuffsList = recipeStuffsRepository.findByRecipesRecipeId(recipeId); + + List stuffList = recipeStuffsList.stream() + .map(rs -> { + StuffDetailDTO stuffDTO = new StuffDetailDTO(); + stuffDTO.setStuffId(rs.getStuff().getStuffId()); + stuffDTO.setStuffName(rs.getStuff().getStuffName()); + stuffDTO.setAmount(rs.getAmount()); + return stuffDTO; + }) + .collect(Collectors.toList()); + + RecipeDetailDTO dto = new RecipeDetailDTO(); + dto.setRecipeId(recipe.getRecipeId()); + dto.setRecipeName(recipe.getRecipeName()); + dto.setSummary(recipe.getSummary()); + dto.setStuffs(stuffList); + + return dto; + } + + + @Transactional + public Recipes updateRecipe(RecipeDetailDTO dto) { + Recipes recipe = recipesRepository.findById(dto.getRecipeId()) + .orElseThrow(() -> new RuntimeException("レシピが見つかりません")); + + recipe.setRecipeName(dto.getRecipeName()); + recipe.setSummary(dto.getSummary()); + recipesRepository.save(recipe); + + Set incomingStuffIds = new HashSet<>(); + + for (StuffDetailDTO stuffDTO : dto.getStuffs()) { + if (stuffDTO.getStuffId() == null) { + Stuffs newStuff = new Stuffs(); + newStuff.setStuffName(stuffDTO.getStuffName()); + newStuff.setCategory("その他"); + newStuff = stuffsRepository.save(newStuff); + + RecipeStuffs rs = new RecipeStuffs(); + rs.setRecipes(recipe); + rs.setStuff(newStuff); + rs.setAmount(stuffDTO.getAmount()); + recipeStuffsRepository.save(rs); + + incomingStuffIds.add(newStuff.getStuffId()); + } else { + Optional optionalRs = recipeStuffsRepository + .findByRecipesRecipeIdAndStuffStuffId(dto.getRecipeId(), stuffDTO.getStuffId()); + + if (optionalRs.isPresent()) { + RecipeStuffs rs = optionalRs.get(); + rs.setAmount(stuffDTO.getAmount()); + recipeStuffsRepository.save(rs); + incomingStuffIds.add(rs.getStuff().getStuffId()); + } else { + // 可选:创建新的 RecipeStuffs + Stuffs existingStuff = stuffsRepository.findById(stuffDTO.getStuffId()) + .orElseThrow(() -> new RuntimeException("材料が見つかりません")); + + RecipeStuffs rs = new RecipeStuffs(); + rs.setRecipes(recipe); + rs.setStuff(existingStuff); + rs.setAmount(stuffDTO.getAmount()); + recipeStuffsRepository.save(rs); + incomingStuffIds.add(existingStuff.getStuffId()); + } + } + } + + List existingStuffs = recipeStuffsRepository.findByRecipesRecipeId(dto.getRecipeId()); + for (RecipeStuffs rs : existingStuffs) { + System.out.println("dddddwtestst" + rs.getStuff().getStuffId()); + if (!incomingStuffIds.contains(rs.getStuff().getStuffId())) { + recipeStuffsRepository.delete(rs); + } + } + + return recipe; + } +} \ No newline at end of file From 8e318ec32e4273470e1d4737f83776cfdcf7f5ed Mon Sep 17 00:00:00 2001 From: "zhang.pengcheng" Date: Tue, 10 Jun 2025 16:39:39 +0900 Subject: [PATCH 3/3] =?UTF-8?q?1.=20=E3=82=B3=E3=83=BC=E3=83=89=E3=81=AE?= =?UTF-8?q?=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88=E3=82=92=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=E3=81=A8=E8=BF=BD=E5=8A=A0=E3=81=99=E3=82=8B=202.=20DTO?= =?UTF-8?q?=E2=80=8B=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB=E5=90=8D=E3=81=AE?= =?UTF-8?q?=E5=BD=A2=E5=BC=8F=E3=82=92=E7=B5=B1=E4=B8=80=E3=81=99=E3=82=8B?= =?UTF-8?q?=E2=80=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../todoapp/controller/RecipesController.java | 26 ++++++++++- .../todoapp/controller/StocksController.java | 12 ++--- .../todoapp/controller/ToBuysController.java | 10 ++--- .../example/todoapp/dto/BuyRequestDTO.java | 31 +++++++++++++ .../todoapp/dto/DeleteStockRequest.java | 8 ---- .../todoapp/dto/DeleteStockRequestDTO.java | 19 ++++++++ .../todoapp/dto/DeleteToBuyRequest.java | 9 ---- .../todoapp/dto/DeleteToBuyRequestDTO.java | 25 +++++++++++ .../example/todoapp/dto/RecipeDetailDTO.java | 25 +++++++++++ .../example/todoapp/dto/RecipeRequestDTO.java | 26 +++++++++++ .../todoapp/dto/RecipeResponseDTO.java | 22 +++++++++- ...DTOResponse.java => StockResponseDTO.java} | 6 +-- .../example/todoapp/dto/StuffDetailDTO.java | 22 +++++++++- .../example/todoapp/dto/StuffRequestDTO.java | 34 ++++++++++++-- .../example/todoapp/dto/ToBuyResponse.java | 12 ----- .../example/todoapp/dto/ToBuyResponseDTO.java | 44 +++++++++++++++++++ .../repository/RecipeStuffsRepository.java | 18 -------- .../todoapp/repository/RecipesRepository.java | 9 +++- .../repository/RecipesStuffsRepository.java | 37 ++++++++++++++++ .../todoapp/service/RecipeService.java | 35 ++++++++++----- 20 files changed, 350 insertions(+), 80 deletions(-) delete mode 100644 backend/src/main/java/com/example/todoapp/dto/DeleteStockRequest.java create mode 100644 backend/src/main/java/com/example/todoapp/dto/DeleteStockRequestDTO.java delete mode 100644 backend/src/main/java/com/example/todoapp/dto/DeleteToBuyRequest.java create mode 100644 backend/src/main/java/com/example/todoapp/dto/DeleteToBuyRequestDTO.java rename backend/src/main/java/com/example/todoapp/dto/{StockDTOResponse.java => StockResponseDTO.java} (91%) delete mode 100644 backend/src/main/java/com/example/todoapp/dto/ToBuyResponse.java create mode 100644 backend/src/main/java/com/example/todoapp/dto/ToBuyResponseDTO.java delete mode 100644 backend/src/main/java/com/example/todoapp/repository/RecipeStuffsRepository.java create mode 100644 backend/src/main/java/com/example/todoapp/repository/RecipesStuffsRepository.java diff --git a/backend/src/main/java/com/example/todoapp/controller/RecipesController.java b/backend/src/main/java/com/example/todoapp/controller/RecipesController.java index 45702a3..b2f97ab 100644 --- a/backend/src/main/java/com/example/todoapp/controller/RecipesController.java +++ b/backend/src/main/java/com/example/todoapp/controller/RecipesController.java @@ -22,7 +22,13 @@ import com.example.todoapp.service.RecipeService; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; - +/** + * 料理レシピ管理のコントローラー + *

+ * このコントローラーはレシピの取得、作成、更新、削除などの + * エンドポイントを提供します。すべてのエンドポイントは認証が必要です。 + *

+ */ @RestController @RequestMapping("/recipes") public class RecipesController { @@ -30,6 +36,12 @@ public class RecipesController { @Autowired private RecipeService recipeService; + /** + * 新しいレシピを作成する + * + * @param dto 作成するレシピの情報 + * @return 作成結果(recipeIdとメッセージを含む) + */ @PostMapping("/add") public ResponseEntity> addRecipe(@RequestBody RecipeRequestDTO dto) { Recipes createAllReipes = recipeService.addRecipe(dto); @@ -42,6 +54,12 @@ public class RecipesController { return ResponseEntity.ok(response); } + /** + * すべてのレシピを取得する + * + * @param authentication 認証情報 + * @return レシピ情報リスト + */ @GetMapping("/getAll") public ResponseEntity> getRecipe(Authentication authentication) { List recipes = recipeService.getAllRecipes(); @@ -73,6 +91,12 @@ public class RecipesController { return ResponseEntity.ok(recipeService.getRecipeDetailsById(recipeId)); } + /** + * レシピ情報を更新する + * + * @param dto 更新するレシピの詳細情報 + * @return 更新結果(成功/失敗メッセージを含む) + */ @PutMapping("/update") public ResponseEntity> updateRecipe(@RequestBody RecipeDetailDTO dto) { Recipes recipes = recipeService.updateRecipe(dto); diff --git a/backend/src/main/java/com/example/todoapp/controller/StocksController.java b/backend/src/main/java/com/example/todoapp/controller/StocksController.java index b2866c5..5c59213 100644 --- a/backend/src/main/java/com/example/todoapp/controller/StocksController.java +++ b/backend/src/main/java/com/example/todoapp/controller/StocksController.java @@ -1,7 +1,7 @@ package com.example.todoapp.controller; -import com.example.todoapp.dto.DeleteStockRequest; -import com.example.todoapp.dto.StockDTOResponse; +import com.example.todoapp.dto.DeleteStockRequestDTO; +import com.example.todoapp.dto.StockResponseDTO; import com.example.todoapp.dto.StockDTO; import com.example.todoapp.model.Stocks; import com.example.todoapp.model.User; @@ -43,11 +43,11 @@ public class StocksController { * @return ユーザーの在庫リスト */ @GetMapping("/get") - public ResponseEntity> getAllStocks(Authentication authentication) { + public ResponseEntity> getAllStocks(Authentication authentication) { List stocks = stockService.getALLStocksByUser(authentication.getName()); // エンティティからDTOへの変換 - List stockDTOs = stocks.stream() - .map(StockDTOResponse::fromEntity) + List stockDTOs = stocks.stream() + .map(StockResponseDTO::fromEntity) .collect(Collectors.toList()); return ResponseEntity.ok(stockDTOs); } @@ -121,7 +121,7 @@ public class StocksController { @DeleteMapping("/delete") public ResponseEntity deleteStock( Authentication authentication, - @RequestBody DeleteStockRequest request + @RequestBody DeleteStockRequestDTO request ) { // 認証されたユーザー名を取得 diff --git a/backend/src/main/java/com/example/todoapp/controller/ToBuysController.java b/backend/src/main/java/com/example/todoapp/controller/ToBuysController.java index 6c3f84f..1b4b919 100644 --- a/backend/src/main/java/com/example/todoapp/controller/ToBuysController.java +++ b/backend/src/main/java/com/example/todoapp/controller/ToBuysController.java @@ -8,8 +8,8 @@ package com.example.todoapp.controller; import com.example.todoapp.dto.BuyRequestDTO; -import com.example.todoapp.dto.DeleteToBuyRequest; -import com.example.todoapp.dto.ToBuyResponse; +import com.example.todoapp.dto.DeleteToBuyRequestDTO; +import com.example.todoapp.dto.ToBuyResponseDTO; import com.example.todoapp.dto.ToBuysDTO; import com.example.todoapp.model.Stuffs; import com.example.todoapp.model.ToBuys; @@ -112,9 +112,9 @@ public class ToBuysController { List toBuysList = toBuysService.getToBuysByUser(user); // DTO形式に変換して返す - List responseList = toBuysList.stream() + List responseList = toBuysList.stream() .map(toBuy -> { - ToBuyResponse resp = new ToBuyResponse(); + ToBuyResponseDTO resp = new ToBuyResponseDTO(); Stuffs stuff = toBuy.getStuff(); resp.setTobuyId(toBuy.getTobuyId()); resp.setStuffId(stuff.getStuffId()); @@ -139,7 +139,7 @@ public class ToBuysController { */ @DeleteMapping("/delete") public ResponseEntity> deleteToBuy( - @RequestBody DeleteToBuyRequest request, + @RequestBody DeleteToBuyRequestDTO request, Authentication authentication) { int deletedCount = toBuysService.deleteToBuyById(request.getTobuyId()); diff --git a/backend/src/main/java/com/example/todoapp/dto/BuyRequestDTO.java b/backend/src/main/java/com/example/todoapp/dto/BuyRequestDTO.java index 38438f9..f0e2ba5 100644 --- a/backend/src/main/java/com/example/todoapp/dto/BuyRequestDTO.java +++ b/backend/src/main/java/com/example/todoapp/dto/BuyRequestDTO.java @@ -4,11 +4,42 @@ import java.time.LocalDate; import lombok.Data; +/** + * 購入情報更新のデータ転送オブジェクト(DTO) + *

+ * このクラスは既存の購入予定情報を更新するために使用されます。 + * 更新に必要な全情報を含みます。 + *

+ */ @Data public class BuyRequestDTO { + /** + * 購入ID + * 更新対象の購入予定を識別します + */ private Long tobuyId; + + /** + * 価格 + * 実際の購入金額を設定します + */ private int price; + + /** + * 消費期限 + * 食材の消費期限を設定します + */ private LocalDate expDate; + + /** + * 最終更新日 + * レコードの最終更新日時を保持します + */ private LocalDate lastUpdate; + + /** + * 購入日 + * 食材の実際の購入日を設定します + */ private LocalDate buyDate; } \ No newline at end of file diff --git a/backend/src/main/java/com/example/todoapp/dto/DeleteStockRequest.java b/backend/src/main/java/com/example/todoapp/dto/DeleteStockRequest.java deleted file mode 100644 index 7eee296..0000000 --- a/backend/src/main/java/com/example/todoapp/dto/DeleteStockRequest.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.example.todoapp.dto; - -import lombok.Data; - -@Data -public class DeleteStockRequest { - private Long stockId; -} \ No newline at end of file diff --git a/backend/src/main/java/com/example/todoapp/dto/DeleteStockRequestDTO.java b/backend/src/main/java/com/example/todoapp/dto/DeleteStockRequestDTO.java new file mode 100644 index 0000000..cede4a2 --- /dev/null +++ b/backend/src/main/java/com/example/todoapp/dto/DeleteStockRequestDTO.java @@ -0,0 +1,19 @@ +package com.example.todoapp.dto; + +import lombok.Data; + +/** + * 在庫削除要求のデータ転送オブジェクト(DTO) + *

+ * このクラスは在庫削除操作をサーバーに送信するために使用されます。 + * 削除対象を特定するための情報を含みます。 + *

+ */ +@Data +public class DeleteStockRequestDTO { + /** + * 在庫ID + * 削除対象の在庫を識別するためのID + */ + private Long stockId; +} \ No newline at end of file diff --git a/backend/src/main/java/com/example/todoapp/dto/DeleteToBuyRequest.java b/backend/src/main/java/com/example/todoapp/dto/DeleteToBuyRequest.java deleted file mode 100644 index 07b2a37..0000000 --- a/backend/src/main/java/com/example/todoapp/dto/DeleteToBuyRequest.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.example.todoapp.dto; - -import lombok.Data; - -@Data -public class DeleteToBuyRequest { - private Long userId; - private Long tobuyId; -} \ No newline at end of file diff --git a/backend/src/main/java/com/example/todoapp/dto/DeleteToBuyRequestDTO.java b/backend/src/main/java/com/example/todoapp/dto/DeleteToBuyRequestDTO.java new file mode 100644 index 0000000..8929f08 --- /dev/null +++ b/backend/src/main/java/com/example/todoapp/dto/DeleteToBuyRequestDTO.java @@ -0,0 +1,25 @@ +package com.example.todoapp.dto; + +import lombok.Data; + +/** + * 購入予定削除要求のデータ転送オブジェクト(DTO) + *

+ * このクラスは購入予定情報の削除要求をサーバーに送信するために使用されます。 + * 削除対象を特定するための必要情報を含みます。 + *

+ */ +@Data +public class DeleteToBuyRequestDTO { + /** + * ユーザーID + * 操作対象のユーザーを識別するためのID + */ + private Long userId; + + /** + * 購入予定ID + * 削除対象の購入予定情報を識別するためのID + */ + private Long tobuyId; +} \ No newline at end of file diff --git a/backend/src/main/java/com/example/todoapp/dto/RecipeDetailDTO.java b/backend/src/main/java/com/example/todoapp/dto/RecipeDetailDTO.java index dea793f..9702ebd 100644 --- a/backend/src/main/java/com/example/todoapp/dto/RecipeDetailDTO.java +++ b/backend/src/main/java/com/example/todoapp/dto/RecipeDetailDTO.java @@ -4,11 +4,36 @@ import java.util.List; import lombok.Data; +/** + * レシピ詳細情報のデータ転送オブジェクト(DTO) + *

+ * このクラスはレシピの詳細情報を伝送するために使用されます。 + * レシピ基本情報に加えて関連食材情報を含みます。 + *

+ */ @Data public class RecipeDetailDTO { + /** + * レシピID + * ユニークなレシピを識別するためのID + */ private Long recipeId; + + /** + * レシピ名 + * レシピの名称を表します + */ private String recipeName; + + /** + * 概要 + * レシピの簡単な説明文 + */ private String summary; + /** + * 食材リスト + * このレシピに必要な食材とその数量のリスト + */ private List stuffs; } \ No newline at end of file diff --git a/backend/src/main/java/com/example/todoapp/dto/RecipeRequestDTO.java b/backend/src/main/java/com/example/todoapp/dto/RecipeRequestDTO.java index 5b26b9b..9cd0a77 100644 --- a/backend/src/main/java/com/example/todoapp/dto/RecipeRequestDTO.java +++ b/backend/src/main/java/com/example/todoapp/dto/RecipeRequestDTO.java @@ -4,10 +4,36 @@ import java.util.List; import lombok.Data; +/** + * レシピ操作要求のデータ転送オブジェクト(DTO) + *

+ * このクラスはレシピ操作要求をサーバーに送信するために使用されます。 + * 新規作成および更新時の情報を含みます。 + *

+ */ @Data public class RecipeRequestDTO { + /** + * レシピID + * 新規作成時は未指定、更新時は必須 + */ private Long recipeId; + + /** + * レシピ名 + * レシピの名称を表します + */ private String recipeName; + + /** + * 概要 + * レシピの簡単な説明文 + */ private String summary; + + /** + * 食材と数量リスト + * このレシピに必要な食材とその数量のリスト + */ private List stuffAndAmountArray; } \ No newline at end of file diff --git a/backend/src/main/java/com/example/todoapp/dto/RecipeResponseDTO.java b/backend/src/main/java/com/example/todoapp/dto/RecipeResponseDTO.java index 2464cbc..38d69a3 100644 --- a/backend/src/main/java/com/example/todoapp/dto/RecipeResponseDTO.java +++ b/backend/src/main/java/com/example/todoapp/dto/RecipeResponseDTO.java @@ -2,10 +2,30 @@ package com.example.todoapp.dto; import lombok.Data; +/** + * レシピ情報のデータ転送オブジェクト(DTO) + *

+ * このクラスはクライアントとサーバー間で基本的なレシピ情報をやり取りするために使用されます。 + * エンティティとは異なり、必要な情報のみを含みます。 + *

+ */ @Data public class RecipeResponseDTO { + /** + * レシピID + * ユニークなレシピを識別するためのID + */ private Long recipeId; + + /** + * レシピ名 + * レシピの名称を表します + */ private String recipeName; - private String summary; + /** + * 概要 + * レシピの簡単な説明文 + */ + private String summary; } diff --git a/backend/src/main/java/com/example/todoapp/dto/StockDTOResponse.java b/backend/src/main/java/com/example/todoapp/dto/StockResponseDTO.java similarity index 91% rename from backend/src/main/java/com/example/todoapp/dto/StockDTOResponse.java rename to backend/src/main/java/com/example/todoapp/dto/StockResponseDTO.java index e2eb002..5098319 100644 --- a/backend/src/main/java/com/example/todoapp/dto/StockDTOResponse.java +++ b/backend/src/main/java/com/example/todoapp/dto/StockResponseDTO.java @@ -16,7 +16,7 @@ import java.time.LocalDate; */ @Data -public class StockDTOResponse { +public class StockResponseDTO { private Long stockId; private Long stuffId; private Long userId; @@ -34,8 +34,8 @@ public class StockDTOResponse { * @param stock 変換元の在庫エンティティ * @return 変換されたStockDTOオブジェクト */ - public static StockDTOResponse fromEntity(Stocks stock) { - StockDTOResponse dto = new StockDTOResponse(); + public static StockResponseDTO fromEntity(Stocks stock) { + StockResponseDTO dto = new StockResponseDTO(); Stuffs stuff = stock.getStuff(); dto.setStockId(stock.getStockId()); diff --git a/backend/src/main/java/com/example/todoapp/dto/StuffDetailDTO.java b/backend/src/main/java/com/example/todoapp/dto/StuffDetailDTO.java index adde9bb..bf63d6d 100644 --- a/backend/src/main/java/com/example/todoapp/dto/StuffDetailDTO.java +++ b/backend/src/main/java/com/example/todoapp/dto/StuffDetailDTO.java @@ -1,10 +1,30 @@ package com.example.todoapp.dto; import lombok.Data; - +/** + * 食材詳細情報のデータ転送オブジェクト(DTO) + *

+ * このクラスはレシピに含まれる個別食材情報を伝送するために使用されます。 + * 必要最小限の食材情報を含みます。 + *

+ */ @Data public class StuffDetailDTO { + /** + * 食材ID + * ユニークな食材を識別するためのID + */ private Long stuffId; + + /** + * 食材名 + * 食材の名称を表します + */ private String stuffName; + + /** + * 数量 + * レシピに必要な食材の量 + */ private Integer amount; } \ No newline at end of file diff --git a/backend/src/main/java/com/example/todoapp/dto/StuffRequestDTO.java b/backend/src/main/java/com/example/todoapp/dto/StuffRequestDTO.java index ce06291..65308fc 100644 --- a/backend/src/main/java/com/example/todoapp/dto/StuffRequestDTO.java +++ b/backend/src/main/java/com/example/todoapp/dto/StuffRequestDTO.java @@ -1,10 +1,36 @@ package com.example.todoapp.dto; import lombok.Data; +/** + * 食材操作要求のデータ転送オブジェクト(DTO) + *

+ * このクラスは食材操作要求をサーバーに送信するために使用されます。 + * 新規作成時の必須情報を含みます。 + *

+ */ @Data public class StuffRequestDTO { - private String stuffId; - private String stuffName; - private String category; - private String amount; + /** + * 食材ID + * 新規作成時は未指定 + */ + private String stuffId; + + /** + * 食材名 + * 食材の名称を表します + */ + private String stuffName; + + /** + * カテゴリ + * 食材の分類を示します + */ + private String category; + + /** + * 数量 + * 食材の保有量を示します + */ + private String amount; } \ No newline at end of file diff --git a/backend/src/main/java/com/example/todoapp/dto/ToBuyResponse.java b/backend/src/main/java/com/example/todoapp/dto/ToBuyResponse.java deleted file mode 100644 index 407ae91..0000000 --- a/backend/src/main/java/com/example/todoapp/dto/ToBuyResponse.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.example.todoapp.dto; - -import lombok.Data; - -@Data -public class ToBuyResponse { - private Long tobuyId; - private Long stuffId; - private String stuffName; - private int amount; - private String shop; -} \ No newline at end of file diff --git a/backend/src/main/java/com/example/todoapp/dto/ToBuyResponseDTO.java b/backend/src/main/java/com/example/todoapp/dto/ToBuyResponseDTO.java new file mode 100644 index 0000000..e45eae5 --- /dev/null +++ b/backend/src/main/java/com/example/todoapp/dto/ToBuyResponseDTO.java @@ -0,0 +1,44 @@ +package com.example.todoapp.dto; + +import lombok.Data; + +/** + * 購入予定情報のデータ転送オブジェクト(DTO) + *

+ * このクラスは購入予定食材情報をクライアントとサーバー間でやり取りするために使用されます。 + * 必要な情報を含み、関連エンティティへの参照ではなくIDのみを保持します。 + *

+ */ +@Data +public class ToBuyResponseDTO { + + /** + * 購入ID + * 購入予定を識別するためのID + */ + private Long tobuyId; + + /** + * 食材ID + * 関連する食材のID + */ + private Long stuffId; + + /** + * 食材名 + * 購入予定の食材名称 + */ + private String stuffName; + + /** + * 数量 + * 購入予定数量 + */ + private int amount; + + /** + * 購入先 + * 購入を予定している店舗名 + */ + private String shop; +} \ No newline at end of file diff --git a/backend/src/main/java/com/example/todoapp/repository/RecipeStuffsRepository.java b/backend/src/main/java/com/example/todoapp/repository/RecipeStuffsRepository.java deleted file mode 100644 index 000574b..0000000 --- a/backend/src/main/java/com/example/todoapp/repository/RecipeStuffsRepository.java +++ /dev/null @@ -1,18 +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; - -public interface RecipeStuffsRepository extends JpaRepository { - List findByRecipesRecipeId(Long recipeId); - - - Optional findByRecipesRecipeIdAndStuffStuffId(Long recipeId, Long stuffId); -} - - - diff --git a/backend/src/main/java/com/example/todoapp/repository/RecipesRepository.java b/backend/src/main/java/com/example/todoapp/repository/RecipesRepository.java index 6151530..f651269 100644 --- a/backend/src/main/java/com/example/todoapp/repository/RecipesRepository.java +++ b/backend/src/main/java/com/example/todoapp/repository/RecipesRepository.java @@ -4,4 +4,11 @@ import org.springframework.data.jpa.repository.JpaRepository; import com.example.todoapp.model.Recipes; -public interface RecipesRepository extends JpaRepository {} +/** + * レシピエンティティのリポジトリインターフェース + *

+ * このインターフェースはレシピデータへのアクセスと操作を提供します。 + * Spring Data JPAによって自動的に実装されます。 + *

+ */ +public interface RecipesRepository extends JpaRepository {} \ No newline at end of file diff --git a/backend/src/main/java/com/example/todoapp/repository/RecipesStuffsRepository.java b/backend/src/main/java/com/example/todoapp/repository/RecipesStuffsRepository.java new file mode 100644 index 0000000..729b825 --- /dev/null +++ b/backend/src/main/java/com/example/todoapp/repository/RecipesStuffsRepository.java @@ -0,0 +1,37 @@ +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; + +/** + * レシピ食材関連データのリポジトリインターフェース + *

+ * このインターフェースはレシピと食材の関連データへのアクセスを提供します。 + * Spring Data JPAによって自動的に実装されます。 + *

+ */ +public interface RecipesStuffsRepository extends JpaRepository { + /** + * レシピIDで食材情報を検索する + * + * @param recipeId 検索するレシピID + * @return 関連する食材情報リスト + */ + List findByRecipesRecipeId(Long recipeId); + + /** + * レシピIDと食材IDで関連情報を検索する + * + * @param recipeId 検索するレシピID + * @param stuffId 検索する食材ID + * @return 関連情報(存在する場合) + */ + Optional findByRecipesRecipeIdAndStuffStuffId(Long recipeId, Long stuffId); +} + + + diff --git a/backend/src/main/java/com/example/todoapp/service/RecipeService.java b/backend/src/main/java/com/example/todoapp/service/RecipeService.java index 9b50deb..2eab2b8 100644 --- a/backend/src/main/java/com/example/todoapp/service/RecipeService.java +++ b/backend/src/main/java/com/example/todoapp/service/RecipeService.java @@ -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.RecipeStuffsRepository; +import com.example.todoapp.repository.RecipesStuffsRepository; import com.example.todoapp.repository.RecipesRepository; import com.example.todoapp.repository.StuffsRepository; @@ -47,7 +47,7 @@ public class RecipeService { private StuffsRepository stuffsRepository; @Autowired - private RecipeStuffsRepository recipeStuffsRepository; + private RecipesStuffsRepository recipeStuffsRepository; /** * レシピを新規登録する @@ -94,20 +94,20 @@ public class RecipeService { } /** - * 登録済のレシピを取得する + * すべてのレシピ情報を取得する * - * @param authentication 認証情報 - * @return 登録済のレシピ情報 + * @return 登録済みレシピ情報リスト */ public List getAllRecipes() { return recipesRepository.findAll(); } /** - * レシピをIDで取得する - * + * 指定されたIDのレシピ詳細情報を取得する + * * @param recipeId 検索するレシピID - * @return 検索結果のレシピ情報 + * @return レシピ詳細情報(レシピ基本情報と関連食材情報) + * @throws RuntimeException レシピが見つからない場合 */ public RecipeDetailDTO getRecipeDetailsById(Long recipeId) { Recipes recipe = recipesRepository.findById(recipeId) @@ -134,25 +134,36 @@ public class RecipeService { return dto; } - + /** + * レシピ情報を更新する + * + * @param dto 更新するレシピ詳細情報 + * @return 更新されたレシピエンティティ + * @throws RuntimeException レシピまたは材料情報が見つからない場合 + */ @Transactional public Recipes updateRecipe(RecipeDetailDTO dto) { + // IDでレシピを検索し、見つからない場合は例外をスロー Recipes recipe = recipesRepository.findById(dto.getRecipeId()) .orElseThrow(() -> new RuntimeException("レシピが見つかりません")); + // レシピ名と概要を更新 recipe.setRecipeName(dto.getRecipeName()); recipe.setSummary(dto.getSummary()); recipesRepository.save(recipe); Set incomingStuffIds = new HashSet<>(); + // 提供された材料の詳細を繰り返し処理 for (StuffDetailDTO stuffDTO : dto.getStuffs()) { if (stuffDTO.getStuffId() == null) { + // 材料IDがnullの場合、新しい材料を作成 Stuffs newStuff = new Stuffs(); newStuff.setStuffName(stuffDTO.getStuffName()); newStuff.setCategory("その他"); newStuff = stuffsRepository.save(newStuff); + // 新しいRecipeStuffsエントリを作成 RecipeStuffs rs = new RecipeStuffs(); rs.setRecipes(recipe); rs.setStuff(newStuff); @@ -161,16 +172,18 @@ public class RecipeService { incomingStuffIds.add(newStuff.getStuffId()); } else { + // 材料IDが提供されている場合、既存のRecipeStuffsエントリを検索 Optional optionalRs = recipeStuffsRepository .findByRecipesRecipeIdAndStuffStuffId(dto.getRecipeId(), stuffDTO.getStuffId()); if (optionalRs.isPresent()) { + // RecipeStuffsエントリが存在する場合、数量を更新 RecipeStuffs rs = optionalRs.get(); rs.setAmount(stuffDTO.getAmount()); recipeStuffsRepository.save(rs); incomingStuffIds.add(rs.getStuff().getStuffId()); } else { - // 可选:创建新的 RecipeStuffs + // オプション:見つからない場合、新しいRecipeStuffsエントリを作成 Stuffs existingStuff = stuffsRepository.findById(stuffDTO.getStuffId()) .orElseThrow(() -> new RuntimeException("材料が見つかりません")); @@ -184,9 +197,9 @@ public class RecipeService { } } + // 入ってきたリストにないRecipeStuffsエントリを削除 List existingStuffs = recipeStuffsRepository.findByRecipesRecipeId(dto.getRecipeId()); for (RecipeStuffs rs : existingStuffs) { - System.out.println("dddddwtestst" + rs.getStuff().getStuffId()); if (!incomingStuffIds.contains(rs.getStuff().getStuffId())) { recipeStuffsRepository.delete(rs); }