Я бы go с чем-то вроде этого:
Обязательно создайте интерфейс MealRepository jpa
@Repository
public interface MealRepository extends JpaRepository<Meal, Integer> {
}
, затем предпочтительно создайте MealPlanService для обработки любых операций над объектами (не для выполнения реальной работы в контроллере), впрыскивая оба репозитория. И всякий раз, когда мы добавляем новое блюдо, мы сначала сохраняем его, а затем добавляем в набор блюд на объекте плана питания. Транзакционный для автоматического обновления планов питания (вы можете вручную вызывать сохранение на плане питания)
@Service
public class MealPlanService{
private MealRepository _mealRepository;
private MealPlanRepository _mealPlanRepository;
@Autowire
MealPlanService(MealRepository mealRepository,MealPlanRepository mealPlanRepository)
_mealRepository = mealRepository
_mealPlanRepository = mealPlanRepository
}
@Transactional
public Mealplan addMealToMealplan(int mealPlanId, Meal meal) throws MealNotFoundException{
Mealplan mealplan = _mealPlanRepository.findById(mealPlanId).orElseThrow(MealNotFoundException::new)
meal = _mealRepository.save(meal);
mealplan.getMealsPerWeek().add(meal)
return mealplan;
}
}
А в контроллере автосервис и выполнить. Хорошие вещи об этом вы можете дополнительно обезопасить и изящно поймать, если кто-то пытается изменить не существующий план питания или нет его (с некоторыми дополнительными логами c в обслуживании)
@RestController
@RequestMapping("/mealplan")
@CrossOrigin(origins = "*", allowedHeaders = "*")
public class MealplanController {
private MealPlanService _mealPlanService;
@Autowire
MealplanController (MealPlanService mealPlanService){
_mealPlanService = mealPlanService;
}
@PostMapping(path = "/{mealPlanId}/add")
public ResponseEntity<MealPlan> addMealToMealplan(@PathVariable int mealPlanId , @RequestBody Meal meal) {
try{
return ResponseEntity.ok(_mealPlanService.addMealToMealplan(meal));
catch (MealNotFoundException e){
//do some other logic, return error , log it or smth
ResponseEntity.notFound().build();
}
}
POST-запрос на /mealplan/1/add
с тело нового приема пищи (где 1 - ваш mealPlanId
, к которому следует добавить блюдо).
Контроллер вызовет сервисную службу, которая попытается сначала найти план питания на основе переданного идентификатора _mealPlanRepository.findById(mealPlanId)
Это вернет Необязательный, и мы объединяем операцию получения значения, вызывая _mealPlanRepository.findById(mealPlanId).orElseThrow(MealNotFoundException::new)
. На найденном объекте мы добавляем наш новый прием пищи (он будет сохранен из-за транзакций, но вы можете вызвать _mealPlanRepository.save()
для него вместо
Если все сделано в основном, сервис ретус обновляется, а контроллер затем возвращает объект ответа с обновленным планом питания