#388 Код-ревью сервиса бронирования места

Компании:
Т-Банк
Темы:
SpringТранзакцииКод ревью

Сделать код-ревью:

import java.util.UIID;

/**
 * Сервис бронирования места в самолете.
 * Клиент с купленным билетом может за дополнительную плату выбрать конкретное место.
 * Базовая цена мест определяется тарифами (внешним сервисом).
 * Для клиентов с определенными тарифами (PREMIUM, ULTRA) необходимо сделать скидку при оплате.
 * При бронировании клиенту выставляется инвойс на оплату. Управление оплатой осуществляется в стороннем сервисе.
 */
@Service
public class SeatBookingService {

    @Autowired private SeatBookingRepository seatBookingRepository;
    @Autowired private TicketRepository ticketRepository;
    @Autowired private TariffClient tariffClient;
    @Autowired private CustomerClient customerClient;
    @Autowired private PaymentClient paymentClient;

    /**
     * Бронирование.
     * @param seatCode код места (например 19A)
     * @param ticketId ид билета
     */
    @Transactional
    public void bookSeat(String seatCode, UIID ticketId) {
        var ticket = ticketRepository.findById(ticketId);
        // бронируем
        var seatBooking = new SeatBooking(seatCode, ticket.get().getFlightId(), ticketId, BookingStatus.BOOKED);
        seatBookingRepository.save(seatBooking);

        // ищем базовый тариф для выбранного места в самолете
        var basePrice = tariffClient.getBasePrice(ticket.get().getPlaneModel(), seatCode);
        // ищем данные о клиенте
        long userId = (long) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        var userData = customerClient.getCustomer(userId);
        System.out.println("Найден пользователь " + userData.getFio() + " номер документа " + userData.getDocument());
        var price = basePrice;
        if (userData.getTariff() == "PREMIUM") {
            // скидка 50%
            price = basePrice * 0.5d;
        }
        if (userData.getTariff() == "ULTRA") {
            // скидка 20%
            price = basePrice * 0.8d;
        }
        var invoice = new Invoice(price, ticketId, userId);
        // выставляем платежку
        paymentClient.sendInvoice(invoice);
    }
}

@Data
@Table("seat_booking")
public class SeatBooking {

    @Column
    private String seatCode;

    @Column
    private UUID flightId;

    @Column
    private UUID ticketId;

    @Column
    private BookingStatus status;
}

public enum BookingStatus {
    BOOKED, PAID;
}

Разбор вопроса

Ментор
Ответь как на реальном собеседовании. Я задам уточняющие вопросы, а затем сравню твой ответ с эталонным и покажу точность в %.
Войди, чтобы начать диалог Ментор ведёт диалог по текущему вопросу и учитывает предыдущие сообщения.
Войти