Files
my-bar/src/main/java/ru/kayashov/bar/service/OrderService.java

104 lines
3.8 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package ru.kayashov.bar.service;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import ru.kayashov.bar.model.AbstractSendMessage;
import ru.kayashov.bar.model.entity.BarEntity;
import ru.kayashov.bar.model.entity.BarResident;
import ru.kayashov.bar.model.entity.CocktailEntity;
import ru.kayashov.bar.model.entity.Pay;
import ru.kayashov.bar.model.entity.SessionEntity;
import ru.kayashov.bar.model.entity.Visitor;
import ru.kayashov.bar.repository.CocktailRepository;
import ru.kayashov.bar.repository.OrdersRepository;
import java.time.LocalDateTime;
import java.util.List;
import static ru.kayashov.bar.model.entity.OrderStatus.CANCEL;
import static ru.kayashov.bar.model.entity.OrderStatus.DONE;
import static ru.kayashov.bar.model.entity.OrderStatus.NEW;
import static ru.kayashov.bar.model.entity.UserRole.ADMIN;
import static ru.kayashov.bar.model.entity.UserRole.BARMEN;
@Service
@RequiredArgsConstructor
public class OrderService {
private final VisitorService visitorService;
private final CocktailRepository cocktailRepository;
private final OrdersRepository ordersRepository;
/**
* Новый заказ
*/
public List<AbstractSendMessage> createOrder(Long visitorId, Long cocktailId) {
Visitor visitor = visitorService.findById(visitorId);
BarEntity bar = visitor.getResidents().stream()
.filter(BarResident::getActive)
.map(BarResident::getBar)
.toList()
.get(0);
SessionEntity session = bar.getSessions().stream()
.filter(SessionEntity::getIsActive)
.toList()
.get(0);
CocktailEntity cocktail = cocktailRepository.findById(cocktailId).orElseThrow();
Pay pay = new Pay();
pay.setStatus(NEW);
pay.setVisitor(visitor);
pay.setCocktail(cocktail);
pay.setSession(session);
pay.setCreatedAt(LocalDateTime.now());
ordersRepository.save(pay);
return bar.getVisitors().stream()
.filter(BarResident::getActive)
.filter(BarResident::getInvited)
.filter(b -> b.getRole() == ADMIN || b.getRole() == BARMEN)
.map(BarResident::getVisitor)
.map(admin -> createOrderMessage(admin, visitor, cocktail))
.toList();
}
private AbstractSendMessage createOrderMessage(Visitor admin, Visitor client, CocktailEntity cocktail) {
return AbstractSendMessage.builder()
.chatId(admin.getId())
.message(client.getName() + " " + client.getLastName() + " заказал(а) коктейль " + cocktail.getName())
.build();
}
/**
* Обновить статус заказа
*/
public AbstractSendMessage updateOrder(boolean check, long l) {
Pay pay = ordersRepository.findById(l).orElseThrow();
pay.setStatus(check ? DONE : CANCEL);
pay.setClosedAt(LocalDateTime.now());
ordersRepository.save(pay);
return AbstractSendMessage.builder()
.chatId(pay.getVisitor().getId())
.message("Коктейль " + pay.getCocktail().getName() + (check ? " готов" : " отменен"))
.build();
}
/**
* Получить заказ из очереди
*/
public List<Pay> getOrders() {
Visitor visitor = visitorService.getCurrentVisitor();
return visitor.getResidents().stream()
.filter(BarResident::getActive)
.map(BarResident::getBar)
.map(BarEntity::getSessions)
.flatMap(List::stream)
.filter(SessionEntity::getIsActive)
.map(SessionEntity::getOrders)
.flatMap(List::stream)
.toList();
}
}