package com.central.oauth.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.central.common.constant.CommonConstant;
import com.central.common.lock.DistributedLock;
import com.central.common.redis.template.RedisRepository;
import com.central.common.constant.SecurityConstants;
import com.central.common.model.PageResult;
import com.central.common.model.Result;
import com.central.common.service.impl.SuperServiceImpl;
import com.central.oauth.mapper.ClientMapper;
import com.central.oauth.model.Client;
import com.central.oauth.service.IClientService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.MapUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
/**
* @author zlt
*
* Blog: https://zlt2000.gitee.io
* Github: https://github.com/zlt2000
*/
@Slf4j
@Service
public class ClientServiceImpl extends SuperServiceImpl implements IClientService {
private final static String LOCK_KEY_CLIENTID = "clientId:";
@Autowired
private RedisRepository redisRepository;
@Autowired
private PasswordEncoder passwordEncoder;
@Autowired
private DistributedLock lock;
@Override
public Result saveClient(Client client) throws Exception {
client.setClientSecret(passwordEncoder.encode(client.getClientSecretStr()));
String clientId = client.getClientId();
super.saveOrUpdateIdempotency(client, lock
, LOCK_KEY_CLIENTID+clientId
, new QueryWrapper().eq("client_id", clientId)
, clientId + "已存在");
return Result.succeed("操作成功");
}
@Override
public PageResult listClient(Map params, boolean isPage) {
Page page;
if (isPage) {
page = new Page<>(MapUtils.getInteger(params, "page"), MapUtils.getInteger(params, "limit"));
} else {
page = new Page<>(1, -1);
}
List list = baseMapper.findList(page, params);
page.setRecords(list);
return PageResult.builder().data(list).code(0).count(page.getTotal()).build();
}
@Override
public void delClient(long id) {
String clientId = baseMapper.selectById(id).getClientId();
baseMapper.deleteById(id);
redisRepository.del(clientRedisKey(clientId));
}
private String clientRedisKey(String clientId) {
return SecurityConstants.CACHE_CLIENT_KEY + ":" + clientId;
}
}