diff --git a/src/main/java/com/onixbyte/helix/controller/AuthorityController.java b/src/main/java/com/onixbyte/helix/controller/AuthorityController.java index 5363712..bfefede 100644 --- a/src/main/java/com/onixbyte/helix/controller/AuthorityController.java +++ b/src/main/java/com/onixbyte/helix/controller/AuthorityController.java @@ -4,6 +4,7 @@ import com.onixbyte.helix.domain.entity.Authority; import com.onixbyte.helix.domain.web.request.AddAuthorityRequest; import com.onixbyte.helix.domain.web.request.EditAuthorityRequest; import com.onixbyte.helix.domain.web.request.QueryAuthorityRequest; +import com.onixbyte.helix.domain.web.response.ActionResponse; import com.onixbyte.helix.service.AuthorityService; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; @@ -65,4 +66,10 @@ public class AuthorityController { public Authority editAuthority(@Validated @RequestBody EditAuthorityRequest request) { return authorityService.editAuthority(request); } + + @DeleteMapping("/{authorityId:\\d+}") + public ActionResponse deleteAuthority(@PathVariable Long authorityId) { + var name = authorityService.deleteAuthority(authorityId); + return ActionResponse.success("Authority [%s] deleted.".formatted(name)); + } } diff --git a/src/main/java/com/onixbyte/helix/manager/AuthorityManager.java b/src/main/java/com/onixbyte/helix/manager/AuthorityManager.java index b064e86..e52cd8a 100644 --- a/src/main/java/com/onixbyte/helix/manager/AuthorityManager.java +++ b/src/main/java/com/onixbyte/helix/manager/AuthorityManager.java @@ -72,4 +72,12 @@ public class AuthorityManager { return authority; } + + public String findAuthorityNameById(Long authorityId) { + return authorityRepository.findAuthorityNameById(authorityId); + } + + public void deleteById(Long authorityId) { + authorityRepository.deleteById(authorityId); + } } diff --git a/src/main/java/com/onixbyte/helix/manager/RoleAuthorityManager.java b/src/main/java/com/onixbyte/helix/manager/RoleAuthorityManager.java index 684698d..d29e80f 100644 --- a/src/main/java/com/onixbyte/helix/manager/RoleAuthorityManager.java +++ b/src/main/java/com/onixbyte/helix/manager/RoleAuthorityManager.java @@ -1,5 +1,6 @@ package com.onixbyte.helix.manager; +import com.onixbyte.helix.mapper.RoleAuthorityMapper; import com.onixbyte.helix.repository.RoleAuthorityRepository; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -10,13 +11,21 @@ public class RoleAuthorityManager { private static final Logger log = LoggerFactory.getLogger(RoleAuthorityManager.class); private final RoleAuthorityRepository roleAuthorityRepository; + private final RoleAuthorityMapper roleAuthorityMapper; - public RoleAuthorityManager(RoleAuthorityRepository roleAuthorityRepository) { + public RoleAuthorityManager(RoleAuthorityRepository roleAuthorityRepository, RoleAuthorityMapper roleAuthorityMapper) { this.roleAuthorityRepository = roleAuthorityRepository; + this.roleAuthorityMapper = roleAuthorityMapper; } public void deleteByRoleId(Long roleId) { - var affectedRows = roleAuthorityRepository.deleteByRoleId(roleId); - log.info("角色 {} 关联的权限绑定已全部移除(共 {} 条)", roleId, affectedRows); + var affectedRows = roleAuthorityMapper.deleteByRoleId(roleId); + log.info("A total of {} authorities linked to Role ID: {} have been successfully cleared.", + affectedRows, roleId); + } + + public void deleteByAuthorityId(Long authorityId) { + var affectedRows = roleAuthorityMapper.deleteByAuthorityId(authorityId); + log.info("The binding between {} authorities and the role has been cleared.", affectedRows); } } diff --git a/src/main/java/com/onixbyte/helix/mapper/RoleAuthorityMapper.java b/src/main/java/com/onixbyte/helix/mapper/RoleAuthorityMapper.java index 72bf389..86daeca 100644 --- a/src/main/java/com/onixbyte/helix/mapper/RoleAuthorityMapper.java +++ b/src/main/java/com/onixbyte/helix/mapper/RoleAuthorityMapper.java @@ -7,4 +7,6 @@ import org.apache.ibatis.annotations.Param; public interface RoleAuthorityMapper { int deleteByRoleId(@Param("roleId") Long roleId); + + int deleteByAuthorityId(@Param("authorityId") Long authorityId); } diff --git a/src/main/java/com/onixbyte/helix/repository/AuthorityRepository.java b/src/main/java/com/onixbyte/helix/repository/AuthorityRepository.java index 96800c2..ce52bb9 100644 --- a/src/main/java/com/onixbyte/helix/repository/AuthorityRepository.java +++ b/src/main/java/com/onixbyte/helix/repository/AuthorityRepository.java @@ -2,8 +2,17 @@ package com.onixbyte.helix.repository; import com.onixbyte.helix.domain.entity.Authority; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @Repository public interface AuthorityRepository extends JpaRepository { + + @Query(""" + select a.name + from Authority a + where a.id = :authorityId + """) + String findAuthorityNameById(Long authorityId); } diff --git a/src/main/java/com/onixbyte/helix/service/AuthorityService.java b/src/main/java/com/onixbyte/helix/service/AuthorityService.java index d8d1bdb..551582f 100644 --- a/src/main/java/com/onixbyte/helix/service/AuthorityService.java +++ b/src/main/java/com/onixbyte/helix/service/AuthorityService.java @@ -8,10 +8,13 @@ import com.onixbyte.helix.domain.web.request.QueryAuthorityRequest; import com.onixbyte.helix.enumeration.Status; import com.onixbyte.helix.exception.BizException; import com.onixbyte.helix.manager.AuthorityManager; +import com.onixbyte.helix.manager.RoleAuthorityManager; +import org.apache.commons.lang3.StringUtils; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.Optional; @@ -19,9 +22,11 @@ import java.util.Optional; public class AuthorityService { private final AuthorityManager authorityManager; + private final RoleAuthorityManager roleAuthorityManager; - public AuthorityService(AuthorityManager authorityManager) { + public AuthorityService(AuthorityManager authorityManager, RoleAuthorityManager roleAuthorityManager) { this.authorityManager = authorityManager; + this.roleAuthorityManager = roleAuthorityManager; } public Page getAuthorities(Pageable pageable, QueryAuthorityRequest request) { @@ -50,4 +55,18 @@ public class AuthorityService { public Authority editAuthority(EditAuthorityRequest request) { return authorityManager.update(request); } + + @Transactional(rollbackFor = Throwable.class) + public String deleteAuthority(Long authorityId) { + var authorityName = authorityManager.findAuthorityNameById(authorityId); + + if (StringUtils.isBlank(authorityName)) { + throw new BizException(HttpStatus.NOT_FOUND, "Authority with ID '%d' not found.".formatted(authorityId)); + } + + roleAuthorityManager.deleteByAuthorityId(authorityId); + authorityManager.deleteById(authorityId); + + return authorityName; + } } diff --git a/src/main/resources/mapper/AuthorityMapper.xml b/src/main/resources/mapper/AuthorityMapper.xml index 8b64eaf..02b9e72 100644 --- a/src/main/resources/mapper/AuthorityMapper.xml +++ b/src/main/resources/mapper/AuthorityMapper.xml @@ -2,7 +2,7 @@ - SELECT DISTINCT a.id, a.code, a.name, a.description, a.status, a.created_at, a.updated_at FROM authority a JOIN role_authority ra ON a.id = ra.authority_id diff --git a/src/main/resources/mapper/RoleAuthorityMapper.xml b/src/main/resources/mapper/RoleAuthorityMapper.xml index 9885de6..e4776a1 100644 --- a/src/main/resources/mapper/RoleAuthorityMapper.xml +++ b/src/main/resources/mapper/RoleAuthorityMapper.xml @@ -7,4 +7,10 @@ FROM role_authority WHERE role_id = #{roleId} + + + DELETE + FROM role_authority + WHERE authority_id = #{authorityId} + \ No newline at end of file diff --git a/src/main/resources/mapper/RoleMapper.xml b/src/main/resources/mapper/RoleMapper.xml index 4f14892..dd17648 100644 --- a/src/main/resources/mapper/RoleMapper.xml +++ b/src/main/resources/mapper/RoleMapper.xml @@ -52,7 +52,7 @@ - SELECT COUNT(*) FROM role