打开项目里的 UpdateUserCommand 命令的处理器,之前创建这个 userQueryBuilder 可以调整一下,去掉这个 select 方法。在下面查询用户的时候,可以调用 getOne 这个方法,这样得到的结果的类型就会是 UserEntity。
然后我们再去写一下更新用户名的功能,先判断一下 update.name ,如果 update 里的 name 属性有值,说明要更新用户名。
先检查一下要更新的用户名是否跟之前相同,判断一下 user.name 是否等于 update.name ,,如果是可以 throw 一个异常,新建一个 BadRequestException ,异常信息是要更新的用户名与当前的用户名相同。
下面还得再检查一下要更新的用户名是否已经存在了,声明一个 hasUser,用一下 userQueryBuilder,where 条件是 user.name 等于 :name,提供一个 name 参数的值,设置成 update 里的 name,再调用 getCount ,统计一下结果个数。
判断一下,如果 hasUser,也就是如果有同名的用户,就需要 throw 一个异常,新建一个 BadRequestException,异常信息是用户名已存在。
一切正常的话就可以保存对用户名的修改了,设置一下 user.name 让它等于 update.name,然后 await 执行一下 this.userRepository.save,提供一个 UserEntity。
execute 方法最后返回的东西,可以是一个对象,里面有个 message 属性,把它的值设置成,成功更新了用户。
测试
在 Http 客户端可以测试一下更新用户名的功能,在请求主体数据里面添加一个 update,里面需要一个 name 属性,值就是要更新的名字,比如 张三。发送一下请求,提示要更新的用户名跟当前用户名相同。
换个名字,比如小雪,发送一下请求,提示要更新的名字已经存在了。再换个名字,比如张三丰,发送一下请求,这回得到了一个正常的响应,提示成功更新了用户。
打开数据库客户端,观察一下 user 数据表,现在这个用户的名字已经变成了更新之后的张三丰。 在 Http 客户端,再把这个用户名改成张三,发送一下请求。成功以后再到数据库客户端观察一下,刷新一下应用界面,这个用户的名字又变成了张三。