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 a42f4ff8d..a9f6bff25 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
@@ -54,9 +54,8 @@ public class LinkController {
@ApiOperation("Updates a link")
public LinkDTO updateBy(@PathVariable("id") Integer id,
@RequestBody @Valid LinkParam linkParam) {
- Link link = linkService.getById(id);
- linkParam.update(link);
- return new LinkDTO().convertFrom(linkService.update(link));
+ Link link = linkService.updateBy(id, linkParam);
+ return new LinkDTO().convertFrom(link);
}
@DeleteMapping("{id:\\d+}")
diff --git a/src/main/java/run/halo/app/repository/LinkRepository.java b/src/main/java/run/halo/app/repository/LinkRepository.java
index fbfe8aed7..f54d9dfc2 100755
--- a/src/main/java/run/halo/app/repository/LinkRepository.java
+++ b/src/main/java/run/halo/app/repository/LinkRepository.java
@@ -20,4 +20,8 @@ public interface LinkRepository extends BaseRepository {
*/
@Query(value = "select distinct a.team from Link a")
List findAllTeams();
+
+ boolean existsByNameAndIdNot(String name, Integer id);
+
+ boolean existsByUrlAndIdNot(String url, Integer id);
}
diff --git a/src/main/java/run/halo/app/service/LinkService.java b/src/main/java/run/halo/app/service/LinkService.java
index a0e37e25e..82f83880f 100755
--- a/src/main/java/run/halo/app/service/LinkService.java
+++ b/src/main/java/run/halo/app/service/LinkService.java
@@ -55,6 +55,17 @@ public interface LinkService extends CrudService {
@NonNull
Link createBy(@NonNull LinkParam linkParam);
+ /**
+ * Updates link by link param.
+ *
+ *
+ * @param id must not be null
+ * @param linkParam must not be null
+ * @return updated link
+ */
+ @NonNull
+ Link updateBy(Integer id, @NonNull LinkParam linkParam);
+
/**
* Exists by link name.
*
@@ -63,6 +74,14 @@ public interface LinkService extends CrudService {
*/
boolean existByName(String name);
+ /**
+ * Exists by link url.
+ *
+ * @param url must not be blank
+ * @return true if exists; false otherwise
+ */
+ boolean existByUrl(String url);
+
/**
* List all link teams.
*
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 02d0fa8da..b5cd33908 100644
--- a/src/main/java/run/halo/app/service/impl/LinkServiceImpl.java
+++ b/src/main/java/run/halo/app/service/impl/LinkServiceImpl.java
@@ -101,9 +101,39 @@ public class LinkServiceImpl extends AbstractCrudService implemen
throw new AlreadyExistsException("友情链接 " + linkParam.getName() + " 已存在").setErrorData(linkParam.getName());
}
+ // Check the url
+ exist = existByUrl(linkParam.getUrl());
+
+ if (exist) {
+ throw new AlreadyExistsException("友情链接 " + linkParam.getUrl() + " 已存在").setErrorData(linkParam.getUrl());
+ }
+
return create(linkParam.convertTo());
}
+ @Override
+ public @NotNull Link updateBy(Integer id, @NotNull LinkParam linkParam) {
+ Assert.notNull(id, "Id must not be null");
+ Assert.notNull(linkParam, "Link param must not be null");
+
+ // Check the name
+ boolean exist = linkRepository.existsByNameAndIdNot(linkParam.getName(), id);
+ if (exist) {
+ throw new AlreadyExistsException("友情链接 " + linkParam.getName() + " 已存在").setErrorData(linkParam.getName());
+ }
+
+ // Check the url
+ exist = linkRepository.existsByUrlAndIdNot(linkParam.getUrl(), id);
+ if (exist) {
+ throw new AlreadyExistsException("友情链接 " + linkParam.getUrl() + " 已存在").setErrorData(linkParam.getUrl());
+ }
+
+ Link link = getById(id);
+ linkParam.update(link);
+
+ return update(link);
+ }
+
@Override
public boolean existByName(String name) {
Assert.hasText(name, "Link name must not be blank");
@@ -113,6 +143,15 @@ public class LinkServiceImpl extends AbstractCrudService implemen
return linkRepository.exists(Example.of(link));
}
+ @Override
+ public boolean existByUrl(String url) {
+ Assert.hasText(url, "Link url must not be blank");
+ Link link = new Link();
+ link.setUrl(url);
+
+ return linkRepository.exists(Example.of(link));
+ }
+
@Override
public List listAllTeams() {
return linkRepository.findAllTeams();