001    /**
002     * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
003     *
004     * The contents of this file are subject to the terms of the Liferay Enterprise
005     * Subscription License ("License"). You may not use this file except in
006     * compliance with the License. You can obtain a copy of the License by
007     * contacting Liferay, Inc. See the License for the specific language governing
008     * permissions and limitations under the License, including but not limited to
009     * distribution rights of the Software.
010     *
011     *
012     *
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            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            public void deleteMembershipRequests(long groupId) throws SystemException {
076                    List<MembershipRequest> membershipRequests =
077                            membershipRequestPersistence.findByGroupId(groupId);
078    
079                    for (MembershipRequest membershipRequest : membershipRequests) {
080                            deleteMembershipRequest(membershipRequest);
081                    }
082            }
083    
084            public void deleteMembershipRequests(long groupId, int statusId)
085                    throws SystemException {
086    
087                    List<MembershipRequest> membershipRequests =
088                            membershipRequestPersistence.findByG_S(groupId, statusId);
089    
090                    for (MembershipRequest membershipRequest : membershipRequests) {
091                            deleteMembershipRequest(membershipRequest);
092                    }
093            }
094    
095            public void deleteMembershipRequestsByUserId(long userId)
096                    throws SystemException {
097    
098                    List<MembershipRequest> membershipRequests =
099                            membershipRequestPersistence.findByUserId(userId);
100    
101                    for (MembershipRequest membershipRequest : membershipRequests) {
102                            deleteMembershipRequest(membershipRequest);
103                    }
104            }
105    
106            public List<MembershipRequest> getMembershipRequests(
107                            long userId, long groupId, int statusId)
108                    throws SystemException {
109    
110                    return membershipRequestPersistence.findByG_U_S(
111                            groupId, userId, statusId);
112            }
113    
114            public boolean hasMembershipRequest(long userId, long groupId, int statusId)
115                    throws SystemException {
116    
117                    List<MembershipRequest> membershipRequests = getMembershipRequests(
118                            userId, groupId, statusId);
119    
120                    if (membershipRequests.isEmpty()) {
121                            return false;
122                    }
123                    else {
124                            return true;
125                    }
126            }
127    
128            public List<MembershipRequest> search(
129                            long groupId, int status, int start, int end)
130                    throws SystemException {
131    
132                    return membershipRequestPersistence.findByG_S(
133                            groupId, status, start, end);
134            }
135    
136            public int searchCount(long groupId, int status) throws SystemException {
137                    return membershipRequestPersistence.countByG_S(groupId, status);
138            }
139    
140            public void updateStatus(
141                            long replierUserId, long membershipRequestId, String replyComments,
142                            int statusId, boolean addUserToGroup, ServiceContext serviceContext)
143                    throws PortalException, SystemException {
144    
145                    validate(replyComments);
146    
147                    MembershipRequest membershipRequest =
148                            membershipRequestPersistence.findByPrimaryKey(membershipRequestId);
149    
150                    membershipRequest.setReplyComments(replyComments);
151                    membershipRequest.setReplyDate(new Date());
152    
153                    if (replierUserId != 0) {
154                            membershipRequest.setReplierUserId(replierUserId);
155                    }
156                    else {
157                            long defaultUserId = userLocalService.getDefaultUserId(
158                                    membershipRequest.getCompanyId());
159    
160                            membershipRequest.setReplierUserId(defaultUserId);
161                    }
162    
163                    membershipRequest.setStatusId(statusId);
164    
165                    membershipRequestPersistence.update(membershipRequest, false);
166    
167                    if ((statusId == MembershipRequestConstants.STATUS_APPROVED) &&
168                            addUserToGroup) {
169    
170                            long[] addUserIds = new long[] {membershipRequest.getUserId()};
171    
172                            userLocalService.addGroupUsers(
173                                    membershipRequest.getGroupId(), addUserIds);
174                    }
175    
176                    if (replierUserId != 0) {
177                            notify(
178                                    membershipRequest.getUserId(), membershipRequest,
179                                    PropsKeys.SITES_EMAIL_MEMBERSHIP_REPLY_SUBJECT,
180                                    PropsKeys.SITES_EMAIL_MEMBERSHIP_REPLY_BODY, serviceContext);
181                    }
182            }
183    
184            protected List<Long> getGroupAdministratorUserIds(long groupId)
185                    throws PortalException, SystemException {
186    
187                    List<Long> userIds = new UniqueList<Long>();
188    
189                    Group group = groupLocalService.getGroup(groupId);
190    
191                    Role siteAdministratorRole = roleLocalService.getRole(
192                            group.getCompanyId(), RoleConstants.SITE_ADMINISTRATOR);
193    
194                    List<UserGroupRole> siteAdministratorUserGroupRoles =
195                            userGroupRoleLocalService.getUserGroupRolesByGroupAndRole(
196                                    groupId, siteAdministratorRole.getRoleId());
197    
198                    for (UserGroupRole userGroupRole : siteAdministratorUserGroupRoles) {
199                            userIds.add(userGroupRole.getUserId());
200                    }
201    
202                    Role siteOwnerRole = rolePersistence.findByC_N(
203                            group.getCompanyId(), RoleConstants.SITE_OWNER);
204    
205                    List<UserGroupRole> siteOwnerUserGroupRoles =
206                            userGroupRoleLocalService.getUserGroupRolesByGroupAndRole(
207                                    groupId, siteOwnerRole.getRoleId());
208    
209                    for (UserGroupRole userGroupRole : siteOwnerUserGroupRoles) {
210                            userIds.add(userGroupRole.getUserId());
211                    }
212    
213                    if (!group.isOrganization()) {
214                            return userIds;
215                    }
216    
217                    Role organizationAdministratorRole = roleLocalService.getRole(
218                            group.getCompanyId(), RoleConstants.ORGANIZATION_ADMINISTRATOR);
219    
220                    List<UserGroupRole> organizationAdminstratorUserGroupRoles =
221                            userGroupRoleLocalService.getUserGroupRolesByGroupAndRole(
222                                    groupId, organizationAdministratorRole.getRoleId());
223    
224                    for (UserGroupRole orgAdministratorUserGroupRole :
225                                    organizationAdminstratorUserGroupRoles) {
226    
227                            userIds.add(orgAdministratorUserGroupRole.getUserId());
228                    }
229    
230                    Role orgOwnerRole = roleLocalService.getRole(
231                            group.getCompanyId(), RoleConstants.ORGANIZATION_OWNER);
232    
233                    List<UserGroupRole> organizationOwnerUserGroupRoles =
234                            userGroupRoleLocalService.getUserGroupRolesByGroupAndRole(
235                                    groupId, orgOwnerRole.getRoleId());
236    
237                    for (UserGroupRole organizationOwnerUserGroupRole :
238                                    organizationOwnerUserGroupRoles) {
239    
240                            userIds.add(organizationOwnerUserGroupRole.getUserId());
241                    }
242    
243                    return userIds;
244            }
245    
246            protected void notify(
247                            long userId, MembershipRequest membershipRequest,
248                            String subjectProperty, String bodyProperty,
249                            ServiceContext serviceContext)
250                    throws PortalException, SystemException {
251    
252                    User user = userPersistence.findByPrimaryKey(userId);
253                    User requestUser = userPersistence.findByPrimaryKey(
254                            membershipRequest.getUserId());
255    
256                    String fromName = PrefsPropsUtil.getStringFromNames(
257                            membershipRequest.getCompanyId(), PropsKeys.SITES_EMAIL_FROM_NAME,
258                            PropsKeys.ADMIN_EMAIL_FROM_NAME);
259    
260                    String fromAddress = PrefsPropsUtil.getStringFromNames(
261                            membershipRequest.getCompanyId(),
262                            PropsKeys.SITES_EMAIL_FROM_ADDRESS,
263                            PropsKeys.ADMIN_EMAIL_FROM_ADDRESS);
264    
265                    String toName = user.getFullName();
266                    String toAddress = user.getEmailAddress();
267    
268                    String subject = PrefsPropsUtil.getContent(
269                            membershipRequest.getCompanyId(), subjectProperty);
270    
271                    String body = PrefsPropsUtil.getContent(
272                            membershipRequest.getCompanyId(), bodyProperty);
273    
274                    String statusKey = null;
275    
276                    if (membershipRequest.getStatusId() ==
277                                    MembershipRequestConstants.STATUS_APPROVED) {
278    
279                            statusKey = "approved";
280                    }
281                    else if (membershipRequest.getStatusId() ==
282                                            MembershipRequestConstants.STATUS_DENIED) {
283    
284                            statusKey = "denied";
285                    }
286                    else {
287                            statusKey = "pending";
288                    }
289    
290                    SubscriptionSender subscriptionSender = new SubscriptionSender();
291    
292                    subscriptionSender.setBody(body);
293                    subscriptionSender.setCompanyId(membershipRequest.getCompanyId());
294                    subscriptionSender.setContextAttributes(
295                            "[$COMMENTS$]", membershipRequest.getComments(),
296                            "[$REPLY_COMMENTS$]", membershipRequest.getReplyComments(),
297                            "[$REQUEST_USER_ADDRESS$]", requestUser.getEmailAddress(),
298                            "[$REQUEST_USER_NAME$]", requestUser.getFullName(), "[$STATUS$]",
299                            LanguageUtil.get(user.getLocale(), statusKey), "[$USER_ADDRESS$]",
300                            user.getEmailAddress(), "[$USER_NAME$]", user.getFullName());
301                    subscriptionSender.setFrom(fromAddress, fromName);
302                    subscriptionSender.setHtmlFormat(true);
303                    subscriptionSender.setMailId(
304                            "membership_request", membershipRequest.getMembershipRequestId());
305                    subscriptionSender.setScopeGroupId(membershipRequest.getGroupId());
306                    subscriptionSender.setServiceContext(serviceContext);
307                    subscriptionSender.setSubject(subject);
308                    subscriptionSender.setUserId(userId);
309    
310                    subscriptionSender.addRuntimeSubscribers(toAddress, toName);
311    
312                    subscriptionSender.flushNotificationsAsync();
313            }
314    
315            protected void notifyGroupAdministrators(
316                            MembershipRequest membershipRequest, ServiceContext serviceContext)
317                    throws PortalException, SystemException {
318    
319                    List<Long> userIds = getGroupAdministratorUserIds(
320                            membershipRequest.getGroupId());
321    
322                    for (Long userId : userIds) {
323                            notify(
324                                    userId, membershipRequest,
325                                    PropsKeys.SITES_EMAIL_MEMBERSHIP_REQUEST_SUBJECT,
326                                    PropsKeys.SITES_EMAIL_MEMBERSHIP_REQUEST_BODY, serviceContext);
327                    }
328            }
329    
330            protected void validate(String comments) throws PortalException {
331                    if (Validator.isNull(comments) || Validator.isNumber(comments)) {
332                            throw new MembershipRequestCommentsException();
333                    }
334            }
335    
336    }