From 4233b0129d7814201c793442b030427a34a1642a Mon Sep 17 00:00:00 2001
From: Josh Pollock <josh@calderawp.com>
Date: Wed, 4 Apr 2018 21:38:47 -0400
Subject: [PATCH] select by user id on main class

---
 .../Features/QueryByUserIdTest.php            | 46 ++++++++++
 src/EntryQueries.php                          | 85 +++++++++++++++++++
 2 files changed, 131 insertions(+)
 create mode 100644 Tests/Integration/Features/QueryByUserIdTest.php

diff --git a/Tests/Integration/Features/QueryByUserIdTest.php b/Tests/Integration/Features/QueryByUserIdTest.php
new file mode 100644
index 0000000..2b5ec48
--- /dev/null
+++ b/Tests/Integration/Features/QueryByUserIdTest.php
@@ -0,0 +1,46 @@
+<?php
+namespace calderawp\CalderaFormsQuery\Tests\Integration\Features;
+
+
+use calderawp\CalderaFormsQuery\QueriesEntries;
+use calderawp\CalderaFormsQuery\Tests\Integration\IntegrationTestCase;
+use calderawp\CalderaFormsQuery\Tests\Traits\CanCreateEntryWithEmailField;
+
+class QueryByUserIdTest extends IntegrationTestCase
+{
+
+	use CanCreateEntryWithEmailField;
+
+	/**
+	 * Test selecting by entry ID
+	 *
+	 * @covers QueriesEntries::selectByUserId()
+	 */
+	public function testByUserId()
+	{
+		$email = 'nom@noms.noms';
+		//Create an entry for a known user.
+		$userId = $this->factory()->user->create(
+			[ 'user_email' => $email ]
+		);
+		wp_set_current_user( $userId );
+		$entryId = $this->createEntryWithEmail( $email );
+		$queries = $this->entryQueriesFactory();
+
+		$results = $queries->selectByUserId( $userId );
+		$this->assertEquals( $entryId, $results[0]['entry']->id);
+		$this->assertEquals( $entryId, $results[0]['entry']->id);
+
+		$found = false;
+		foreach ( $results[0]['values'] as $entryValue )
+		{
+			if( $entryValue->slug === $this->getEmailFieldSlug() ){
+				$this->assertSame( $email, $entryValue->value );
+				$found = true;
+			}
+		}
+
+		$this->assertTrue( $found );
+
+	}
+}
\ No newline at end of file
diff --git a/src/EntryQueries.php b/src/EntryQueries.php
index c54876e..8fee874 100644
--- a/src/EntryQueries.php
+++ b/src/EntryQueries.php
@@ -61,4 +61,89 @@ class EntryQueries implements QueriesEntries
 	{
 		return $this->entryGenerator;
 	}
+
+
+	/**
+	 * Get all data for a user by Id
+	 *
+	 * @param $userId
+	 * @return array
+	 */
+	public function selectByUserId($userId)
+	{
+		$this->resetEntryGenerator();
+
+		$this
+			->getEntryGenerator()
+			->queryByUserId($userId);
+
+		$entries = $this->getResults($this->getEntryGenerator()->getPreparedSql());
+
+		return $this->collectResults($entries);
+
+
+	}
+
+	/**
+	 * Reset entry generator
+	 */
+	private function resetEntryGenerator()
+	{
+		$this->entryGenerator->resetQuery();
+	}
+
+	/**
+	 * Reset entry value generator
+	 */
+	private function resetEntryValueGenerator()
+	{
+		$this->entryValueGenerator->resetQuery();
+	}
+
+	/**
+	 * Collect results using  Caldera_Forms_Entry_Entry and Caldera_Forms_Entry_Field to represent values
+	 *
+	 * @param \stdClass[] $entriesValues
+	 * @return array
+	 */
+	private function collectResults($entriesValues)
+	{
+		$results = [];
+		foreach ($entriesValues as $entry) {
+			$this->resetEntryValueGenerator();
+			$entry = new \Caldera_Forms_Entry_Entry($entry);
+			$this
+				->getEntryValueGenerator()
+				->queryByEntryId($entry->id);
+			$entriesValues =$this->getResults(
+				$this->getEntryValueGenerator()
+				->getPreparedSql()
+			);
+
+			$entryValuesPrepared = $this->collectEntryValues($entriesValues);
+			$results[] = [
+				'entry' => $entry,
+				'values' => $entryValuesPrepared
+			];
+
+		}
+		return $results;
+	}
+
+	/**
+	 * Collect entry values as Caldera_Forms_Entry_Field objects
+	 *
+	 * @param \stdClass[] $entriesValues
+	 * @return array
+	 */
+	private function collectEntryValues($entriesValues): array
+	{
+		$entryValuesPrepared = [];
+		if (!empty($entriesValues)) {
+			foreach ($entriesValues as $entryValue) {
+				$entryValuesPrepared[] = new \Caldera_Forms_Entry_Field($entryValue);
+			}
+		}
+		return $entryValuesPrepared;
+	}
 }
-- 
GitLab