/******************************************************************************* * Copyright [2015] [Onboard team of SERC, Peking University] * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *******************************************************************************/ package com.onboard.service.account.impl; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.onboard.domain.mapper.ActivityMapper; import com.onboard.domain.mapper.CompanyMapper; import com.onboard.domain.mapper.ProjectMapper; import com.onboard.domain.mapper.UserCompanyMapper; import com.onboard.domain.mapper.UserMapper; import com.onboard.domain.mapper.UserProjectMapper; import com.onboard.domain.model.Activity; import com.onboard.domain.model.Invitation; import com.onboard.domain.model.InvitationProjects; import com.onboard.domain.model.Project; import com.onboard.domain.model.User; import com.onboard.domain.model.UserCompany; import com.onboard.domain.model.UserProject; import com.onboard.service.account.AccountService; import com.onboard.service.account.UserService; import com.onboard.service.account.utils.PasswordUtils; import com.onboard.service.email.EmailService; import com.onboard.service.email.TemplateEngineService; import com.onboard.service.web.SessionService; @Transactional @Service("accountServiceBean") public class AccountServiceImpl implements AccountService { public static final Logger logger = LoggerFactory.getLogger(AccountServiceImpl.class); private static final String INVITATION_TPL = "templates/Invitation.html"; private static final String ACTIVITY_INFO = "加入了项目:"; private static final String JOIN_ACTION = "join"; // not used now @Autowired private CompanyMapper companyMapper; @Autowired private UserMapper userMapper; @Autowired private UserCompanyMapper userCompanyMapper; @Autowired private UserProjectMapper userProjectMapper; @Autowired private ActivityMapper activityMapper; @Autowired private ProjectMapper projectMapper; @Autowired private AccountConfigure configurer; @Autowired private SessionService session; @Autowired private InvitationManager invitationManager; @Autowired private TemplateEngineService templateEngineService; @Autowired private EmailService emailService; @Autowired private UserService userService; // private static final String INVITE_TEMPLATE = "com/onboard/service/account/vm/invitation.vm"; @Override public void sendInvitation(int companyId, String email) { sendInvitation(companyId, email, null); } @Override public void sendInvitation(int companyId, String email, List<Project> projects) { User user = userService.getUserByEmail(email); // 用户已经在团队中,直接加入项目即可 if (user != null && userService.isUserInCompany(user.getId(), companyId) && projects != null) { for (Project p : projects) { if (userService.isUserInProject(user.getId(), companyId, p.getId())) { continue; } UserProject userProject = new UserProject(); userProject.setUserId(user.getId()); userProject.setProjectId(p.getId()); userProject.setCompanyId(companyId); userProjectMapper.insert(userProject); } return; } // 检查是否曾经发出邀请 String token; Invitation invitation = invitationManager.getExistInvitationByEmail(companyId, email); if (invitation == null) { token = UUID.randomUUID().toString(); invitation = invitationManager.insertInvitation(companyId, email, token); } else { token = invitation.getToken(); invitationManager.updateInvitationDate(invitation); } Map<String, Object> model = new HashMap<String, Object>(); model.put("invitor", session.getCurrentUser()); model.put("host", configurer.getProtocol() + configurer.getHost()); model.put("company", companyMapper.selectByPrimaryKey(companyId)); model.put("token", token); model.put("projects", invitationManager.addInvitationProjects(invitation, projects)); String text = templateEngineService.process(getClass(), INVITATION_TPL, model); emailService.sendEmail(session.getCurrentUser().getName(), email, null, null, "您被邀请加入OnBoard", text, null); } @Override public String authenticateInvitation(int companyId, String token) { Invitation invitation = invitationManager.getExistInvitationByToken(companyId, token); return invitation == null && invitationManager.isInvitationExpired(invitation) ? null : invitation.getEmail(); } /** * 当把一个用户加入到项目时,产生一条Activity信息 * */ @Override public void addActivityInfo(User user, int projectId) { Project project = projectMapper.selectByPrimaryKey(projectId); Activity activity = new Activity(); activity.setCreated(new Date()); activity.setCompanyId(project.getCompanyId()); activity.setAttachId(project.getCompanyId()); activity.setAttachType(project.getType()); activity.setProjectId(project.getId()); activity.setProjectName(project.getName()); activity.setAction(JOIN_ACTION); activity.setCreatorId(user.getId()); activity.setCreatorName(user.getName()); activity.setSubject(ACTIVITY_INFO); activity.setCreatorAvatar(user.getAvatar()); activity.setTarget(project.getName()); activityMapper.insert(activity); } @Override public void completeInvitation(int companyId, User user, String token) { Invitation invitation = invitationManager.getExistInvitationByToken(companyId, token); if (invitation == null) { throw new RuntimeException("token invalid"); } // if user is an InvitationRegistrationForm if (user.getId() == null) { user.setActivated(true); user.setEmail(invitation.getEmail()); user.setCreated(new Date()); user.setUpdated(user.getCreated()); user.setNewPassword(PasswordUtils.createPassword(user.getPassword(), user.getCreated().toString())); userMapper.insertSelective(user); } if (!userService.isUserInCompany(user.getId(), companyId)) { UserCompany userCompany = new UserCompany(); userCompany.setUserId(user.getId()); userCompany.setCompanyId(companyId); userCompanyMapper.insert(userCompany); } List<InvitationProjects> ips = invitationManager.getInvitationProjectsByInvitationId(invitation.getId()); for (InvitationProjects ip : ips) { UserProject userProject = new UserProject(); userProject.setUserId(user.getId()); userProject.setProjectId(ip.getProjectId()); userProject.setCompanyId(companyId); userProjectMapper.insert(userProject); this.addActivityInfo(user, ip.getProjectId()); } invitationManager.deleteInvitationById(invitation.getId()); } @Override public List<Invitation> getAllInvitations(int companyId) { Invitation sample = new Invitation(); sample.setCompanyId(companyId); return invitationManager.getInvitationsBySample(sample); } @Override public Invitation getInvitationById(int id) { return invitationManager.getInvitationById(id); } @Override public void deleteInvitationById(int id) { invitationManager.deleteInvitationById(id); } }