package com.zy.acs.fake.service.impl; 
 | 
  
 | 
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 
 | 
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 
 | 
import com.zy.acs.common.utils.GsonUtils; 
 | 
import com.zy.acs.fake.entity.Config; 
 | 
import com.zy.acs.fake.enums.ConfigType; 
 | 
import com.zy.acs.fake.mapper.ConfigMapper; 
 | 
import com.zy.acs.fake.service.ConfigService; 
 | 
import com.zy.acs.framework.common.DateUtils; 
 | 
import org.springframework.stereotype.Service; 
 | 
  
 | 
import java.util.Date; 
 | 
import java.util.List; 
 | 
  
 | 
/** 
 | 
 * Created by vincent on 8/30/2024 
 | 
 */ 
 | 
@Service("configService") 
 | 
public class ConfigServiceImpl extends ServiceImpl<ConfigMapper, Config> implements ConfigService { 
 | 
  
 | 
    @Override 
 | 
    @SuppressWarnings("unchecked") 
 | 
    public <T> T getVal(String key, Class<T> clazz) { 
 | 
        List<Config> list = this.list(new LambdaQueryWrapper<Config>().eq(Config::getFlag, key)); 
 | 
        Config config = list.stream().findFirst().orElse(null); 
 | 
        if (null == config) { 
 | 
            return null; 
 | 
        } 
 | 
        String val = config.getVal(); 
 | 
        switch (ConfigType.query(config.getType())) { 
 | 
            case BOOLEAN: 
 | 
                if (val.equals("1") || val.trim().toUpperCase().equals("TRUE")) { 
 | 
                    return (T) Boolean.TRUE; 
 | 
                } 
 | 
                return (T) Boolean.FALSE; 
 | 
            case NUMBER: 
 | 
                if (clazz == Integer.class) { 
 | 
                    return (T) Integer.valueOf(val); 
 | 
                } else if (clazz == Short.class) { 
 | 
                    return (T) Short.valueOf(val); 
 | 
                } else if (clazz == Long.class) { 
 | 
                    return (T) Long.valueOf(val); 
 | 
                } else if (clazz == Double.class) { 
 | 
                    return (T) Double.valueOf(val); 
 | 
                } 
 | 
                throw new UnsupportedOperationException("Unsupported type: " + clazz.getName()); 
 | 
            case STRING: 
 | 
                return (T) val; 
 | 
            case JSON: 
 | 
                return GsonUtils.fromJson(val, clazz); 
 | 
            case DATE: 
 | 
                return (T) DateUtils.convert(val); 
 | 
            default: 
 | 
                return null; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public <T> boolean setVal(String key, T val) { 
 | 
        List<Config> list = this.list(new LambdaQueryWrapper<Config>().eq(Config::getFlag, key)); 
 | 
        Config config = list.stream().findFirst().orElse(null); 
 | 
        if (config == null) { 
 | 
            return false; 
 | 
        } 
 | 
        ConfigType configType = ConfigType.query(config.getType()); 
 | 
        switch (configType) { 
 | 
            case BOOLEAN: 
 | 
                if (!(val instanceof Boolean)) { 
 | 
                    throw new IllegalArgumentException("Expected Boolean value for key: " + key); 
 | 
                } 
 | 
                config.setVal((Boolean) val ? "TRUE" : "FALSE"); 
 | 
                break; 
 | 
            case NUMBER: 
 | 
                if (val instanceof Integer || val instanceof Short || val instanceof Long || val instanceof Double) { 
 | 
                    config.setVal(String.valueOf(val)); 
 | 
                } else { 
 | 
                    throw new IllegalArgumentException("Expected a numeric value for key: " + key); 
 | 
                } 
 | 
                break; 
 | 
            case STRING: 
 | 
                if (!(val instanceof String)) { 
 | 
                    throw new IllegalArgumentException("Expected a String value for key: " + key); 
 | 
                } 
 | 
                config.setVal((String) val); 
 | 
                break; 
 | 
            case JSON: 
 | 
                config.setVal(GsonUtils.toJson(val)); 
 | 
                break; 
 | 
            case DATE: 
 | 
                if (!(val instanceof Date)) { 
 | 
                    throw new IllegalArgumentException("Expected a Date value for key: " + key); 
 | 
                } 
 | 
                config.setVal(DateUtils.convert((Date) val)); 
 | 
                break; 
 | 
            default: 
 | 
                throw new UnsupportedOperationException("Unsupported ConfigType: " + configType); 
 | 
        } 
 | 
  
 | 
        return this.updateById(config); 
 | 
    } 
 | 
  
 | 
} 
 |