OrganizationServiceImpl.java 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718
  1. /*
  2. * <<
  3. * Davinci
  4. * ==
  5. * Copyright (C) 2016 - 2019 EDP
  6. * ==
  7. * Licensed under the Apache License, Version 2.0 (the "License");
  8. * you may not use this file except in compliance with the License.
  9. * You may obtain a copy of the License at
  10. * http://www.apache.org/licenses/LICENSE-2.0
  11. * Unless required by applicable law or agreed to in writing, software
  12. * distributed under the License is distributed on an "AS IS" BASIS,
  13. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. * See the License for the specific language governing permissions and
  15. * limitations under the License.
  16. * >>
  17. *
  18. */
  19. package edp.davinci.service.impl;
  20. import com.alibaba.druid.util.StringUtils;
  21. import edp.core.enums.MailContentTypeEnum;
  22. import edp.core.exception.NotFoundException;
  23. import edp.core.exception.ServerException;
  24. import edp.core.exception.UnAuthorizedException;
  25. import edp.core.model.MailContent;
  26. import edp.core.utils.*;
  27. import edp.davinci.core.common.Constants;
  28. import edp.davinci.core.enums.CheckEntityEnum;
  29. import edp.davinci.core.enums.LogNameEnum;
  30. import edp.davinci.core.enums.UserOrgRoleEnum;
  31. import edp.davinci.core.model.TokenEntity;
  32. import edp.davinci.dao.*;
  33. import edp.davinci.dto.organizationDto.*;
  34. import edp.davinci.dto.userDto.UserBaseInfo;
  35. import edp.davinci.model.Organization;
  36. import edp.davinci.model.Project;
  37. import edp.davinci.model.RelUserOrganization;
  38. import edp.davinci.model.User;
  39. import edp.davinci.service.OrganizationService;
  40. import lombok.extern.slf4j.Slf4j;
  41. import org.slf4j.Logger;
  42. import org.slf4j.LoggerFactory;
  43. import org.springframework.beans.BeanUtils;
  44. import org.springframework.beans.factory.annotation.Autowired;
  45. import org.springframework.http.HttpStatus;
  46. import org.springframework.stereotype.Service;
  47. import org.springframework.transaction.annotation.Transactional;
  48. import org.springframework.web.multipart.MultipartFile;
  49. import java.util.*;
  50. import java.util.concurrent.ExecutorService;
  51. import java.util.concurrent.Executors;
  52. import java.util.stream.Collectors;
  53. @Slf4j
  54. @Service("organizationService")
  55. public class OrganizationServiceImpl extends BaseEntityService implements OrganizationService {
  56. private static final Logger optLogger = LoggerFactory.getLogger(LogNameEnum.BUSINESS_OPERATION.getName());
  57. @Autowired
  58. private RelUserOrganizationMapper relUserOrganizationMapper;
  59. @Autowired
  60. public OrganizationMapper organizationMapper;
  61. @Autowired
  62. private UserMapper userMapper;
  63. @Autowired
  64. private ProjectMapper projectMapper;
  65. @Autowired
  66. private RoleMapper roleMapper;
  67. @Autowired
  68. private TokenUtils tokenUtils;
  69. @Autowired
  70. private MailUtils mailUtils;
  71. @Autowired
  72. private FileUtils fileUtils;
  73. @Autowired
  74. private ServerUtils serverUtils;
  75. private static final CheckEntityEnum entity = CheckEntityEnum.ORGANIZATION;
  76. private static final ExecutorService FIXED_THREAD_POOL = Executors.newFixedThreadPool(8);
  77. @Override
  78. public boolean isExist(String name, Long id, Long scopeId) {
  79. Long orgId = organizationMapper.getIdByName(name);
  80. if (null != id && null != orgId) {
  81. return !id.equals(orgId);
  82. }
  83. return null != orgId && orgId.longValue() > 0L;
  84. }
  85. /**
  86. * 新建组织
  87. *
  88. * @param organizationCreate
  89. * @param user
  90. * @return
  91. */
  92. @Override
  93. @Transactional
  94. public OrganizationBaseInfo createOrganization(OrganizationCreate organizationCreate, User user) throws ServerException {
  95. String name = organizationCreate.getName();
  96. if (isExist(name, null, null)) {
  97. alertNameTaken(entity, name);
  98. }
  99. BaseLock lock = getLock(entity, name, null);
  100. if (lock != null && !lock.getLock()) {
  101. alertNameTaken(entity, name);
  102. }
  103. try {
  104. //新增组织
  105. Organization organization = new Organization(organizationCreate.getName(), organizationCreate.getDescription(), user.getId());
  106. if (organizationMapper.insert(organization) <= 0) {
  107. log.info("Create organization error");
  108. throw new ServerException("Create organization error");
  109. }
  110. optLogger.info("Organization({}) is create by user({})", organization.toString(), user.getId());
  111. //用户-组织 建立关联
  112. RelUserOrganization relUserOrganization = new RelUserOrganization(organization.getId(), user.getId(), UserOrgRoleEnum.OWNER.getRole());
  113. relUserOrganization.createdBy(user.getId());
  114. relUserOrganizationMapper.insert(relUserOrganization);
  115. OrganizationBaseInfo organizationBaseInfo = new OrganizationBaseInfo();
  116. BeanUtils.copyProperties(organization, organizationBaseInfo);
  117. organizationBaseInfo.setRole(relUserOrganization.getRole());
  118. return organizationBaseInfo;
  119. } finally {
  120. lock.release();
  121. }
  122. }
  123. /**
  124. * 修改组织信息
  125. * 只有organization的创建者和owner可以修改
  126. *
  127. * @param organizationPut
  128. * @param user
  129. * @return
  130. */
  131. @Override
  132. @Transactional
  133. public boolean updateOrganization(OrganizationPut organizationPut, User user) throws NotFoundException, UnAuthorizedException, ServerException {
  134. Long id = organizationPut.getId();
  135. Organization organization = getOrganization(id);
  136. //验证修改权限,只有organization的创建者和owner可以修改
  137. checkOwner(organization, user.getId(), id, "update");
  138. String name = organizationPut.getName();
  139. if (isExist(name, id, null)) {
  140. alertNameTaken(entity, name);
  141. }
  142. BaseLock lock = getLock(entity, name, null);
  143. if (lock != null && !lock.getLock()) {
  144. alertNameTaken(entity, name);
  145. }
  146. try {
  147. String origin = organization.toString();
  148. BeanUtils.copyProperties(organizationPut, organization);
  149. organization.setUpdateBy(user.getId());
  150. organization.setUpdateTime(new Date());
  151. if (organizationMapper.update(organization) <= 0) {
  152. log.info("Update organization error");
  153. throw new ServerException("Update organization error");
  154. }
  155. optLogger.info("Organization({}) is update by user({}), origin:{}", organization.toString(), user.getId(), origin);
  156. return true;
  157. } finally {
  158. lock.release();
  159. }
  160. }
  161. private Organization getOrganization(Long id) {
  162. Organization organization = organizationMapper.getById(id);
  163. if (null == organization) {
  164. log.info("Organization({}) is not found", id);
  165. throw new NotFoundException("Organization is not found");
  166. }
  167. return organization;
  168. }
  169. private void checkOwner(Organization organization, Long userId, Long id, String operation) {
  170. RelUserOrganization rel = relUserOrganizationMapper.getRel(userId, id);
  171. if (!organization.getUserId().equals(userId)
  172. && (null == rel || rel.getRole() != UserOrgRoleEnum.OWNER.getRole())) {
  173. throw new UnAuthorizedException("You have not permission to " + operation + " this organization");
  174. }
  175. }
  176. /**
  177. * 上传组织头图
  178. *
  179. * @param id
  180. * @param file
  181. * @param user
  182. * @return
  183. */
  184. @Override
  185. @Transactional
  186. public Map<String, String> uploadAvatar(Long id, MultipartFile file, User user) throws NotFoundException, UnAuthorizedException, ServerException {
  187. Organization organization = getOrganization(id);
  188. //只有组织的创建者和owner有权限
  189. checkOwner(organization, user.getId(), id, "upload avatar to");
  190. //校验文件是否图片
  191. if (!fileUtils.isImage(file)) {
  192. throw new ServerException("File format error");
  193. }
  194. //上传文件
  195. String fileName = user.getUsername() + "_" + UUID.randomUUID();
  196. String avatar = null;
  197. try {
  198. avatar = fileUtils.upload(file, Constants.ORG_AVATAR_PATH, fileName);
  199. if (StringUtils.isEmpty(avatar)) {
  200. throw new ServerException("Organization avatar upload error");
  201. }
  202. } catch (Exception e) {
  203. log.error("Organization({}) avatar upload error", organization.getName(), e);
  204. throw new ServerException("Organization avatar upload error");
  205. }
  206. //删除原头像
  207. if (!StringUtils.isEmpty(organization.getAvatar())) {
  208. fileUtils.remove(organization.getAvatar());
  209. }
  210. //修改头像
  211. organization.setAvatar(avatar);
  212. organization.setUpdateTime(new Date());
  213. organization.setUpdateBy(user.getId());
  214. if (organizationMapper.update(organization) <= 0) {
  215. throw new ServerException("Organization avatar update fail");
  216. }
  217. Map<String, String> map = new HashMap<>();
  218. map.put("avatar", avatar);
  219. return map;
  220. }
  221. /**
  222. * 删除组织
  223. *
  224. * @param id
  225. * @param user
  226. * @return
  227. */
  228. @Override
  229. @Transactional
  230. public boolean deleteOrganization(Long id, User user) throws NotFoundException, UnAuthorizedException, ServerException {
  231. Organization organization = getOrganization(id);
  232. //只有组织的创建者和owner有权限删除
  233. checkOwner(organization, user.getId(), id, "delete");
  234. //校验组织下是否有项目
  235. List<Project> projectList = projectMapper.getByOrgId(id);
  236. if (!CollectionUtils.isEmpty(projectList)) {
  237. log.info("There is at least one project under the organization({}), it is can not be deleted", organization.getId());
  238. throw new ServerException("There is at least one project under this organization, it is can not be deleted");
  239. }
  240. relUserOrganizationMapper.deleteByOrgId(id);
  241. roleMapper.deleteByOrg(id);
  242. organizationMapper.deleteById(id);
  243. optLogger.info("Organization({}) is delete by user({})", organization.toString(), user.getId());
  244. return true;
  245. }
  246. /**
  247. * 获取组织详情
  248. *
  249. * @param id
  250. * @param user
  251. * @return
  252. */
  253. @Override
  254. public OrganizationInfo getOrganization(Long id, User user) throws NotFoundException, UnAuthorizedException {
  255. Organization organization = getOrganization(id);
  256. RelUserOrganization rel = relUserOrganizationMapper.getRel(user.getId(), id);
  257. if (null == rel) {
  258. throw new UnAuthorizedException("Insufficient permissions");
  259. }
  260. OrganizationInfo organizationInfo = new OrganizationInfo();
  261. BeanUtils.copyProperties(organization, organizationInfo);
  262. organizationInfo.setRole(rel.getRole());
  263. return organizationInfo;
  264. }
  265. /**
  266. * 获取组织列表
  267. * 当前用户创建 + Member(关联表用户是当前用户)
  268. *
  269. * @param user
  270. * @return
  271. */
  272. @Override
  273. public List<OrganizationInfo> getOrganizations(User user) {
  274. List<OrganizationInfo> organizationInfos = organizationMapper.getOrganizationByUser(user.getId());
  275. organizationInfos.forEach(o -> {
  276. if (o.getRole() == UserOrgRoleEnum.OWNER.getRole()) {
  277. o.setAllowCreateProject(true);
  278. }
  279. });
  280. return organizationInfos;
  281. }
  282. /**
  283. * 获取组织成员列表
  284. *
  285. * @param id
  286. * @return
  287. */
  288. @Override
  289. public List<OrganizationMember> getOrgMembers(Long id) {
  290. return relUserOrganizationMapper.getOrgMembers(id);
  291. }
  292. /**
  293. * 邀请成员
  294. *
  295. * @param orgId
  296. * @param memId
  297. * @param user
  298. * @return
  299. */
  300. @Override
  301. public void inviteMember(Long orgId, Long memId, User user) throws NotFoundException, UnAuthorizedException, ServerException {
  302. //验证组织
  303. Organization organization = getOrganization(orgId);
  304. //验证被邀请者
  305. User member = userMapper.getById(memId);
  306. if (null == member) {
  307. log.info("User({}) is not found", memId);
  308. throw new NotFoundException("User is not found");
  309. }
  310. // 验证用户权限,只有organization的owner可以邀请
  311. RelUserOrganization relOwner = relUserOrganizationMapper.getRel(user.getId(), orgId);
  312. if (null == relOwner || relOwner.getRole() != UserOrgRoleEnum.OWNER.getRole()) {
  313. throw new UnAuthorizedException("You cannot invite anyone to join this organization, cause you are not the owner of this ordination");
  314. }
  315. //验证被邀请用户是否已经加入
  316. RelUserOrganization rel = relUserOrganizationMapper.getRel(memId, orgId);
  317. if (null != rel) {
  318. throw new ServerException("The invitee is already a member of the this organization");
  319. }
  320. //校验邮箱
  321. if (StringUtils.isEmpty(user.getEmail())) {
  322. throw new ServerException("The email address of the invitee is EMPTY");
  323. }
  324. sendInviteEmail(organization, member, user);
  325. }
  326. @Override
  327. public BatchInviteMemberResult batchInviteCustomMembers(Long orgId, InviteMembers inviteMembers, User user) throws NotFoundException, UnAuthorizedException, ServerException {
  328. //验证组织
  329. Organization organization = getOrganization(orgId);
  330. // 验证用户权限,只有organization的owner可以邀请
  331. RelUserOrganization relOwner = relUserOrganizationMapper.getRel(user.getId(), orgId);
  332. if (null == relOwner || relOwner.getRole() != UserOrgRoleEnum.OWNER.getRole()) {
  333. throw new UnAuthorizedException("You cannot invite anyone to join this organization, cause you are not the owner of this organization");
  334. }
  335. BatchInviteMemberResult result = new BatchInviteMemberResult();
  336. Set<String> members = inviteMembers.getMembers();
  337. List<User> users = new ArrayList<>();
  338. Set<String> notUsers = new HashSet<>();
  339. for (String member : members) {
  340. User currentUser = userMapper.selectByUsername(member);
  341. if(currentUser != null) {
  342. users.add(currentUser);
  343. } else {
  344. notUsers.add(member);
  345. }
  346. }
  347. result.setNotUsers(notUsers);
  348. Set<Long> userIds = users.stream().map(User::getId).collect(Collectors.toSet());
  349. Set<UserBaseInfo> existUsers = relUserOrganizationMapper.selectOrgMembers(orgId, userIds);
  350. result.setExists(existUsers);
  351. if (!CollectionUtils.isEmpty(existUsers)) {
  352. Set<Long> exist = existUsers.stream().map(UserBaseInfo::getId).collect(Collectors.toSet());
  353. userIds.removeAll(exist);
  354. }
  355. if (!CollectionUtils.isEmpty(userIds)) {
  356. Set<User> inviteUsers = users.stream().filter(u -> userIds.contains(u.getId())).collect(Collectors.toSet());
  357. if (inviteMembers.isNeedConfirm()) {
  358. FIXED_THREAD_POOL.execute(() -> inviteUsers.forEach(member -> sendInviteEmail(organization, member, user)));
  359. } else {
  360. Set<RelUserOrganization> relUserOrgSet = inviteUsers.stream()
  361. .map(u -> new RelUserOrganization(orgId, u.getId(), UserOrgRoleEnum.MEMBER.getRole()))
  362. .collect(Collectors.toSet());
  363. int newMembers = relUserOrganizationMapper.insertBatch(relUserOrgSet);
  364. if (newMembers > 0) {
  365. organization.setMemberNum(organization.getMemberNum() + newMembers);
  366. organizationMapper.updateMemberNum(organization);
  367. }
  368. }
  369. log.info("User({}) invite members join organization({}), needConfirm:{}, memberId:{}", user.getId(), orgId, inviteMembers.isNeedConfirm(), members);
  370. Set<UserBaseInfo> success = inviteUsers.stream().map(UserBaseInfo::new).collect(Collectors.toSet());
  371. result.setSuccesses(success);
  372. }
  373. result.setStatus(HttpStatus.OK.value());
  374. return result;
  375. }
  376. /**
  377. * 组织成员确认邀请
  378. *
  379. * @param token
  380. * @param user
  381. * @return
  382. */
  383. @Override
  384. @Transactional
  385. public OrganizationInfo confirmInvite(String token, User user) throws ServerException {
  386. // aes解密
  387. token = AESUtils.decrypt(token, null);
  388. // 验证token(特殊验证,不走util)
  389. String tokenUserName = tokenUtils.getUsername(token);
  390. String tokenPassword = tokenUtils.getPassword(token);
  391. if (StringUtils.isEmpty(tokenUserName) || StringUtils.isEmpty(tokenPassword)) {
  392. throw new ServerException("Username or password cannot be empty");
  393. }
  394. String[] ids = tokenUserName.split(Constants.SPLIT_CHAR_STRING);
  395. if (ids.length != 3) {
  396. log.error("ConfirmInvite error, invalid token username");
  397. throw new ServerException("Invalid Token");
  398. }
  399. Long inviterId = Long.parseLong(ids[0]);
  400. Long memberId = Long.parseLong(ids[1]);
  401. Long orgId = Long.parseLong(ids[2]);
  402. if (!user.getId().equals(memberId)) {
  403. log.info("ConfirmInvite error, invalid token member, username is wrong");
  404. throw new ServerException("Username or password is wrong");
  405. }
  406. if (!user.getPassword().equals(tokenPassword)) {
  407. log.info("ConfirmInvite error, invalid token password");
  408. throw new ServerException("Username or password is wrong");
  409. }
  410. User inviter = userMapper.getById(inviterId);
  411. if (null == inviter) {
  412. log.info("ConfirmInvite error, invalid token inviter");
  413. throw new ServerException("Invalid Token");
  414. }
  415. Organization organization = getOrganization(orgId);
  416. OrganizationInfo organizationInfo = new OrganizationInfo();
  417. BeanUtils.copyProperties(organization, organizationInfo);
  418. RelUserOrganization tokenRel = relUserOrganizationMapper.getRel(inviterId, orgId);
  419. if (null != tokenRel && tokenRel.getRole() != UserOrgRoleEnum.OWNER.getRole()) {
  420. log.error("ConfirmInvite error, invalid token inviter permission");
  421. throw new ServerException("Invalid Token");
  422. }
  423. isJoined(memberId, orgId);
  424. // 验证通过,建立关联
  425. RelUserOrganization rel = new RelUserOrganization(orgId, memberId, UserOrgRoleEnum.MEMBER.getRole());
  426. rel.createdBy(memberId);
  427. if (relUserOrganizationMapper.insert(rel) <= 0) {
  428. throw new ServerException("unknown fail");
  429. }
  430. // 修改成员人数
  431. organization.setMemberNum(organization.getMemberNum() + 1);
  432. organizationMapper.updateMemberNum(organization);
  433. organizationInfo.setRole(rel.getRole());
  434. return organizationInfo;
  435. }
  436. private void isJoined(Long memberId, Long orgId) {
  437. RelUserOrganization rel = relUserOrganizationMapper.getRel(memberId, orgId);
  438. if (rel != null) {
  439. throw new ServerException("You have joined the organization and don't need to repeat.");
  440. }
  441. }
  442. @Override
  443. @Transactional
  444. public void confirmInviteNoLogin(String token) throws NotFoundException, ServerException {
  445. // aes解密
  446. token = AESUtils.decrypt(token, null);
  447. // 验证token(特殊验证,不走util)
  448. String tokenUserName = tokenUtils.getUsername(token);
  449. String tokenPassword = tokenUtils.getPassword(token);
  450. if (StringUtils.isEmpty(tokenUserName) || StringUtils.isEmpty(tokenPassword)) {
  451. throw new ServerException("Invalid Token");
  452. }
  453. String[] ids = tokenUserName.split(Constants.SPLIT_CHAR_STRING);
  454. if (ids.length != 3) {
  455. log.error("ConfirmInvite error, invalid token username");
  456. throw new ServerException("Invalid Token");
  457. }
  458. Long inviterId = Long.parseLong(ids[0]);
  459. Long memberId = Long.parseLong(ids[1]);
  460. Long orgId = Long.parseLong(ids[2]);
  461. User inviter = userMapper.getById(inviterId);
  462. if (null == inviter) {
  463. log.error("ConfirmInvite error, invalid token inviter");
  464. throw new ServerException("Invalid Token");
  465. }
  466. Organization organization = getOrganization(orgId);
  467. RelUserOrganization tokenRel = relUserOrganizationMapper.getRel(inviterId, orgId);
  468. if (null != tokenRel && tokenRel.getRole() != UserOrgRoleEnum.OWNER.getRole()) {
  469. log.error("ConfirmInvite error, invalid token inviter permission");
  470. throw new ServerException("Invalid Token");
  471. }
  472. User member = userMapper.getById(memberId);
  473. if (null == member) {
  474. throw new NotFoundException("User is not found");
  475. }
  476. isJoined(memberId, orgId);
  477. // 验证通过,建立关联
  478. RelUserOrganization rel = new RelUserOrganization(orgId, memberId, UserOrgRoleEnum.MEMBER.getRole());
  479. rel.createdBy(memberId);
  480. relUserOrganizationMapper.insert(rel);
  481. // 修改成员人数
  482. organization.setMemberNum(organization.getMemberNum() + 1);
  483. organizationMapper.updateMemberNum(organization);
  484. }
  485. /**
  486. * 删除组织成员
  487. *
  488. * @param relationId
  489. * @param user
  490. * @return
  491. */
  492. @Override
  493. @Transactional
  494. public boolean deleteOrgMember(Long relationId, User user) throws NotFoundException, UnAuthorizedException, ServerException {
  495. RelUserOrganization rel = relUserOrganizationMapper.getById(relationId);
  496. if (null == rel) {
  497. throw new ServerException("this member are no longer member of the organization");
  498. }
  499. Long orgId = rel.getOrgId();
  500. //验证权限,只有owner可以删除
  501. checkOwner(user.getId(), orgId, "delete");
  502. Organization organization = getOrganization(orgId);
  503. if (organization.getUserId().equals(rel.getUserId())) {
  504. throw new UnAuthorizedException("you have not permission delete the creator of the organization");
  505. }
  506. if (rel.getUserId().equals(user.getId())) {
  507. throw new ServerException("you cannot delete yourself in this organization");
  508. }
  509. if (relUserOrganizationMapper.deleteById(relationId) <= 0) {
  510. throw new ServerException("unknown fail");
  511. }
  512. // 更新组织成员数量
  513. int memberNum = organization.getMemberNum();
  514. organization.setMemberNum(memberNum > 0 ? memberNum - 1 : memberNum);
  515. organizationMapper.updateMemberNum(organization);
  516. return true;
  517. }
  518. private void checkOwner(Long userId, Long orgId, String operation) {
  519. RelUserOrganization ownerRel = relUserOrganizationMapper.getRel(userId, orgId);
  520. if (null != ownerRel && ownerRel.getRole() != UserOrgRoleEnum.OWNER.getRole()) {
  521. throw new UnAuthorizedException("you cannot " + operation + " any member of this organization, cause you are not the owner of this ordination");
  522. }
  523. }
  524. /**
  525. * 更改成员角色
  526. *
  527. * @param relationId
  528. * @param user
  529. * @param role
  530. * @return
  531. */
  532. @Override
  533. @Transactional
  534. public boolean updateMemberRole(Long relationId, User user, int role) throws NotFoundException, UnAuthorizedException, ServerException {
  535. RelUserOrganization rel = relUserOrganizationMapper.getById(relationId);
  536. if (null == rel) {
  537. throw new ServerException("this member are no longer member of the organization");
  538. }
  539. Long orgId = rel.getOrgId();
  540. getOrganization(orgId);
  541. //验证权限,只有owner可以更改
  542. checkOwner(user.getId(), orgId, "update");
  543. UserOrgRoleEnum userOrgRoleEnum = UserOrgRoleEnum.roleOf(role);
  544. if (null == userOrgRoleEnum) {
  545. throw new ServerException("Invalid role");
  546. }
  547. //不可以更改自己的权限
  548. if (user.getId().equals(rel.getUserId())) {
  549. throw new ServerException("you cannot change your own role");
  550. }
  551. //不需要更改
  552. if ((int) rel.getRole() == role) {
  553. throw new ServerException("this member does not need to change role");
  554. }
  555. String origin = rel.toString();
  556. rel.setRole(userOrgRoleEnum.getRole());
  557. rel.updatedBy(user.getId());
  558. if (relUserOrganizationMapper.updateMemberRole(rel) <= 0) {
  559. throw new ServerException("Unknown fail");
  560. }
  561. optLogger.info("RelUserOrganization({}) is update by user({}), origin:{}", rel.toString(), user.getId(), origin);
  562. return true;
  563. }
  564. /**
  565. * 发送邀请邮件
  566. *
  567. * @param organization
  568. * @param member
  569. * @param user
  570. */
  571. private void sendInviteEmail(Organization organization, User member, User user) {
  572. /**
  573. * 邀请组织成员token生成实体
  574. * 规则:
  575. * username: 邀请人id:-:被邀请人id:-:组织id
  576. * password: 被邀请人密码
  577. */
  578. TokenEntity orgInviteDetail = new TokenEntity();
  579. orgInviteDetail.setUsername(user.getId() + Constants.SPLIT_CHAR_STRING + member.getId() + Constants.SPLIT_CHAR_STRING + organization.getId());
  580. orgInviteDetail.setPassword(member.getPassword());
  581. Map<String, Object> content = new HashMap<>();
  582. content.put("username", member.getUsername());
  583. content.put("inviter", user.getUsername());
  584. content.put("orgName", organization.getName());
  585. content.put("host", serverUtils.getHost());
  586. //aes加密token
  587. content.put("token", AESUtils.encrypt(tokenUtils.generateContinuousToken(orgInviteDetail), null));
  588. try {
  589. MailContent mailContent = MailContent.MailContentBuilder.builder()
  590. .withSubject(String.format(Constants.INVITE_ORG_MEMBER_MAIL_SUBJECT, user.getUsername(), organization.getName()))
  591. .withTo(member.getEmail())
  592. .withMainContent(MailContentTypeEnum.TEMPLATE)
  593. .withTemplate(Constants.INVITE_ORG_MEMBER_MAIL_TEMPLATE)
  594. .withTemplateContent(content)
  595. .build();
  596. mailUtils.sendMail(mailContent, null);
  597. } catch (ServerException e) {
  598. log.error(e.toString(), e);
  599. }
  600. }
  601. }