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