EditUserScreen.java

package io.extact.rms.client.console.ui.admin;

import static io.extact.rms.client.console.ui.ClientConstants.*;
import static io.extact.rms.client.console.ui.textio.TextIoUtils.*;

import io.extact.rms.client.api.RentalReservationClientApi;
import io.extact.rms.client.api.dto.UserAccountClientDto;
import io.extact.rms.client.api.dto.UserAccountClientDto.ClientUserType;
import io.extact.rms.client.api.exception.BusinessFlowClientException;
import io.extact.rms.client.console.ui.ClientConstants;
import io.extact.rms.client.console.ui.TransitionMap.RmsScreen;
import io.extact.rms.client.console.ui.TransitionMap.Transition;
import io.extact.rms.client.console.ui.textio.RmsStringInputReader.PatternMessage;
import io.extact.rms.client.console.ui.textio.TextIoUtils;
import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
public class EditUserScreen implements RmsScreen {

    private final RentalReservationClientApi clientApi;

    @Override
    public Transition play(UserAccountClientDto loginUser, boolean printHeader) {

        if (printHeader) {
            printScreenHeader(loginUser, "ユーザ情報編集画面");
        }

        // ユーザ一覧を表示
        var users = clientApi.getAllUserAccounts();
        println(EDIT_USER_INFORMATION);
        users.forEach(dto ->
            println(ClientConstants.USER_ACCOUNT_FORMAT.format(dto))
        );
        blankLine();

        // 編集するユーザを選択
        var selectNumber = newIntInputReader()
                .withSelectableValues(
                        users.stream()
                            .map(UserAccountClientDto::getId)
                            .toList(),
                        SCREEN_BREAK_VALUE)
                .read("ユーザ番号");
        if (TextIoUtils.isBreak(selectNumber)) {
            return Transition.ADMIN_MAIN;
        }
        blankLine();

        var targetUser = users.stream()
                .filter(user -> user.getId().equals(selectNumber))
                .findFirst()
                .get();

        // パスワードの入力
        var password = newStringInputReader()
                .withDefaultValue(targetUser.getPassword())
                .withMinLength(5)
                .withMaxLength(15)
                .read("パスワード");
        targetUser.setPassword(password);

        // ユーザ名の入力
        var userName = newStringInputReader()
                .withDefaultValue(targetUser.getUserName())
                .withMinLength(1)
                .read("ユーザ名");
        targetUser.setUserName(userName);

        // 電話番号の入力
        var phoneNumber = newStringInputReader()
                .withDefaultValue(targetUser.getPhoneNumber())
                .withMaxLength(14)
                .withPattern(PatternMessage.PHONE_NUMBER)
                .read("電話番号(省略可)");
        targetUser.setPhoneNumber(phoneNumber);

        // 連絡先の入力
        var contact = newStringInputReader()
                .withDefaultValue(targetUser.getPhoneNumber())
                .withMaxLength(15)
                .read("連絡先(省略可)");
        targetUser.setContact(contact);

        // 連絡先の入力
        var userType = newEnumInputReader(ClientUserType.class)
                .withDefaultValue(targetUser.getUserType())
                .read("権限");
        targetUser.setUserType(userType);

        // ユーザ情報の更新実行
        try {
            var updatedUser = clientApi.updateUserAccount(targetUser);
            printResultInformation(updatedUser);
            return Transition.ADMIN_MAIN;

        } catch (BusinessFlowClientException e) {
            printServerError(e);
            return play(loginUser, false); // start over!!

        }
    }

    private void printResultInformation(UserAccountClientDto updatedUserAccount) {
        blankLine();
        println("***** ユーザ登録結果 *****");
        printf("[%s]のユーザ情報を更新しました", updatedUserAccount.getId());
        blankLine();
        blankLine();
        waitPressEnter();
    }
}