package com.app.mvc.acl.service;
import com.app.mvc.acl.convert.AclConvert;
import com.app.mvc.acl.convert.BaseConvert;
import com.app.mvc.acl.dao.SysAclDao;
import com.app.mvc.acl.domain.SysAcl;
import com.app.mvc.acl.vo.AclPara;
import com.app.mvc.beans.PageQuery;
import com.app.mvc.beans.PageResult;
import com.app.mvc.exception.ParaException;
import com.app.mvc.util.DateTimeUtil;
import com.google.common.base.Preconditions;
import lombok.extern.slf4j.Slf4j;
import org.joda.time.DateTime;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
* Created by jimin on 16/1/18.
*/
@Slf4j
@Service
public class SysAclService implements SysService {
@Resource
private SysAclDao sysAclDao;
@Resource
private SysLogService sysLogService;
/**
* 新增权限点
*/
public void save(AclPara para) {
BaseConvert.checkPara(para);
SysAcl acl = AclConvert.of(para);
if (checkExist(para.getAclModuleId(), para.getName(), null)) {
throw new ParaException("当前模块下存在相同名称的权限点");
}
acl.setCode(buildCode());
sysAclDao.save(acl);
sysLogService.saveAclLog(null, acl);
}
/**
* 更新权限点
*/
public void update(AclPara para) {
BaseConvert.checkPara(para);
SysAcl before = sysAclDao.findById(para.getId());
Preconditions.checkNotNull(before, "待更新权限点不存在");
if (checkExist(para.getAclModuleId(), para.getName(), para.getId())) {
throw new ParaException("当前模块下存在相同名称的权限点");
}
SysAcl after = AclConvert.of(para);
sysAclDao.update(after);
sysLogService.saveAclLog(before, after);
}
private String buildCode() {
return DateTimeUtil.allFrom(DateTime.now()) + "_" + (int) (Math.random() * 100);
}
/**
* 校验指定模块下是否存在指定名称的权限点
*
* @param aclModuleId 权限模块id
* @param name 权限点名称
* @param id 待排除的权限点id, 更新时要忽略掉自己
* @return
*/
private boolean checkExist(int aclModuleId, String name, Integer id) {
return sysAclDao.countByNameAndAclModuleId(aclModuleId, name, id) > 0;
}
/**
* 分页获取权限点列表
*/
public PageResult<SysAcl> getPageByAclModuleId(int aclModuleId, PageQuery page) {
BaseConvert.checkPara(page);
int count = sysAclDao.countByAclModuleId(aclModuleId);
if (count > 0) {
List<SysAcl> list = sysAclDao.getPageByAclModuleId(aclModuleId, page);
return PageResult.<SysAcl>builder().total(count).data(list).build();
} else {
return PageResult.<SysAcl>builder().build();
}
}
public SysAcl findById(int id) {
return sysAclDao.findById(id);
}
@Override
public void recover(int targetId, Object o) {
SysAcl acl = (SysAcl) o;
Preconditions.checkNotNull(acl, "还原前的权限点为空,无法还原");
SysAcl before = sysAclDao.findById(targetId);
Preconditions.checkNotNull(before, "待还原的权限点不存在");
if (checkExist(acl.getAclModuleId(), acl.getName(), acl.getId())) {
throw new ParaException("当前模块下存在相同名称的权限点");
}
sysAclDao.update(acl);
sysLogService.saveAclLog(before, acl);
}
/**
* 根据url获取能正则匹配到的权限点列表
*/
public List<SysAcl> getByUrlRegexp(String url) {
Preconditions.checkNotNull(url, "url不可以为空");
return sysAclDao.getByUrlRegexp(url);
}
}