diff --git a/src/main/java/cc/ryanc/halo/model/entity/Link.java b/src/main/java/cc/ryanc/halo/model/entity/Link.java
index e9873a81a..ab07e130d 100644
--- a/src/main/java/cc/ryanc/halo/model/entity/Link.java
+++ b/src/main/java/cc/ryanc/halo/model/entity/Link.java
@@ -37,13 +37,13 @@ public class Link extends BaseEntity {
/**
* Link website address.
*/
- @Column(name = "url", columnDefinition = "varchar(255) not null")
+ @Column(name = "url", columnDefinition = "varchar(1023) not null")
private String url;
/**
* Website logo.
*/
- @Column(name = "logo", columnDefinition = "varchar(255) default ''")
+ @Column(name = "logo", columnDefinition = "varchar(1023) default ''")
private String logo;
/**
@@ -62,6 +62,19 @@ public class Link extends BaseEntity {
@Override
public void prePersist() {
super.prePersist();
+
id = null;
+
+ if (logo == null) {
+ logo = "";
+ }
+
+ if (description == null) {
+ description = "";
+ }
+
+ if (team == null) {
+ team = "";
+ }
}
}
diff --git a/src/main/java/cc/ryanc/halo/model/params/LinkParam.java b/src/main/java/cc/ryanc/halo/model/params/LinkParam.java
new file mode 100644
index 000000000..b36e3666b
--- /dev/null
+++ b/src/main/java/cc/ryanc/halo/model/params/LinkParam.java
@@ -0,0 +1,38 @@
+package cc.ryanc.halo.model.params;
+
+import cc.ryanc.halo.model.dto.base.InputConverter;
+import cc.ryanc.halo.model.entity.Link;
+import lombok.Data;
+import org.hibernate.validator.constraints.URL;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
+
+/**
+ * Link param.
+ *
+ * @author johnniang
+ * @date 4/3/19
+ */
+@Data
+public class LinkParam implements InputConverter {
+
+ @NotBlank(message = "Link name must not be blank")
+ @Size(max = 255, message = "Length of link name must not be more than {max}")
+ private String name;
+
+ @NotBlank(message = "Link url must not be blank")
+ @Size(max = 1023, message = "Length of link url must not be more than {max}")
+ @URL(message = "Link url format is incorrect")
+ private String url;
+
+ @Size(max = 1023, message = "Length of link logo must not be more than {max}")
+ private String logo;
+
+ @Size(max = 255, message = "Length of link description must not be more than {max}")
+ private String description;
+
+ @Size(max = 255, message = "Length of link team must not be more than {max}")
+ private String team;
+
+}
diff --git a/src/main/java/cc/ryanc/halo/service/LinkService.java b/src/main/java/cc/ryanc/halo/service/LinkService.java
index 17a73928d..ca78573ae 100755
--- a/src/main/java/cc/ryanc/halo/service/LinkService.java
+++ b/src/main/java/cc/ryanc/halo/service/LinkService.java
@@ -1,8 +1,9 @@
package cc.ryanc.halo.service;
import cc.ryanc.halo.model.dto.LinkOutputDTO;
-import cc.ryanc.halo.model.dto.LinkTeamOutputDTO;
import cc.ryanc.halo.model.entity.Link;
+import cc.ryanc.halo.model.params.LinkParam;
+import cc.ryanc.halo.model.vo.LinkTeamVO;
import cc.ryanc.halo.service.base.CrudService;
import org.springframework.data.domain.Sort;
import org.springframework.lang.NonNull;
@@ -22,12 +23,40 @@ public interface LinkService extends CrudService {
* @param sort sort
* @return all links
*/
+ @NonNull
List listDtos(@NonNull Sort sort);
/**
* List link by group
*
- * @return List
+ * @return a list of link team vo
*/
- List listTeam();
+ @NonNull
+ List listTeamVos();
+
+ /**
+ * Lists link team vos.
+ *
+ * @param sort must not be null
+ * @return a list of link team vo
+ */
+ @NonNull
+ List listTeamVos(@NonNull Sort sort);
+
+ /**
+ * Creates link by link param.
+ *
+ * @param linkParam must not be null
+ * @return create link
+ */
+ @NonNull
+ Link createBy(@NonNull LinkParam linkParam);
+
+ /**
+ * Exists by link name.
+ *
+ * @param name must not be blank
+ * @return true if exists; false otherwise
+ */
+ boolean existByName(String name);
}
diff --git a/src/main/java/cc/ryanc/halo/service/impl/LinkServiceImpl.java b/src/main/java/cc/ryanc/halo/service/impl/LinkServiceImpl.java
index 376f7ad68..75a23182b 100644
--- a/src/main/java/cc/ryanc/halo/service/impl/LinkServiceImpl.java
+++ b/src/main/java/cc/ryanc/halo/service/impl/LinkServiceImpl.java
@@ -1,16 +1,23 @@
package cc.ryanc.halo.service.impl;
+import cc.ryanc.halo.exception.AlreadyExistsException;
import cc.ryanc.halo.model.dto.LinkOutputDTO;
-import cc.ryanc.halo.model.dto.LinkTeamOutputDTO;
import cc.ryanc.halo.model.entity.Link;
+import cc.ryanc.halo.model.params.LinkParam;
+import cc.ryanc.halo.model.vo.LinkTeamVO;
import cc.ryanc.halo.repository.LinkRepository;
import cc.ryanc.halo.service.LinkService;
import cc.ryanc.halo.service.base.AbstractCrudService;
+import cc.ryanc.halo.utils.ServiceUtils;
+import org.springframework.data.domain.Example;
import org.springframework.data.domain.Sort;
+import org.springframework.lang.NonNull;
+import org.springframework.lang.Nullable;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
+import org.springframework.util.CollectionUtils;
-import java.util.List;
+import java.util.*;
import java.util.stream.Collectors;
/**
@@ -39,17 +46,79 @@ public class LinkServiceImpl extends AbstractCrudService implemen
public List listDtos(Sort sort) {
Assert.notNull(sort, "Sort info must not be null");
- return listAll(sort).stream().map(link -> (LinkOutputDTO) new LinkOutputDTO().convertFrom(link)).collect(Collectors.toList());
+ return convertTo(listAll(sort));
}
/**
* List link by group
*
- * @return List
+ * @return List
*/
@Override
- public List listTeam() {
+ public List listTeamVos() {
// TODO list team
return null;
}
+
+ @Override
+ public List listTeamVos(Sort sort) {
+ Assert.notNull(sort, "Sort info must not be null");
+
+ // List all links
+ List links = listDtos(sort);
+
+ // Get teams
+ Set teams = ServiceUtils.fetchProperty(links, LinkOutputDTO::getTeam);
+
+ // Convert to team link list map (Key: team, value: link list)
+ Map> teamLinkListMap = ServiceUtils.convertToListMap(teams, links, LinkOutputDTO::getTeam);
+
+ List result = new LinkedList<>();
+
+ // Wrap link team vo list
+ teamLinkListMap.forEach((team, linkList) -> {
+ // Build link team vo
+ LinkTeamVO linkTeamVO = new LinkTeamVO();
+ linkTeamVO.setTeam(team);
+ linkTeamVO.setLinks(linkList);
+
+ // Add it to result
+ result.add(linkTeamVO);
+ });
+
+ return result;
+ }
+
+ @Override
+ public Link createBy(LinkParam linkParam) {
+ Assert.notNull(linkParam, "Link param must not be null");
+
+ // Check the name
+ boolean exist = existByName(linkParam.getName());
+
+ if (exist) {
+ throw new AlreadyExistsException("Link name " + linkParam.getName() + " has already existed").setErrorData(linkParam.getName());
+ }
+
+ return create(linkParam.convertTo());
+ }
+
+ @Override
+ public boolean existByName(String name) {
+ Assert.hasText(name, "Link name must not be blank");
+ Link link = new Link();
+ link.setName(name);
+
+ return linkRepository.exists(Example.of(link));
+ }
+
+ @NonNull
+ private List convertTo(@Nullable List links) {
+ if (CollectionUtils.isEmpty(links)) {
+ return Collections.emptyList();
+ }
+
+ return links.stream().map(link -> new LinkOutputDTO().convertFrom(link))
+ .collect(Collectors.toList());
+ }
}
diff --git a/src/main/java/cc/ryanc/halo/web/controller/admin/api/LinkController.java b/src/main/java/cc/ryanc/halo/web/controller/admin/api/LinkController.java
index d95bc6900..a1bc75503 100644
--- a/src/main/java/cc/ryanc/halo/web/controller/admin/api/LinkController.java
+++ b/src/main/java/cc/ryanc/halo/web/controller/admin/api/LinkController.java
@@ -1,12 +1,15 @@
package cc.ryanc.halo.web.controller.admin.api;
import cc.ryanc.halo.model.dto.LinkOutputDTO;
+import cc.ryanc.halo.model.entity.Link;
+import cc.ryanc.halo.model.params.LinkParam;
import cc.ryanc.halo.service.LinkService;
import io.swagger.annotations.ApiOperation;
import org.springframework.data.domain.Sort;
import org.springframework.data.web.SortDefault;
import org.springframework.web.bind.annotation.*;
+import javax.validation.Valid;
import java.util.List;
/**
@@ -16,7 +19,7 @@ import java.util.List;
* @date : 2019/3/21
*/
@RestController
-@RequestMapping(value = "/admin/api/links")
+@RequestMapping("/admin/api/links")
public class LinkController {
private final LinkService linkService;
@@ -48,6 +51,12 @@ public class LinkController {
return new LinkOutputDTO().convertFrom(linkService.getById(id));
}
+ @PostMapping
+ public LinkOutputDTO createBy(@RequestBody @Valid LinkParam linkParam) {
+ Link link = linkService.createBy(linkParam);
+ return new LinkOutputDTO().convertFrom(link);
+ }
+
/**
* Delete link by id.
*