#388 Код-ревью сервиса бронирования места
Сделать код-ревью:
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;
}
Разбор вопроса
Войди, чтобы начать диалог
Ментор ведёт диалог по текущему вопросу и учитывает предыдущие сообщения.
Войти
Доступно с Premium
Это лишь одно из решений, доступных с Premium. А ещё:
- 250+ продвинутых лекций
- 1300+ практических заданий
- 500+ решений задач с реальных собеседований
- Именные сертификаты Java Hub
- Расширенный доступ к AI-ментору