package com.TinyPro.service.imp;
import com.TinyPro.entity.dto.CreatePermissionDto;
import com.TinyPro.entity.dto.UpdatePermissionDto;
import com.TinyPro.entity.page.PageWrapper;
import com.TinyPro.entity.po.Permission;
import com.TinyPro.entity.po.Role;
import com.TinyPro.entity.vo.PermissionVo;
import com.TinyPro.exception.BusinessException;
import com.TinyPro.service.IPermissionService;
import com.TinyPro.jpa.IPermissionRepository;
import jakarta.persistence.criteria.CriteriaBuilder;
import jakarta.persistence.criteria.Predicate;
import jakarta.persistence.criteria.Root;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
@Service
public class IPermissionServiceImpl implements IPermissionService {
@Autowired
private IPermissionRepository iPermissionRepository;
@Override
public ResponseEntity<PermissionVo> create(CreatePermissionDto createPermissionDto, boolean isInit) {
PermissionVo result = new PermissionVo();
String name = createPermissionDto.getName();
String desc = createPermissionDto.getDesc();
Optional<Permission> existingPermission = iPermissionRepository.findByName(name);
if (isInit && existingPermission.isPresent()) {
BeanUtils.copyProperties(existingPermission.get(), result);
return ResponseEntity.ok(result);
}
if (existingPermission.isPresent() && !isInit) {
throw new BusinessException("exception.permission.exists", HttpStatus.BAD_REQUEST, null);
}
Permission newPermission = new Permission();
newPermission.setName(name);
newPermission.setDesc(desc);
Permission save = iPermissionRepository.save(newPermission);
BeanUtils.copyProperties(save, result);
return ResponseEntity.ok(result);
}
@Override
public ResponseEntity<PermissionVo> updatePermission(UpdatePermissionDto updatePermissionDto) {
PermissionVo result = new PermissionVo();
Integer id = updatePermissionDto.getId();
String name = updatePermissionDto.getName();
String desc = updatePermissionDto.getDesc();
Permission permission = iPermissionRepository.findById(Long.valueOf(id))
.orElseThrow(() -> new BusinessException("exception.permission.notExists", HttpStatus.NOT_FOUND, null));
permission.setName(name);
permission.setDesc(desc);
Permission save = iPermissionRepository.save(permission);
BeanUtils.copyProperties(save, result);
return ResponseEntity.ok(result);
}
@Override
public ResponseEntity<PageWrapper<PermissionVo>> findPermissions(Integer page, Integer limit, String name) {
boolean unlimited = limit == null || limit <= 0;
Pageable pageable = unlimited ?
Pageable.unpaged() :
PageRequest.of(page == null || page <= 0 ? 0 : page - 1, limit);
Page<Permission> permissionPage;
Specification<Permission> spec = (root, query, cb) -> {
List<Predicate> predicates = new ArrayList<>();
if (StringUtils.isNotEmpty(name)) {
Predicate namePreidcate = buildLikePredicate(root, cb, "name", name);
predicates.add(namePreidcate);
}
return cb.and(predicates.toArray(new Predicate[0]));
};
permissionPage = iPermissionRepository.findAll(spec, pageable);
List<PermissionVo> permissionVoList = permissionPage.getContent()
.stream()
.map(permission -> {
PermissionVo vo = new PermissionVo();
vo.setId(permission.getId());
vo.setName(permission.getName());
vo.setDesc(permission.getDesc());
return vo;
})
.collect(Collectors.toList());
Page<PermissionVo> result = new PageImpl<>(
permissionVoList,
pageable,
permissionPage.getTotalElements()
);
return ResponseEntity.ok(PageWrapper.of(result));
}
@Override
public ResponseEntity<CreatePermissionDto> delPermission(Integer id) {
CreatePermissionDto result = new CreatePermissionDto();
Permission permission = iPermissionRepository.findById(Long.valueOf(id))
.orElseThrow(() -> new BusinessException("exception.permission.notExists",HttpStatus.NOT_FOUND,null));
iPermissionRepository.deleteRolePermissionByPermissionId(permission.getId().longValue());
iPermissionRepository.delete(permission);
BeanUtils.copyProperties(permission, result);
return ResponseEntity.ok(result);
}
@Override
public List<Permission> findAllPermission() {
return iPermissionRepository.findAll();
}
private Predicate buildLikePredicate(Root<Permission> root, CriteriaBuilder cb, String field, String input) {
if (input.contains("%")) {
if (input.startsWith("%") && input.endsWith("%")) {
String value = input.substring(1, input.length() - 1);
return cb.like(root.get(field), "%" + value + "%");
} else if (input.startsWith("%")) {
String value = input.substring(1);
return cb.like(root.get(field), "%" + value);
} else if (input.endsWith("%")) {
String value = input.substring(0, input.length() - 1);
return cb.like(root.get(field), value + "%");
} else {
return cb.like(root.get(field), input);
}
} else {
return cb.equal(root.get(field), input);
}
}
}