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