001    /**
002     * Copyright (c) 2000-2012 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            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    }