001
014
015 package com.liferay.portal.service.impl;
016
017 import com.liferay.portal.MembershipRequestCommentsException;
018 import com.liferay.portal.kernel.exception.PortalException;
019 import com.liferay.portal.kernel.exception.SystemException;
020 import com.liferay.portal.kernel.language.LanguageUtil;
021 import com.liferay.portal.kernel.util.PropsKeys;
022 import com.liferay.portal.kernel.util.UniqueList;
023 import com.liferay.portal.kernel.util.Validator;
024 import com.liferay.portal.model.Group;
025 import com.liferay.portal.model.MembershipRequest;
026 import com.liferay.portal.model.MembershipRequestConstants;
027 import com.liferay.portal.model.Resource;
028 import com.liferay.portal.model.ResourceConstants;
029 import com.liferay.portal.model.Role;
030 import com.liferay.portal.model.RoleConstants;
031 import com.liferay.portal.model.Team;
032 import com.liferay.portal.model.User;
033 import com.liferay.portal.model.UserGroupRole;
034 import com.liferay.portal.security.permission.ActionKeys;
035 import com.liferay.portal.security.permission.ResourceActionsUtil;
036 import com.liferay.portal.service.ServiceContext;
037 import com.liferay.portal.service.base.MembershipRequestLocalServiceBaseImpl;
038 import com.liferay.portal.util.PrefsPropsUtil;
039 import com.liferay.portal.util.ResourcePermissionUtil;
040 import com.liferay.portal.util.SubscriptionSender;
041
042 import java.util.ArrayList;
043 import java.util.Date;
044 import java.util.List;
045
046
049 public class MembershipRequestLocalServiceImpl
050 extends MembershipRequestLocalServiceBaseImpl {
051
052 @Override
053 public MembershipRequest addMembershipRequest(
054 long userId, long groupId, String comments,
055 ServiceContext serviceContext)
056 throws PortalException, SystemException {
057
058 User user = userPersistence.findByPrimaryKey(userId);
059 Date now = new Date();
060
061 validate(comments);
062
063 long membershipRequestId = counterLocalService.increment();
064
065 MembershipRequest membershipRequest =
066 membershipRequestPersistence.create(membershipRequestId);
067
068 membershipRequest.setCompanyId(user.getCompanyId());
069 membershipRequest.setUserId(userId);
070 membershipRequest.setCreateDate(now);
071 membershipRequest.setGroupId(groupId);
072 membershipRequest.setComments(comments);
073 membershipRequest.setStatusId(
074 MembershipRequestConstants.STATUS_PENDING);
075
076 membershipRequestPersistence.update(membershipRequest);
077
078 notifyGroupAdministrators(membershipRequest, serviceContext);
079
080 return membershipRequest;
081 }
082
083 @Override
084 public void deleteMembershipRequests(long groupId) throws SystemException {
085 List<MembershipRequest> membershipRequests =
086 membershipRequestPersistence.findByGroupId(groupId);
087
088 for (MembershipRequest membershipRequest : membershipRequests) {
089 deleteMembershipRequest(membershipRequest);
090 }
091 }
092
093 @Override
094 public void deleteMembershipRequests(long groupId, int statusId)
095 throws SystemException {
096
097 List<MembershipRequest> membershipRequests =
098 membershipRequestPersistence.findByG_S(groupId, statusId);
099
100 for (MembershipRequest membershipRequest : membershipRequests) {
101 deleteMembershipRequest(membershipRequest);
102 }
103 }
104
105 @Override
106 public void deleteMembershipRequestsByUserId(long userId)
107 throws SystemException {
108
109 List<MembershipRequest> membershipRequests =
110 membershipRequestPersistence.findByUserId(userId);
111
112 for (MembershipRequest membershipRequest : membershipRequests) {
113 deleteMembershipRequest(membershipRequest);
114 }
115 }
116
117 @Override
118 public List<MembershipRequest> getMembershipRequests(
119 long userId, long groupId, int statusId)
120 throws SystemException {
121
122 return membershipRequestPersistence.findByG_U_S(
123 groupId, userId, statusId);
124 }
125
126 @Override
127 public boolean hasMembershipRequest(long userId, long groupId, int statusId)
128 throws SystemException {
129
130 List<MembershipRequest> membershipRequests = getMembershipRequests(
131 userId, groupId, statusId);
132
133 if (membershipRequests.isEmpty()) {
134 return false;
135 }
136 else {
137 return true;
138 }
139 }
140
141 @Override
142 public List<MembershipRequest> search(
143 long groupId, int status, int start, int end)
144 throws SystemException {
145
146 return membershipRequestPersistence.findByG_S(
147 groupId, status, start, end);
148 }
149
150 @Override
151 public int searchCount(long groupId, int status) throws SystemException {
152 return membershipRequestPersistence.countByG_S(groupId, status);
153 }
154
155 @Override
156 public void updateStatus(
157 long replierUserId, long membershipRequestId, String replyComments,
158 int statusId, boolean addUserToGroup, ServiceContext serviceContext)
159 throws PortalException, SystemException {
160
161 validate(replyComments);
162
163 MembershipRequest membershipRequest =
164 membershipRequestPersistence.findByPrimaryKey(membershipRequestId);
165
166 membershipRequest.setReplyComments(replyComments);
167 membershipRequest.setReplyDate(new Date());
168
169 if (replierUserId != 0) {
170 membershipRequest.setReplierUserId(replierUserId);
171 }
172 else {
173 long defaultUserId = userLocalService.getDefaultUserId(
174 membershipRequest.getCompanyId());
175
176 membershipRequest.setReplierUserId(defaultUserId);
177 }
178
179 membershipRequest.setStatusId(statusId);
180
181 membershipRequestPersistence.update(membershipRequest);
182
183 if ((statusId == MembershipRequestConstants.STATUS_APPROVED) &&
184 addUserToGroup) {
185
186 long[] addUserIds = new long[] {membershipRequest.getUserId()};
187
188 userLocalService.addGroupUsers(
189 membershipRequest.getGroupId(), addUserIds);
190 }
191
192 if (replierUserId != 0) {
193 notify(
194 membershipRequest.getUserId(), membershipRequest,
195 PropsKeys.SITES_EMAIL_MEMBERSHIP_REPLY_SUBJECT,
196 PropsKeys.SITES_EMAIL_MEMBERSHIP_REPLY_BODY, serviceContext);
197 }
198 }
199
200 protected List<Long> getGroupAdministratorUserIds(long groupId)
201 throws PortalException, SystemException {
202
203 List<Long> userIds = new UniqueList<Long>();
204
205 Group group = groupLocalService.getGroup(groupId);
206 String modelResource = Group.class.getName();
207
208 List<Role> roles = ResourceActionsUtil.getRoles(
209 group.getCompanyId(), group, modelResource, null);
210
211 List<Team> teams = teamLocalService.getGroupTeams(groupId);
212
213 if (teams != null) {
214 for (Team team : teams) {
215 Role role = roleLocalService.getTeamRole(
216 team.getCompanyId(), team.getTeamId());
217
218 roles.add(role);
219 }
220 }
221
222 Resource resource = resourceLocalService.getResource(
223 group.getCompanyId(), modelResource,
224 ResourceConstants.SCOPE_INDIVIDUAL, String.valueOf(groupId));
225
226 List<String> actions = ResourceActionsUtil.getResourceActions(
227 Group.class.getName());
228
229 for (Role role : roles) {
230 String roleName = role.getName();
231
232 if (roleName.equals(RoleConstants.OWNER)) {
233 continue;
234 }
235
236 if ((roleName.equals(RoleConstants.ORGANIZATION_ADMINISTRATOR) ||
237 roleName.equals(RoleConstants.ORGANIZATION_OWNER)) &&
238 !group.isOrganization()) {
239
240 continue;
241 }
242
243 if (roleName.equals(RoleConstants.SITE_ADMINISTRATOR) ||
244 roleName.equals(RoleConstants.SITE_OWNER) ||
245 roleName.equals(RoleConstants.ORGANIZATION_ADMINISTRATOR) ||
246 roleName.equals(RoleConstants.ORGANIZATION_OWNER)) {
247
248 Role curRole = roleLocalService.getRole(
249 group.getCompanyId(), roleName);
250
251 List<UserGroupRole> userGroupRoles =
252 userGroupRoleLocalService.getUserGroupRolesByGroupAndRole(
253 groupId, curRole.getRoleId());
254
255 for (UserGroupRole userGroupRole : userGroupRoles) {
256 userIds.add(userGroupRole.getUserId());
257 }
258 }
259
260 List<String> currentIndividualActions = new ArrayList<String>();
261 List<String> currentGroupActions = new ArrayList<String>();
262 List<String> currentGroupTemplateActions = new ArrayList<String>();
263 List<String> currentCompanyActions = new ArrayList<String>();
264
265 ResourcePermissionUtil.populateResourcePermissionActionIds(
266 groupId, role, resource, actions, currentIndividualActions,
267 currentGroupActions, currentGroupTemplateActions,
268 currentCompanyActions);
269
270 if (currentIndividualActions.contains(ActionKeys.ASSIGN_MEMBERS) ||
271 currentGroupActions.contains(ActionKeys.ASSIGN_MEMBERS) ||
272 currentGroupTemplateActions.contains(
273 ActionKeys.ASSIGN_MEMBERS) ||
274 currentCompanyActions.contains(ActionKeys.ASSIGN_MEMBERS)) {
275
276 List<UserGroupRole> currentUserGroupRoles =
277 userGroupRoleLocalService.getUserGroupRolesByGroupAndRole(
278 groupId, role.getRoleId());
279
280 for (UserGroupRole userGroupRole : currentUserGroupRoles) {
281 userIds.add(userGroupRole.getUserId());
282 }
283 }
284 }
285
286 return userIds;
287 }
288
289 protected void notify(
290 long userId, MembershipRequest membershipRequest,
291 String subjectProperty, String bodyProperty,
292 ServiceContext serviceContext)
293 throws PortalException, SystemException {
294
295 User user = userPersistence.findByPrimaryKey(userId);
296 User requestUser = userPersistence.findByPrimaryKey(
297 membershipRequest.getUserId());
298
299 String fromName = PrefsPropsUtil.getStringFromNames(
300 membershipRequest.getCompanyId(), PropsKeys.SITES_EMAIL_FROM_NAME,
301 PropsKeys.ADMIN_EMAIL_FROM_NAME);
302
303 String fromAddress = PrefsPropsUtil.getStringFromNames(
304 membershipRequest.getCompanyId(),
305 PropsKeys.SITES_EMAIL_FROM_ADDRESS,
306 PropsKeys.ADMIN_EMAIL_FROM_ADDRESS);
307
308 String toName = user.getFullName();
309 String toAddress = user.getEmailAddress();
310
311 String subject = PrefsPropsUtil.getContent(
312 membershipRequest.getCompanyId(), subjectProperty);
313
314 String body = PrefsPropsUtil.getContent(
315 membershipRequest.getCompanyId(), bodyProperty);
316
317 String statusKey = null;
318
319 if (membershipRequest.getStatusId() ==
320 MembershipRequestConstants.STATUS_APPROVED) {
321
322 statusKey = "approved";
323 }
324 else if (membershipRequest.getStatusId() ==
325 MembershipRequestConstants.STATUS_DENIED) {
326
327 statusKey = "denied";
328 }
329 else {
330 statusKey = "pending";
331 }
332
333 SubscriptionSender subscriptionSender = new SubscriptionSender();
334
335 subscriptionSender.setBody(body);
336 subscriptionSender.setCompanyId(membershipRequest.getCompanyId());
337 subscriptionSender.setContextAttributes(
338 "[$COMMENTS$]", membershipRequest.getComments(),
339 "[$REPLY_COMMENTS$]", membershipRequest.getReplyComments(),
340 "[$REQUEST_USER_ADDRESS$]", requestUser.getEmailAddress(),
341 "[$REQUEST_USER_NAME$]", requestUser.getFullName(), "[$STATUS$]",
342 LanguageUtil.get(user.getLocale(), statusKey), "[$USER_ADDRESS$]",
343 user.getEmailAddress(), "[$USER_NAME$]", user.getFullName());
344 subscriptionSender.setFrom(fromAddress, fromName);
345 subscriptionSender.setHtmlFormat(true);
346 subscriptionSender.setMailId(
347 "membership_request", membershipRequest.getMembershipRequestId());
348 subscriptionSender.setScopeGroupId(membershipRequest.getGroupId());
349 subscriptionSender.setServiceContext(serviceContext);
350 subscriptionSender.setSubject(subject);
351 subscriptionSender.setUserId(userId);
352
353 subscriptionSender.addRuntimeSubscribers(toAddress, toName);
354
355 subscriptionSender.flushNotificationsAsync();
356 }
357
358 protected void notifyGroupAdministrators(
359 MembershipRequest membershipRequest, ServiceContext serviceContext)
360 throws PortalException, SystemException {
361
362 List<Long> userIds = getGroupAdministratorUserIds(
363 membershipRequest.getGroupId());
364
365 for (Long userId : userIds) {
366 notify(
367 userId, membershipRequest,
368 PropsKeys.SITES_EMAIL_MEMBERSHIP_REQUEST_SUBJECT,
369 PropsKeys.SITES_EMAIL_MEMBERSHIP_REQUEST_BODY, serviceContext);
370 }
371 }
372
373 protected void validate(String comments) throws PortalException {
374 if (Validator.isNull(comments) || Validator.isNumber(comments)) {
375 throw new MembershipRequestCommentsException();
376 }
377 }
378
379 }