project_in_meituan_04

第四个需求,建一个RPC接口

需求描述

为游戏中心建立一个能够重置游戏中心用户账户的RPC接口,能把用户重置为新用户,注意用户新人奖励也需要重置

开发过程

其实参照start-up中的RPC接口开发流程,并没有太大的改动。

这里主要注意一下接口的实现中的几个细节:

  • 要对参数进行校验
    • 对于不符合要求的参数返回由GameCenterResponseBuild构造的PARAMETER_ILLEGAL异常
  • 主体使用try-catch:注意有远程调用的时候,由于不知道是否会发生网络异常、超时,或者别人抛出一个异常给你,就需要使用try-catch,另外如果对自己写的代码是否会抛出错误没有把握,也可以使用try-catch
  • 关于返回值,一开始我使用Boolean,后面包装成了Response。其实都是可以的,但是使用Response后续可以继续扩展,即如果后面想反回一些别的内容,可以方便地加进去,增加了扩展性!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
@Slf4j
@MdpThriftServer
public class GameCenterUtilsServiceImpl implements GameCenterUtilsService {

@Resource
private UserAssetsQueryService userAssetsQueryService;

@Resource
private AssetsOperationService assetsOperationService;

@Resource
private GameDataGateway gameDataGateway;

@Override
public ResetUserAccountResp resetUserAccount(Long userId) {
if (null == userId) {
return GameCenterResponseBuild.build(GameCenterResultCodeEnum.PARAMETER_ILLEGAL, ResetUserAccountResp.class);
}
try {
Integer sceneCode = AssetsSceneCodeEnum.GAME_CENTER.getCode();
Integer identity = AssetsUserIdentityEnum.ACTIVITY_NEW.getCode();
AssetsAccountResponse resp = userAssetsQueryService.queryAccountBySceneCode(userId, sceneCode);
if (null == resp || null == resp.getData() || null == resp.getData().getAddTime()) {
log.error("游戏中心-用户账户信息异常,resp:{}", resp);
return GameCenterResponseBuild.build(GameCenterResultCodeEnum.SYSTEM_ERROR, ResetUserAccountResp.class);
}
ResetUserAccountResp resetUserAccountResp = GameCenterResponseBuild.success(ResetUserAccountResp.class);
//更新addTime
assetsOperationService.updateUserAccountIdentity(userId, sceneCode, identity, "zhuzhangqi", "wahaha123");

//更新新人奖励
GBDataSaveReq request = new GBDataSaveReq();
request.setUserId(userId);
request.setGameType(GBDGameTypeEnum.GAME_CENTER.getType());
List<GBDFieldDTO> fieldList = Lists.newArrayList();
request.setFieldList(fieldList);
GBDFieldDTO fieldDTO = new GBDFieldDTO();
fieldList.add(fieldDTO);

fieldDTO.setModuleId(GameCenterModuleEnum.USER_DATA.getId());
fieldDTO.setFieldId(GameCenterDataFieldEnum.USER_GAME_DATA.getFieldId());
fieldDTO.setValueType(GBDValueTypeEnum.STRUCT.getType());

UserDataBO userDataBO = new UserDataBO();
userDataBO.setGuideRewardTime(System.currentTimeMillis());
userDataBO.setGuideRewardStatus(GuideRewardStatusEnum.PENDING.getValue());
request.getFieldList().get(0).setFieldValue(GsonUtil.toJSONString(userDataBO));
gameDataGateway.saveModuleOrFields(request);

resetUserAccountResp.setResult(Boolean.TRUE);
return resetUserAccountResp;
} catch (Exception e) {
log.error("游戏中心-用户账户信息异常,userId={}", userId, e);
return GameCenterResponseBuild.build(GameCenterResultCodeEnum.SYSTEM_ERROR, ResetUserAccountResp.class);
}
}
}

UT测试类,尽可能覆盖代码每一行

1
2
3
4
5
6
7
8
9
10
11
12
13
public class GameCenterUtilsServiceTest extends AbstractTest{

@Resource
private GameCenterUtilsService gameCenterUtilsService;

@Test
public void test_resetUserAccount(){
Tracer.setSwimlane("zhuzhangqi-yzwgj");
System.out.println(gameCenterUtilsService.resetUserAccount(5054538345L));
System.out.println(gameCenterUtilsService.resetUserAccount(123L));
System.out.println(gameCenterUtilsService.resetUserAccount(null));
}
}
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2022 ZHU
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信