001
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
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 }