// 引入Express框架的核心模块，Express是用于构建Node.js网络应用程序的常用框架，通过它可以方便地处理HTTP请求、定义路由等操作。
// 它为Node.js开发Web应用提供了简洁高效的方式，是整个后端服务构建的基础框架，像搭建服务器、处理不同HTTP方法（GET、POST等）的请求都依赖于它来实现。
var express = require('express');

// 创建一个Express路由器实例，利用这个实例能够以模块化的方式定义一组相关的路由，便于在整个Web应用中进行有条理的路由管理。
// 这种模块化的路由管理方式有助于将不同功能模块对应的路由进行分组，使代码结构更加清晰，易于维护和扩展，例如可以把用户相关路由、权限相关路由等分别放在不同的路由器实例中进行管理。
var router = express.Router();

// 引入Node.js的path模块，该模块主要用于处理文件路径相关的操作，像拼接、解析路径等，此处用于准确地定位其他模块所在的文件位置。
// 在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"是一个路由参数，用于指定权限列表的显示类型。
// 当客户端向服务器发送GET请求到这个带有参数的路径时，服务器会根据传入的显示类型参数来获取相应格式的权限列表数据，
// 例如客户端可能请求以列表形式（"list"）或者树形结构形式（"tree"）来查看权限信息，服务器则要根据这个参数返回对应格式的数据。
router.get("/:type",
    // 第一个中间件函数，主要用于对路由参数进行验证，确保传入的参数符合业务要求，保证后续业务逻辑能正确执行。
// 在Web应用开发中，对路由参数的验证是很关键的前置步骤，能够避免因传入不符合要求的参数而导致后续业务逻辑出现错误，比如数据库查询异常或者逻辑混乱等问题。
    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()函数，将控制权传递给下一个中间件或者路由处理函数，以便继续执行后续的业务逻辑。
        // 这是Express中间件机制中实现请求流程控制的关键操作，通过调用next()可以确保请求按照顺序依次经过各个中间件进行相应的处理，若不调用则请求会阻塞在当前中间件处。
        next();
    },
    // 第二个中间件函数，用于处理获取权限列表的实际业务逻辑，依赖于前面验证通过的参数进行相应操作。
// 在参数验证中间件通过后，就会进入这个中间件来执行具体的获取权限列表操作，例如从数据库或者其他数据存储中查询符合指定显示类型的权限数据，
// 然后对获取到的数据进行整理、格式化等操作，最后将合适的数据返回给客户端展示。
    function (req, res, next) {
        // 调用rightService权限服务模块的getAllRights方法，传入经过验证的显示类型参数（req.params.type），用于获取相应类型的权限列表数据。
        // getAllRights方法应该是在RightService中定义的用于根据传入的显示类型参数去数据存储（如数据库）中查找并获取对应格式权限记录的方法，
        // 它是一个异步操作，会涉及到数据库连接、查询语句执行等操作，所以需要通过回调函数来处理操作完成后的结果情况。
        rightService.getAllRights(req.params.type, function (err, rights) {
            // 如果在执行获取权限列表的异步操作过程中出现错误（err不为null），例如数据库查询失败、权限配置数据异常等情况，
            // 就通过res.sendResult返回包含错误信息的响应，状态码设置为400，表示请求处理出现错误，同时将具体的错误信息（err）传递给客户端，让客户端知晓请求失败的原因。
            if (err) return res.sendResult(null, 400, err);
            // 如果获取权限列表操作成功，就使用res.sendResult返回包含权限列表数据（rights）的响应，状态码为200，表示请求成功，同时附带提示信息"获取权限列表成功"，
            // 告知客户端操作顺利完成，客户端接收到权限列表数据后可以根据业务需求进行相应的展示或者后续处理操作。
            res.sendResult(rights, 200, "获取权限列表成功");
        })(req, res, next);
    }
);

// 将配置好的路由器对象导出，这样在主应用程序中就可以引入这个路由器模块，并将其挂载到对应的路径上，使得这个定义好的路由能够正确响应客户端发送的相应HTTP请求，实现获取权限列表的功能。
// 在主应用中，通过引入这个路由器模块，并将其挂载到对应的 "/:type" 路径上，服务器就能正确识别客户端发送的获取权限列表请求，
// 按照路由中定义的逻辑去验证参数、获取数据并返回响应，从而实现整个获取权限列表的功能交互。
module.exports = router;
//这段代码主要实现了一个根据指定显示类型获取权限列表的路由功能，先是对传入的显示类型路由参数进
//行严格验证，确保其合法性及符合预定义的取值范围，然后基于验证通过的参数调用相应服务方法去获取
//权限列表数据，并根据操作结果向客户端返回合适的响应信息，整体用于实现后端权限列表获取的接口服
//务功能。