Skip to content

Commit

Permalink
perf($DDD): decouple and aggregate permission
Browse files Browse the repository at this point in the history
  • Loading branch information
johnnymillergh committed Feb 18, 2022
1 parent 6ef3fd2 commit 87845e7
Show file tree
Hide file tree
Showing 9 changed files with 173 additions and 112 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
/*
* Copyright By ZATI
* Copyright By 3a3c88295d37870dfd3b25056092d1a9209824b256c341f2cdc296437f671617
* All rights reserved.
*
* If you are not the intended user, you are hereby notified that any use, disclosure, copying, printing, forwarding or
* dissemination of this property is strictly prohibited. If you have got this file in error, delete it from your
* system.
*/
package com.jmsoftware.maf.authcenter.permission.service;

import com.jmsoftware.maf.authcenter.permission.response.GetServicesInfoResponse;
import com.jmsoftware.maf.common.domain.authcenter.permission.GetPermissionListByRoleIdListPayload;
import com.jmsoftware.maf.common.domain.authcenter.permission.GetPermissionListByRoleIdListResponse;
import com.jmsoftware.maf.common.exception.BizException;
import org.springframework.validation.annotation.Validated;

import javax.validation.Valid;
import javax.validation.constraints.NotNull;

/**
* Description: PermissionServiceImpl, change description here.
*
* @author Johnny Miller (鍾俊), e-mail: johnnysviva@outlook.com, date: 2/18/2022 11:22 PM
**/
@Validated
public interface PermissionService {
/**
* Gets permission list by role id list.
*
* @param payload the payload
* @return the permission list by role id list
*/
GetPermissionListByRoleIdListResponse getPermissionListByRoleIdList(@Valid @NotNull GetPermissionListByRoleIdListPayload payload);

/**
* Gets services info.
*
* @return the services info
* @throws BizException the business exception
*/
GetServicesInfoResponse getServicesInfo() throws BizException;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
/*
* Copyright By ZATI
* Copyright By 3a3c88295d37870dfd3b25056092d1a9209824b256c341f2cdc296437f671617
* All rights reserved.
*
* If you are not the intended user, you are hereby notified that any use, disclosure, copying, printing, forwarding or
* dissemination of this property is strictly prohibited. If you have got this file in error, delete it from your
* system.
*/
package com.jmsoftware.maf.authcenter.permission.service.impl;

import cn.hutool.core.collection.CollUtil;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.jmsoftware.maf.authcenter.permission.configuration.PermissionConfiguration;
import com.jmsoftware.maf.authcenter.permission.converter.PermissionMapStructMapper;
import com.jmsoftware.maf.authcenter.permission.response.GetServicesInfoResponse;
import com.jmsoftware.maf.authcenter.permission.service.PermissionDomainService;
import com.jmsoftware.maf.authcenter.permission.service.PermissionService;
import com.jmsoftware.maf.authcenter.role.service.RoleDomainService;
import com.jmsoftware.maf.common.bean.ResponseBodyBean;
import com.jmsoftware.maf.common.domain.authcenter.permission.GetPermissionListByRoleIdListPayload;
import com.jmsoftware.maf.common.domain.authcenter.permission.GetPermissionListByRoleIdListResponse;
import com.jmsoftware.maf.common.domain.authcenter.permission.PermissionType;
import com.jmsoftware.maf.common.domain.springbootstarter.HttpApiResourcesResponse;
import com.jmsoftware.maf.common.exception.BizException;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import lombok.val;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.util.Optional;
import java.util.stream.Collectors;

/**
* Description: PermissionServiceImpl, change description here.
*
* @author Johnny Miller (鍾俊), e-mail: johnnysviva@outlook.com, date: 2/18/2022 11:37 PM
**/
@Slf4j
@Service
@RequiredArgsConstructor
public class PermissionServiceImpl implements PermissionService {
private final PermissionDomainService permissionDomainService;
private final RoleDomainService roleDomainService;
private final DiscoveryClient discoveryClient;
private final RestTemplate restTemplate;
private final PermissionConfiguration permissionConfiguration;

@Override
public GetPermissionListByRoleIdListResponse getPermissionListByRoleIdList(
@Valid @NotNull GetPermissionListByRoleIdListPayload payload
) {
val adminRole = this.roleDomainService.checkAdmin(payload.getRoleIdList());
val response = new GetPermissionListByRoleIdListResponse();
if (adminRole) {
log.warn("Admin role checked. The role can access any resources");
val permission = new GetPermissionListByRoleIdListResponse.Permission();
permission.setUrl("/**");
permission.setType(PermissionType.BUTTON.getType());
permission.setPermissionExpression("admin-permission");
permission.setMethod("*");
response.getPermissionList().add(permission);
return response;
}
val permissionList =
this.permissionDomainService.getPermissionListByRoleIdList(
payload.getRoleIdList(), payload.getPermissionTypeList());
response.setPermissionList(
permissionList
.stream()
.map(PermissionMapStructMapper.INSTANCE::of)
.collect(Collectors.toList())
);
return response;
}

@Override
public GetServicesInfoResponse getServicesInfo() throws BizException {
val serviceIdList = this.discoveryClient.getServices();
log.info("Getting service info from Service ID list: {}", serviceIdList);
val response = new GetServicesInfoResponse();
val mapper = new ObjectMapper();
log.info("Ignored service ID: {}", this.permissionConfiguration.getIgnoredServiceIds());
for (String serviceId : serviceIdList) {
if (CollUtil.contains(this.permissionConfiguration.getIgnoredServiceIds(), serviceId)) {
log.warn("Ignored service ID: {}", serviceId);
continue;
}
ResponseBodyBean<?> responseBodyBean = Optional.ofNullable(this.restTemplate.getForObject(
String.format("http://%s/http-api-resources", serviceId), ResponseBodyBean.class))
.orElseThrow(() -> new BizException("Internal service mustn't respond null"));
val data = Optional.of(responseBodyBean.getData())
.orElseThrow(() -> new BizException("HttpApiResourcesResponse mustn't be null"));
val httpApiResourcesResponse = mapper.convertValue(data, HttpApiResourcesResponse.class);
val serviceInfo = new GetServicesInfoResponse.ServiceInfo();
serviceInfo.setServiceId(serviceId);
serviceInfo.setHttpApiResources(httpApiResourcesResponse);
response.getList().add(serviceInfo);
}
if (CollUtil.isEmpty(response.getList())) {
log.warn("Got am empty ServiceInfo list");
}
return response;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
package com.jmsoftware.maf.authcenter.permission.service;
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,9 @@

import com.baomidou.mybatisplus.extension.service.IService;
import com.jmsoftware.maf.authcenter.permission.persistence.Permission;
import com.jmsoftware.maf.authcenter.permission.response.GetServicesInfoResponse;
import com.jmsoftware.maf.common.domain.authcenter.permission.GetPermissionListByRoleIdListPayload;
import com.jmsoftware.maf.common.domain.authcenter.permission.GetPermissionListByRoleIdListResponse;
import com.jmsoftware.maf.common.domain.authcenter.permission.PermissionType;
import com.jmsoftware.maf.common.exception.BizException;
import org.springframework.validation.annotation.Validated;

import javax.validation.Valid;
import javax.validation.constraints.NotEmpty;
import java.util.List;

Expand All @@ -23,29 +18,15 @@
*/
@Validated
public interface PermissionDomainService extends IService<Permission> {
/**
* Gets permission list by role id list.
*
* @param payload the payload
* @return the permission list by role id list
*/
GetPermissionListByRoleIdListResponse getPermissionListByRoleIdList(@Valid GetPermissionListByRoleIdListPayload payload);

/**
* Gets permission list by role id list.
*
* @param roleIdList the role id list
* @param permissionTypeList the permission type list
* @return the permission list by role id list
*/
List<Permission> getPermissionListByRoleIdList(@NotEmpty List<Long> roleIdList,
@NotEmpty List<PermissionType> permissionTypeList);

/**
* Gets services info.
*
* @return the services info
* @throws BizException the business exception
*/
GetServicesInfoResponse getServicesInfo() throws BizException;
List<Permission> getPermissionListByRoleIdList(
@NotEmpty List<Long> roleIdList,
@NotEmpty List<PermissionType> permissionTypeList
);
}
Original file line number Diff line number Diff line change
@@ -1,110 +1,35 @@
package com.jmsoftware.maf.authcenter.permission.service.impl;

import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.jmsoftware.maf.authcenter.permission.configuration.PermissionConfiguration;
import com.jmsoftware.maf.authcenter.permission.converter.PermissionMapStructMapper;
import com.jmsoftware.maf.authcenter.permission.mapper.PermissionMapper;
import com.jmsoftware.maf.authcenter.permission.persistence.Permission;
import com.jmsoftware.maf.authcenter.permission.response.GetServicesInfoResponse;
import com.jmsoftware.maf.authcenter.permission.service.PermissionDomainService;
import com.jmsoftware.maf.authcenter.role.service.RoleDomainService;
import com.jmsoftware.maf.common.bean.ResponseBodyBean;
import com.jmsoftware.maf.common.domain.authcenter.permission.GetPermissionListByRoleIdListPayload;
import com.jmsoftware.maf.common.domain.authcenter.permission.GetPermissionListByRoleIdListResponse;
import com.jmsoftware.maf.common.domain.authcenter.permission.PermissionType;
import com.jmsoftware.maf.common.domain.springbootstarter.HttpApiResourcesResponse;
import com.jmsoftware.maf.common.exception.BizException;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import lombok.val;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import javax.validation.Valid;
import javax.validation.constraints.NotEmpty;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

/**
* <h1>PermissionDomainServiceImpl</h1>
* <p>
* Service implementation of Permission.(Permission)
*
* @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com
* @date 5/11/20 8:34 AM
* @author Johnny Miller (锺俊), e-mail: johnnysviva@outlook.com, date: 5/11/20 8:34 AM
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class PermissionDomainServiceImpl
extends ServiceImpl<PermissionMapper, Permission>
implements PermissionDomainService {
private final RoleDomainService roleDomainService;
private final DiscoveryClient discoveryClient;
private final RestTemplate restTemplate;
private final PermissionConfiguration permissionConfiguration;

@Override
public GetPermissionListByRoleIdListResponse getPermissionListByRoleIdList(@Valid GetPermissionListByRoleIdListPayload payload) {
val adminRole = this.roleDomainService.checkAdmin(payload.getRoleIdList());
val response = new GetPermissionListByRoleIdListResponse();
if (adminRole) {
log.warn("Admin role checked. The role can access any resources");
val permission = new GetPermissionListByRoleIdListResponse.Permission();
permission.setUrl("/**");
permission.setType(PermissionType.BUTTON.getType());
permission.setPermissionExpression("admin-permission");
permission.setMethod("*");
response.getPermissionList().add(permission);
return response;
}
val permissionList =
this.getPermissionListByRoleIdList(payload.getRoleIdList(), payload.getPermissionTypeList());
response.setPermissionList(
permissionList
.stream()
.map(PermissionMapStructMapper.INSTANCE::of)
.collect(Collectors.toList())
);
return response;
}

@Override
public List<Permission> getPermissionListByRoleIdList(@NotEmpty List<Long> roleIdList,
@NotEmpty List<PermissionType> permissionTypeList) {
public List<Permission> getPermissionListByRoleIdList(
@NotEmpty List<Long> roleIdList,
@NotEmpty List<PermissionType> permissionTypeList
) {
return this.getBaseMapper().selectPermissionListByRoleIdList(roleIdList, permissionTypeList);
}

@Override
public GetServicesInfoResponse getServicesInfo() throws BizException {
val serviceIdList = this.discoveryClient.getServices();
log.info("Getting service info from Service ID list: {}", serviceIdList);
val response = new GetServicesInfoResponse();
val mapper = new ObjectMapper();
log.info("Ignored service ID: {}", this.permissionConfiguration.getIgnoredServiceIds());
for (String serviceId : serviceIdList) {
if (CollUtil.contains(this.permissionConfiguration.getIgnoredServiceIds(), serviceId)) {
log.warn("Ignored service ID: {}", serviceId);
continue;
}
ResponseBodyBean<?> responseBodyBean = Optional.ofNullable(this.restTemplate.getForObject(
String.format("http://%s/http-api-resources", serviceId), ResponseBodyBean.class))
.orElseThrow(() -> new BizException("Internal service mustn't respond null"));
val data = Optional.of(responseBodyBean.getData())
.orElseThrow(() -> new BizException("HttpApiResourcesResponse mustn't be null"));
val httpApiResourcesResponse = mapper.convertValue(data, HttpApiResourcesResponse.class);
val serviceInfo = new GetServicesInfoResponse.ServiceInfo();
serviceInfo.setServiceId(serviceId);
serviceInfo.setHttpApiResources(httpApiResourcesResponse);
response.getList().add(serviceInfo);
}
if (CollUtil.isEmpty(response.getList())) {
log.warn("Got am empty ServiceInfo list");
}
return response;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
/**
* Description: OssCenterFeignService, change description here.
*
* @author 钟俊 (za-zhongjun), email: jun.zhong@zatech.com, date: 2/5/2022 7:46 PM
* @author Johnny Miller (鍾俊), e-mail: johnnysviva@outlook.com, date: 2/5/2022 7:46 PM
**/
@Validated
public interface OssCenterFeignService {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
/**
* Description: OssCenterFeignServiceImpl, change description here.
*
* @author 钟俊 (za-zhongjun), email: jun.zhong@zatech.com, date: 2/5/2022 7:47 PM
* @author Johnny Miller (鍾俊), e-mail: johnnysviva@outlook.com, date: 2/5/2022 7:47 PM
**/
@Slf4j
@Service
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.jmsoftware.maf.authcenter.permission;

import com.jmsoftware.maf.authcenter.permission.response.GetServicesInfoResponse;
import com.jmsoftware.maf.authcenter.permission.service.PermissionDomainService;
import com.jmsoftware.maf.authcenter.permission.service.PermissionService;
import com.jmsoftware.maf.common.bean.ResponseBodyBean;
import com.jmsoftware.maf.common.exception.BizException;
import lombok.RequiredArgsConstructor;
Expand All @@ -21,7 +21,7 @@
@RestController
@RequiredArgsConstructor
public class PermissionController {
private final PermissionDomainService permissionDomainService;
private final PermissionService permissionService;

/**
* Services info response body bean.
Expand All @@ -33,6 +33,6 @@ public class PermissionController {
*/
@GetMapping("/permissions/services-info")
public ResponseBodyBean<GetServicesInfoResponse> getServicesInfo() throws BizException {
return ResponseBodyBean.ofSuccess(this.permissionDomainService.getServicesInfo());
return ResponseBodyBean.ofSuccess(this.permissionService.getServicesInfo());
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.jmsoftware.maf.authcenter.permission;

import com.jmsoftware.maf.authcenter.permission.service.PermissionDomainService;
import com.jmsoftware.maf.authcenter.permission.service.PermissionService;
import com.jmsoftware.maf.common.bean.ResponseBodyBean;
import com.jmsoftware.maf.common.domain.authcenter.permission.GetPermissionListByRoleIdListPayload;
import com.jmsoftware.maf.common.domain.authcenter.permission.GetPermissionListByRoleIdListResponse;
Expand All @@ -23,10 +23,12 @@
@RequiredArgsConstructor
@RequestMapping("/permission-remote-api")
public class PermissionRemoteApiController {
private final PermissionDomainService permissionDomainService;
private final PermissionService permissionService;

@GetMapping("/permissions")
public ResponseBodyBean<GetPermissionListByRoleIdListResponse> getPermissionListByRoleIdList(@Valid GetPermissionListByRoleIdListPayload payload) {
return ResponseBodyBean.ofSuccess(this.permissionDomainService.getPermissionListByRoleIdList(payload));
public ResponseBodyBean<GetPermissionListByRoleIdListResponse> getPermissionListByRoleIdList(
@Valid GetPermissionListByRoleIdListPayload payload
) {
return ResponseBodyBean.ofSuccess(this.permissionService.getPermissionListByRoleIdList(payload));
}
}

0 comments on commit 87845e7

Please sign in to comment.