// 引入Express框架的核心模块，Express是用于构建Node.js网络应用程序的常用框架，通过它可以方便地处理HTTP请求、定义路由等操作
var express = require('express');
// 创建一个Express路由器实例，利用这个实例能够以模块化的方式定义一组相关的路由，便于在整个Web应用中进行有条理的路由管理
var router = express.Router();
// 引入Node.js的path模块，该模块主要用于处理文件路径相关的操作，像拼接、解析路径等，此处用于准确地定位其他模块所在的文件位置
var path = require("path");

// 获取自定义的验证模块，通过path.join函数把当前工作目录（process.cwd()）与相对路径（"/modules/authorization"）进行拼接，以此精确地引入验证模块。
// 这个验证模块通常负责对用户的身份、权限等方面进行验证，保障后续操作的合法性与安全性，比如判断用户是否有权限访问某些特定资源等
var authorization = require(path.join(process.cwd(), "/modules/authorization"));

// 通过上述验证模块获取名为"RightService"的权限服务模块，这个服务模块应该封装了一系列与权限相关的业务操作方法，例如获取不同类型的权限列表等功能
var rightService = authorization.getService("RightService");

// 定义一个处理GET请求的路由，路径格式为 "/:type"，其中":type"是一个路由参数，用于指定权限列表的显示类型
router.get("/:type",
    // 第一个中间件函数，主要用于对路由参数进行验证，确保传入的参数符合业务要求，保证后续业务逻辑能正确执行
    function (req, res, next) {
        // 首先检查请求参数中的type是否存在，如果不存在（即为空），则返回错误响应给客户端。
        // 这里使用res.sendResult函数返回响应，状态码设置为400，表示请求出现了参数错误，同时附带具体的错误提示信息"显示类型未定义"
        if (!req.params.type) {
            return res.sendResult(null, 400, "显示类型未定义");
        }
        // 接着进一步验证type参数的值是否符合预定义的合法值，即判断是否等于"list"或者"tree"，如果不符合，则同样返回错误响应。
        // 状态码依旧为400，附带错误提示信息"显示类型参数错误"，告知客户端传入的显示类型参数不符合要求
        if (req.params.type!= "list" && req.params.type!= "tree") {
            return res.sendResult(null, 400, "显示类型参数错误");
        }
        // 如果参数验证通过，就调用next()函数，将控制权传递给下一个中间件或者路由处理函数，以便继续执行后续的业务逻辑
        next();
    },
    // 第二个中间件函数，用于处理获取权限列表的实际业务逻辑，依赖于前面验证通过的参数进行相应操作
    function (req, res, next) {
        // 调用rightService权限服务模块的getAllRights方法，传入经过验证的显示类型参数（req.params.type），用于获取相应类型的权限列表数据。
        // 这个方法执行的是异步操作，在操作过程中如果出现错误（err不为null），就通过res.sendResult返回包含错误信息的响应，状态码设置为400，表示请求处理出现错误。
        // 如果获取权限列表操作成功，就使用res.sendResult返回包含权限列表数据（rights）的响应，状态码为200，表示请求成功，同时附带提示信息"获取权限列表成功"，告知客户端操作顺利完成
        rightService.getAllRights(req.params.type, function (err, rights) {
            if (err) return res.sendResult(null, 400, err);
            res.sendResult(rights, 200, "获取权限列表成功");
        })(req, res, next);
    }
);

// 将配置好的路由器对象导出，这样在主应用程序中就可以引入这个路由器模块，并将其挂载到对应的路径上，使得这个定义好的路由能够正确响应客户端发送的相应HTTP请求，实现获取权限列表的功能
module.exports = router;