diff --git a/src/main/java/cc/ryanc/halo/model/entity/Menu.java b/src/main/java/cc/ryanc/halo/model/entity/Menu.java index 5ca6b760d..a7bcaa54a 100644 --- a/src/main/java/cc/ryanc/halo/model/entity/Menu.java +++ b/src/main/java/cc/ryanc/halo/model/entity/Menu.java @@ -31,13 +31,13 @@ public class Menu extends BaseEntity { /** * Menu name. */ - @Column(name = "name", columnDefinition = "varchar(255) not null") + @Column(name = "name", columnDefinition = "varchar(50) not null") private String name; /** * Menu access url. */ - @Column(name = "url", columnDefinition = "varchar(255) not null") + @Column(name = "url", columnDefinition = "varchar(1023) not null") private String url; /** diff --git a/src/main/java/cc/ryanc/halo/model/params/MenuParam.java b/src/main/java/cc/ryanc/halo/model/params/MenuParam.java new file mode 100644 index 000000000..0504e69e1 --- /dev/null +++ b/src/main/java/cc/ryanc/halo/model/params/MenuParam.java @@ -0,0 +1,40 @@ +package cc.ryanc.halo.model.params; + +import cc.ryanc.halo.model.dto.base.InputConverter; +import cc.ryanc.halo.model.entity.Menu; +import lombok.Data; +import lombok.ToString; +import org.hibernate.validator.constraints.URL; + +import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; + +/** + * Menu param. + * + * @author johnniang + * @date 4/3/19 + */ +@Data +@ToString +public class MenuParam implements InputConverter { + + @NotBlank(message = "Menu name must not be blank") + @Size(max = 50, message = "Length of menu name must not be more than {max}") + private String name; + + @NotBlank(message = "Menu url must not be blank") + @Size(max = 1023, message = "Length of menu url must not be more than {max}") + @URL(message = "Menu url has incorrect url format") + private String url; + + @Min(value = 0, message = "Menu sort must not be less than {value}") + private Integer sort; + + @Size(max = 50, message = "Length of menu target must not be more than {max}") + private String target; + + @Size(max = 50, message = "Length of menu icon must not be more than {max}") + private String icon; +} diff --git a/src/main/java/cc/ryanc/halo/repository/MenuRepository.java b/src/main/java/cc/ryanc/halo/repository/MenuRepository.java index a07e221a4..716f508d1 100644 --- a/src/main/java/cc/ryanc/halo/repository/MenuRepository.java +++ b/src/main/java/cc/ryanc/halo/repository/MenuRepository.java @@ -2,6 +2,7 @@ package cc.ryanc.halo.repository; import cc.ryanc.halo.model.entity.Menu; import cc.ryanc.halo.repository.base.BaseRepository; +import org.springframework.lang.NonNull; /** * Menu repository. @@ -9,4 +10,12 @@ import cc.ryanc.halo.repository.base.BaseRepository; * @author johnniang */ public interface MenuRepository extends BaseRepository { + + /** + * Exists by menu name. + * + * @param name must not be blank + * @return true if exists; false otherwise + */ + boolean existsByName(@NonNull String name); } diff --git a/src/main/java/cc/ryanc/halo/service/MenuService.java b/src/main/java/cc/ryanc/halo/service/MenuService.java index a8846f05e..24e171e18 100644 --- a/src/main/java/cc/ryanc/halo/service/MenuService.java +++ b/src/main/java/cc/ryanc/halo/service/MenuService.java @@ -2,6 +2,7 @@ package cc.ryanc.halo.service; import cc.ryanc.halo.model.dto.MenuOutputDTO; import cc.ryanc.halo.model.entity.Menu; +import cc.ryanc.halo.model.params.MenuParam; import cc.ryanc.halo.service.base.CrudService; import org.springframework.data.domain.Sort; import org.springframework.lang.NonNull; @@ -23,4 +24,13 @@ public interface MenuService extends CrudService { */ @NonNull List listDtos(@NonNull Sort sort); + + /** + * Creates a menu. + * + * @param menuParam must not be null + * @return created menu + */ + @NonNull + Menu createBy(@NonNull MenuParam menuParam); } diff --git a/src/main/java/cc/ryanc/halo/service/impl/MenuServiceImpl.java b/src/main/java/cc/ryanc/halo/service/impl/MenuServiceImpl.java index 76f60ffb0..b5f3b46a6 100644 --- a/src/main/java/cc/ryanc/halo/service/impl/MenuServiceImpl.java +++ b/src/main/java/cc/ryanc/halo/service/impl/MenuServiceImpl.java @@ -1,7 +1,9 @@ package cc.ryanc.halo.service.impl; +import cc.ryanc.halo.exception.AlreadyExistsException; import cc.ryanc.halo.model.dto.MenuOutputDTO; import cc.ryanc.halo.model.entity.Menu; +import cc.ryanc.halo.model.params.MenuParam; import cc.ryanc.halo.repository.MenuRepository; import cc.ryanc.halo.service.MenuService; import cc.ryanc.halo.service.base.AbstractCrudService; @@ -37,6 +39,22 @@ public class MenuServiceImpl extends AbstractCrudService implemen return convertTo(listAll(sort)); } + @Override + public Menu createBy(MenuParam menuParam) { + Assert.notNull(menuParam, "Menu param must not be null"); + + // Check the name + boolean exists = menuRepository.existsByName(menuParam.getName()); + + if (exists) { + throw new AlreadyExistsException("The menu name " + menuParam.getName() + " has already existed").setErrorData(menuParam.getName()); + } + + // Create an return + return create(menuParam.convertTo()); + } + + private List convertTo(List menus) { if (CollectionUtils.isEmpty(menus)) { return Collections.emptyList(); diff --git a/src/main/java/cc/ryanc/halo/web/controller/admin/api/MenuController.java b/src/main/java/cc/ryanc/halo/web/controller/admin/api/MenuController.java index 2ea02a502..4e00d16a1 100644 --- a/src/main/java/cc/ryanc/halo/web/controller/admin/api/MenuController.java +++ b/src/main/java/cc/ryanc/halo/web/controller/admin/api/MenuController.java @@ -1,8 +1,18 @@ package cc.ryanc.halo.web.controller.admin.api; +import cc.ryanc.halo.model.dto.MenuOutputDTO; +import cc.ryanc.halo.model.entity.Menu; +import cc.ryanc.halo.model.params.MenuParam; import cc.ryanc.halo.service.MenuService; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +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; + +import static org.springframework.data.domain.Sort.Direction.DESC; /** * Menu controller. @@ -20,4 +30,15 @@ public class MenuController { this.menuService = menuService; } + @GetMapping + @ApiOperation("Lists all menus") + public List listAll(@SortDefault(sort = "sort", direction = DESC) Sort sort) { + return menuService.listDtos(sort); + } + + @PostMapping + @ApiOperation("Creates a menu") + public MenuOutputDTO createBy(@RequestBody @Valid MenuParam menuParam) { + return new MenuOutputDTO().convertFrom(menuService.createBy(menuParam)); + } }