From f2c6ab43f0a10d23fd1f55e52568d3f160b8fe49 Mon Sep 17 00:00:00 2001 From: johnniang <1340692778@qq.com> Date: Wed, 20 Feb 2019 11:01:17 +0800 Subject: [PATCH] Refactor OptionsService --- .../halo/repository/OptionsRepository.java | 2 +- .../cc/ryanc/halo/service/OptionsService.java | 10 +- .../service/base/AbstractCrudService.java | 8 ++ .../ryanc/halo/service/base/CrudService.java | 3 + .../halo/service/impl/OptionsServiceImpl.java | 103 ++++++++++-------- .../cc/ryanc/halo/utils/ServiceUtils.java | 25 +++++ .../controller/admin/OptionController.java | 2 +- 7 files changed, 99 insertions(+), 54 deletions(-) diff --git a/src/main/java/cc/ryanc/halo/repository/OptionsRepository.java b/src/main/java/cc/ryanc/halo/repository/OptionsRepository.java index 4217e8dac..50a5b22a6 100755 --- a/src/main/java/cc/ryanc/halo/repository/OptionsRepository.java +++ b/src/main/java/cc/ryanc/halo/repository/OptionsRepository.java @@ -12,7 +12,7 @@ import org.springframework.data.jpa.repository.JpaRepository; * @author : RYAN0UP * @date : 2017/11/14 */ -public interface OptionsRepository extends BaseRepository { +public interface OptionsRepository extends BaseRepository { /** * 根据key查询单个option diff --git a/src/main/java/cc/ryanc/halo/service/OptionsService.java b/src/main/java/cc/ryanc/halo/service/OptionsService.java index f05c6d8af..65aa68309 100755 --- a/src/main/java/cc/ryanc/halo/service/OptionsService.java +++ b/src/main/java/cc/ryanc/halo/service/OptionsService.java @@ -1,6 +1,7 @@ package cc.ryanc.halo.service; import cc.ryanc.halo.model.domain.Options; +import cc.ryanc.halo.service.base.CrudService; import java.util.Map; @@ -12,7 +13,7 @@ import java.util.Map; * @author : RYAN0UP * @date : 2017/11/14 */ -public interface OptionsService { +public interface OptionsService extends CrudService { /** * 保存单个设置选项 @@ -29,13 +30,6 @@ public interface OptionsService { */ void saveOptions(Map options); - /** - * 移除设置选项 - * - * @param options options - */ - void removeOption(Options options); - /** * 获取所有设置选项 * diff --git a/src/main/java/cc/ryanc/halo/service/base/AbstractCrudService.java b/src/main/java/cc/ryanc/halo/service/base/AbstractCrudService.java index f065f795b..5c8dc6783 100644 --- a/src/main/java/cc/ryanc/halo/service/base/AbstractCrudService.java +++ b/src/main/java/cc/ryanc/halo/service/base/AbstractCrudService.java @@ -153,6 +153,14 @@ public abstract class AbstractCrudService implements CrudService { + remove(domain); + return domain; + }).orElse(null); + } + @Override public void remove(DOMAIN domain) { Assert.notNull(domain, domainName + " data must not be null"); diff --git a/src/main/java/cc/ryanc/halo/service/base/CrudService.java b/src/main/java/cc/ryanc/halo/service/base/CrudService.java index ab2725b39..75b77a16c 100644 --- a/src/main/java/cc/ryanc/halo/service/base/CrudService.java +++ b/src/main/java/cc/ryanc/halo/service/base/CrudService.java @@ -71,6 +71,9 @@ public interface CrudService { @NonNull DOMAIN removeById(@NonNull ID id); + @Nullable + DOMAIN removeByIdOfNullable(@NonNull ID id); + void remove(@NonNull DOMAIN domain); void removeInBatch(@NonNull Collection ids); diff --git a/src/main/java/cc/ryanc/halo/service/impl/OptionsServiceImpl.java b/src/main/java/cc/ryanc/halo/service/impl/OptionsServiceImpl.java index 148b71ca8..2f5ba6f10 100755 --- a/src/main/java/cc/ryanc/halo/service/impl/OptionsServiceImpl.java +++ b/src/main/java/cc/ryanc/halo/service/impl/OptionsServiceImpl.java @@ -3,8 +3,9 @@ package cc.ryanc.halo.service.impl; import cc.ryanc.halo.model.domain.Options; import cc.ryanc.halo.repository.OptionsRepository; import cc.ryanc.halo.service.OptionsService; +import cc.ryanc.halo.service.base.AbstractCrudService; +import cc.ryanc.halo.utils.ServiceUtils; import cn.hutool.core.util.StrUtil; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheEvict; import org.springframework.stereotype.Service; @@ -21,11 +22,16 @@ import java.util.Map; * @date : 2017/11/14 */ @Service -public class OptionsServiceImpl implements OptionsService { +public class OptionsServiceImpl extends AbstractCrudService implements OptionsService { private static final String POSTS_CACHE_NAME = "posts"; - @Autowired - private OptionsRepository optionsRepository; + + private final OptionsRepository optionsRepository; + + public OptionsServiceImpl(OptionsRepository optionsRepository) { + super(optionsRepository); + this.optionsRepository = optionsRepository; + } /** * 批量保存设置 @@ -36,7 +42,7 @@ public class OptionsServiceImpl implements OptionsService { @CacheEvict(value = POSTS_CACHE_NAME, allEntries = true, beforeInvocation = true) public void saveOptions(Map options) { if (null != options && !options.isEmpty()) { - options.forEach((k, v) -> saveOption(k, v)); + options.forEach(this::saveOption); } } @@ -48,36 +54,41 @@ public class OptionsServiceImpl implements OptionsService { */ @Override public void saveOption(String key, String value) { - Options options = null; if (StrUtil.equals(value, "")) { - options = new Options(); - options.setOptionName(key); - this.removeOption(options); - } else { - if (StrUtil.isNotEmpty(key)) { - //如果查询到有该设置选项则做更新操作,反之保存新的设置选项 - if (null == optionsRepository.findOptionsByOptionName(key)) { - options = new Options(); - options.setOptionName(key); - options.setOptionValue(value); - optionsRepository.save(options); - } else { - options = optionsRepository.findOptionsByOptionName(key); - options.setOptionValue(value); - optionsRepository.save(options); - } - } - } - } +// options = new Options(); +// options.setOptionName(key); +// this.remove(options); - /** - * 移除设置项 - * - * @param options options - */ - @Override - public void removeOption(Options options) { - optionsRepository.delete(options); + removeByIdOfNullable(key); + } else if (StrUtil.isNotEmpty(key)) { + //如果查询到有该设置选项则做更新操作,反之保存新的设置选项 + +// if (null == optionsRepository.findOptionsByOptionName(key)) { +// options = new Options(); +// options.setOptionName(key); +// options.setOptionValue(value); +// optionsRepository.save(options); +// } else { +// options = optionsRepository.findOptionsByOptionName(key); +// options.setOptionValue(value); +// optionsRepository.save(options); +// } + + Options options = fetchById(key).map(option -> { + // Exist + option.setOptionValue(value); + return option; + }).orElseGet(() -> { + // Not exist + Options option = new Options(); + option.setOptionName(key); + option.setOptionValue(value); + return option; + }); + + // Save or update the options + optionsRepository.save(options); + } } /** @@ -87,12 +98,14 @@ public class OptionsServiceImpl implements OptionsService { */ @Override public Map findAllOptions() { - final Map options = new HashMap<>(); - final List optionsList = optionsRepository.findAll(); - if (null != optionsList) { - optionsList.forEach(option -> options.put(option.getOptionName(), option.getOptionValue())); - } - return options; +// final Map options = new HashMap<>(); +// final List optionsList = optionsRepository.findAll(); +// if (null != optionsList) { +// optionsList.forEach(option -> options.put(option.getOptionName(), option.getOptionValue())); +// } +// return options; + + return ServiceUtils.convertToMap(listAll(), Options::getOptionName, Options::getOptionValue); } /** @@ -103,10 +116,12 @@ public class OptionsServiceImpl implements OptionsService { */ @Override public String findOneOption(String key) { - final Options options = optionsRepository.findOptionsByOptionName(key); - if (null != options) { - return options.getOptionValue(); - } - return null; +// final Options options = getNullableById(key); +// if (null != options) { +// return options.getOptionValue(); +// } +// return null; + + return fetchById(key).map(Options::getOptionValue).orElse(null); } } diff --git a/src/main/java/cc/ryanc/halo/utils/ServiceUtils.java b/src/main/java/cc/ryanc/halo/utils/ServiceUtils.java index 9f79e7e8d..a9c370f26 100644 --- a/src/main/java/cc/ryanc/halo/utils/ServiceUtils.java +++ b/src/main/java/cc/ryanc/halo/utils/ServiceUtils.java @@ -83,4 +83,29 @@ public class ServiceUtils { return resultMap; } + + /** + * Converts to map (key from the list data) + * + * @param list data list + * @param keyFunction key mapping function + * @param valueFunction value mapping function + * @param id type + * @param data type + * @param value type + * @return a map which key from list data and value is data + */ + public static Map convertToMap(Collection list, Function keyFunction, Function valueFunction) { + Assert.notNull(keyFunction, "mapping function must not be null"); + + if (CollectionUtils.isEmpty(list)) { + return Collections.emptyMap(); + } + + Map resultMap = new HashMap<>(); + + list.forEach(data -> resultMap.putIfAbsent(keyFunction.apply(data), valueFunction.apply(data))); + + return resultMap; + } } diff --git a/src/main/java/cc/ryanc/halo/web/controller/admin/OptionController.java b/src/main/java/cc/ryanc/halo/web/controller/admin/OptionController.java index c676fc1cf..4a56e1923 100755 --- a/src/main/java/cc/ryanc/halo/web/controller/admin/OptionController.java +++ b/src/main/java/cc/ryanc/halo/web/controller/admin/OptionController.java @@ -67,7 +67,7 @@ public class OptionController { log.info("List of saved options: " + options); return new JsonResult(ResultCodeEnum.SUCCESS.getCode(), localeMessageUtil.getMessage("code.admin.common.save-success")); } catch (Exception e) { - log.error("Save settings option failed: {}", e.getMessage()); + log.error("Save settings option failed: " + e.getMessage(), e); return new JsonResult(ResultCodeEnum.FAIL.getCode(), localeMessageUtil.getMessage("code.admin.common.save-failed")); } }