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