package cc.mrbird.febs.gateway.enhance.service.impl; import cc.mrbird.febs.common.core.entity.QueryRequest; import cc.mrbird.febs.common.core.entity.constant.StringConstant; import cc.mrbird.febs.common.core.utils.DateUtil; import cc.mrbird.febs.gateway.enhance.entity.BlackList; import cc.mrbird.febs.gateway.enhance.mapper.BlackListMapper; import cc.mrbird.febs.gateway.enhance.service.BlackListService; import cc.mrbird.febs.gateway.enhance.service.RouteEnhanceCacheService; import cc.mrbird.febs.gateway.enhance.utils.AddressUtil; import cc.mrbird.febs.gateway.enhance.utils.PageableExecutionUtil; import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.ReactiveMongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.stereotype.Service; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import java.time.LocalDateTime; import java.util.Arrays; /** * @author MrBird */ @Service @RequiredArgsConstructor public class BlackListServiceImpl implements BlackListService { private final RouteEnhanceCacheService routeEnhanceCacheService; private BlackListMapper blackListMapper; private ReactiveMongoTemplate template; @Autowired(required = false) public void setBlackListMapper(BlackListMapper blackListMapper) { this.blackListMapper = blackListMapper; } @Autowired(required = false) public void setTemplate(ReactiveMongoTemplate template) { this.template = template; } @Override public Flux findAll() { return blackListMapper.findAll(); } @Override public Mono create(BlackList blackList) { blackList.setCreateTime(DateUtil.formatFullTime(LocalDateTime.now(), DateUtil.FULL_TIME_SPLIT_PATTERN)); if (StringUtils.isNotBlank(blackList.getIp())) { blackList.setLocation(AddressUtil.getCityInfo(blackList.getIp())); } return blackListMapper.insert(blackList).doOnSuccess(b -> routeEnhanceCacheService.saveBlackList(blackList)); } @Override public Mono update(BlackList blackList) { return this.blackListMapper.findById(blackList.getId()) .flatMap(b -> { routeEnhanceCacheService.removeBlackList(b); BeanUtils.copyProperties(blackList, b); return this.blackListMapper.save(b); }).doOnSuccess(routeEnhanceCacheService::saveBlackList); } @Override public Flux delete(String ids) { String[] idArray = StringUtils.splitByWholeSeparatorPreserveAllTokens(ids, StringConstant.COMMA); return blackListMapper.deleteByIdIn(Arrays.asList(idArray)) .doOnNext(routeEnhanceCacheService::removeBlackList); } @Override public Flux findPages(QueryRequest request, BlackList blackList) { Query query = getQuery(blackList); return PageableExecutionUtil.getPages(query, request, BlackList.class, template); } @Override public Mono findCount(BlackList blackList) { Query query = getQuery(blackList); return template.count(query, BlackList.class); } @Override public Flux findByCondition(String ip, String requestUri, String requestMethod) { if (StringUtils.isBlank(ip)) { return blackListMapper.findByRequestUriAndRequestMethod(requestUri, requestMethod); } return blackListMapper.findByIpAndRequestUriAndRequestMethod(ip, requestUri, requestMethod); } private Query getQuery(BlackList blackList) { Query query = new Query(); Criteria criteria = new Criteria(); if (StringUtils.isNotBlank(blackList.getIp())) { criteria.and("ip").is(blackList.getIp()); } if (StringUtils.isNotBlank(blackList.getRequestUri())) { criteria.and("requestUri").is(blackList.getRequestUri()); } if (StringUtils.isNotBlank(blackList.getRequestMethod())) { criteria.and("requestMethod").is(blackList.getRequestMethod()); } if (StringUtils.isNotBlank(blackList.getStatus())) { criteria.and("status").is(blackList.getStatus()); } query.addCriteria(criteria); return query; } }