iT邦幫忙

2025 iThome 鐵人賽

DAY 26
0
自我挑戰組

跟 AI Agent 變成好朋友系列 第 26

【Day26】AI Agent 魔法詠唱 - FavoriteDrink Service

  • 分享至 

  • xImage
  •  

FavoriteDrinkService 負責處理「最愛飲品」相關的邏輯。它通常會呼叫 Repository 來存取資料庫,並提供方法給 Controller 使用。在此服務中較爲重要的三個功能,分別是:

第一,新增喜好飲品, 此方法會根據使用者名稱與飲品資訊,先檢查使用者是否存在,再判斷該飲品是否已在收藏清單中。若未重複,則建立 FavoriteDrink 實體並存入資料庫。

public FavoriteDrink addFavoriteDrink(String username, FavoriteDrinkRequest request) {
    Optional<User> userOpt = userRepository.findByUsername(username);
    if (userOpt.isEmpty()) {
        throw new RuntimeException("使用者不存在");
    }
    
    User user = userOpt.get();
    
    // 檢查是否已經收藏
    if (favoriteDrinkRepository.existsByUserAndDrinkName(user, request.getDrinkName())) {
        throw new RuntimeException("此飲品已在收藏清單中");
    }
    
    FavoriteDrink favoriteDrink = new FavoriteDrink(user, request.getDrinkName(), request.getDrinkCategory());
    favoriteDrink.setDrinkDescription(request.getDrinkDescription());
    favoriteDrink.setPrice(request.getPrice());
    favoriteDrink.setTags(request.getTags());
    favoriteDrink.setNotes(request.getNotes());
    
    return favoriteDrinkRepository.save(favoriteDrink);
}

第二,判斷飲品是否已被收藏, 此方法用於查詢某使用者是否已收藏指定飲品。先查詢使用者,若存在則呼叫 Repository 判斷是否有該飲品紀錄,回傳布林值。這對前端顯示「已收藏」狀態很重要。

public boolean isDrinkFavoritedByUser(String username, String drinkName) {
    User user = userRepository.findByUsername(username).orElse(null);
    if (user == null) return false;
    
    return favoriteDrinkRepository.existsByUserAndDrinkName(user, drinkName);
}

第三,移除最愛飲品,此方法會先確認使用者存在,再查詢該飲品是否在收藏清單中。若找到則刪除,否則拋出例外。

public void removeFavoriteDrink(String username, String drinkName) {
    Optional<User> userOpt = userRepository.findByUsername(username);
    if (userOpt.isEmpty()) {
        throw new RuntimeException("使用者不存在");
    }
    
    User user = userOpt.get();
    Optional<FavoriteDrink> favDrinkOpt = favoriteDrinkRepository.findByUserAndDrinkName(user, drinkName);
    
    if (favDrinkOpt.isEmpty()) {
        throw new RuntimeException("收藏清單中找不到此飲品");
    }
    
    favoriteDrinkRepository.delete(favDrinkOpt.get());
}

這三個方法分別負責新增、查詢、移除最愛飲品,能夠確保資料正確性、避免重複、並提供錯誤處理,並讓 Controller 可以簡單呼叫 Service 方法,將資料存取細節封裝在 Repository 層。


上一篇
【Day25】AI Agent 魔法詠唱 - AIRecommendation Service
系列文
跟 AI Agent 變成好朋友26
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言