feat(api): add REST controllers, services, entities and 15-min timeline grid

This commit is contained in:
DanielS
2026-08-19 00:44:33 +02:00
parent 52b0728510
commit 22469f557c
16 changed files with 619 additions and 17 deletions

View 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()
);
}
}

View 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()
);
}
}