From df041bafe271bcebd1ab6a40078b07d189369af8 Mon Sep 17 00:00:00 2001 From: camsyn <2742046922@qq.com> Date: Sun, 22 May 2022 15:43:44 +0800 Subject: [PATCH 1/7] fix issue 1905. --- .../controller/admin/api/LinkController.java | 29 +++++++++++++- .../run/halo/app/model/params/LinkParam.java | 2 + .../halo/app/repository/LinkRepository.java | 2 +- .../app/service/impl/LinkServiceImpl.java | 38 +++++++++++++++---- 4 files changed, 62 insertions(+), 9 deletions(-) diff --git a/src/main/java/run/halo/app/controller/admin/api/LinkController.java b/src/main/java/run/halo/app/controller/admin/api/LinkController.java index 2ae82277d8..d6bd8658c8 100644 --- a/src/main/java/run/halo/app/controller/admin/api/LinkController.java +++ b/src/main/java/run/halo/app/controller/admin/api/LinkController.java @@ -5,6 +5,8 @@ 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; import org.springframework.data.web.SortDefault; @@ -17,8 +19,12 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import run.halo.app.model.dto.LinkDTO; +import run.halo.app.model.dto.MenuDTO; +import run.halo.app.model.dto.base.InputConverter; import run.halo.app.model.entity.Link; +import run.halo.app.model.entity.Menu; import run.halo.app.model.params.LinkParam; +import run.halo.app.model.params.MenuParam; import run.halo.app.service.LinkService; /** @@ -59,7 +65,7 @@ public LinkDTO createBy(@RequestBody @Valid LinkParam linkParam) { @PutMapping("{id:\\d+}") @ApiOperation("Updates a link") public LinkDTO updateBy(@PathVariable("id") Integer id, - @RequestBody @Valid LinkParam linkParam) { + @RequestBody @Valid LinkParam linkParam) { Link link = linkService.updateBy(id, linkParam); return new LinkDTO().convertFrom(link); } @@ -75,4 +81,25 @@ public void deletePermanently(@PathVariable("id") Integer id) { public List teams() { return linkService.listAllTeams(); } + + /** + * Update the links in batch. + * + *

To realize the draggable sort approach for link priority, + * a links batch update API is in demand. + * + * @param linkParams the modified links params. + * @return the links after updated. + */ + @PutMapping("/batch") + public List updateBatchBy(@RequestBody @Valid List linkParams) { + List links = linkParams + .stream() + .filter(linkParam -> Objects.nonNull(linkParam.getId())) + .map(InputConverter::convertTo) + .collect(Collectors.toList()); + return linkService.updateInBatch(links).stream() + .map(link -> (LinkDTO) new LinkDTO().convertFrom(link)) + .collect(Collectors.toList()); + } } diff --git a/src/main/java/run/halo/app/model/params/LinkParam.java b/src/main/java/run/halo/app/model/params/LinkParam.java index 716d8fec14..ff283b53d7 100644 --- a/src/main/java/run/halo/app/model/params/LinkParam.java +++ b/src/main/java/run/halo/app/model/params/LinkParam.java @@ -17,6 +17,8 @@ @Data public class LinkParam implements InputConverter { + private Integer id; + @NotBlank(message = "友情链接名称不能为空") @Size(max = 255, message = "友情链接名称的字符长度不能超过 {max}") private String name; diff --git a/src/main/java/run/halo/app/repository/LinkRepository.java b/src/main/java/run/halo/app/repository/LinkRepository.java index 37f9f98289..825074b625 100755 --- a/src/main/java/run/halo/app/repository/LinkRepository.java +++ b/src/main/java/run/halo/app/repository/LinkRepository.java @@ -17,7 +17,7 @@ public interface LinkRepository extends BaseRepository { * * @return a list of teams */ - @Query(value = "select distinct a.team from Link a") + @Query(value = "select a.team from Link a group by a.team order by max(a.priority) DESC ") List findAllTeams(); boolean existsByNameAndIdNot(String name, Integer id); diff --git a/src/main/java/run/halo/app/service/impl/LinkServiceImpl.java b/src/main/java/run/halo/app/service/impl/LinkServiceImpl.java index bb916be3f0..9f3d1e65fc 100644 --- a/src/main/java/run/halo/app/service/impl/LinkServiceImpl.java +++ b/src/main/java/run/halo/app/service/impl/LinkServiceImpl.java @@ -1,6 +1,7 @@ package run.halo.app.service.impl; import java.util.Collections; +import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -40,14 +41,16 @@ public LinkServiceImpl(LinkRepository linkRepository) { } @Override - public @NonNull List listDtos(@NonNull Sort sort) { + public @NonNull + List listDtos(@NonNull Sort sort) { Assert.notNull(sort, "Sort info must not be null"); return convertTo(listAll(sort)); } @Override - public @NonNull List listTeamVos(@NonNull Sort sort) { + public @NonNull + List listTeamVos(@NonNull Sort sort) { Assert.notNull(sort, "Sort info must not be null"); // List all links @@ -61,7 +64,7 @@ public LinkServiceImpl(LinkRepository linkRepository) { ServiceUtils.convertToListMap(teams, links, LinkDTO::getTeam); List result = new LinkedList<>(); - + Map teamPriorities = new HashMap<>(); // Wrap link team vo list teamLinkListMap.forEach((team, linkList) -> { // Build link team vo @@ -69,15 +72,33 @@ public LinkServiceImpl(LinkRepository linkRepository) { linkTeamVO.setTeam(team); linkTeamVO.setLinks(linkList); + teamPriorities.put(linkTeamVO, getTeamPriority(linkTeamVO)); // Add it to result result.add(linkTeamVO); }); + result.sort((a, b) -> teamPriorities.get(b) - teamPriorities.get(a)); + return result; } + + /** + * Get the priority of a link team, which is the maximum priority of its link members. + * + * @param linkTeam A team of links. + * @return the priority of a link team. + */ + private Integer getTeamPriority(LinkTeamVO linkTeam) { + return linkTeam.getLinks().stream() + .mapToInt(LinkDTO::getPriority) + .max() + .orElse(-1); + } + @Override - public @NonNull List listTeamVosByRandom(@NonNull Sort sort) { + public @NonNull + List listTeamVosByRandom(@NonNull Sort sort) { Assert.notNull(sort, "Sort info must not be null"); List links = listDtos(sort); Set teams = ServiceUtils.fetchProperty(links, LinkDTO::getTeam); @@ -95,7 +116,8 @@ public LinkServiceImpl(LinkRepository linkRepository) { } @Override - public @NonNull Link createBy(@NonNull LinkParam linkParam) { + public @NonNull + Link createBy(@NonNull LinkParam linkParam) { Assert.notNull(linkParam, "Link param must not be null"); // Check the name @@ -118,7 +140,8 @@ public LinkServiceImpl(LinkRepository linkRepository) { } @Override - public @NonNull Link updateBy(Integer id, @NonNull LinkParam linkParam) { + public @NonNull + Link updateBy(Integer id, @NonNull LinkParam linkParam) { Assert.notNull(id, "Id must not be null"); Assert.notNull(linkParam, "Link param must not be null"); @@ -166,7 +189,8 @@ public List listAllTeams() { } @Override - public @NonNull List listAllByRandom() { + public @NonNull + List listAllByRandom() { List allLink = linkRepository.findAll(); Collections.shuffle(allLink); return allLink; From 2b396e0f2a716a1ac54080ed8d2461259f8a439d Mon Sep 17 00:00:00 2001 From: camsyn <2742046922@qq.com> Date: Sun, 22 May 2022 15:47:04 +0800 Subject: [PATCH 2/7] fix issue 1905. --- .../java/run/halo/app/controller/admin/api/LinkController.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/run/halo/app/controller/admin/api/LinkController.java b/src/main/java/run/halo/app/controller/admin/api/LinkController.java index d6bd8658c8..980421cbea 100644 --- a/src/main/java/run/halo/app/controller/admin/api/LinkController.java +++ b/src/main/java/run/halo/app/controller/admin/api/LinkController.java @@ -19,12 +19,9 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import run.halo.app.model.dto.LinkDTO; -import run.halo.app.model.dto.MenuDTO; import run.halo.app.model.dto.base.InputConverter; import run.halo.app.model.entity.Link; -import run.halo.app.model.entity.Menu; import run.halo.app.model.params.LinkParam; -import run.halo.app.model.params.MenuParam; import run.halo.app.service.LinkService; /** From 32453d5cec98678087a97ef0639e6a1edd76f43d Mon Sep 17 00:00:00 2001 From: camsyn <2742046922@qq.com> Date: Mon, 23 May 2022 21:13:44 +0800 Subject: [PATCH 3/7] follow suggestions. --- .../app/controller/admin/api/LinkController.java | 3 ++- .../halo/app/service/impl/LinkServiceImpl.java | 15 +++++---------- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/src/main/java/run/halo/app/controller/admin/api/LinkController.java b/src/main/java/run/halo/app/controller/admin/api/LinkController.java index 980421cbea..c42f7ab6f5 100644 --- a/src/main/java/run/halo/app/controller/admin/api/LinkController.java +++ b/src/main/java/run/halo/app/controller/admin/api/LinkController.java @@ -89,7 +89,8 @@ public List teams() { * @return the links after updated. */ @PutMapping("/batch") - public List updateBatchBy(@RequestBody @Valid List linkParams) { + @ApiOperation("Updates links in batch") + public List updateBatchBy(@RequestBody List<@Valid LinkParam> linkParams) { List links = linkParams .stream() .filter(linkParam -> Objects.nonNull(linkParam.getId())) diff --git a/src/main/java/run/halo/app/service/impl/LinkServiceImpl.java b/src/main/java/run/halo/app/service/impl/LinkServiceImpl.java index 9f3d1e65fc..f030dbb227 100644 --- a/src/main/java/run/halo/app/service/impl/LinkServiceImpl.java +++ b/src/main/java/run/halo/app/service/impl/LinkServiceImpl.java @@ -41,16 +41,14 @@ public LinkServiceImpl(LinkRepository linkRepository) { } @Override - public @NonNull - List listDtos(@NonNull Sort sort) { + public @NonNull List listDtos(@NonNull Sort sort) { Assert.notNull(sort, "Sort info must not be null"); return convertTo(listAll(sort)); } @Override - public @NonNull - List listTeamVos(@NonNull Sort sort) { + public @NonNull List listTeamVos(@NonNull Sort sort) { Assert.notNull(sort, "Sort info must not be null"); // List all links @@ -97,8 +95,7 @@ private Integer getTeamPriority(LinkTeamVO linkTeam) { } @Override - public @NonNull - List listTeamVosByRandom(@NonNull Sort sort) { + public @NonNull List listTeamVosByRandom(@NonNull Sort sort) { Assert.notNull(sort, "Sort info must not be null"); List links = listDtos(sort); Set teams = ServiceUtils.fetchProperty(links, LinkDTO::getTeam); @@ -116,8 +113,7 @@ List listTeamVosByRandom(@NonNull Sort sort) { } @Override - public @NonNull - Link createBy(@NonNull LinkParam linkParam) { + public @NonNull Link createBy(@NonNull LinkParam linkParam) { Assert.notNull(linkParam, "Link param must not be null"); // Check the name @@ -140,8 +136,7 @@ Link createBy(@NonNull LinkParam linkParam) { } @Override - public @NonNull - Link updateBy(Integer id, @NonNull LinkParam linkParam) { + public @NonNull Link updateBy(Integer id, @NonNull LinkParam linkParam) { Assert.notNull(id, "Id must not be null"); Assert.notNull(linkParam, "Link param must not be null"); From 5272c71bd7591375cf8b71288f75b85330c3ea9c Mon Sep 17 00:00:00 2001 From: Camsyn <65994555+Camsyn@users.noreply.github.com> Date: Mon, 23 May 2022 21:29:42 +0800 Subject: [PATCH 4/7] Update src/main/java/run/halo/app/repository/LinkRepository.java Co-authored-by: John Niang --- src/main/java/run/halo/app/repository/LinkRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/run/halo/app/repository/LinkRepository.java b/src/main/java/run/halo/app/repository/LinkRepository.java index 825074b625..cbd1536bd9 100755 --- a/src/main/java/run/halo/app/repository/LinkRepository.java +++ b/src/main/java/run/halo/app/repository/LinkRepository.java @@ -17,7 +17,7 @@ public interface LinkRepository extends BaseRepository { * * @return a list of teams */ - @Query(value = "select a.team from Link a group by a.team order by max(a.priority) DESC ") + @Query(value = "select a.team from Link a group by a.team order by max(a.priority) DESC") List findAllTeams(); boolean existsByNameAndIdNot(String name, Integer id); From 3d4ead47fb98e619591cf559f88391380cdbe4de Mon Sep 17 00:00:00 2001 From: camsyn <2742046922@qq.com> Date: Tue, 24 May 2022 16:10:40 +0800 Subject: [PATCH 5/7] Withdraw irrelevant modification. --- .../controller/admin/api/LinkController.java | 25 +++++++++++++++++++ .../run/halo/app/model/params/LinkParam.java | 2 ++ .../halo/app/repository/LinkRepository.java | 2 +- .../app/service/impl/LinkServiceImpl.java | 23 +++++++++++++++-- 4 files changed, 49 insertions(+), 3 deletions(-) diff --git a/src/main/java/run/halo/app/controller/admin/api/LinkController.java b/src/main/java/run/halo/app/controller/admin/api/LinkController.java index 2ae82277d8..3993099ee0 100644 --- a/src/main/java/run/halo/app/controller/admin/api/LinkController.java +++ b/src/main/java/run/halo/app/controller/admin/api/LinkController.java @@ -5,6 +5,8 @@ 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; import org.springframework.data.web.SortDefault; @@ -17,6 +19,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import run.halo.app.model.dto.LinkDTO; +import run.halo.app.model.dto.base.InputConverter; import run.halo.app.model.entity.Link; import run.halo.app.model.params.LinkParam; import run.halo.app.service.LinkService; @@ -75,4 +78,26 @@ public void deletePermanently(@PathVariable("id") Integer id) { public List teams() { return linkService.listAllTeams(); } + + /** + * Update the links in batch. + * + *

To realize the draggable sort approach for link priority, + * a links batch update API is in demand. + * + * @param linkParams the modified links params. + * @return the links after updated. + */ + @PutMapping("/batch") + @ApiOperation("Updates links in batch") + public List updateBatchBy(@RequestBody List<@Valid LinkParam> linkParams) { + List links = linkParams + .stream() + .filter(linkParam -> Objects.nonNull(linkParam.getId())) + .map(InputConverter::convertTo) + .collect(Collectors.toList()); + return linkService.updateInBatch(links).stream() + .map(link -> (LinkDTO) new LinkDTO().convertFrom(link)) + .collect(Collectors.toList()); + } } diff --git a/src/main/java/run/halo/app/model/params/LinkParam.java b/src/main/java/run/halo/app/model/params/LinkParam.java index 716d8fec14..ff283b53d7 100644 --- a/src/main/java/run/halo/app/model/params/LinkParam.java +++ b/src/main/java/run/halo/app/model/params/LinkParam.java @@ -17,6 +17,8 @@ @Data public class LinkParam implements InputConverter { + private Integer id; + @NotBlank(message = "友情链接名称不能为空") @Size(max = 255, message = "友情链接名称的字符长度不能超过 {max}") private String name; diff --git a/src/main/java/run/halo/app/repository/LinkRepository.java b/src/main/java/run/halo/app/repository/LinkRepository.java index 37f9f98289..cbd1536bd9 100755 --- a/src/main/java/run/halo/app/repository/LinkRepository.java +++ b/src/main/java/run/halo/app/repository/LinkRepository.java @@ -17,7 +17,7 @@ public interface LinkRepository extends BaseRepository { * * @return a list of teams */ - @Query(value = "select distinct a.team from Link a") + @Query(value = "select a.team from Link a group by a.team order by max(a.priority) DESC") List findAllTeams(); boolean existsByNameAndIdNot(String name, Integer id); diff --git a/src/main/java/run/halo/app/service/impl/LinkServiceImpl.java b/src/main/java/run/halo/app/service/impl/LinkServiceImpl.java index bb916be3f0..f030dbb227 100644 --- a/src/main/java/run/halo/app/service/impl/LinkServiceImpl.java +++ b/src/main/java/run/halo/app/service/impl/LinkServiceImpl.java @@ -1,6 +1,7 @@ package run.halo.app.service.impl; import java.util.Collections; +import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -61,7 +62,7 @@ public LinkServiceImpl(LinkRepository linkRepository) { ServiceUtils.convertToListMap(teams, links, LinkDTO::getTeam); List result = new LinkedList<>(); - + Map teamPriorities = new HashMap<>(); // Wrap link team vo list teamLinkListMap.forEach((team, linkList) -> { // Build link team vo @@ -69,13 +70,30 @@ public LinkServiceImpl(LinkRepository linkRepository) { linkTeamVO.setTeam(team); linkTeamVO.setLinks(linkList); + teamPriorities.put(linkTeamVO, getTeamPriority(linkTeamVO)); // Add it to result result.add(linkTeamVO); }); + result.sort((a, b) -> teamPriorities.get(b) - teamPriorities.get(a)); + return result; } + + /** + * Get the priority of a link team, which is the maximum priority of its link members. + * + * @param linkTeam A team of links. + * @return the priority of a link team. + */ + private Integer getTeamPriority(LinkTeamVO linkTeam) { + return linkTeam.getLinks().stream() + .mapToInt(LinkDTO::getPriority) + .max() + .orElse(-1); + } + @Override public @NonNull List listTeamVosByRandom(@NonNull Sort sort) { Assert.notNull(sort, "Sort info must not be null"); @@ -166,7 +184,8 @@ public List listAllTeams() { } @Override - public @NonNull List listAllByRandom() { + public @NonNull + List listAllByRandom() { List allLink = linkRepository.findAll(); Collections.shuffle(allLink); return allLink; From 0707be422e75382d17ccd8f4699dbc32784c521b Mon Sep 17 00:00:00 2001 From: camsyn <2742046922@qq.com> Date: Tue, 24 May 2022 16:13:36 +0800 Subject: [PATCH 6/7] Withdraw irrelevant modification. --- .../java/run/halo/app/controller/admin/api/LinkController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/run/halo/app/controller/admin/api/LinkController.java b/src/main/java/run/halo/app/controller/admin/api/LinkController.java index c42f7ab6f5..3993099ee0 100644 --- a/src/main/java/run/halo/app/controller/admin/api/LinkController.java +++ b/src/main/java/run/halo/app/controller/admin/api/LinkController.java @@ -62,7 +62,7 @@ public LinkDTO createBy(@RequestBody @Valid LinkParam linkParam) { @PutMapping("{id:\\d+}") @ApiOperation("Updates a link") public LinkDTO updateBy(@PathVariable("id") Integer id, - @RequestBody @Valid LinkParam linkParam) { + @RequestBody @Valid LinkParam linkParam) { Link link = linkService.updateBy(id, linkParam); return new LinkDTO().convertFrom(link); } From d19e97cf76dc362bb8eaece022b125e399abd88d Mon Sep 17 00:00:00 2001 From: camsyn <2742046922@qq.com> Date: Tue, 24 May 2022 16:15:36 +0800 Subject: [PATCH 7/7] Withdraw irrelevant modification. --- src/main/java/run/halo/app/service/impl/LinkServiceImpl.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/run/halo/app/service/impl/LinkServiceImpl.java b/src/main/java/run/halo/app/service/impl/LinkServiceImpl.java index f030dbb227..e6bc05b4c8 100644 --- a/src/main/java/run/halo/app/service/impl/LinkServiceImpl.java +++ b/src/main/java/run/halo/app/service/impl/LinkServiceImpl.java @@ -184,8 +184,7 @@ public List listAllTeams() { } @Override - public @NonNull - List listAllByRandom() { + public @NonNull List listAllByRandom() { List allLink = linkRepository.findAll(); Collections.shuffle(allLink); return allLink;