feat(api): add REST controllers, services, entities and 15-min timeline grid
This commit is contained in:
101
src/main/java/com/caspos/service/ReservationService.java
Normal file
101
src/main/java/com/caspos/service/ReservationService.java
Normal file
@@ -0,0 +1,101 @@
|
||||
package com.caspos.service;
|
||||
|
||||
import com.caspos.domain.Guest;
|
||||
import com.caspos.domain.Reservation;
|
||||
import com.caspos.domain.RestaurantTable;
|
||||
import com.caspos.dto.CreateReservationRequest;
|
||||
import com.caspos.dto.ReservationDto;
|
||||
import com.caspos.repository.GuestRepository;
|
||||
import com.caspos.repository.ReservationRepository;
|
||||
import com.caspos.repository.TableRepository;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.web.server.ResponseStatusException;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
@Service
|
||||
@Transactional
|
||||
public class ReservationService {
|
||||
|
||||
private final ReservationRepository reservationRepository;
|
||||
private final GuestRepository guestRepository;
|
||||
private final TableRepository tableRepository;
|
||||
|
||||
public ReservationService(
|
||||
ReservationRepository reservationRepository,
|
||||
GuestRepository guestRepository,
|
||||
TableRepository tableRepository
|
||||
) {
|
||||
this.reservationRepository = reservationRepository;
|
||||
this.guestRepository = guestRepository;
|
||||
this.tableRepository = tableRepository;
|
||||
}
|
||||
|
||||
@Transactional(readOnly = true)
|
||||
public List<ReservationDto> getByDate(LocalDate date) {
|
||||
return reservationRepository.findByDate(date).stream().map(this::toDto).toList();
|
||||
}
|
||||
|
||||
public ReservationDto create(CreateReservationRequest req) {
|
||||
Guest guest = new Guest();
|
||||
guest.setFirstName(req.firstName());
|
||||
guest.setLastName(req.lastName());
|
||||
guest.setPhone(req.phone());
|
||||
guest.setEmail(req.email());
|
||||
guest = guestRepository.save(guest);
|
||||
|
||||
List<RestaurantTable> tables = req.tableIds() == null ? List.of()
|
||||
: tableRepository.findAllById(req.tableIds());
|
||||
|
||||
Reservation reservation = new Reservation();
|
||||
reservation.setGuest(guest);
|
||||
reservation.setTables(tables);
|
||||
reservation.setStartTime(req.startTime());
|
||||
reservation.setEndTime(req.endTime());
|
||||
reservation.setGuestCount(req.guestCount());
|
||||
reservation.setSpecialRequests(req.specialRequests());
|
||||
reservation.setStatus(Reservation.Status.CONFIRMED);
|
||||
|
||||
return toDto(reservationRepository.save(reservation));
|
||||
}
|
||||
|
||||
public ReservationDto updateStatus(UUID id, String rawStatus) {
|
||||
Reservation reservation = reservationRepository.findById(id)
|
||||
.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Reservation not found: " + id));
|
||||
|
||||
Reservation.Status newStatus;
|
||||
try {
|
||||
newStatus = Reservation.Status.valueOf(rawStatus.toUpperCase());
|
||||
} catch (IllegalArgumentException e) {
|
||||
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Invalid status: " + rawStatus);
|
||||
}
|
||||
|
||||
reservation.setStatus(newStatus);
|
||||
return toDto(reservationRepository.save(reservation));
|
||||
}
|
||||
|
||||
private ReservationDto toDto(Reservation r) {
|
||||
var guestDto = r.getGuest() == null ? null : new ReservationDto.GuestDto(
|
||||
r.getGuest().getId(),
|
||||
r.getGuest().getFirstName(),
|
||||
r.getGuest().getLastName(),
|
||||
r.getGuest().getPhone(),
|
||||
r.getGuest().getEmail()
|
||||
);
|
||||
return new ReservationDto(
|
||||
r.getId(),
|
||||
guestDto,
|
||||
r.getTables().stream().map(RestaurantTable::getId).toList(),
|
||||
r.getStartTime(),
|
||||
r.getEndTime(),
|
||||
r.getGuestCount(),
|
||||
r.getStatus().name(),
|
||||
r.getSpecialRequests(),
|
||||
r.getCreatedAt().toString()
|
||||
);
|
||||
}
|
||||
}
|
||||
43
src/main/java/com/caspos/service/TableService.java
Normal file
43
src/main/java/com/caspos/service/TableService.java
Normal file
@@ -0,0 +1,43 @@
|
||||
package com.caspos.service;
|
||||
|
||||
import com.caspos.domain.RestaurantTable;
|
||||
import com.caspos.dto.TableDto;
|
||||
import com.caspos.repository.TableRepository;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Service
|
||||
@Transactional(readOnly = true)
|
||||
public class TableService {
|
||||
|
||||
private final TableRepository tableRepository;
|
||||
|
||||
public TableService(TableRepository tableRepository) {
|
||||
this.tableRepository = tableRepository;
|
||||
}
|
||||
|
||||
public List<TableDto> getAllTables() {
|
||||
return tableRepository.findAllByOrderByDiningAreaDisplayOrderAscTableNumberAsc()
|
||||
.stream()
|
||||
.map(this::toDto)
|
||||
.toList();
|
||||
}
|
||||
|
||||
private TableDto toDto(RestaurantTable t) {
|
||||
return new TableDto(
|
||||
t.getId(),
|
||||
t.getTableNumber(),
|
||||
t.getDiningArea() != null ? t.getDiningArea().getName() : null,
|
||||
t.getMinCapacity(),
|
||||
t.getMaxCapacity(),
|
||||
t.isCombinable(),
|
||||
t.getPosX(),
|
||||
t.getPosY(),
|
||||
t.getWidth(),
|
||||
t.getHeight(),
|
||||
t.getShape()
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user