Commit a385a37c4af29eaea3d12a4310a4dae398f0b415

Authored by puhui999
1 parent c6422dc6

完善 CRM-客户 数据权限校验2

Showing 10 changed files with 81 additions and 68 deletions
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/permission/CrmPermissionConvert.java
1 1 package cn.iocoder.yudao.module.crm.convert.permission;
2 2  
3 3 import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO;
4   -import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateBO;
5   -import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionUpdateBO;
  4 +import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO;
  5 +import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionUpdateReqBO;
6 6 import org.mapstruct.Mapper;
7 7 import org.mapstruct.factory.Mappers;
8 8  
... ... @@ -16,8 +16,8 @@ public interface CrmPermissionConvert {
16 16  
17 17 CrmPermissionConvert INSTANCE = Mappers.getMapper(CrmPermissionConvert.class);
18 18  
19   - CrmPermissionDO convert(CrmPermissionCreateBO createBO);
  19 + CrmPermissionDO convert(CrmPermissionCreateReqBO createBO);
20 20  
21   - CrmPermissionDO convert(CrmPermissionUpdateBO updateBO);
  21 + CrmPermissionDO convert(CrmPermissionUpdateReqBO updateBO);
22 22  
23 23 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/core/aop/CrmPermissionAspect.java
... ... @@ -81,7 +81,7 @@ public class CrmPermissionAspect {
81 81 }
82 82 if (isRead(permissionLevel)) { // 读权限
83 83 // 如果没有数据权限或没有负责人则表示此记录为公海数据所有人都有只读权限
84   - if (CollUtil.isEmpty(bizPermissions) || !CollUtil.anyMatch(bizPermissions, item -> isOwner(item.getPermissionLevel()))) {
  84 + if (!CollUtil.anyMatch(bizPermissions, item -> isOwner(item.getPermissionLevel()))) {
85 85 return;
86 86 }
87 87 if (isRead(userPermission.getPermissionLevel())) { // 校验当前用户是否有读权限
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImpl.java
... ... @@ -11,7 +11,7 @@ import cn.iocoder.yudao.module.crm.framework.core.annotations.CrmPermission;
11 11 import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum;
12 12 import cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum;
13 13 import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService;
14   -import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateBO;
  14 +import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO;
15 15 import org.springframework.stereotype.Service;
16 16 import org.springframework.transaction.annotation.Transactional;
17 17 import org.springframework.validation.annotation.Validated;
... ... @@ -46,8 +46,8 @@ public class CrmBusinessServiceImpl implements CrmBusinessService {
46 46 businessMapper.insert(business);
47 47  
48 48 // 创建数据权限
49   - crmPermissionService.createCrmPermission(new CrmPermissionCreateBO().setCrmType(CrmBizTypeEnum.CRM_BUSINESS.getType())
50   - .setCrmDataId(business.getId()).setOwnerUserId(userId)); // 设置当前操作的人为负责人
  49 + crmPermissionService.createPermission(new CrmPermissionCreateReqBO().setBizType(CrmBizTypeEnum.CRM_BUSINESS.getType())
  50 + .setBizId(business.getId()).setUserId(userId).setPermissionLevel(CrmPermissionLevelEnum.OWNER.getLevel())); // 设置当前操作的人为负责人
51 51  
52 52 // 返回
53 53 return business.getId();
... ... @@ -117,6 +117,7 @@ public class CrmBusinessServiceImpl implements CrmBusinessService {
117 117 crmPermissionService.transferCrmPermission(
118 118 CrmBusinessConvert.INSTANCE.convert(reqVO, userId).setBizType(CrmBizTypeEnum.CRM_BUSINESS.getType()));
119 119  
  120 + // 3. TODO 记录转移日志
120 121 }
121 122  
122 123 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contact/ContactServiceImpl.java
... ... @@ -11,7 +11,7 @@ import cn.iocoder.yudao.module.crm.framework.core.annotations.CrmPermission;
11 11 import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum;
12 12 import cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum;
13 13 import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService;
14   -import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateBO;
  14 +import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO;
15 15 import org.springframework.stereotype.Service;
16 16 import org.springframework.transaction.annotation.Transactional;
17 17 import org.springframework.validation.annotation.Validated;
... ... @@ -46,8 +46,8 @@ public class ContactServiceImpl implements ContactService {
46 46 contactMapper.insert(contact);
47 47  
48 48 // 创建数据权限
49   - crmPermissionService.createCrmPermission(new CrmPermissionCreateBO().setCrmType(CrmBizTypeEnum.CRM_BUSINESS.getType())
50   - .setCrmDataId(contact.getId()).setOwnerUserId(userId)); // 设置当前操作的人为负责人
  49 + crmPermissionService.createPermission(new CrmPermissionCreateReqBO().setBizType(CrmBizTypeEnum.CRM_CONTACTS.getType())
  50 + .setBizId(contact.getId()).setUserId(userId).setPermissionLevel(CrmPermissionLevelEnum.OWNER.getLevel())); // 设置当前操作的人为负责人
51 51  
52 52 // 返回
53 53 return contact.getId();
... ... @@ -55,7 +55,8 @@ public class ContactServiceImpl implements ContactService {
55 55  
56 56 @Override
57 57 @Transactional(rollbackFor = Exception.class)
58   - @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTACTS, permissionLevel = CrmPermissionLevelEnum.WRITE)
  58 + @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTACTS, getIdFor = ContactUpdateReqVO.class,
  59 + permissionLevel = CrmPermissionLevelEnum.WRITE)
59 60 public void updateContact(ContactUpdateReqVO updateReqVO) {
60 61 // 校验存在
61 62 validateContactExists(updateReqVO.getId());
... ... @@ -117,6 +118,7 @@ public class ContactServiceImpl implements ContactService {
117 118 crmPermissionService.transferCrmPermission(
118 119 ContactConvert.INSTANCE.convert(reqVO, userId).setBizType(CrmBizTypeEnum.CRM_CONTACTS.getType()));
119 120  
  121 + // 3. TODO 记录转移日志
120 122 }
121 123  
122 124 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/ContractServiceImpl.java
... ... @@ -11,7 +11,7 @@ import cn.iocoder.yudao.module.crm.framework.core.annotations.CrmPermission;
11 11 import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum;
12 12 import cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum;
13 13 import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService;
14   -import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateBO;
  14 +import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO;
15 15 import org.springframework.stereotype.Service;
16 16 import org.springframework.transaction.annotation.Transactional;
17 17 import org.springframework.validation.annotation.Validated;
... ... @@ -45,8 +45,8 @@ public class ContractServiceImpl implements ContractService {
45 45 contractMapper.insert(contract);
46 46  
47 47 // 创建数据权限
48   - crmPermissionService.createCrmPermission(new CrmPermissionCreateBO().setCrmType(CrmBizTypeEnum.CRM_CONTRACT.getType())
49   - .setCrmDataId(contract.getId()).setOwnerUserId(userId)); // 设置当前操作的人为负责人
  48 + crmPermissionService.createPermission(new CrmPermissionCreateReqBO().setBizType(CrmBizTypeEnum.CRM_CONTRACT.getType())
  49 + .setBizId(contract.getId()).setUserId(userId).setPermissionLevel(CrmPermissionLevelEnum.OWNER.getLevel())); // 设置当前操作的人为负责人
50 50  
51 51 // 返回
52 52 return contract.getId();
... ... @@ -54,7 +54,8 @@ public class ContractServiceImpl implements ContractService {
54 54  
55 55 @Override
56 56 @Transactional(rollbackFor = Exception.class)
57   - @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTRACT, permissionLevel = CrmPermissionLevelEnum.WRITE)
  57 + @CrmPermission(bizType = CrmBizTypeEnum.CRM_CONTRACT, getIdFor = ContractUpdateReqVO.class,
  58 + permissionLevel = CrmPermissionLevelEnum.WRITE)
58 59 public void updateContract(ContractUpdateReqVO updateReqVO) {
59 60 // 校验存在
60 61 validateContractExists(updateReqVO.getId());
... ... @@ -115,6 +116,7 @@ public class ContractServiceImpl implements ContractService {
115 116 crmPermissionService.transferCrmPermission(
116 117 ContractConvert.INSTANCE.convert(reqVO, userId).setBizType(CrmBizTypeEnum.CRM_CONTRACT.getType()));
117 118  
  119 + // 3. TODO 记录转移日志
118 120 }
119 121  
120 122 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerServiceImpl.java
... ... @@ -11,7 +11,7 @@ import cn.iocoder.yudao.module.crm.framework.core.annotations.CrmPermission;
11 11 import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum;
12 12 import cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum;
13 13 import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService;
14   -import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateBO;
  14 +import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO;
15 15 import cn.iocoder.yudao.module.system.api.dept.DeptApi;
16 16 import org.springframework.stereotype.Service;
17 17 import org.springframework.transaction.annotation.Transactional;
... ... @@ -48,8 +48,8 @@ public class CrmCustomerServiceImpl implements CrmCustomerService {
48 48 customerMapper.insert(customer);
49 49  
50 50 // 创建数据权限
51   - crmPermissionService.createCrmPermission(new CrmPermissionCreateBO().setCrmType(CrmBizTypeEnum.CRM_CUSTOMER.getType())
52   - .setCrmDataId(customer.getId()).setOwnerUserId(userId)); // 设置当前操作的人为负责人
  51 + crmPermissionService.createPermission(new CrmPermissionCreateReqBO().setBizType(CrmBizTypeEnum.CRM_CUSTOMER.getType())
  52 + .setBizId(customer.getId()).setUserId(userId).setPermissionLevel(CrmPermissionLevelEnum.OWNER.getLevel())); // 设置当前操作的人为负责人
53 53  
54 54 // 返回
55 55 return customer.getId();
... ... @@ -57,7 +57,8 @@ public class CrmCustomerServiceImpl implements CrmCustomerService {
57 57  
58 58 @Override
59 59 @Transactional(rollbackFor = Exception.class)
60   - @CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, permissionLevel = CrmPermissionLevelEnum.WRITE)
  60 + @CrmPermission(bizType = CrmBizTypeEnum.CRM_CUSTOMER, getIdFor = CrmCustomerUpdateReqVO.class,
  61 + permissionLevel = CrmPermissionLevelEnum.WRITE)
61 62 public void updateCustomer(CrmCustomerUpdateReqVO updateReqVO) {
62 63 // 校验存在
63 64 validateCustomerExists(updateReqVO.getId());
... ... @@ -112,6 +113,7 @@ public class CrmCustomerServiceImpl implements CrmCustomerService {
112 113 }
113 114  
114 115 // TODO wanwan:service 接口已经注释,实现类就不需要了。
  116 +
115 117 /**
116 118 * 校验客户是否存在
117 119 *
... ... @@ -136,6 +138,8 @@ public class CrmCustomerServiceImpl implements CrmCustomerService {
136 138 // 2. 数据权限转移
137 139 crmPermissionService.transferCrmPermission(
138 140 CrmCustomerConvert.INSTANCE.convert(reqVO, userId).setBizType(CrmBizTypeEnum.CRM_CUSTOMER.getType()));
  141 +
  142 + // 3. TODO 记录转移日志
139 143 }
140 144  
141 145 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionService.java
... ... @@ -3,8 +3,8 @@ package cn.iocoder.yudao.module.crm.service.permission;
3 3  
4 4 import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO;
5 5 import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum;
6   -import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateBO;
7   -import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionUpdateBO;
  6 +import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO;
  7 +import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionUpdateReqBO;
8 8 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmTransferPermissionReqBO;
9 9  
10 10 import javax.validation.Valid;
... ... @@ -24,21 +24,21 @@ public interface CrmPermissionService {
24 24 * @param createBO 创建信息
25 25 * @return 编号
26 26 */
27   - Long createCrmPermission(@Valid CrmPermissionCreateBO createBO);
  27 + Long createPermission(@Valid CrmPermissionCreateReqBO createBO);
28 28  
29 29 /**
30 30 * 更新数据权限
31 31 *
32 32 * @param updateBO 更新信息
33 33 */
34   - void updateCrmPermission(@Valid CrmPermissionUpdateBO updateBO);
  34 + void updatePermission(@Valid CrmPermissionUpdateReqBO updateBO);
35 35  
36 36 /**
37 37 * 删除数据权限
38 38 *
39 39 * @param id 编号
40 40 */
41   - void deleteCrmPermission(Long id);
  41 + void deletePermission(Long id);
42 42  
43 43 /**
44 44 * 获取用户数据权限通过 数据类型 x 某个数据 x 用户编号
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java
... ... @@ -7,8 +7,8 @@ import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO;
7 7 import cn.iocoder.yudao.module.crm.dal.mysql.permission.CrmPermissionMapper;
8 8 import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum;
9 9 import cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum;
10   -import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateBO;
11   -import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionUpdateBO;
  10 +import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO;
  11 +import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionUpdateReqBO;
12 12 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmTransferPermissionReqBO;
13 13 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
14 14 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
... ... @@ -40,7 +40,7 @@ public class CrmPermissionServiceImpl implements CrmPermissionService {
40 40  
41 41 @Override
42 42 @Transactional(rollbackFor = Exception.class)
43   - public Long createCrmPermission(CrmPermissionCreateBO createBO) {
  43 + public Long createPermission(CrmPermissionCreateReqBO createBO) {
44 44 CrmPermissionDO permission = CrmPermissionConvert.INSTANCE.convert(createBO);
45 45 crmPermissionMapper.insert(permission);
46 46 return permission.getId();
... ... @@ -48,7 +48,7 @@ public class CrmPermissionServiceImpl implements CrmPermissionService {
48 48  
49 49 @Override
50 50 @Transactional(rollbackFor = Exception.class)
51   - public void updateCrmPermission(CrmPermissionUpdateBO updateBO) {
  51 + public void updatePermission(CrmPermissionUpdateReqBO updateBO) {
52 52 validateCrmPermissionExists(updateBO.getId());
53 53 // 更新操作
54 54 CrmPermissionDO updateDO = CrmPermissionConvert.INSTANCE.convert(updateBO);
... ... @@ -57,7 +57,7 @@ public class CrmPermissionServiceImpl implements CrmPermissionService {
57 57  
58 58 @Override
59 59 @Transactional(rollbackFor = Exception.class)
60   - public void deleteCrmPermission(Long id) {
  60 + public void deletePermission(Long id) {
61 61 validateCrmPermissionExists(id);
62 62 // 删除
63 63 crmPermissionMapper.deleteById(id);
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/bo/CrmPermissionCreateBO.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/bo/CrmPermissionCreateReqBO.java
1 1 package cn.iocoder.yudao.module.crm.service.permission.bo;
2 2  
  3 +import cn.iocoder.yudao.framework.common.validation.InEnum;
3 4 import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum;
  5 +import cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum;
4 6 import lombok.Data;
5 7  
6 8 import javax.validation.constraints.NotNull;
7   -import java.util.Set;
8 9  
9   -// TODO @puhui999:,一个是 Crm 前缀,一个 Req 表示入参
10 10 /**
11   - * crm 数据权限 Create BO
  11 + * crm 数据权限 Create Req BO
12 12 *
13 13 * @author HUIHUI
14 14 */
15 15 @Data
16   -public class CrmPermissionCreateBO {
  16 +public class CrmPermissionCreateReqBO {
17 17  
18   - // TODO @puhui999:如果是关联字段,换一行写它的注释;不然看着略乱哈
  18 + /**
  19 + * 当前登录用户编号
  20 + */
  21 + @NotNull(message = "用户编号不能为空")
  22 + private Long userId;
19 23  
20 24 /**
21   - * Crm 类型 关联 {@link CrmBizTypeEnum}
  25 + * Crm 类型
22 26 */
23 27 @NotNull(message = "Crm 类型不能为空")
24   - private Integer crmType;
  28 + @InEnum(CrmBizTypeEnum.class)
  29 + private Integer bizType;
  30 +
25 31 /**
26   - * 数据编号 关联 {@link CrmBizTypeEnum} 对应模块 DO#getId()
  32 + * 数据编号
27 33 */
28 34 @NotNull(message = "Crm 数据编号不能为空")
29   - private Long crmDataId;
  35 + private Long bizId;
30 36  
31 37 /**
32   - * 负责人的用户编号 关联 AdminUser#id, null 则为公海数据
33   - */
34   - private Long ownerUserId;
35   - /**
36   - * 只读权限的用户编号数组
37   - */
38   - private Set<Long> roUserIds;
39   - /**
40   - * 读写权限的用户编号数组
  38 + * 权限级别
  39 + * 关联 {@link CrmPermissionLevelEnum}
41 40 */
42   - private Set<Long> rwUserIds;
  41 + @NotNull(message = "权限级别不能为空")
  42 + @InEnum(CrmPermissionLevelEnum.class)
  43 + private Integer permissionLevel;
43 44  
44 45 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/bo/CrmPermissionUpdateBO.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/permission/bo/CrmPermissionUpdateReqBO.java
1 1 package cn.iocoder.yudao.module.crm.service.permission.bo;
2 2  
  3 +import cn.iocoder.yudao.framework.common.validation.InEnum;
3 4 import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO;
4 5 import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum;
  6 +import cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum;
5 7 import lombok.Data;
6 8  
7 9 import javax.validation.constraints.NotNull;
8   -import java.util.Set;
9 10  
10   -// TODO @puhui999:,一个是 Crm 前缀,一个 Req 表示入参
11 11 /**
12   - * crm 数据权限 Update BO
  12 + * crm 数据权限 Update Req BO
13 13 *
14 14 * @author HUIHUI
15 15 */
16 16 @Data
17   -public class CrmPermissionUpdateBO {
  17 +public class CrmPermissionUpdateReqBO {
18 18  
19   - // TODO @puhui999:id 和 crmType + crmDataId 是不是重叠了;
20 19 /**
21 20 * 数据权限编号 {@link CrmPermissionDO#getId()}
22 21 */
... ... @@ -24,26 +23,30 @@ public class CrmPermissionUpdateBO {
24 23 private Long id;
25 24  
26 25 /**
27   - * Crm 类型 关联 {@link CrmBizTypeEnum}
  26 + * 当前登录用户编号
28 27 */
29   - @NotNull(message = "Crm 类型不能为空")
30   - private Integer crmType;
31   - /**
32   - * 数据编号 关联 {@link CrmBizTypeEnum} 对应模块 DO#getId()
33   - */
34   - @NotNull(message = "Crm 数据编号不能为空")
35   - private Long crmDataId;
  28 + @NotNull(message = "用户编号不能为空")
  29 + private Long userId;
  30 +
36 31 /**
37   - * 负责人的用户编号 关联 AdminUser#id, null 则为公海数据
  32 + * Crm 类型
38 33 */
39   - private Long ownerUserId;
  34 + @NotNull(message = "Crm 类型不能为空")
  35 + @InEnum(CrmBizTypeEnum.class)
  36 + private Integer bizType;
  37 +
40 38 /**
41   - * 只读权限的用户编号数组
  39 + * 数据编号
42 40 */
43   - private Set<Long> roUserIds;
  41 + @NotNull(message = "Crm 数据编号不能为空")
  42 + private Long bizId;
  43 +
44 44 /**
45   - * 读写权限的用户编号数组
  45 + * 权限级别
  46 + * 关联 {@link CrmPermissionLevelEnum}
46 47 */
47   - private Set<Long> rwUserIds;
  48 + @NotNull(message = "权限级别不能为空")
  49 + @InEnum(CrmPermissionLevelEnum.class)
  50 + private Integer permissionLevel;
48 51  
49 52 }
... ...