打开 UserService,在用户服务务先添加一个可以检查指定用户是否拥有指定资源的方法,方法的名字可以叫 possess,表示拥有,这个方法接收几个参数,一个用户的 id,类型是 number,还需要资源的名字,resource,类型是 string,还有一个 resourceId,类型是 number 。
方法里面我们可以使用 querybuilder 查询指定用户是否拥有指定的资源,添加一个 result,await,用一下 this.userRepository,用 createQueryBuilder 创建一个查询构建器,别名设置成 user。
下面可以接着用 where 设置查询条件 ,user.id 等于 :id,后面设置 id 参数的值,它的值就是方法接收的 id 参数的值。
然后用 leftJoin,需要的关系是 user. 后面加上一个 resource,别名设置成 resource。
下面继续设置查询条件,这个条件可以用一下 resource 的 id,等于 :resourceId,后面设置这个 resourceId 参数的值,它的值就是使用这个方法的时候提供的要检查的资源的 id 号。
最后可以使用 getCount,得到一个总计的数量,这个方法返回的值可以是 true 或者 false,判断一下 result 是不是等于 1, 如果是说明用户拥有指定资源,这样就返回 true,如果不是就返回 false。
测试路由
打开 UserController ,在用户控制器上添加一个 UserService 上的 possess 方法的路由,用 @Get 装饰器,参数是 :id/possess/:resource/:resourceId。
添加一个处理方法,名字叫 possess,方法里添加几个参数,用 @Param 装饰,需要地址里的 id 参数,用 ParseIntPipe 转换成数字类型的值,参数的名字叫 id,类型是 number。
再用 @Param 装饰,需要的是 resource,参数的名字叫 resource,类型是 string。
还需要一个资源 id,@Param,resourceId,ParseIntPipe,名字是 resourceId,类型是 number。
return 的是 await,用一下 this.userService.possess,把用户 id,resource,资源的名字,还有 resourceId 交给这个方法。
测试
打开 Http 客户端,创建一个新的请求,名字叫 User Possess,请求用的方法是 GET,请求的地址是 localhost:3000,users,然后是用户的 id ,possess,接着应该是资源的名字,比如 posts,最后是资源的 id 号 ,发送一下这个请求。
如果 id 号是 6 的这个用户,拥有 id 号是 1 的这个 posts 资源,得到的响应应该会是 true,如果这个资源不是这个用户的,就会响应 false。
我们可以到数据库客户端验证一下,打开 post 表,找到 id 号是 1 的这个资源,它的 userId 的值是 1 ,对应的用户是白居易。
我们检查的用户的 id 号是 6,下面可以找一个属于这个用户的内容资源,比如这个 id 号是 11 的内容,它的 userId 是 6,对应的用户是 李白。
回到 Http 客户端,把资源的 id 换成 11,发送一下这个请求,这次返回的是 true,说明 id 号是 6 的这个用户拥有 id 号是 11 的这个内容资源。
下面再试一下检查用户是否拥有指定的评论资源,在数据库打开 comment 表,比如检查一下这里的第一条评论,它的 userId 的值是 7 ,评论资源的 id 是 1。
请求的地址先换一下用户的 id ,设置成 7,资源的名字叫 comments,资源的 id 是 1,发送一下这个请求,返回的结果是 true,说明这个用户拥有指定的评论资源,也就是这个用户是这条评论的作者。