Java · 41 строк
При оформлении заказа товары корзины резервируются на 15 минут. Если заказ не оплачен, планировщик возвращает остаток на склад. findByOrderId в Spring Data возвращает List<Reservation>.
В распродажу — 3 000 оформлений в секунду и около 2 млн живых резервов. Отметьте строки с ошибками.
В работе: Оформление заказа: от резерва зависит, не продадим ли мы товар, которого нет на полке.
Как проверяем
Нажмите на строку с ошибкой и коротко напишите, что не так. Баг засчитан, если отмечена хотя бы одна его строка. Зачёт — найдено не меньше 60 % багов с учётом серьёзности (критичный весит 3, обычный 2, мелкий 1), а лишних отметок не больше, чем багов в коде. Пустые строки, скобки и комментарии лишними не считаем. Ответ один на подход: после него показываем разбор.
Источник: на задачах Ozon: склады и резервы. Условие пересказано своими словами.
Давали на собеседовании?
Ответов пока мало — ваш поможет.
@Servicepublic class ReservationService {private final StockRepository stocks;private final ReservationRepository reservations;public ReservationService(StockRepository stocks, ReservationRepository reservations) {this.stocks = stocks;this.reservations = reservations;}@Transactionalpublic ReservationResult reserve(String orderId, List<CartItem> items) {for (CartItem item : items) {Stock stock = stocks.findBySku(item.getSku());if (stock.getAvailable() < item.getQuantity()) {return ReservationResult.failed(item.getSku());}stock.setAvailable(stock.getAvailable() - item.getQuantity());stocks.save(stock);reservations.save(new Reservation(orderId, item.getSku(), item.getQuantity(),LocalDateTime.now().plusMinutes(15)));}return ReservationResult.ok();}@Scheduled(fixedDelay = 60_000)public void releaseExpired() {for (Reservation r : reservations.findAll()) {if (r.getExpiresAt().isBefore(LocalDateTime.now())) {Stock stock = stocks.findBySku(r.getSku());stock.setAvailable(stock.getAvailable() + r.getQuantity());stocks.save(stock);reservations.delete(r);}}}public boolean isReserved(String orderId) {return reservations.findByOrderId(orderId) != null;}}