@@ -20,6 +20,10 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper ;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page ;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl ;
import com.fasterxml.jackson.databind.ObjectMapper ;
import jakarta.annotation.Resource ;
import lombok.extern.slf4j.Slf4j ;
import org.nl.tool.mock.core.handle.MockCacheService ;
import org.springframework.stereotype.Service ;
import org.springframework.transaction.annotation.Transactional ;
import org.nl.common.enums.CommonSortOrderEnum ;
@@ -42,9 +46,19 @@ import java.util.Optional;
* @author liyongde
* @date 2026/01/28 17:50
**/
@Slf4j
@Service
public class MockConfigServiceImpl extends ServiceImpl < MockConfigMapper , MockConfig > implements MockConfigService {
@Resource
private MockCacheService cacheService ;
private final ObjectMapper objectMapper ;
public MockConfigServiceImpl ( ObjectMapper objectMapper ) {
this . objectMapper = objectMapper ;
}
@Override
public Page < MockConfig > page ( MockConfigPageParam mockConfigPageParam ) {
QueryWrapper < MockConfig > queryWrapper = new QueryWrapper < MockConfig > ( ) . checkSqlInjection ( ) ;
@@ -71,6 +85,8 @@ public class MockConfigServiceImpl extends ServiceImpl<MockConfigMapper, MockCon
@Override
public void add ( MockConfigAddParam mockConfigAddParam ) {
MockConfig mockConfig = BeanUtil . toBean ( mockConfigAddParam , MockConfig . class ) ;
// 更新缓存
cacheService . put ( mockConfig . getCacheKey ( ) , mockConfig ) ;
this . save ( mockConfig ) ;
}
@@ -78,13 +94,33 @@ public class MockConfigServiceImpl extends ServiceImpl<MockConfigMapper, MockCon
@Override
public void edit ( MockConfigEditParam mockConfigEditParam ) {
MockConfig mockConfig = this . queryEntity ( mockConfigEditParam . getId ( ) ) ;
// 记录旧的缓存键(如果路径或方法被更新,需要失效旧缓存)
String oldCacheKey = mockConfig . getCacheKey ( ) ;
// 验证JSON格式( 如果提供)
if ( mockConfigEditParam . getResponseJson ( ) ! = null ) {
validateJson ( mockConfigEditParam . getResponseJson ( ) ) ;
}
// 如果路径或方法改变了,也要失效新的缓存键
String newCacheKey = mockConfigEditParam . getCacheKey ( ) ;
if ( ! oldCacheKey . equals ( newCacheKey ) ) {
cacheService . invalidate ( newCacheKey ) ;
}
BeanUtil . copyProperties ( mockConfigEditParam , mockConfig ) ;
// 更新缓存
cacheService . put ( newCacheKey , mockConfig ) ;
this . updateById ( mockConfig ) ;
}
@Transactional ( rollbackFor = Exception . class )
@Override
public void delete ( List < MockConfigIdParam > mockConfigIdParamList ) {
for ( MockConfigIdParam configIdParam : mockConfigIdParamList ) {
MockConfig mockConfig = this . queryEntity ( configIdParam . getId ( ) ) ;
// 失效缓存
cacheService . invalidate ( mockConfig . getCacheKey ( ) ) ;
}
// 执行删除
this . removeByIds ( CollStreamUtil . toList ( mockConfigIdParamList , MockConfigIdParam : : getId ) ) ;
}
@@ -110,4 +146,25 @@ public class MockConfigServiceImpl extends ServiceImpl<MockConfigMapper, MockCon
. eq ( MockConfig : : getApiMethod , apiMethod ) ;
return Optional . ofNullable ( getOne ( wrapper ) ) ;
}
/**
* 验证JSON格式
*
* @param json JSON字符串
* @throws IllegalArgumentException 如果JSON格式无效
*/
private void validateJson ( String json ) {
if ( json = = null | | json . trim ( ) . isEmpty ( ) ) {
log . error ( " JSON string is null or empty " ) ;
throw new IllegalArgumentException ( " Response JSON cannot be null or empty " ) ;
}
try {
objectMapper . readTree ( json ) ;
log . debug ( " JSON validation passed " ) ;
} catch ( Exception e ) {
log . error ( " Invalid JSON format: {} " , e . getMessage ( ) ) ;
throw new IllegalArgumentException ( " Invalid JSON format: " + e . getMessage ( ) , e ) ;
}
}
}