com.devnexus.ting.repository.jpa.RegistrationRepositoryImpl.java Source code

Java tutorial

Introduction

Here is the source code for com.devnexus.ting.repository.jpa.RegistrationRepositoryImpl.java

Source

/*
 * Copyright 2015 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.devnexus.ting.repository.jpa;

import com.devnexus.ting.model.Event;
import com.devnexus.ting.model.EventSignup;
import java.util.UUID;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import com.devnexus.ting.model.RegistrationDetails;
import com.devnexus.ting.repository.RegistrationRepositoryCustom;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.springframework.util.StringUtils;

/**
 *
 * @author Summers Pittman
 */
@Repository("registrationDao")
public class RegistrationRepositoryImpl implements RegistrationRepositoryCustom {

    @PersistenceContext
    private EntityManager entityManager;

    @Override
    @Transactional
    public RegistrationDetails createRegistrationPendingPayment(RegistrationDetails pendingRegistration) {

        pendingRegistration.setRegistrationFormKey(UUID.randomUUID().toString());

        while (!entityManager
                .createQuery("from RegistrationDetails where registrationFormKey = :registrationFormKey")
                .setParameter("registrationFormKey", pendingRegistration.getRegistrationFormKey()).getResultList()
                .isEmpty()) {
            pendingRegistration.setRegistrationFormKey(UUID.randomUUID().toString());
        }
        ;

        entityManager.persist(pendingRegistration);
        entityManager.flush();
        return pendingRegistration;
    }

    @Override
    public RegistrationDetails findByKey(String registrationKey) {
        return (RegistrationDetails) entityManager
                .createQuery("from RegistrationDetails where registrationFormKey = :registrationFormKey")
                .setParameter("registrationFormKey", registrationKey).getSingleResult();
    }

    @Override
    public List<RegistrationDetails> findPurchasedForEvent(Event event) {
        return entityManager.createQuery(
                "from RegistrationDetails where event.id = :eventId and (paymentState=:PAID or paymentState=:INVOICED)",
                RegistrationDetails.class).setParameter("PAID", RegistrationDetails.PaymentState.PAID)
                .setParameter("INVOICED", RegistrationDetails.PaymentState.INVOICED)
                .setParameter("eventId", event.getId()).getResultList();
    }

    @Override
    public List<RegistrationDetails> findAllForEvent(Event event) {
        return entityManager
                .createQuery("from RegistrationDetails where event.id = :eventId", RegistrationDetails.class)
                .setParameter("eventId", event.getId()).getResultList();
    }

    @Override
    public List<RegistrationDetails> findIncompletePaypalOrdersForEvent(Event event) {
        return entityManager
                .createQuery(
                        "from RegistrationDetails where event.id = :eventId and (paymentState=:PAYPAL_PENDING)",
                        RegistrationDetails.class)
                .setParameter("PAYPAL_PENDING", RegistrationDetails.PaymentState.PAYPAL_CREATED)
                .setParameter("eventId", event.getId()).getResultList();
    }

    @Override
    public List<RegistrationDetails> findOrdersRequestingInvoiceForEvent(Event event) {
        return entityManager
                .createQuery(
                        "from RegistrationDetails where event.id = :eventId and (paymentState=:REQUIRES_INVOICE)",
                        RegistrationDetails.class)
                .setParameter("REQUIRES_INVOICE", RegistrationDetails.PaymentState.REQUIRES_INVOICE)
                .setParameter("eventId", event.getId()).getResultList();
    }

    @Override
    public List<RegistrationDetails> findOrdersWithContactEmail(String email, EventSignup signUp) {
        List<RegistrationDetails> results = entityManager.createQuery(
                "select details from RegistrationDetails details inner join details.orderDetails orderDetails where details.event.id = :event_id and (details.contactEmailAddress = :email or orderDetails.emailAddress = :ticket_email)",
                RegistrationDetails.class).setParameter("event_id", signUp.getEvent().getId())
                .setParameter("email", email).setParameter("ticket_email", email).getResultList();
        List<RegistrationDetails> detailsFromEmail = new ArrayList<>();
        results.stream().forEach(objects -> {
            detailsFromEmail.addAll(Arrays.asList(objects));
        });
        return detailsFromEmail;
    }

    @Override
    public List<RegistrationDetails> findOrdersWithContactName(String[] namesA, EventSignup signUp) {
        String fullName = StringUtils.arrayToDelimitedString(namesA, " ");
        List<String> names = Arrays.asList(namesA);
        List<RegistrationDetails> resultList = entityManager.createQuery(
                "select details from RegistrationDetails details inner join details.orderDetails orderDetails where details.event.id = :event_id and (details.contactName LIKE :name or orderDetails.firstName in (:first_names) or orderDetails.lastName in (:last_names))",
                RegistrationDetails.class).setParameter("event_id", signUp.getEvent().getId())
                .setParameter("name", "%" + fullName + "%").setParameter("first_names", names)
                .setParameter("last_names", names).getResultList();

        List<RegistrationDetails> detailsFromEmail = new ArrayList<>();
        resultList.stream().forEach(objects -> {
            detailsFromEmail.addAll(Arrays.asList(objects));
        });

        return detailsFromEmail;
    }

}