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 validateTicketByQrCode method looks up an active QR code and validates the associated ticket.

  • The validateTicketManually method looks up a ticket directly by ID and validates it.

  • The private validateTicket method 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
© 2026 Devtiro Ltd. All rights reserved