001    /**
002     * Copyright (c) 2000-2011 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,
206                                    serviceContext);
207                    }
208            }
209    
210            protected List<Long> getGroupAdministratorUserIds(long groupId)
211                    throws PortalException, SystemException {
212    
213                    List<Long> userIds = new UniqueList<Long>();
214    
215                    Group group = groupLocalService.getGroup(groupId);
216    
217                    Role siteAdministratorRole = roleLocalService.getRole(
218                            group.getCompanyId(), RoleConstants.SITE_ADMINISTRATOR);
219    
220                    List<UserGroupRole> siteAdministratorUserGroupRoles =
221                            userGroupRoleLocalService.getUserGroupRolesByGroupAndRole(
222                                    groupId, siteAdministratorRole.getRoleId());
223    
224                    for (UserGroupRole userGroupRole : siteAdministratorUserGroupRoles) {
225                            userIds.add(userGroupRole.getUserId());
226                    }
227    
228                    Role siteOwnerRole = rolePersistence.findByC_N(
229                            group.getCompanyId(), RoleConstants.SITE_OWNER);
230    
231                    List<UserGroupRole> siteOwnerUserGroupRoles =
232                            userGroupRoleLocalService.getUserGroupRolesByGroupAndRole(
233                                    groupId, siteOwnerRole.getRoleId());
234    
235                    for (UserGroupRole userGroupRole : siteOwnerUserGroupRoles) {
236                            userIds.add(userGroupRole.getUserId());
237                    }
238    
239                    if (!group.isOrganization()) {
240                            return userIds;
241                    }
242    
243                    Role organizationAdministratorRole = roleLocalService.getRole(
244                            group.getCompanyId(), RoleConstants.ORGANIZATION_ADMINISTRATOR);
245    
246                    List<UserGroupRole> organizationAdminstratorUserGroupRoles =
247                            userGroupRoleLocalService.getUserGroupRolesByGroupAndRole(
248                                    groupId, organizationAdministratorRole.getRoleId());
249    
250                    for (UserGroupRole orgAdministratorUserGroupRole :
251                                    organizationAdminstratorUserGroupRoles) {
252    
253                            userIds.add(orgAdministratorUserGroupRole.getUserId());
254                    }
255    
256                    Role orgOwnerRole = roleLocalService.getRole(
257                            group.getCompanyId(), RoleConstants.ORGANIZATION_OWNER);
258    
259                    List<UserGroupRole> organizationOwnerUserGroupRoles =
260                            userGroupRoleLocalService.getUserGroupRolesByGroupAndRole(
261                                    groupId, orgOwnerRole.getRoleId());
262    
263                    for (UserGroupRole organizationOwnerUserGroupRole :
264                                    organizationOwnerUserGroupRoles) {
265    
266                            userIds.add(organizationOwnerUserGroupRole.getUserId());
267                    }
268    
269                    return userIds;
270            }
271    
272            protected void notify(
273                            long userId, MembershipRequest membershipRequest,
274                            String subjectProperty, String bodyProperty,
275                            ServiceContext serviceContext)
276                    throws PortalException, SystemException {
277    
278                    User user = userPersistence.findByPrimaryKey(userId);
279                    User requestUser = userPersistence.findByPrimaryKey(
280                            membershipRequest.getUserId());
281    
282                    String fromName = PrefsPropsUtil.getStringFromNames(
283                            membershipRequest.getCompanyId(),
284                            PropsKeys.SITES_EMAIL_FROM_NAME, PropsKeys.ADMIN_EMAIL_FROM_NAME);
285    
286                    String fromAddress = PrefsPropsUtil.getStringFromNames(
287                            membershipRequest.getCompanyId(),
288                            PropsKeys.SITES_EMAIL_FROM_ADDRESS,
289                            PropsKeys.ADMIN_EMAIL_FROM_ADDRESS);
290    
291                    String toName = user.getFullName();
292                    String toAddress = user.getEmailAddress();
293    
294                    String subject = PrefsPropsUtil.getContent(
295                            membershipRequest.getCompanyId(), subjectProperty);
296    
297                    String body = PrefsPropsUtil.getContent(
298                            membershipRequest.getCompanyId(), bodyProperty);
299    
300                    String statusKey = null;
301    
302                    if (membershipRequest.getStatusId() ==
303                                    MembershipRequestConstants.STATUS_APPROVED) {
304    
305                            statusKey = "approved";
306                    }
307                    else if (membershipRequest.getStatusId() ==
308                                            MembershipRequestConstants.STATUS_DENIED) {
309    
310                            statusKey = "denied";
311                    }
312                    else {
313                            statusKey = "pending";
314                    }
315    
316                    SubscriptionSender subscriptionSender = new SubscriptionSender();
317    
318                    subscriptionSender.setBody(body);
319                    subscriptionSender.setCompanyId(membershipRequest.getCompanyId());
320                    subscriptionSender.setContextAttributes(
321                            "[$COMMENTS$]", membershipRequest.getComments(),
322                            "[$REPLY_COMMENTS$]", membershipRequest.getReplyComments(),
323                            "[$REQUEST_USER_ADDRESS$]", requestUser.getEmailAddress(),
324                            "[$REQUEST_USER_NAME$]", requestUser.getFullName(), "[$STATUS$]",
325                            LanguageUtil.get(user.getLocale(), statusKey), "[$USER_ADDRESS$]",
326                            user.getEmailAddress(), "[$USER_NAME$]", user.getFullName());
327                    subscriptionSender.setFrom(fromAddress, fromName);
328                    subscriptionSender.setHtmlFormat(true);
329                    subscriptionSender.setMailId(
330                            "membership_request", membershipRequest.getMembershipRequestId());
331                    subscriptionSender.setScopeGroupId(membershipRequest.getGroupId());
332                    subscriptionSender.setServiceContext(serviceContext);
333                    subscriptionSender.setSubject(subject);
334                    subscriptionSender.setUserId(userId);
335    
336                    subscriptionSender.addRuntimeSubscribers(toAddress, toName);
337    
338                    subscriptionSender.flushNotificationsAsync();
339            }
340    
341            protected void notifyGroupAdministrators(
342                            MembershipRequest membershipRequest, ServiceContext serviceContext)
343                    throws PortalException, SystemException {
344    
345                    List<Long> userIds = getGroupAdministratorUserIds(
346                            membershipRequest.getGroupId());
347    
348                    for (Long userId : userIds) {
349                            notify(
350                                    userId, membershipRequest,
351                                    PropsKeys.SITES_EMAIL_MEMBERSHIP_REQUEST_SUBJECT,
352                                    PropsKeys.SITES_EMAIL_MEMBERSHIP_REQUEST_BODY,
353                                    serviceContext);
354                    }
355            }
356    
357            protected void validate(String comments)
358                    throws PortalException {
359    
360                    if ((Validator.isNull(comments)) || (Validator.isNumber(comments))) {
361                            throw new MembershipRequestCommentsException();
362                    }
363            }
364    
365    }