From 20e0c1036ebc6d558e57644b770b9c9de8bcf383 Mon Sep 17 00:00:00 2001
From: KKSU <15274802129@163.com>
Date: Thu, 23 Jan 2025 14:16:39 +0800
Subject: [PATCH] refactor(mall): 重构商品相关操作的验证逻辑

---
 src/main/java/cc/mrbird/febs/common/utils/ValidateEntityUtils.java |  152 +++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 149 insertions(+), 3 deletions(-)

diff --git a/src/main/java/cc/mrbird/febs/common/utils/ValidateEntityUtils.java b/src/main/java/cc/mrbird/febs/common/utils/ValidateEntityUtils.java
index 1501a44..83a8b90 100644
--- a/src/main/java/cc/mrbird/febs/common/utils/ValidateEntityUtils.java
+++ b/src/main/java/cc/mrbird/febs/common/utils/ValidateEntityUtils.java
@@ -3,8 +3,11 @@
 import cc.mrbird.febs.common.exception.FebsException;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
 
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Objects;
 
 /**
@@ -13,7 +16,130 @@
 public class ValidateEntityUtils {
 
     /**
-     * 确保指定列的值在数据库中是存在的,
+     * 确保指定列的有效性,并返回相应的实体对象
+     *      selectOne方法
+     *      此方法用于验证数据库中某列的值是否存在,并返回包含该值的实体对象
+     *      如果指定的值不存在或为null,将抛出异常
+     *
+     * @param valueToCheck 需要验证的值
+     * @param columnExtractor 列值提取器,用于指定需要验证的列
+     * @param queryWrapperExtractor 查询包装器提取器,用于执行数据库查询
+     * @param errMsg 错误消息格式字符串
+     * @param columnExtractors 可变参数(varargs)查询字段,可选,如果没有就是查询全部
+     * @param <T> 实体类类型
+     * @param <R> 列值类型
+     * @param <V> 需要验证的值的类型
+     * @return 返回包含指定列值的实体对象
+     * @throws IllegalArgumentException 如果需要验证的值为null
+     * @throws FebsException 如果查询结果为空或列值为null,或查询过程中发生异常
+     */
+    public static <T, R, V> T ensureColumnReturnEntity(
+            V valueToCheck,
+            SFunction<T, R> columnExtractor,
+            SFunction<LambdaQueryWrapper<T>, T> queryWrapperExtractor,
+            String errMsg,
+            SFunction<T, R>... columnExtractors) {
+
+        // 检查输入参数是否为null
+        if (valueToCheck == null) {
+            throw new IllegalArgumentException("The value to check cannot be null while ensureColumnReturnEntity column");
+        }
+        if (columnExtractor == null || queryWrapperExtractor == null) {
+            throw new IllegalArgumentException("Column extractor and query wrapper extractor cannot be null while ensureColumnReturnEntity column");
+        }
+
+        T entity = null;
+        try {
+            // 创建LambdaQueryWrapper并配置查询条件
+            LambdaQueryWrapper<T> wrapper = Wrappers.lambdaQuery();
+            if (columnExtractors != null && columnExtractors.length > 0) {
+                wrapper.select(columnExtractors);
+            }
+            wrapper.eq(columnExtractor, valueToCheck)
+                    .last("limit 1");
+
+            // 执行查询并获取结果实体
+            entity = queryWrapperExtractor.apply(wrapper);
+
+            // 如果查询结果为空,则抛出异常
+            if (entity == null) {
+                throw new FebsException(StrUtil.format(errMsg, valueToCheck));
+            }
+
+            // 提取查询结果中的列值
+            R columnValue = columnExtractor.apply(entity);
+            // 如果列值为null,则抛出异常
+            if (columnValue == null) {
+                throw new FebsException(StrUtil.format(errMsg, valueToCheck));
+            }
+
+        } catch (FebsException e) {
+            // 记录异常日志
+            throw e;
+        } catch (Exception e) {
+            // 记录异常日志
+            throw new FebsException(StrUtil.format("An error occurred while ensuring column return entity: {}", valueToCheck));
+        }
+
+        // 返回查询到的实体类对象
+        return entity;
+    }
+
+    /**
+     * 确保指定列的有效性,并返回相应的实体对象列表
+     *      selectList方法
+     *      此方法用于验证数据库中某列的值是否存在,并返回包含该值的实体对象列表
+     *      如果指定的值不存在或为null,将抛出异常
+     *
+     * @param valueToCheck 需要验证的值
+     * @param columnExtractor 列值提取器,用于指定需要验证的列
+     * @param queryWrapperExtractor 查询包装器提取器,用于执行数据库查询
+     * @param errMsg 错误消息格式字符串
+     * @param columnExtractors 可变参数(varargs)查询字段,可选,如果没有就是查询全部
+     * @param <T> 实体类类型
+     * @param <R> 列值类型
+     * @param <V> 需要验证的值的类型
+     * @return 返回包含指定列值的实体对象列表
+     * @throws IllegalArgumentException 如果需要验证的值为null
+     * @throws FebsException 如果查询结果为空或列值为null,或查询过程中发生异常
+     */
+    public static <T, R, V> List<T> ensureColumnReturnEntityList(
+            V valueToCheck,
+            SFunction<T, R> columnExtractor,
+            SFunction<LambdaQueryWrapper<T>, List<T>> queryWrapperExtractor,
+            String errMsg,
+            SFunction<T, R>... columnExtractors) {
+        // 检查需要验证的值是否为null
+        if (valueToCheck == null) {
+            throw new IllegalArgumentException("The value to check cannot be null while ensureColumnReturnEntityList column");
+        }
+        List<T> entities = new ArrayList<>();
+        try {
+            // 创建LambdaQueryWrapper并配置查询条件
+            LambdaQueryWrapper<T> wrapper = Wrappers.lambdaQuery();
+            if (columnExtractors != null && columnExtractors.length > 0) {
+                wrapper.select(columnExtractors);
+            }
+            wrapper.eq(columnExtractor, valueToCheck);
+
+            // 执行查询并获取结果实体列表
+            entities = queryWrapperExtractor.apply(wrapper);
+        } catch (Exception e) {
+            // 记录异常日志
+            throw new FebsException(StrUtil.format("An error occurred while ensureColumnReturnEntityList column: {}", valueToCheck));
+        }
+        // 如果查询结果为空,则抛出异常
+        if (entities == null || entities.isEmpty()) {
+            throw new FebsException(StrUtil.format(errMsg, valueToCheck));
+        }
+
+        // 返回查询到的实体类对象列表
+        return entities;
+    }
+
+    /**
+     * 确保指定列的值在数据库中是存在的
+     *      selectOne方法
      *      该方法通过查询数据库来验证给定的列值是否存在如果不存在,则抛出异常
      *
      * @param valueToCheck 需要验证的列值
@@ -61,6 +187,7 @@
 
     /**
      * 确保指定值在数据库中是唯一的
+     *      selectCount方法
      *      该方法通过查询数据库来验证给定的列值是否已经存在,如果存在,则抛出异常,以确保数据的唯一性
      *
      * @param valueToCheck 需要检查的值
@@ -100,8 +227,7 @@
 
         } catch (Exception e) {
             // 记录异常日志
-            // 如果在检查过程中发生异常,抛出FebsException异常
-            throw new FebsException(StrUtil.format("An error occurred while ensuring unique column: {}", valueToCheck));
+            throw new FebsException(StrUtil.format("An error occurred while ensureUnique column: {}", valueToCheck));
         }
 
         // 如果结果数量大于0,说明值已存在,抛出FebsException异常
@@ -131,4 +257,24 @@
     }
 
 
+    /**
+     * 确保两个参数不相等,如果相等则抛出异常
+     *
+     * @param value1 第一个参数
+     * @param value2 第二个参数
+     * @param errMsg 当两个参数相等时抛出的异常消息格式字符串
+     * @throws FebsException 如果两个参数相等
+     */
+    public static <T> void ensureNotEqual(
+            T value1,
+            T value2,
+            String errMsg) {
+        // 使用 Objects.equals 处理 null 值,避免显式 null 检查
+        if (Objects.equals(value1, value2)) {
+            // 延迟字符串格式化,只在需要抛出异常时进行
+            throw new FebsException(StrUtil.format(errMsg, value1, value2));
+        }
+    }
+
+
 }

--
Gitblit v1.9.1