public static function attend(Inputter $inputter, JSONOutputter $outputter) { // List Created // // Constants // // Verify input // $required_keys = array('attending_user_identification' => '', 'event_identification' => '', 'attending_status' => ''); $inputter->validate_input($required_keys, null); // Validate input // $validate_error = null; UniversallyUniqueIdentifier::propertyIsValid('rawIdentifier', $inputter->variables_array['attending_user_identification'], $validate_error); UniversallyUniqueIdentifier::propertyIsValid('rawIdentifier', $inputter->variables_array['event_identification'], $validate_error); if (isset($validate_error)) { $outputter->print_error($validate_error); } // Attending status // $inputter->variables_array['attending_status'] = intval($inputter->variables_array['attending_status']); if ($inputter->variables_array['attending_status'] < 0 || $inputter->variables_array['attending_status'] > 2) { // Throw error, status is out of bounds // $error = Error::withDomain(PRIVATE_EVENTS_REST_CONTROLLER_ERROR_DOMAIN, PRIVATE_EVENTS_REST_CONTROLLER_ERROR_CODE_ENTITY_DOES_NOT_EXIST, $attending_status . ' is out of bounds.'); $outputter->print_error($error); } // Identification should exist // $client = new Everyman\Neo4j\Client('events.sb04.stations.graphenedb.com', 24789); $client->getTransport()->setAuth('Events', '3TP9LHROhv8LIcGmbYzq'); $query_string_check_object = 'MATCH (object:AttendingUser) ' . 'WHERE object.' . UNIVERSALLY_UNIQUE_OBJECT_KEY_IDENTIFICATION . " = '" . $inputter->variables_array['attending_user_identification'] . "' " . 'RETURN object'; $query_check_object = new Everyman\Neo4j\Cypher\Query($client, $query_string_check_object); $result_check_object = $query_check_object->getResultSet(); if (!isset($result_check_object[0]['object'])) { // No user exists // $outputter->print_error(Error::withDomain(PRIVATE_EVENTS_REST_CONTROLLER_ERROR_DOMAIN, PRIVATE_EVENTS_REST_CONTROLLER_ERROR_CODE_ENTITY_DOES_NOT_EXIST, $attending_user_identification . ' should be an existing user identification.')); } // Identification should exist // $client = new Everyman\Neo4j\Client('events.sb04.stations.graphenedb.com', 24789); $client->getTransport()->setAuth('Events', '3TP9LHROhv8LIcGmbYzq'); $query_string_check_object = 'MATCH (object:Event) ' . 'WHERE object.' . UNIVERSALLY_UNIQUE_OBJECT_KEY_IDENTIFICATION . " = '" . $inputter->variables_array['event_identification'] . "' " . 'RETURN object'; $query_check_object = new Everyman\Neo4j\Cypher\Query($client, $query_string_check_object); $result_check_object = $query_check_object->getResultSet(); if (!isset($result_check_object[0]['object'])) { // No user exists // $outputter->print_error(Error::withDomain(PRIVATE_EVENTS_REST_CONTROLLER_ERROR_DOMAIN, PRIVATE_EVENTS_REST_CONTROLLER_ERROR_CODE_ENTITY_DOES_NOT_EXIST, $event_identification . ' should be an existing event identification.')); } // Attending user's cannot attend their own events // $client = new Everyman\Neo4j\Client('events.sb04.stations.graphenedb.com', 24789); $client->getTransport()->setAuth('Events', '3TP9LHROhv8LIcGmbYzq'); $query_string_check_object = 'MATCH (creator:CreatingUser)-[relationship:' . CREATINGUSER_RELATIONSHIP_NAME_EVENT . ']->(event:Event) ' . 'WHERE creator.' . UNIVERSALLY_UNIQUE_OBJECT_KEY_IDENTIFICATION . " = '" . $inputter->variables_array['attending_user_identification'] . "' AND event." . UNIVERSALLY_UNIQUE_OBJECT_KEY_IDENTIFICATION . " = '" . $inputter->variables_array['event_identification'] . "' " . 'RETURN relationship'; $query_check_object = new Everyman\Neo4j\Cypher\Query($client, $query_string_check_object); $result_check_object = $query_check_object->getResultSet(); if (isset($result_check_object[0]) && isset($result_check_object[0]['relationship'])) { // Throw error, cannot attend own event // $outputter->print_error(Error::withDomain(PRIVATE_EVENTS_REST_CONTROLLER_ERROR_DOMAIN, PRIVATE_EVENTS_REST_CONTROLLER_ERROR_CODE_ENTITY_DOES_NOT_EXIST, 'Cannot attend own event.')); } // Events // $query_string = 'MATCH (attendingUser:AttendingUser), (event:Event)-[:' . EVENT_RELATIONSHIP_NAME_CREATOR . ']->(creatingUser:CreatingUser) ' . 'WHERE attendingUser.' . UNIVERSALLY_UNIQUE_OBJECT_KEY_IDENTIFICATION . " = '" . $inputter->variables_array['attending_user_identification'] . "' AND event." . UNIVERSALLY_UNIQUE_OBJECT_KEY_IDENTIFICATION . " = '" . $inputter->variables_array['event_identification'] . "' " . 'RETURN attendingUser, event, creatingUser'; $query = new Everyman\Neo4j\Cypher\Query($client, $query_string); $result = $query->getResultSet(); if ($result->count() <= 0) { $outputter->print_error(Error::withDomain(PRIVATE_EVENTS_REST_CONTROLLER_ERROR_DOMAIN, PRIVATE_EVENTS_REST_CONTROLLER_ERROR_CODE_ENTITY_DOES_NOT_EXIST, 'No results returned.')); } $attendingUser = $result[0]['attendingUser']; $event = $result[0]['event']; $creatingUser = $result[0]['creatingUser']; // Get relationship // $query_string = 'OPTIONAL MATCH (attendingUser:AttendingUser)-[relationship:' . ATTENDINGUSER_RELATIONSHIP_NAME_RSVP . ']->(event:Event) ' . 'WHERE attendingUser.' . UNIVERSALLY_UNIQUE_OBJECT_KEY_IDENTIFICATION . " = '" . $inputter->variables_array['attending_user_identification'] . "' AND event." . UNIVERSALLY_UNIQUE_OBJECT_KEY_IDENTIFICATION . " = '" . $inputter->variables_array['event_identification'] . "' " . 'RETURN relationship'; $query = new Everyman\Neo4j\Cypher\Query($client, $query_string); $result = $query->getResultSet(); if ($result->count() <= 0) { $outputter->print_error(Error::withDomain(PRIVATE_EVENTS_REST_CONTROLLER_ERROR_DOMAIN, PRIVATE_EVENTS_REST_CONTROLLER_ERROR_CODE_ENTITY_DOES_NOT_EXIST, 'No results returned.')); } $relationship = $result[0]['relationship']; if (!isset($relationship)) { // Create relationship as it's not created yet // $relationship = $client->makeRelationship()->setStartNode($attendingUser)->setEndNode($event)->setType(ATTENDINGUSER_RELATIONSHIP_NAME_RSVP)->setProperty(ATTENDINGUSER_RELATIONSHIP_NAME_RSVP_PROPERTY_NAME_ATTENDING_STATUS, $inputter->variables_array['attending_status'])->save(); } if (!isset($relationship)) { $error = Error::withDomain(PRIVATE_EVENTS_REST_CONTROLLER_ERROR_DOMAIN, PRIVATE_EVENTS_REST_CONTROLLER_ERROR_CODE_ENTITY_DOES_NOT_EXIST, 'Problem attending event'); $outputter->print_error($error); } else { $relationship->setProperty(ATTENDINGUSER_RELATIONSHIP_NAME_RSVP_PROPERTY_NAME_ATTENDING_STATUS, $inputter->variables_array['attending_status'])->save(); } // 4) Send notifications // if ($inputter->variables_array['attending_status'] == ATTENDINGUSER_RELATIONSHIP_NAME_RSVP_PROPERTY_VALUE_ATTENDING_STATUS_ATTENDING) { $name = $attendingUser->getProperty(CREATINGUSER_KEY_FIRST_NAME); if (!isset($name)) { $name = $attendingUser->getProperty(CREATINGUSER_KEY_NAME); } $identifiers = $creatingUser->getProperty(USER_KEY_NOTIFICATION_DEVICE_IDENTIFIERS); if (isset($identifiers) && is_array($identifiers) && count($identifiers) > 0) { foreach ($identifiers as $identifier) { // Create notification item // $payload = Payload::PayloadJSON(array('alert' => $name . " is attending you're event.", 'sound' => 'default'), array()); $notificationItem = new APNsNotificationItem($identifier, $payload, 'notificationIdentifier', null, null); // Create notification // $notification = new APNsNotification(APNS_NOTIFICATION_COMMAND_PUSH, APNS_NOTIFICATION_FRAME_LENGTH, array($notificationItem)); // Send notification // $inputter->notificationController->APNsManager->sendNotification($notification); } } } // 5) Print data // $outputter->print_data(array(array('attending_status' => $inputter->variables_array['attending_status']))); }