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