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.Role;
028    import com.liferay.portal.model.RoleConstants;
029    import com.liferay.portal.model.User;
030    import com.liferay.portal.model.UserGroupRole;
031    import com.liferay.portal.service.ServiceContext;
032    import com.liferay.portal.service.base.MembershipRequestLocalServiceBaseImpl;
033    import com.liferay.portal.util.PrefsPropsUtil;
034    import com.liferay.portal.util.SubscriptionSender;
035    
036    import java.util.Date;
037    import java.util.List;
038    
039    /**
040     * @author Jorge Ferrer
041     */
042    public class MembershipRequestLocalServiceImpl
043            extends MembershipRequestLocalServiceBaseImpl {
044    
045            @Override
046            public MembershipRequest addMembershipRequest(
047                            long userId, long groupId, String comments,
048                            ServiceContext serviceContext)
049                    throws PortalException, SystemException {
050    
051                    User user = userPersistence.findByPrimaryKey(userId);
052                    Date now = new Date();
053    
054                    validate(comments);
055    
056                    long membershipRequestId = counterLocalService.increment();
057    
058                    MembershipRequest membershipRequest =
059                            membershipRequestPersistence.create(membershipRequestId);
060    
061                    membershipRequest.setCompanyId(user.getCompanyId());
062                    membershipRequest.setUserId(userId);
063                    membershipRequest.setCreateDate(now);
064                    membershipRequest.setGroupId(groupId);
065                    membershipRequest.setComments(comments);
066                    membershipRequest.setStatusId(
067                            MembershipRequestConstants.STATUS_PENDING);
068    
069                    membershipRequestPersistence.update(membershipRequest, false);
070    
071                    notifyGroupAdministrators(membershipRequest, serviceContext);
072    
073                    return membershipRequest;
074            }
075    
076            @Override
077            public void deleteMembershipRequests(long groupId) throws SystemException {
078                    List<MembershipRequest> membershipRequests =
079                            membershipRequestPersistence.findByGroupId(groupId);
080    
081                    for (MembershipRequest membershipRequest : membershipRequests) {
082                            deleteMembershipRequest(membershipRequest);
083                    }
084            }
085    
086            @Override
087            public void deleteMembershipRequests(long groupId, int statusId)
088                    throws SystemException {
089    
090                    List<MembershipRequest> membershipRequests =
091                            membershipRequestPersistence.findByG_S(groupId, statusId);
092    
093                    for (MembershipRequest membershipRequest : membershipRequests) {
094                            deleteMembershipRequest(membershipRequest);
095                    }
096            }
097    
098            @Override
099            public void deleteMembershipRequestsByUserId(long userId)
100                    throws SystemException {
101    
102                    List<MembershipRequest> membershipRequests =
103                            membershipRequestPersistence.findByUserId(userId);
104    
105                    for (MembershipRequest membershipRequest : membershipRequests) {
106                            deleteMembershipRequest(membershipRequest);
107                    }
108            }
109    
110            @Override
111            public List<MembershipRequest> getMembershipRequests(
112                            long userId, long groupId, int statusId)
113                    throws SystemException {
114    
115                    return membershipRequestPersistence.findByG_U_S(
116                            groupId, userId, statusId);
117            }
118    
119            @Override
120            public boolean hasMembershipRequest(long userId, long groupId, int statusId)
121                    throws SystemException {
122    
123                    List<MembershipRequest> membershipRequests = getMembershipRequests(
124                            userId, groupId, statusId);
125    
126                    if (membershipRequests.isEmpty()) {
127                            return false;
128                    }
129                    else {
130                            return true;
131                    }
132            }
133    
134            @Override
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            @Override
144            public int searchCount(long groupId, int status) throws SystemException {
145                    return membershipRequestPersistence.countByG_S(groupId, status);
146            }
147    
148            @Override
149            public void updateStatus(
150                            long replierUserId, long membershipRequestId, String replyComments,
151                            int statusId, boolean addUserToGroup, ServiceContext serviceContext)
152                    throws PortalException, SystemException {
153    
154                    validate(replyComments);
155    
156                    MembershipRequest membershipRequest =
157                            membershipRequestPersistence.findByPrimaryKey(membershipRequestId);
158    
159                    membershipRequest.setReplyComments(replyComments);
160                    membershipRequest.setReplyDate(new Date());
161    
162                    if (replierUserId != 0) {
163                            membershipRequest.setReplierUserId(replierUserId);
164                    }
165                    else {
166                            long defaultUserId = userLocalService.getDefaultUserId(
167                                    membershipRequest.getCompanyId());
168    
169                            membershipRequest.setReplierUserId(defaultUserId);
170                    }
171    
172                    membershipRequest.setStatusId(statusId);
173    
174                    membershipRequestPersistence.update(membershipRequest, false);
175    
176                    if ((statusId == MembershipRequestConstants.STATUS_APPROVED) &&
177                            addUserToGroup) {
178    
179                            long[] addUserIds = new long[] {membershipRequest.getUserId()};
180    
181                            userLocalService.addGroupUsers(
182                                    membershipRequest.getGroupId(), addUserIds);
183                    }
184    
185                    if (replierUserId != 0) {
186                            notify(
187                                    membershipRequest.getUserId(), membershipRequest,
188                                    PropsKeys.SITES_EMAIL_MEMBERSHIP_REPLY_SUBJECT,
189                                    PropsKeys.SITES_EMAIL_MEMBERSHIP_REPLY_BODY, serviceContext);
190                    }
191            }
192    
193            protected List<Long> getGroupAdministratorUserIds(long groupId)
194                    throws PortalException, SystemException {
195    
196                    List<Long> userIds = new UniqueList<Long>();
197    
198                    Group group = groupLocalService.getGroup(groupId);
199    
200                    Role siteAdministratorRole = roleLocalService.getRole(
201                            group.getCompanyId(), RoleConstants.SITE_ADMINISTRATOR);
202    
203                    List<UserGroupRole> siteAdministratorUserGroupRoles =
204                            userGroupRoleLocalService.getUserGroupRolesByGroupAndRole(
205                                    groupId, siteAdministratorRole.getRoleId());
206    
207                    for (UserGroupRole userGroupRole : siteAdministratorUserGroupRoles) {
208                            userIds.add(userGroupRole.getUserId());
209                    }
210    
211                    Role siteOwnerRole = rolePersistence.findByC_N(
212                            group.getCompanyId(), RoleConstants.SITE_OWNER);
213    
214                    List<UserGroupRole> siteOwnerUserGroupRoles =
215                            userGroupRoleLocalService.getUserGroupRolesByGroupAndRole(
216                                    groupId, siteOwnerRole.getRoleId());
217    
218                    for (UserGroupRole userGroupRole : siteOwnerUserGroupRoles) {
219                            userIds.add(userGroupRole.getUserId());
220                    }
221    
222                    if (!group.isOrganization()) {
223                            return userIds;
224                    }
225    
226                    Role organizationAdministratorRole = roleLocalService.getRole(
227                            group.getCompanyId(), RoleConstants.ORGANIZATION_ADMINISTRATOR);
228    
229                    List<UserGroupRole> organizationAdminstratorUserGroupRoles =
230                            userGroupRoleLocalService.getUserGroupRolesByGroupAndRole(
231                                    groupId, organizationAdministratorRole.getRoleId());
232    
233                    for (UserGroupRole orgAdministratorUserGroupRole :
234                                    organizationAdminstratorUserGroupRoles) {
235    
236                            userIds.add(orgAdministratorUserGroupRole.getUserId());
237                    }
238    
239                    Role orgOwnerRole = roleLocalService.getRole(
240                            group.getCompanyId(), RoleConstants.ORGANIZATION_OWNER);
241    
242                    List<UserGroupRole> organizationOwnerUserGroupRoles =
243                            userGroupRoleLocalService.getUserGroupRolesByGroupAndRole(
244                                    groupId, orgOwnerRole.getRoleId());
245    
246                    for (UserGroupRole organizationOwnerUserGroupRole :
247                                    organizationOwnerUserGroupRoles) {
248    
249                            userIds.add(organizationOwnerUserGroupRole.getUserId());
250                    }
251    
252                    return userIds;
253            }
254    
255            protected void notify(
256                            long userId, MembershipRequest membershipRequest,
257                            String subjectProperty, String bodyProperty,
258                            ServiceContext serviceContext)
259                    throws PortalException, SystemException {
260    
261                    User user = userPersistence.findByPrimaryKey(userId);
262                    User requestUser = userPersistence.findByPrimaryKey(
263                            membershipRequest.getUserId());
264    
265                    String fromName = PrefsPropsUtil.getStringFromNames(
266                            membershipRequest.getCompanyId(), PropsKeys.SITES_EMAIL_FROM_NAME,
267                            PropsKeys.ADMIN_EMAIL_FROM_NAME);
268    
269                    String fromAddress = PrefsPropsUtil.getStringFromNames(
270                            membershipRequest.getCompanyId(),
271                            PropsKeys.SITES_EMAIL_FROM_ADDRESS,
272                            PropsKeys.ADMIN_EMAIL_FROM_ADDRESS);
273    
274                    String toName = user.getFullName();
275                    String toAddress = user.getEmailAddress();
276    
277                    String subject = PrefsPropsUtil.getContent(
278                            membershipRequest.getCompanyId(), subjectProperty);
279    
280                    String body = PrefsPropsUtil.getContent(
281                            membershipRequest.getCompanyId(), bodyProperty);
282    
283                    String statusKey = null;
284    
285                    if (membershipRequest.getStatusId() ==
286                                    MembershipRequestConstants.STATUS_APPROVED) {
287    
288                            statusKey = "approved";
289                    }
290                    else if (membershipRequest.getStatusId() ==
291                                            MembershipRequestConstants.STATUS_DENIED) {
292    
293                            statusKey = "denied";
294                    }
295                    else {
296                            statusKey = "pending";
297                    }
298    
299                    SubscriptionSender subscriptionSender = new SubscriptionSender();
300    
301                    subscriptionSender.setBody(body);
302                    subscriptionSender.setCompanyId(membershipRequest.getCompanyId());
303                    subscriptionSender.setContextAttributes(
304                            "[$COMMENTS$]", membershipRequest.getComments(),
305                            "[$REPLY_COMMENTS$]", membershipRequest.getReplyComments(),
306                            "[$REQUEST_USER_ADDRESS$]", requestUser.getEmailAddress(),
307                            "[$REQUEST_USER_NAME$]", requestUser.getFullName(), "[$STATUS$]",
308                            LanguageUtil.get(user.getLocale(), statusKey), "[$USER_ADDRESS$]",
309                            user.getEmailAddress(), "[$USER_NAME$]", user.getFullName());
310                    subscriptionSender.setFrom(fromAddress, fromName);
311                    subscriptionSender.setHtmlFormat(true);
312                    subscriptionSender.setMailId(
313                            "membership_request", membershipRequest.getMembershipRequestId());
314                    subscriptionSender.setScopeGroupId(membershipRequest.getGroupId());
315                    subscriptionSender.setServiceContext(serviceContext);
316                    subscriptionSender.setSubject(subject);
317                    subscriptionSender.setUserId(userId);
318    
319                    subscriptionSender.addRuntimeSubscribers(toAddress, toName);
320    
321                    subscriptionSender.flushNotificationsAsync();
322            }
323    
324            protected void notifyGroupAdministrators(
325                            MembershipRequest membershipRequest, ServiceContext serviceContext)
326                    throws PortalException, SystemException {
327    
328                    List<Long> userIds = getGroupAdministratorUserIds(
329                            membershipRequest.getGroupId());
330    
331                    for (Long userId : userIds) {
332                            notify(
333                                    userId, membershipRequest,
334                                    PropsKeys.SITES_EMAIL_MEMBERSHIP_REQUEST_SUBJECT,
335                                    PropsKeys.SITES_EMAIL_MEMBERSHIP_REQUEST_BODY, serviceContext);
336                    }
337            }
338    
339            protected void validate(String comments) throws PortalException {
340                    if (Validator.isNull(comments) || Validator.isNumber(comments)) {
341                            throw new MembershipRequestCommentsException();
342                    }
343            }
344    
345    }