//这段代码整体实现了一个用于获取商品列表的路由功能，先是对请求参数进行严格验证，确保参数符合分
//页查询及可能的模糊查询要求，然后基于验证通过的参数去调用相应服务方法获取商品列表数据，并根据
//操作结果向客户端返回合适的响应信息。
// 引入Express框架的核心模块，Express是一个广泛用于Node.js的Web应用框架，
// 通过它可以方便地创建Web应用、定义路由以及处理各种HTTP请求等功能
var express = require('express');

// 创建一个Express路由器实例，路由器（Router）在Express中用于将一组相关的路由进行集中管理，
// 可以让代码结构更加清晰，便于对不同路径和请求方法的请求进行分别处理
var router = express.Router();

// 引入Node.js的path模块，该模块提供了许多实用的函数用于处理文件路径相关操作，
// 例如拼接路径、解析路径、获取文件扩展名等，在这里主要用于拼接模块的正确引入路径
var path = require("path");

// 获取自定义的验证模块，通过process.cwd()获取当前工作目录，并与"/modules/authorization"进行路径拼接，
// 以此来准确引入对应的模块。这里假设验证模块（authorization）具备权限验证功能，
// 同时还能提供获取其他相关服务的能力，是整个应用中权限管理及服务获取的关键部分
var authorization = require(path.join(process.cwd(), "/modules/authorization"));

// 通过验证模块获取名为"GoodService"的服务对象，"GoodService"大概率是在authorization模块中定义的一个服务标识，
// 通过这个标识获取到的服务对象应该封装了一系列与商品数据交互的各种方法，例如对商品数据进行添加、删除、修改、查询等操作，
// 方便在后续的路由处理中调用相应功能来处理业务逻辑
var goodServ = authorization.getService("GoodService");

// 定义处理获取商品列表的GET请求的路由，路径为根路径 "/"，这意味着当客户端向服务器的根路径发送GET请求时，
// 将会进入这个路由对应的处理逻辑来获取商品列表信息
router.get("/",
    // 第一个中间件函数，用于验证请求参数的合法性，在Express框架中，中间件函数可以对请求进行预处理，
    // 在这里主要是检查请求中携带的参数是否符合要求，确保后续业务逻辑能基于正确的参数进行处理
    function (req, res, next) {
        // 验证pagenum参数是否存在且大于0，如果不符合要求则返回错误响应，状态码400表示请求参数错误。
        // pagenum参数通常用于分页查询，表示要获取的页码，若不存在或者小于等于0，则不符合正常的分页逻辑
        if (!req.query.pagenum || req.query.pagenum <= 0) return res.sendResult(null, 400, "pagenum 参数错误");

        // 验证pagesize参数是否存在且大于0，如果不符合要求则返回错误响应。
        // pagesize参数同样常用于分页查询，表示每页显示的记录数量，若不存在或者小于等于0，也不符合分页的合理要求
        if (!req.query.pagesize || req.query.pagesize <= 0) return res.sendResult(null, 400, "pagesize 参数错误");

        // 参数验证通过，调用next()将控制权传递给下一个中间件或路由处理函数，这是Express中间件机制中很重要的一环，
        // 通过调用next()来确保请求能按照顺序依次经过各个中间件进行相应的处理，若不调用则请求会被阻塞在此中间件处
        next();
    },
    // 第二个中间件函数，用于处理获取商品列表的业务逻辑，在前面的参数验证中间件通过后，
    // 会进入这个中间件来执行具体的获取商品列表操作，比如从数据库等数据存储中查询符合条件的商品数据
    function (req, res, next) {
        var conditions = {
            // 将请求中的pagenum参数添加到查询条件对象中，用于分页查询等操作，
            // 后续在调用获取商品列表的方法时，可以根据这个参数来确定返回哪一页的数据
            "pagenum": req.query.pagenum,
            // 将请求中的pagesize参数添加到查询条件对象中，以便根据每页显示数量的设定来返回相应数量的商品记录
            "pagesize": req.query.pagesize
        };

        // 如果请求中包含query参数，则将其也添加到查询条件对象中，query参数可能用于模糊查询等功能，
        // 例如根据商品名称、描述等字段进行模糊匹配查找符合条件的商品，丰富了查询的灵活性
        if (req.query.query) {
            conditions["query"] = req.query.query;
        }

        // 调用goodServ服务对象的getAllGoods方法，传入查询条件对象，用于获取商品列表。
        // getAllGoods方法应该是在GoodService中定义的用于从数据存储（如数据库）中查询所有符合条件商品的方法，
        // 它是一个异步操作，通常会涉及到数据库连接、查询语句执行等操作，所以通过回调函数来处理操作完成后的结果情况
        goodServ.getAllGoods(
            conditions,
            function (err, result) {
                // 如果在执行获取商品列表的异步操作过程中出现错误（err不为null），
                // 则向客户端返回包含错误信息的响应，状态码400表示请求出现错误，同时将具体的错误信息传递给客户端
                if (err) return res.sendResult(null, 400, err);

                // 如果获取商品列表操作成功，向客户端返回查询到的商品列表数据，状态码200表示请求成功，
                // 并附带"获取成功"的提示信息告知客户端操作已顺利完成
                res.sendResult(result, 200, "获取成功");
            }
        )(req, res, next);
    }
);
//这段代码分别实现了添加商品和更新商品信息的路由功能。添加商品的路由中参数验证部分有待完善，而
//更新商品信息的路由先对商品 ID 进行了严谨的参数验证，之后基于验证通过的参数去调用相应服务方法
//执行更新操作，并根据操作结果向客户端返回合适的响应信息，不过其中更新成功的提示文本可能需要修
//正。
// 定义处理添加商品的POST请求的路由，路径为 "/"，这意味着当客户端向服务器的根路径发送POST请求时，
// 将会进入这个路由对应的处理逻辑，通常POST请求用于向服务器提交数据以创建新的资源，在这里就是用于添加商品
router.post("/",
    // 参数验证中间件，这里暂时直接调用next()，表示当前没有进行具体的参数验证操作，
    // 可能后续需要补充具体的参数验证逻辑，比如验证请求体中是否包含创建商品必需的字段等内容，
    // 按照正常的业务逻辑，添加商品时请求体应该携带如商品名称、价格、描述等必要信息，需要进行合法性检查
    function (req, res, next) {
        next();
    },
    // 业务逻辑中间件，用于处理添加商品的具体操作，在参数验证中间件（虽然当前为空验证）通过后，
    // 会进入这个中间件来执行实际的添加商品操作，比如将商品数据插入到数据库等数据存储中
    function (req, res, next) {
        // 获取请求体中的参数，假设这些参数包含了创建商品所需的各种信息，如商品名称、价格、描述等，
        // 在实际应用中，具体的参数结构和内容取决于前端传递的数据格式以及后端创建商品业务逻辑的要求
        var params = req.body;
        // 调用goodServ服务对象的createGood方法，传入商品参数，用于创建新商品。
        // createGood方法应该是在GoodService中定义的用于向数据存储（如数据库）中插入新商品记录的方法，
        // 它是一个异步操作，会涉及到数据库连接、插入语句执行等操作，所以通过回调函数来处理操作完成后的结果情况
        goodServ.createGood(params, function (err, newGood) {
            // 如果在执行创建商品的异步操作过程中出现错误（err不为null），
            // 则向客户端返回包含错误信息的响应，状态码400表示请求出现错误，同时将具体的错误信息传递给客户端
            if (err) return res.sendResult(null, 400, err);
            // 如果创建商品操作成功，向客户端返回创建后的商品信息，状态码201表示资源创建成功，
            // 并附带"创建商品成功"的提示信息告知客户端操作已顺利完成
            res.sendResult(newGood, 201, "创建商品成功");
        })(req, res, next);
    }
);

// 定义处理更新商品信息的PUT请求的路由，路径中包含商品ID参数，如 "/:id"，这表示当客户端向服务器发送PUT请求，
// 且路径中带有具体的商品ID值时，会进入这个路由对应的处理逻辑，PUT请求常用于更新指定资源的信息，此处就是更新商品信息
router.put("/:id",
    // 参数验证中间件，检查商品ID参数是否存在以及是否为数字类型，因为要更新指定的商品，
    // 必须先确保传入的商品ID是合法有效的，即不能为空且要是数字类型，这样才能准确找到对应的商品记录进行更新
    function (req, res, next) {
        // 检查商品ID参数是否存在，如果不存在，说明缺少关键的更新依据，不符合要求
        if (!req.params.id) {
            return res.sendResult(null, 400, "商品ID不能为空");
        }
        // 进一步检查商品ID参数是否能成功转换为数字，如果不能（即不是数字格式），同样不符合要求，
        // 无法准确定位要更新的商品记录，所以要返回错误响应给客户端
        if (isNaN(parseInt(req.params.id))) return res.sendResult(null, 400, "商品ID必须是数字");
        // 参数验证通过，将控制权交给下一个中间件，以便继续执行更新商品信息的业务逻辑，按照Express中间件的执行顺序推进处理流程
        next();
    },
    // 业务逻辑中间件，用于处理更新商品信息的具体操作，在前面的参数验证中间件通过后，
    // 会进入这个中间件来执行实际的更新商品信息操作，比如修改数据库中对应商品记录的相关字段值
    function (req, res, next) {
        var params = req.body;
        // 调用goodServ服务对象的updateGood方法，传入商品ID和更新的参数，用于更新指定商品的信息。
        // updateGood方法应该是在GoodService中定义的用于根据商品ID修改对应商品记录信息的方法，
        // 它是一个异步操作，涉及到数据库连接、更新语句执行等操作，通过回调函数来处理操作完成后的结果情况
        goodServ.updateGood(req.params.id, params, function (err, newGood) {
            // 如果在执行更新商品信息的异步操作过程中出现错误（err不为null），
            // 则向客户端返回包含错误信息的响应，状态码400表示请求出现错误，同时将具体的错误信息传递给客户端
            if (err) return res.sendResult(null, 400, err);
            // 如果更新商品信息操作成功，向客户端返回更新后的商品信息，状态码200表示请求成功，
            // 当前这里返回的提示信息文本 "创建商品成功" 可能有误，应该是 "更新商品成功"，后续可根据实际情况修改，
            // 用于告知客户端商品信息已成功更新
            res.sendResult(newGood, 200, "创建商品成功");
        })(req, res, next);
    }
);

// 定义处理获取商品详情的GET请求的路由，路径中包含商品ID参数，如 "/:id"
router.get("/:id",
    // 参数验证中间件，检查商品ID参数是否存在以及是否为数字类型
    function (req, res, next) {
        if (!req.params.id) {
            return res.sendResult(null, 400, "商品ID不能为空");
        }
        if (isNaN(parseInt(req.params.id))) return res.sendResult(null, 400, "商品ID必须是数字");
        // 参数验证通过，将控制权交给下一个中间件
        next();
    },
    // 业务逻辑中间件，用于处理获取商品详情的具体操作
    function (req, res, next) {
        // 调用goodServ服务对象的getGoodById方法，传入商品ID参数，用于获取指定商品的详细信息
        // 处理获取商品详情的异步操作，若出现错误则返回错误信息，成功则返回商品详细信息
        goodServ.getGoodById(req.params.id, function (err, good) {
            if (err) return res.sendResult(null, 400, err);
            return res.sendResult(good, 200, "获取成功");
        })(req, res, next);
    }
);

// 定义处理删除商品的DELETE请求的路由，路径中包含商品ID参数，如 "/:id"
router.delete("/:id",
    // 参数验证中间件，检查商品ID参数是否存在以及是否为数字类型
    function (req, res, next) {
        if (!req.params.id) {
            return res.sendResult(null, 400, "商品ID不能为空");
        }
        if (isNaN(parseInt(req.params.id))) return res.sendResult(null, 400, "商品ID必须是数字");
        // 参数验证通过，将控制权交给下一个中间件
        next();
    },
    // 业务逻辑中间件，用于处理删除商品的具体操作
    function (req, res, next) {
        // 调用goodServ服务对象的deleteGood方法，传入商品ID参数，用于删除指定商品
        // 处理删除商品的异步操作，若出现错误则返回错误信息，成功则返回相应提示信息
        goodServ.deleteGood(req.params.id, function (err) {
            if (err)
                return res.sendResult(null, 400, "删除失败");
            else
                return res.sendResult(null, 200, "删除成功");
        })(req, res, next);
    }
);

// 定义处理更新商品图片的PUT请求的路由，路径为 "/:id/pics"，其中包含商品ID参数
router.put("/:id/pics",
    // 参数验证中间件，检查商品ID参数是否存在以及是否为数字类型
    function (req, res, next) {
        if (!req.params.id) {
            return res.sendResult(null, 400, "商品ID不能为空");
        }
        if (isNaN(parseInt(req.params.id))) return res.sendResult(null, 400, "商品ID必须是数字");
        // 参数验证通过，将控制权交给下一个中间件
        next();
    },
    // 业务逻辑中间件，用于处理更新商品图片的具体操作
    function (req, res, next) {
        // 调用goodServ服务对象的updateGoodPics方法，传入商品ID和请求体中的相关参数（可能包含新的图片信息等）
        // 处理更新商品图片的异步操作，若出现错误则返回错误信息，成功则返回更新后的商品信息
        goodServ.updateGoodPics(
            req.params.id,
            req.body,
            function (err, good) {
                if (err) return res.sendResult(null, 400, err);
                res.sendResult(good, 200, "更新成功");
            }
        )(req, res, next);
    }
);

// 定义处理更新商品属性的PUT请求的路由，路径为 "/:id/attributes"，包含商品ID参数
router.put("/:id/attributes",
    // 参数验证中间件，检查商品ID参数是否存在以及是否为数字类型
    function (req, res, next) {
        if (!req.params.id) {
            return res.sendResult(null, 400, "商品ID不能为空");
        }
        if (isNaN(parseInt(req.params.id))) return res.sendResult(null, 400, "商品ID必须是数字");
        // 参数验证通过，将控制权交给下一个中间件
        next();
    },
    // 业务逻辑中间件，用于处理更新商品属性的具体操作
    function (req, res, next) {
        // 调用goodServ服务对象的updateGoodAttributes方法，传入商品ID和请求体中的相关参数（包含要更新的属性信息等）
        // 处理更新商品属性的异步操作，若出现错误则返回错误信息，成功则返回更新后的商品信息
        goodServ.updateGoodAttributes(
            req.params.id,
            req.body,
            function (err, good) {
                if (err) return res.sendResult(null, 400, "更新失败");
                res.sendResult(good, 200, "更新成功");
            }
        )(req, res, next);
    }
);

// 定义处理更新商品状态的PUT请求的路由，路径为 "/:id/state/:state"，包含商品ID和状态值两个参数
router.put("/:id/state/:state",
    // 参数验证中间件，检查商品ID参数是否存在、是否为数字类型，以及状态值参数是否符合要求
    function (req, res, next) {
        if (!req.params.id) {
            return res.sendResult(null, 400, "商品ID不能为空");
        }
        if (isNaN(parseInt(req.params.id))) return res.sendResult(null, 400, "商品ID必须是数字");
        if (!req.params.state) {
            return res.sendResult(null, 400, "状态值不能为空");
        }
        if (req.params.state!= 0 && req.params.state!= 1 && req.params.state!= 2) {
            return res.sendResult(null, 400, "状态值只能为 0 ，1 或 2");
        }
        // 参数验证通过，将控制权交给下一个中间件
        next();
    },
    function (req, res, next) {
        // 调用goodServ服务对象的updateGoodsState方法，传入商品ID和状态值参数，用于更新商品的状态
        // 处理更新商品状态的异步操作，若出现错误则返回错误信息，成功则返回更新后的商品信息
        goodServ.updateGoodsState(req.params.id, req.params.state, function (err, good) {
            if (err) return res.sendResult(null, 400, err);
            res.sendResult(good, 200, "更新成功");
        })(req, res, next);
    }
);

// 将配置好的路由器对象导出，以便在主应用模块中使用，挂载到对应的路径上，
// 这样主应用就能通过引入这个模块来使用该路由器中定义的所有路由及相关处理逻辑，
// 从而处理各种与商品相关的HTTP请求
module.exports = router;
//这段代码整体围绕商品相关的各种操作定义了一系列的路由及其对应的处理逻辑。每个路由处理函数基本
//都遵循先进行参数验证（确保传入的参数符合业务要求），再执行相应的业务逻辑（如增删改查、更新图
//片、属性、状态等操作）的模式，并且根据操作结果向客户端返回合适的响应信息，最后通过导出路由器
//对象使得这些路由配置能在整个应用中生效。