001    /**
002     * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
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    /**
047     * @author Jorge Ferrer
048     */
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    }