Validate Ticket Service Layer
In this lesson, we'll implement the validate ticket service layer.
Repository Setup
First, we need to create a repository for ticket validations. This forms the foundation for our database interactions:
@Repository
public interface TicketValidationRepository extends JpaRepository<TicketValidation, UUID> {
}Service Interface
The service interface defines two methods for validating tickets - one using a QR code and another for manual validation:
public interface TicketValidationService {
TicketValidation validateTicketByQrCode(UUID qrCodeId);
TicketValidation validateTicketManually(UUID ticketId);
}Service Implementation
The implementation handles the business logic for ticket validation:
@Service
@RequiredArgsConstructor
@Transactional
public class TicketValidationServiceImpl implements TicketValidationService {
private final QrCodeRepository qrCodeRepository;
private final TicketValidationRepository ticketValidationRepository;
private final TicketRepository ticketRepository;
@Override
public TicketValidation validateTicketByQrCode(UUID qrCodeId) {
QrCode qrCode = qrCodeRepository.findByIdAndStatus(qrCodeId, QrCodeStatusEnum.ACTIVE)
.orElseThrow(() -> new QrCodeNotFoundException(
String.format(
"QR Code with ID %s was not found", qrCodeId
)
));
Ticket ticket = qrCode.getTicket();
return validateTicket(ticket);
}
private TicketValidation validateTicket(Ticket ticket) {
TicketValidation ticketValidation = new TicketValidation();
ticketValidation.setTicket(ticket);
ticketValidation.setValidationMethod(TicketValidationMethod.QR_SCAN);
TicketValidationStatusEnum ticketValidationStatus = ticket.getValidations().stream()
.filter(v -> TicketValidationStatusEnum.VALID.equals(v.getStatus()))
.findFirst()
.map(v -> TicketValidationStatusEnum.INVALID)
.orElse(TicketValidationStatusEnum.VALID);
ticketValidation.setStatus(ticketValidationStatus);
return ticketValidationRepository.save(ticketValidation);
}
@Override
public TicketValidation validateTicketManually(UUID ticketId) {
Ticket ticket = ticketRepository.findById(ticketId)
.orElseThrow(TicketNotFoundException::new);
return validateTicket(ticket);
}
}The implementation includes these key features:
-
The
validateTicketByQrCodemethod looks up an active QR code and validates the associated ticket. -
The
validateTicketManuallymethod looks up a ticket directly by ID and validates it. -
The private
validateTicketmethod contains the shared validation logic. -
Tickets can only be validated once - subsequent validations will return invalid status.
Summary
- Implemented the ticket validation service layer functionality