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