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.ListUtil;
022 import com.liferay.portal.kernel.util.PropsKeys;
023 import com.liferay.portal.kernel.util.UniqueList;
024 import com.liferay.portal.kernel.util.Validator;
025 import com.liferay.portal.model.Group;
026 import com.liferay.portal.model.MembershipRequest;
027 import com.liferay.portal.model.MembershipRequestConstants;
028 import com.liferay.portal.model.Resource;
029 import com.liferay.portal.model.ResourceConstants;
030 import com.liferay.portal.model.Role;
031 import com.liferay.portal.model.RoleConstants;
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 = ListUtil.copy(
209 ResourceActionsUtil.getRoles(
210 group.getCompanyId(), group, modelResource, null));
211
212 List<Role> teamRoles = roleLocalService.getTeamRoles(groupId);
213
214 roles.addAll(teamRoles);
215
216 Resource resource = resourceLocalService.getResource(
217 group.getCompanyId(), modelResource,
218 ResourceConstants.SCOPE_INDIVIDUAL, String.valueOf(groupId));
219
220 List<String> actions = ResourceActionsUtil.getResourceActions(
221 Group.class.getName());
222
223 for (Role role : roles) {
224 String roleName = role.getName();
225
226 if (roleName.equals(RoleConstants.OWNER)) {
227 continue;
228 }
229
230 if ((roleName.equals(RoleConstants.ORGANIZATION_ADMINISTRATOR) ||
231 roleName.equals(RoleConstants.ORGANIZATION_OWNER)) &&
232 !group.isOrganization()) {
233
234 continue;
235 }
236
237 if (roleName.equals(RoleConstants.SITE_ADMINISTRATOR) ||
238 roleName.equals(RoleConstants.SITE_OWNER) ||
239 roleName.equals(RoleConstants.ORGANIZATION_ADMINISTRATOR) ||
240 roleName.equals(RoleConstants.ORGANIZATION_OWNER)) {
241
242 Role curRole = roleLocalService.getRole(
243 group.getCompanyId(), roleName);
244
245 List<UserGroupRole> userGroupRoles =
246 userGroupRoleLocalService.getUserGroupRolesByGroupAndRole(
247 groupId, curRole.getRoleId());
248
249 for (UserGroupRole userGroupRole : userGroupRoles) {
250 userIds.add(userGroupRole.getUserId());
251 }
252 }
253
254 List<String> currentIndividualActions = new ArrayList<String>();
255 List<String> currentGroupActions = new ArrayList<String>();
256 List<String> currentGroupTemplateActions = new ArrayList<String>();
257 List<String> currentCompanyActions = new ArrayList<String>();
258
259 ResourcePermissionUtil.populateResourcePermissionActionIds(
260 groupId, role, resource, actions, currentIndividualActions,
261 currentGroupActions, currentGroupTemplateActions,
262 currentCompanyActions);
263
264 if (currentIndividualActions.contains(ActionKeys.ASSIGN_MEMBERS) ||
265 currentGroupActions.contains(ActionKeys.ASSIGN_MEMBERS) ||
266 currentGroupTemplateActions.contains(
267 ActionKeys.ASSIGN_MEMBERS) ||
268 currentCompanyActions.contains(ActionKeys.ASSIGN_MEMBERS)) {
269
270 List<UserGroupRole> currentUserGroupRoles =
271 userGroupRoleLocalService.getUserGroupRolesByGroupAndRole(
272 groupId, role.getRoleId());
273
274 for (UserGroupRole userGroupRole : currentUserGroupRoles) {
275 userIds.add(userGroupRole.getUserId());
276 }
277 }
278 }
279
280 return userIds;
281 }
282
283 protected void notify(
284 long userId, MembershipRequest membershipRequest,
285 String subjectProperty, String bodyProperty,
286 ServiceContext serviceContext)
287 throws PortalException, SystemException {
288
289 User user = userPersistence.findByPrimaryKey(userId);
290 User requestUser = userPersistence.findByPrimaryKey(
291 membershipRequest.getUserId());
292
293 String fromName = PrefsPropsUtil.getStringFromNames(
294 membershipRequest.getCompanyId(), PropsKeys.SITES_EMAIL_FROM_NAME,
295 PropsKeys.ADMIN_EMAIL_FROM_NAME);
296
297 String fromAddress = PrefsPropsUtil.getStringFromNames(
298 membershipRequest.getCompanyId(),
299 PropsKeys.SITES_EMAIL_FROM_ADDRESS,
300 PropsKeys.ADMIN_EMAIL_FROM_ADDRESS);
301
302 String toName = user.getFullName();
303 String toAddress = user.getEmailAddress();
304
305 String subject = PrefsPropsUtil.getContent(
306 membershipRequest.getCompanyId(), subjectProperty);
307
308 String body = PrefsPropsUtil.getContent(
309 membershipRequest.getCompanyId(), bodyProperty);
310
311 String statusKey = null;
312
313 if (membershipRequest.getStatusId() ==
314 MembershipRequestConstants.STATUS_APPROVED) {
315
316 statusKey = "approved";
317 }
318 else if (membershipRequest.getStatusId() ==
319 MembershipRequestConstants.STATUS_DENIED) {
320
321 statusKey = "denied";
322 }
323 else {
324 statusKey = "pending";
325 }
326
327 SubscriptionSender subscriptionSender = new SubscriptionSender();
328
329 subscriptionSender.setBody(body);
330 subscriptionSender.setCompanyId(membershipRequest.getCompanyId());
331 subscriptionSender.setContextAttributes(
332 "[$COMMENTS$]", membershipRequest.getComments(),
333 "[$REPLY_COMMENTS$]", membershipRequest.getReplyComments(),
334 "[$REQUEST_USER_ADDRESS$]", requestUser.getEmailAddress(),
335 "[$REQUEST_USER_NAME$]", requestUser.getFullName(), "[$STATUS$]",
336 LanguageUtil.get(user.getLocale(), statusKey), "[$USER_ADDRESS$]",
337 user.getEmailAddress(), "[$USER_NAME$]", user.getFullName());
338 subscriptionSender.setFrom(fromAddress, fromName);
339 subscriptionSender.setHtmlFormat(true);
340 subscriptionSender.setMailId(
341 "membership_request", membershipRequest.getMembershipRequestId());
342 subscriptionSender.setScopeGroupId(membershipRequest.getGroupId());
343 subscriptionSender.setServiceContext(serviceContext);
344 subscriptionSender.setSubject(subject);
345 subscriptionSender.setUserId(userId);
346
347 subscriptionSender.addRuntimeSubscribers(toAddress, toName);
348
349 subscriptionSender.flushNotificationsAsync();
350 }
351
352 protected void notifyGroupAdministrators(
353 MembershipRequest membershipRequest, ServiceContext serviceContext)
354 throws PortalException, SystemException {
355
356 List<Long> userIds = getGroupAdministratorUserIds(
357 membershipRequest.getGroupId());
358
359 for (Long userId : userIds) {
360 notify(
361 userId, membershipRequest,
362 PropsKeys.SITES_EMAIL_MEMBERSHIP_REQUEST_SUBJECT,
363 PropsKeys.SITES_EMAIL_MEMBERSHIP_REQUEST_BODY, serviceContext);
364 }
365 }
366
367 protected void validate(String comments) throws PortalException {
368 if (Validator.isNull(comments) || Validator.isNumber(comments)) {
369 throw new MembershipRequestCommentsException();
370 }
371 }
372
373 }