diff --git a/src/main/java/run/halo/app/controller/admin/api/MenuController.java b/src/main/java/run/halo/app/controller/admin/api/MenuController.java index 716d7c883..8354ea50b 100644 --- a/src/main/java/run/halo/app/controller/admin/api/MenuController.java +++ b/src/main/java/run/halo/app/controller/admin/api/MenuController.java @@ -5,6 +5,7 @@ import static org.springframework.data.domain.Sort.Direction.DESC; import io.swagger.annotations.ApiOperation; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; import javax.validation.Valid; import org.springframework.data.domain.Sort; @@ -103,6 +104,7 @@ public class MenuController { public List updateBatchBy(@RequestBody @Valid List menuParams) { List menus = menuParams .stream() + .filter(menuParam -> Objects.nonNull(menuParam.getId())) .map(InputConverter::convertTo) .collect(Collectors.toList()); return menuService.updateInBatch(menus).stream() diff --git a/src/main/java/run/halo/app/service/impl/CategoryServiceImpl.java b/src/main/java/run/halo/app/service/impl/CategoryServiceImpl.java index 71b5e8a54..6ef39ef1b 100644 --- a/src/main/java/run/halo/app/service/impl/CategoryServiceImpl.java +++ b/src/main/java/run/halo/app/service/impl/CategoryServiceImpl.java @@ -10,6 +10,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; @@ -661,15 +662,21 @@ public class CategoryServiceImpl extends AbstractCrudService @Override + @Transactional(rollbackFor = Exception.class) public List updateInBatch(Collection categories) { if (CollectionUtils.isEmpty(categories)) { return Collections.emptyList(); } - - ArrayList resultList = new ArrayList<>(); - for (Category category : categories) { - resultList.add(update(category)); - } - return resultList; + Set categoryIds = ServiceUtils.fetchProperty(categories, Category::getId); + Map idCategoryParamMap = + ServiceUtils.convertToMap(categories, Category::getId); + return categoryRepository.findAllById(categoryIds) + .stream() + .map(categoryToUpdate -> { + Category categoryParam = idCategoryParamMap.get(categoryToUpdate.getId()); + BeanUtils.updateProperties(categoryParam, categoryToUpdate); + return update(categoryToUpdate); + }) + .collect(Collectors.toList()); } } diff --git a/src/main/java/run/halo/app/service/impl/MenuServiceImpl.java b/src/main/java/run/halo/app/service/impl/MenuServiceImpl.java index 7cc9eb537..c8c35bd98 100644 --- a/src/main/java/run/halo/app/service/impl/MenuServiceImpl.java +++ b/src/main/java/run/halo/app/service/impl/MenuServiceImpl.java @@ -1,5 +1,6 @@ package run.halo.app.service.impl; +import java.util.Collection; import java.util.Collections; import java.util.LinkedList; import java.util.List; @@ -9,6 +10,7 @@ import java.util.stream.Collectors; import org.springframework.data.domain.Sort; import org.springframework.lang.NonNull; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import run.halo.app.model.dto.MenuDTO; @@ -19,6 +21,7 @@ import run.halo.app.model.vo.MenuVO; import run.halo.app.repository.MenuRepository; import run.halo.app.service.MenuService; import run.halo.app.service.base.AbstractCrudService; +import run.halo.app.utils.BeanUtils; import run.halo.app.utils.ServiceUtils; /** @@ -153,6 +156,22 @@ public class MenuServiceImpl extends AbstractCrudService implemen return super.update(menu); } + @Override + @NonNull + @Transactional(rollbackFor = Exception.class) + public List updateInBatch(@NonNull Collection menus) { + Set menuIds = ServiceUtils.fetchProperty(menus, Menu::getId); + Map idMenuParamMap = ServiceUtils.convertToMap(menus, Menu::getId); + return menuRepository.findAllById(menuIds) + .stream() + .map(menuToUpdate -> { + Menu menuParam = idMenuParamMap.get(menuToUpdate.getId()); + BeanUtils.updateProperties(menuParam, menuToUpdate); + return update(menuToUpdate); + }) + .collect(Collectors.toList()); + } + /** * Concrete menu tree. *