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);
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 }