package com.mossle.user.web.dev;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import com.mossle.api.store.StoreConnector;
import com.mossle.api.tenant.TenantHolder;
import com.mossle.api.user.UserCache;
import com.mossle.api.user.UserDTO;
import com.mossle.core.auth.CustomPasswordEncoder;
import com.mossle.core.export.Exportor;
import com.mossle.core.mapper.BeanMapper;
import com.mossle.core.page.Page;
import com.mossle.core.query.PropertyFilter;
import com.mossle.core.spring.MessageHelper;
import com.mossle.user.persistence.domain.AccountAvatar;
import com.mossle.user.persistence.domain.AccountCredential;
import com.mossle.user.persistence.domain.AccountInfo;
import com.mossle.user.persistence.domain.PersonInfo;
import com.mossle.user.persistence.manager.AccountAvatarManager;
import com.mossle.user.persistence.manager.AccountCredentialManager;
import com.mossle.user.persistence.manager.AccountInfoManager;
import com.mossle.user.persistence.manager.PersonInfoManager;
import com.mossle.user.publish.UserPublisher;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
@Controller
@RequestMapping("user/dev")
public class AccountController {
private AccountInfoManager accountInfoManager;
private AccountCredentialManager accountCredentialManager;
private AccountAvatarManager accountAvatarManager;
private PersonInfoManager personInfoManager;
private UserCache userCache;
private MessageHelper messageHelper;
private Exportor exportor;
private BeanMapper beanMapper = new BeanMapper();
private CustomPasswordEncoder customPasswordEncoder;
private StoreConnector storeConnector;
private UserPublisher userPublisher;
private TenantHolder tenantHolder;
@RequestMapping("list")
public String list(@ModelAttribute Page page,
@RequestParam Map<String, Object> parameterMap, Model model) {
String tenantId = tenantHolder.getTenantId();
List<PropertyFilter> propertyFilters = PropertyFilter
.buildFromMap(parameterMap);
propertyFilters.add(new PropertyFilter("EQS_tenantId", tenantId));
page = accountInfoManager.pagedQuery(page, propertyFilters);
model.addAttribute("page", page);
return "user/dev/list";
}
@RequestMapping("remove")
public String remove(@RequestParam("selectedItem") List<Long> selectedItem,
RedirectAttributes redirectAttributes) {
String tenantId = tenantHolder.getTenantId();
List<AccountInfo> accountInfos = accountInfoManager
.findByIds(selectedItem);
for (AccountInfo accountInfo : accountInfos) {
for (AccountCredential accountCredential : accountInfo
.getAccountCredentials()) {
accountCredentialManager.remove(accountCredential);
}
for (AccountAvatar accountAvatar : accountInfo.getAccountAvatars()) {
accountAvatarManager.remove(accountAvatar);
}
accountInfoManager.remove(accountInfo);
UserDTO userDto = new UserDTO();
userDto.setId(Long.toString(accountInfo.getId()));
userDto.setUsername(accountInfo.getUsername());
userDto.setRef(accountInfo.getCode());
userDto.setUserRepoRef(tenantId);
userCache.removeUser(userDto);
userPublisher.notifyUserRemoved(this.convertUserDto(accountInfo));
}
messageHelper.addFlashMessage(redirectAttributes,
"core.success.delete", "删除成功");
return "redirect:/user/dev/list.do";
}
@RequestMapping("account-info-checkUsername")
@ResponseBody
public boolean checkUsername(@RequestParam("username") String username,
@RequestParam(value = "id", required = false) Long id)
throws Exception {
String tenantId = tenantHolder.getTenantId();
String hql = "from AccountInfo where username=? and tenantId=?";
Object[] params = { username, tenantId };
if (id != null) {
hql = "from AccountInfo where username=? and tenantId=? and id<>?";
params = new Object[] { username, tenantId, id };
}
boolean result = accountInfoManager.findUnique(hql, params) == null;
return result;
}
@RequestMapping("import-view")
public String importView() throws Exception {
return "user/dev/import-view";
}
@RequestMapping("import-save")
public String importSave(@RequestParam("text") String text, Model model) {
String tenantId = tenantHolder.getTenantId();
List<Map<String, String>> list = new ArrayList<Map<String, String>>();
for (String line : text.split("\n")) {
if (StringUtils.isBlank(line)) {
continue;
}
String[] array = line.split("\t");
String username = array[0];
String displayName = array[1];
String mobile = array[2];
String email = array[3];
Map<String, String> map = new HashMap<String, String>();
map.put("username", username);
map.put("displayName", displayName);
map.put("mobile", mobile);
map.put("email", email);
list.add(map);
AccountInfo accountInfo = accountInfoManager.findUnique(
"from AccountInfo where username=? and tenantId=?",
username, tenantId);
if (accountInfo != null) {
map.put("result", "ERROR : username exists");
continue;
}
PersonInfo personInfo = null;
personInfo = personInfoManager.findUnique(
"from PersonInfo where cellphone=? and tenantId=?", mobile,
tenantId);
if (personInfo != null) {
map.put("result", "ERROR : mobile exists");
continue;
}
personInfo = personInfoManager.findUnique(
"from PersonInfo where email=? and tenantId=?", email,
tenantId);
if (personInfo != null) {
map.put("result", "ERROR : email exists");
continue;
}
accountInfo = new AccountInfo();
accountInfo.setUsername(username);
accountInfo.setDisplayName(displayName);
accountInfo.setStatus("active");
accountInfo.setCreateTime(new Date());
accountInfo.setTenantId(tenantId);
accountInfoManager.save(accountInfo);
accountInfo.setCode(Long.toString(accountInfo.getId()));
accountInfoManager.save(accountInfo);
personInfo = new PersonInfo();
personInfo.setCode(accountInfo.getCode());
personInfo.setUsername(username);
personInfo.setCellphone(mobile);
personInfo.setEmail(email);
personInfo.setTenantId(tenantId);
personInfoManager.save(personInfo);
map.put("result", "SUCCESS");
}
model.addAttribute("list", list);
return "user/dev/import-result";
}
public UserDTO convertUserDto(AccountInfo accountInfo) {
String hql = "from PersonInfo where code=? and tenantId=?";
PersonInfo personInfo = personInfoManager.findUnique(hql,
accountInfo.getCode(), accountInfo.getTenantId());
UserDTO userDto = new UserDTO();
userDto.setId(Long.toString(accountInfo.getId()));
userDto.setUsername(accountInfo.getUsername());
userDto.setDisplayName(accountInfo.getDisplayName());
userDto.setNickName(accountInfo.getNickName());
userDto.setUserRepoRef(accountInfo.getTenantId());
if (personInfo != null) {
userDto.setEmail(personInfo.getEmail());
userDto.setMobile(personInfo.getCellphone());
}
return userDto;
}
// ~ ======================================================================
@Resource
public void setAccountInfoManager(AccountInfoManager accountInfoManager) {
this.accountInfoManager = accountInfoManager;
}
@Resource
public void setAccountCredentialManager(
AccountCredentialManager accountCredentialManager) {
this.accountCredentialManager = accountCredentialManager;
}
@Resource
public void setAccountAvatarManager(
AccountAvatarManager accountAvatarManager) {
this.accountAvatarManager = accountAvatarManager;
}
@Resource
public void setPersonInfoManager(PersonInfoManager personInfoManager) {
this.personInfoManager = personInfoManager;
}
@Resource
public void setUserCache(UserCache userCache) {
this.userCache = userCache;
}
@Resource
public void setMessageHelper(MessageHelper messageHelper) {
this.messageHelper = messageHelper;
}
@Resource
public void setCustomPasswordEncoder(
CustomPasswordEncoder customPasswordEncoder) {
this.customPasswordEncoder = customPasswordEncoder;
}
@Resource
public void setExportor(Exportor exportor) {
this.exportor = exportor;
}
@Resource
public void setStoreConnector(StoreConnector storeConnector) {
this.storeConnector = storeConnector;
}
@Resource
public void setUserPublisher(UserPublisher userPublisher) {
this.userPublisher = userPublisher;
}
@Resource
public void setTenantHolder(TenantHolder tenantHolder) {
this.tenantHolder = tenantHolder;
}
}