package org.croudtrip.trips; import com.google.common.base.Optional; import org.croudtrip.api.account.User; import org.croudtrip.api.gcm.GcmConstants; import org.croudtrip.api.trips.RunningTripQuery; import org.croudtrip.api.trips.RunningTripQueryStatus; import org.croudtrip.api.trips.TripOffer; import org.croudtrip.api.trips.TripQuery; import org.croudtrip.db.RunningTripQueryDAO; import org.croudtrip.gcm.GcmManager; import org.croudtrip.utils.Pair; import java.util.List; import javax.inject.Inject; /** * Handles {@link org.croudtrip.api.trips.RunningTripQuery}s. */ public class RunningTripQueriesManager { private final RunningTripQueryDAO runningTripQueryDAO; private final SimpleTripsMatcher simpleTripsMatcher; private final GcmManager gcmManager; @Inject RunningTripQueriesManager( RunningTripQueryDAO runningTripQueryDAO, SimpleTripsMatcher simpleTripsMatcher, GcmManager gcmManager) { this.runningTripQueryDAO = runningTripQueryDAO; this.simpleTripsMatcher = simpleTripsMatcher; this.gcmManager = gcmManager; } /** * Creates and stores a new {@link RunningTripQuery}. */ public RunningTripQuery startRunningQuery(TripQuery query) { RunningTripQuery runningQuery = new RunningTripQuery(0, query, RunningTripQueryStatus.RUNNING); runningTripQueryDAO.save(runningQuery); return runningQuery; } /** * Find all the queries by a certain passenger. * @param passenger The passenger you want to get the queries for * @param showOnlyRunning true, if you want to get only the running queries, false otherwise * @return A list of {@link org.croudtrip.api.trips.RunningTripQuery} by this passenger. */ public List<RunningTripQuery> getRunningQueries(User passenger, boolean showOnlyRunning) { if (showOnlyRunning) return runningTripQueryDAO.findByPassengerIdAndSatusRunning(passenger.getId()); else return runningTripQueryDAO.findByPassengerId(passenger.getId()); } /** * Find a running query by its id. * @param queryId the id of the query you want to get. * @return An {@link com.google.common.base.Optional} that contains the {@link org.croudtrip.api.trips.RunningTripQuery} * if it exists in the database. */ public Optional<RunningTripQuery> getRunningQuery(long queryId) { return runningTripQueryDAO.findById(queryId); } /** * Delete a running query from the database * @param runningTripQuery the query that should be deleted. */ public void deleteRunningQuery(RunningTripQuery runningTripQuery) { runningTripQueryDAO.delete(runningTripQuery); } /** * Checks if the passed in offer is a match for one of the running background searches * and alerts the passenger if that is the case. */ public void checkAndUpdateRunningQueries(TripOffer offer) { for (RunningTripQuery runningQuery : runningTripQueryDAO.findByStatusRunning()) { // check max waiting time if (runningQuery.getQuery().getCreationTimestamp() + runningQuery.getQuery().getMaxWaitingTimeInSeconds() < System.currentTimeMillis() / 1000) continue; // check if the newly offered trip matches to a running trip query TripQuery query = runningQuery.getQuery(); Optional<SimpleTripsMatcher.PotentialMatch> potentialMatch = simpleTripsMatcher.isPotentialMatch(offer, query); // notify passenger about potential match if (potentialMatch.isPresent()) { gcmManager.sendGcmMessageToUser( query.getPassenger(), GcmConstants.GCM_MSG_FOUND_MATCHES, new Pair<>(GcmConstants.GCM_MSG_FOUND_MATCHES_QUERY_ID, "" + runningQuery.getId())); RunningTripQuery updatedRunningQuery = new RunningTripQuery( runningQuery.getId(), runningQuery.getQuery(), RunningTripQueryStatus.FOUND); runningTripQueryDAO.update(updatedRunningQuery); } } } }