Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for link group and its sort #2105

Merged
merged 8 commits into from
May 25, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -75,4 +78,26 @@ public void deletePermanently(@PathVariable("id") Integer id) {
public List<String> teams() {
return linkService.listAllTeams();
}

/**
* Update the links in batch.
*
* <p>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")
Camsyn marked this conversation as resolved.
Show resolved Hide resolved
@ApiOperation("Updates links in batch")
public List<LinkDTO> updateBatchBy(@RequestBody List<@Valid LinkParam> linkParams) {
List<Link> 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());
}
}
2 changes: 2 additions & 0 deletions src/main/java/run/halo/app/model/params/LinkParam.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
@Data
public class LinkParam implements InputConverter<Link> {

private Integer id;

@NotBlank(message = "友情链接名称不能为空")
@Size(max = 255, message = "友情链接名称的字符长度不能超过 {max}")
private String name;
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/run/halo/app/repository/LinkRepository.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public interface LinkRepository extends BaseRepository<Link, Integer> {
*
* @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<String> findAllTeams();

boolean existsByNameAndIdNot(String name, Integer id);
Expand Down
20 changes: 19 additions & 1 deletion src/main/java/run/halo/app/service/impl/LinkServiceImpl.java
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -61,21 +62,38 @@ public LinkServiceImpl(LinkRepository linkRepository) {
ServiceUtils.convertToListMap(teams, links, LinkDTO::getTeam);

List<LinkTeamVO> result = new LinkedList<>();

Map<LinkTeamVO, Integer> teamPriorities = new HashMap<>();
// Wrap link team vo list
teamLinkListMap.forEach((team, linkList) -> {
// Build link team vo
LinkTeamVO linkTeamVO = new LinkTeamVO();
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<LinkTeamVO> listTeamVosByRandom(@NonNull Sort sort) {
Assert.notNull(sort, "Sort info must not be null");
Expand Down