View Javadoc
1   package io.extact.rms.client.console.ui.admin;
2   
3   import static io.extact.rms.client.console.ui.ClientConstants.*;
4   import static io.extact.rms.client.console.ui.textio.TextIoUtils.*;
5   
6   import io.extact.rms.client.api.RentalReservationClientApi;
7   import io.extact.rms.client.api.dto.UserAccountClientDto;
8   import io.extact.rms.client.api.dto.UserAccountClientDto.ClientUserType;
9   import io.extact.rms.client.api.exception.BusinessFlowClientException;
10  import io.extact.rms.client.console.ui.ClientConstants;
11  import io.extact.rms.client.console.ui.TransitionMap.RmsScreen;
12  import io.extact.rms.client.console.ui.TransitionMap.Transition;
13  import io.extact.rms.client.console.ui.textio.RmsStringInputReader.PatternMessage;
14  import io.extact.rms.client.console.ui.textio.TextIoUtils;
15  import lombok.RequiredArgsConstructor;
16  
17  @RequiredArgsConstructor
18  public class EditUserScreen implements RmsScreen {
19  
20      private final RentalReservationClientApi clientApi;
21  
22      @Override
23      public Transition play(UserAccountClientDto loginUser, boolean printHeader) {
24  
25          if (printHeader) {
26              printScreenHeader(loginUser, "ユーザ情報編集画面");
27          }
28  
29          // ユーザ一覧を表示
30          var users = clientApi.getAllUserAccounts();
31          println(EDIT_USER_INFORMATION);
32          users.forEach(dto ->
33              println(ClientConstants.USER_ACCOUNT_FORMAT.format(dto))
34          );
35          blankLine();
36  
37          // 編集するユーザを選択
38          var selectNumber = newIntInputReader()
39                  .withSelectableValues(
40                          users.stream()
41                              .map(UserAccountClientDto::getId)
42                              .toList(),
43                          SCREEN_BREAK_VALUE)
44                  .read("ユーザ番号");
45          if (TextIoUtils.isBreak(selectNumber)) {
46              return Transition.ADMIN_MAIN;
47          }
48          blankLine();
49  
50          var targetUser = users.stream()
51                  .filter(user -> user.getId().equals(selectNumber))
52                  .findFirst()
53                  .get();
54  
55          // パスワードの入力
56          var password = newStringInputReader()
57                  .withDefaultValue(targetUser.getPassword())
58                  .withMinLength(5)
59                  .withMaxLength(15)
60                  .read("パスワード");
61          targetUser.setPassword(password);
62  
63          // ユーザ名の入力
64          var userName = newStringInputReader()
65                  .withDefaultValue(targetUser.getUserName())
66                  .withMinLength(1)
67                  .read("ユーザ名");
68          targetUser.setUserName(userName);
69  
70          // 電話番号の入力
71          var phoneNumber = newStringInputReader()
72                  .withDefaultValue(targetUser.getPhoneNumber())
73                  .withMaxLength(14)
74                  .withPattern(PatternMessage.PHONE_NUMBER)
75                  .read("電話番号(省略可)");
76          targetUser.setPhoneNumber(phoneNumber);
77  
78          // 連絡先の入力
79          var contact = newStringInputReader()
80                  .withDefaultValue(targetUser.getPhoneNumber())
81                  .withMaxLength(15)
82                  .read("連絡先(省略可)");
83          targetUser.setContact(contact);
84  
85          // 連絡先の入力
86          var userType = newEnumInputReader(ClientUserType.class)
87                  .withDefaultValue(targetUser.getUserType())
88                  .read("権限");
89          targetUser.setUserType(userType);
90  
91          // ユーザ情報の更新実行
92          try {
93              var updatedUser = clientApi.updateUserAccount(targetUser);
94              printResultInformation(updatedUser);
95              return Transition.ADMIN_MAIN;
96  
97          } catch (BusinessFlowClientException e) {
98              printServerError(e);
99              return play(loginUser, false); // start over!!
100 
101         }
102     }
103 
104     private void printResultInformation(UserAccountClientDto updatedUserAccount) {
105         blankLine();
106         println("***** ユーザ登録結果 *****");
107         printf("[%s]のユーザ情報を更新しました", updatedUserAccount.getId());
108         blankLine();
109         blankLine();
110         waitPressEnter();
111     }
112 }