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