Javaでお気に入り機能の追加

実現したいこと

お気に入り機能を実装させたい

発生している問題・分からないこと

民宿詳細というページにお気に入り登録ボタンを配置しそれを押すことでMySQLのお気に入りテーブルに保存される。
またもう一度押すとお気に入り登録が解除されデータベースから削除されるようにしたいです。
表示切替の処理はHTML側で行ってます。

サービスクラス@Transactionalとして記述したものをコントロールで呼んだのちビューに渡すイメージであってるのでしょうか?

またAI等に質問も行いコードを改善しましたがサービスクラスのfindByHouseAndUserのメソッドをOptional型にとされエラーになっています。

教材でフォームクラスを介して処理を送るやり方は何度かあったのですがフォームを通さずに処理をするやり方がわかりません。
学習を始めて日が浅いので基礎的なことと思いますがご教授いただけると助かります。

該当のソースコード

package com.example.samuraitravel.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.web.PageableDefault; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.mvc.support.RedirectAttributes; import com.example.samuraitravel.entity.Favorite; import com.example.samuraitravel.entity.House; import com.example.samuraitravel.entity.User; import com.example.samuraitravel.repository.FavoriteRepository; import com.example.samuraitravel.repository.HouseRepository; import com.example.samuraitravel.repository.UserRepository; import com.example.samuraitravel.security.UserDetailsImpl; import com.example.samuraitravel.service.FavoriteService; @Controller @RequestMapping("/houses/{houseId}/favorites") public class FavoriteController { private final FavoriteRepository favoriteRepository; private final HouseRepository houseRepository; private final UserRepository userRepository; private final FavoriteService favoriteservice; @Autowired public FavoriteController(FavoriteRepository favoriteRepository, HouseRepository houseRepository, FavoriteService favoriteService, UserRepository userRepository) { this.favoriteRepository = favoriteRepository; this.houseRepository = houseRepository; this.userRepository = userRepository; this.favoriteservice = favoriteService; } @GetMapping public String index( @AuthenticationPrincipal UserDetailsImpl userDetailsImpl, @PageableDefault(page = 0, size = 10, sort = "id") Pageable pageable, Model model) { User user = userDetailsImpl.getUser(); Page<Favorite> favoritePage = favoriteRepository.findByUser(user, pageable); model.addAttribute("favoritePage", favoritePage); return "favorites/index"; } @PostMapping("/create") public String create(@PathVariable(name = "houseId") Integer houseId, @AuthenticationPrincipal UserDetailsImpl userDetailsImpl, RedirectAttributes redirectAttributes) { House house = houseRepository.getReferenceById(houseId); User user = userDetailsImpl.getUser(); if (!favoriteservice.keep(house, user)) { favoriteservice.create(house, user); } redirectAttributes.addAttribute("houseId", houseId); return "redirect:/houses/" + houseId; } @PostMapping("/{favoreteid}/delete") public String delete(@PathVariable(name = "favoriteId") Integer favoriteId, @PathVariable(name = "houseId") Integer houseId, RedirectAttributes redirectAttributes) { favoriteRepository.deleteById(favoriteId); redirectAttributes.addAttribute("houseId",houseId); return "redirect:/houses/{houseId}"; } }
package com.example.samuraitravel.repository; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import com.example.samuraitravel.entity.Favorite; import com.example.samuraitravel.entity.House; import com.example.samuraitravel.entity.User; public interface FavoriteRepository extends JpaRepository<Favorite, Integer>{ public Page<Favorite> findByUser(User user,Pageable pageable); // public List<Favorite> findByHouseAndUser1(House house, User user); public Page<Favorite> findByHouse(House house, Pageable pageable); Optional<Favorite> findByHouseAndUser(House house,User user); }
package com.example.samuraitravel.service; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.example.samuraitravel.entity.Favorite; import com.example.samuraitravel.entity.House; import com.example.samuraitravel.entity.User; import com.example.samuraitravel.repository.FavoriteRepository; @Service public class FavoriteService { private final FavoriteRepository favoriteRepository; public FavoriteService(FavoriteRepository favoriteRepository) { this.favoriteRepository = favoriteRepository; } //お気に入り追加 @Transactional public void create(House house, User user) { Favorite favorite = new Favorite(); favorite.setHouse(house); favorite.setUser(user); favoriteRepository.save(favorite); } @Transactional public void delete(Integer favoriteId) { favoriteRepository.deleteById(favoriteId); } public boolean keep(House house, User user) { return favoriteRepository.findByHouseAndUser(house, user) != null; } }

試したこと・調べたこと

上記の詳細・結果

・削除はデータベースで設定しているお気に入りのIdを使って削除する。
・特定のログインしているユーザーがその民宿をお気に入りにしてるかを判断してお気に入りに追加するかしないかを決める。

補足

特になし

コメントを投稿

0 コメント