From 9057feeb6901573db67cc6e4fec305ae271c2b7e Mon Sep 17 00:00:00 2001
From: Josh Pollock <josh@calderawp.com>
Date: Thu, 5 Apr 2018 21:24:51 -0400
Subject: [PATCH] Impliment delete by user id feature- YOU MAY BE DELETED

---
 .../Features/FeatureHelperMethodsTest.php     | 39 ++++++++
 Tests/Unit/Features/FeatureContainerTest.php  | 25 ++---
 Tests/Unit/TestCase.php                       |  2 -
 src/CanCollectResults.php                     |  3 +-
 src/Delete/EntryValues.php                    |  3 +-
 src/Exceptions/Exception.php                  |  2 +-
 src/Features/DoesQueries.php                  |  3 +-
 src/Features/FeatureContainer.php             | 95 +++++++++++++------
 src/Features/Queries.php                      |  4 +-
 src/QueryBuilder.php                          |  2 +-
 src/Select/Entry.php                          |  2 -
 src/Select/EntryValues.php                    |  4 +-
 src/Select/SelectQueryBuilder.php             |  1 -
 src/SelectQueries.php                         |  2 -
 14 files changed, 127 insertions(+), 60 deletions(-)

diff --git a/Tests/Integration/Features/FeatureHelperMethodsTest.php b/Tests/Integration/Features/FeatureHelperMethodsTest.php
index 200002a..0374f81 100644
--- a/Tests/Integration/Features/FeatureHelperMethodsTest.php
+++ b/Tests/Integration/Features/FeatureHelperMethodsTest.php
@@ -3,6 +3,7 @@ namespace calderawp\CalderaFormsQuery\Tests\Integration\Features;
 
 
 use calderawp\CalderaFormsQuery\CreatesSelectQueries;
+use calderawp\CalderaFormsQuery\Delete\DeleteQueryBuilder;
 use calderawp\CalderaFormsQuery\Features\FeatureContainer;
 use calderawp\CalderaFormsQuery\Tests\Integration\IntegrationTestCase;
 use calderawp\CalderaFormsQuery\Tests\Traits\CanCreateEntryWithEmailField;
@@ -119,4 +120,42 @@ class FeatureHelperMethodsTest extends IntegrationTestCase
 		$this->assertTrue( 0 < count( $results ) );
 
 	}
+
+	/**
+	 * Test deleting all entries for a specific user
+	 *
+	 * @covers FeatureContainer::deleteByUserId()
+	 */
+	public function testDeleteByUserId()
+	{
+		$container = $this->containerFactory();
+		//Create one entry for unknown user
+		$this->createEntryWithEmail( rand(). 'email.com' );
+
+		//Create two entries for a known user.
+		$email = 'nom@noms.noms';
+		$userId = $this->factory()->user->create(
+			[ 'user_email' => $email ]
+		);
+		wp_set_current_user( $userId );
+		$this->createEntryWithEmail( $email );
+		$this->createEntryWithEmail( $email );
+
+		//Delete messages for known user
+		$container->deleteByUserId($userId);
+
+		//Expect no entry  results when querying by known user
+		$results = $container->selectByUserId($userId);
+		$this->assertSame(0, count($results));
+
+
+		//Expect no entry value results when querying by known user
+		$results = $container->selectByFieldValue(
+			$this->getEmailFieldSlug(),
+			$email
+		);
+		$this->assertSame(0, count($results));
+
+
+	}
 }
\ No newline at end of file
diff --git a/Tests/Unit/Features/FeatureContainerTest.php b/Tests/Unit/Features/FeatureContainerTest.php
index 82c2151..9a10663 100644
--- a/Tests/Unit/Features/FeatureContainerTest.php
+++ b/Tests/Unit/Features/FeatureContainerTest.php
@@ -3,7 +3,6 @@
 
 namespace calderawp\CalderaFormsQuery\Tests\Unit\Features;
 
-
 use calderawp\CalderaContainers\Service\Container as TheServiceContainer;
 use calderawp\CalderaFormsQuery\Features\DoesQueries;
 use calderawp\CalderaFormsQuery\Features\FeatureContainer;
@@ -25,8 +24,8 @@ class FeatureContainerTest extends TestCase
 	{
 		$serviceContainer = new TheServiceContainer();
 		$container = new FeatureContainer($serviceContainer, $this->getWPDB());
-		$this->assertTrue( is_object( $serviceContainer->make( MySqlBuilder::class ) ) );
-		$this->assertTrue( is_object( $container->getBuilder() ) );
+		$this->assertTrue(is_object($serviceContainer->make(MySqlBuilder::class)));
+		$this->assertTrue(is_object($container->getBuilder()));
 
 		$this->assertTrue(
 			is_a(
@@ -36,10 +35,9 @@ class FeatureContainerTest extends TestCase
 		);
 
 		$this->assertEquals(
-			$serviceContainer->make( MySqlBuilder::class ),
+			$serviceContainer->make(MySqlBuilder::class),
 			$container->getBuilder()
 		);
-
 	}
 
 	/**
@@ -61,7 +59,7 @@ class FeatureContainerTest extends TestCase
 		);
 
 		$this->assertEquals(
-			$serviceContainer->make( Queries::class ),
+			$serviceContainer->make(Queries::class),
 			$container->getQueries()
 		);
 	}
@@ -77,7 +75,8 @@ class FeatureContainerTest extends TestCase
 		$container = $this->containerFactory();
 
 		//Select entry
-		$this->assertEquals( $this->entryTableName(),
+		$this->assertEquals(
+			$this->entryTableName(),
 			$container
 				->getQueries()
 				->entrySelect()
@@ -85,7 +84,8 @@ class FeatureContainerTest extends TestCase
 		);
 
 		//Select entry value
-		$this->assertEquals( $this->entryValueTableName(),
+		$this->assertEquals(
+			$this->entryValueTableName(),
 			$container
 				->getQueries()
 				->entryValuesSelect()
@@ -93,7 +93,8 @@ class FeatureContainerTest extends TestCase
 		);
 
 		//Delete entry
-		$this->assertEquals( $this->entryTableName(),
+		$this->assertEquals(
+			$this->entryTableName(),
 			$container
 				->getQueries()
 				->entryDelete()
@@ -101,12 +102,12 @@ class FeatureContainerTest extends TestCase
 		);
 
 		//Delete entry values
-		$this->assertEquals( $this->entryValueTableName(),
+		$this->assertEquals(
+			$this->entryValueTableName(),
 			$container
 				->getQueries()
 				->entryValueDelete()
 				->getTableName()
 		);
 	}
-
-}
\ No newline at end of file
+}
diff --git a/Tests/Unit/TestCase.php b/Tests/Unit/TestCase.php
index df3ec4c..713fa95 100755
--- a/Tests/Unit/TestCase.php
+++ b/Tests/Unit/TestCase.php
@@ -19,6 +19,4 @@ abstract class TestCase extends FrameworkTestCase
 {
 	//Factories go in this trait so they are share with integration tests
 	use HasFactories;
-
-
 }
diff --git a/src/CanCollectResults.php b/src/CanCollectResults.php
index 33b5b78..6136d2c 100644
--- a/src/CanCollectResults.php
+++ b/src/CanCollectResults.php
@@ -3,7 +3,6 @@
 
 namespace calderawp\CalderaFormsQuery;
 
-
 trait CanCollectResults
 {
 	/**
@@ -67,4 +66,4 @@ trait CanCollectResults
 	{
 		$this->entryValueGenerator->resetQuery();
 	}
-}
\ No newline at end of file
+}
diff --git a/src/Delete/EntryValues.php b/src/Delete/EntryValues.php
index f189a6b..71840a0 100644
--- a/src/Delete/EntryValues.php
+++ b/src/Delete/EntryValues.php
@@ -30,8 +30,7 @@ class EntryValues extends DeleteQueryBuilder
 	 */
 	public function deleteByEntryIds(array $entryIds)
 	{
-		return $this->in($entryIds,'entry_id');
-
+		return $this->in($entryIds, 'entry_id');
 	}
 
 	/**
diff --git a/src/Exceptions/Exception.php b/src/Exceptions/Exception.php
index 6303eff..9e5fee1 100644
--- a/src/Exceptions/Exception.php
+++ b/src/Exceptions/Exception.php
@@ -5,4 +5,4 @@ namespace calderawp\CalderaFormsQuery\Exceptions;
 class Exception extends \Exception
 {
 
-}
\ No newline at end of file
+}
diff --git a/src/Features/DoesQueries.php b/src/Features/DoesQueries.php
index 43699bd..000231c 100644
--- a/src/Features/DoesQueries.php
+++ b/src/Features/DoesQueries.php
@@ -3,8 +3,7 @@
 
 namespace calderawp\CalderaFormsQuery\Features;
 
-
 interface DoesQueries
 {
 
-}
\ No newline at end of file
+}
diff --git a/src/Features/FeatureContainer.php b/src/Features/FeatureContainer.php
index efb7d1d..54b046b 100644
--- a/src/Features/FeatureContainer.php
+++ b/src/Features/FeatureContainer.php
@@ -3,7 +3,6 @@
 
 namespace calderawp\CalderaFormsQuery\Features;
 
-
 use calderawp\CalderaContainers\Container;
 use calderawp\CalderaContainers\Interfaces\ServiceContainer;
 
@@ -35,7 +34,7 @@ class FeatureContainer extends Container
 	 * @param ServiceContainer $serviceContainer
 	 * @param \wpdb $wpdb
 	 */
-	public function __construct(ServiceContainer $serviceContainer, \wpdb $wpdb )
+	public function __construct(ServiceContainer $serviceContainer, \wpdb $wpdb)
 	{
 
 		$this->serviceContainer = $serviceContainer;
@@ -49,11 +48,11 @@ class FeatureContainer extends Container
 	protected function bindServices()
 	{
 		//@TODO move these to service provider classes
-		$this->serviceContainer->singleton( MySqlBuilder::class, function(){
+		$this->serviceContainer->singleton(MySqlBuilder::class, function () {
 			return new MySqlBuilder();
 		});
 
-		$this->serviceContainer->bind( SelectQueries::class, function (){
+		$this->serviceContainer->bind(SelectQueries::class, function () {
 			//@TODO Factory
 			return new SelectQueries(
 				new EntrySelect(
@@ -68,7 +67,7 @@ class FeatureContainer extends Container
 			);
 		});
 
-		$this->serviceContainer->bind( DeleteQueries::class, function (){
+		$this->serviceContainer->bind(DeleteQueries::class, function () {
 			//@TODO Factory
 			return new DeleteQueries(
 				new EntryDelete(
@@ -83,14 +82,14 @@ class FeatureContainer extends Container
 			);
 		});
 
-		$this->serviceContainer->singleton( Queries::class, function(){
+		$this->serviceContainer->singleton(Queries::class, function () {
 			return new Queries(
 				$this
 					->serviceContainer
-					->make( SelectQueries::class ),
+					->make(SelectQueries::class),
 				$this
 					->serviceContainer
-					->make(DeleteQueries::class )
+					->make(DeleteQueries::class)
 			);
 		});
 	}
@@ -104,7 +103,7 @@ class FeatureContainer extends Container
 	{
 		return $this
 			->serviceContainer
-			->make( MySqlBuilder::class );
+			->make(MySqlBuilder::class);
 	}
 
 	/**
@@ -116,7 +115,7 @@ class FeatureContainer extends Container
 	{
 		return $this
 			->serviceContainer
-			->make( Queries::class );
+			->make(Queries::class);
 	}
 
 	/**
@@ -131,7 +130,7 @@ class FeatureContainer extends Container
 			->getQueries()
 			->entrySelect()
 			->queryByUserId($userId);
-		return $this->collectResults( $this->select( $query ) );
+		return $this->collectResults($this->select($query));
 	}
 
 	/**
@@ -143,7 +142,7 @@ class FeatureContainer extends Container
 	 *
 	 * @return array
 	 */
-	public function selectByFieldValue($fieldSlug, $fieldValue, $have = true )
+	public function selectByFieldValue($fieldSlug, $fieldValue, $have = true)
 	{
 
 		$type = $have ? 'equals' : 'notEquals';
@@ -152,21 +151,19 @@ class FeatureContainer extends Container
 			->entryValuesSelect()
 			->queryByFieldValue($fieldSlug, $fieldValue, $type, 'AND', [
 				'entry_id'
-			] );
-		$results = $this->select( $queryForEntryValues );
-		if( empty( $results ) || 0 >= count( $results )){
+			]);
+		$results = $this->select($queryForEntryValues);
+		if (empty($results) || 0 >= count($results)) {
 			return [];
 		}
-		foreach ( $results as &$result ){
-			$result = $result->entry_id;
-		}
+		$results = $this->reduceResultsToEntryId($results);
 
 		$queryForValues = $this
 			->getQueries()
 			->entrySelect()
 			->queryByEntryIds($results);
 
-		return $this->collectResults( $this->select( $queryForValues ) );
+		return $this->collectResults($this->select($queryForValues));
 	}
 
 	/**
@@ -175,13 +172,13 @@ class FeatureContainer extends Container
 	 * @param array $entryIds Entry Ids to delete
 	 * @return $this
 	 */
-	public function deleteByEntryIds(array$entryIds)
+	public function deleteByEntryIds(array $entryIds)
 	{
 		$this->delete(
 			$this
-			->getQueries()
-			->entryDelete()
-			->deleteByEntryIds($entryIds)
+				->getQueries()
+				->entryDelete()
+				->deleteByEntryIds($entryIds)
 		);
 		$this->delete(
 			$this->getQueries()
@@ -192,6 +189,37 @@ class FeatureContainer extends Container
 		return $this;
 	}
 
+	/**
+	 * Delete all entries and entry values by user ID
+	 *
+	 * @param int $userId
+	 */
+	public function deleteByUserId($userId)
+	{
+
+		$entries = $this->select(
+			$this
+			->getQueries()
+			->entrySelect()
+			->queryByUserId($userId)
+		);
+		if (!empty($entries)) {
+			$ids = $this->reduceResultsToEntryId($entries, 'id');
+			$this->delete(
+				$this
+					->getQueries()
+					->entryDelete()
+					->deleteByEntryIds($ids)
+			);
+			$this->delete(
+				$this
+					->getQueries()
+					->entryValueDelete()
+					->deleteByEntryIds($ids)
+			);
+		}
+	}
+
 	/**
 	 * @return string
 	 */
@@ -218,7 +246,6 @@ class FeatureContainer extends Container
 	{
 		$results = [];
 		foreach ($entriesValues as $entry) {
-
 			$entry = new \Caldera_Forms_Entry_Entry($entry);
 			$query = $this
 				->getQueries()
@@ -261,8 +288,8 @@ class FeatureContainer extends Container
 	private function select(SelectQueryBuilder $query)
 	{
 		return $this
-				->getQueries()
-				->select($query);
+			->getQueries()
+			->select($query);
 	}
 
 	/**
@@ -274,9 +301,19 @@ class FeatureContainer extends Container
 	private function delete(DeleteQueryBuilder $query)
 	{
 		return $this->
-			getQueries()
+		getQueries()
 			->delete($query);
 	}
 
-
-}
\ No newline at end of file
+	/**
+	 * @param $results
+	 * @return array
+	 */
+	private function reduceResultsToEntryId($results,$colum='entry_id')
+	{
+		foreach ($results as &$result) {
+			$result = $result->$colum;
+		}
+		return $results;
+	}
+}
diff --git a/src/Features/Queries.php b/src/Features/Queries.php
index 0cd7204..f6a0973 100644
--- a/src/Features/Queries.php
+++ b/src/Features/Queries.php
@@ -43,7 +43,7 @@ class Queries implements DoesQueries
 	 * @param SelectQueryBuilder $query
 	 * @return \stdClass[]
 	 */
-	public function select( SelectQueryBuilder $query )
+	public function select(SelectQueryBuilder $query)
 	{
 		return $this
 			->selectQueries
@@ -56,7 +56,7 @@ class Queries implements DoesQueries
 	 * @param DeleteQueryBuilder $query
 	 * @return \stdClass[]
 	 */
-	public function delete( DeleteQueryBuilder $query )
+	public function delete(DeleteQueryBuilder $query)
 	{
 		return $this
 			->deleteQueries
diff --git a/src/QueryBuilder.php b/src/QueryBuilder.php
index 6f47af1..1a731cf 100644
--- a/src/QueryBuilder.php
+++ b/src/QueryBuilder.php
@@ -100,7 +100,7 @@ abstract class QueryBuilder implements CreatesSqlQueries
 	{
 		$values = $this->getBuilder()->getValues();
 		foreach ($values as $identifier => $value) {
-			if (is_array( $value ) || is_object( $value ) ) {
+			if (is_array($value) || is_object($value)) {
 				continue;
 			} else {
 				$values[$identifier] = $this->surroundValue($value);
diff --git a/src/Select/Entry.php b/src/Select/Entry.php
index c1fea30..4ececde 100644
--- a/src/Select/Entry.php
+++ b/src/Select/Entry.php
@@ -55,6 +55,4 @@ class Entry extends SelectQueryBuilder
 	{
 		return $this->is('user_id', $userId);
 	}
-
-
 }
diff --git a/src/Select/EntryValues.php b/src/Select/EntryValues.php
index a4fa43a..a367a36 100644
--- a/src/Select/EntryValues.php
+++ b/src/Select/EntryValues.php
@@ -35,10 +35,10 @@ class EntryValues extends SelectQueryBuilder
 	 */
 	public function queryByFieldValue($fieldSlug, $fieldValue, $type = 'equals', $whereOperator = 'AND', $columns = [])
 	{
-		if( ! empty( $columns ) ){
+		if (! empty($columns)) {
 			$this
 				->getSelectQuery()
-				->setColumns( $columns );
+				->setColumns($columns);
 		}
 		switch ($type) {
 			case 'equals':
diff --git a/src/Select/SelectQueryBuilder.php b/src/Select/SelectQueryBuilder.php
index 9c06624..b4a5028 100644
--- a/src/Select/SelectQueryBuilder.php
+++ b/src/Select/SelectQueryBuilder.php
@@ -59,5 +59,4 @@ abstract class SelectQueryBuilder extends QueryBuilder implements DoesSelectQuer
 	{
 		$this->selectQuery = new \NilPortugues\Sql\QueryBuilder\Manipulation\Select($this->getTableName());
 	}
-
 }
diff --git a/src/SelectQueries.php b/src/SelectQueries.php
index 1cc6aeb..c22c3ca 100644
--- a/src/SelectQueries.php
+++ b/src/SelectQueries.php
@@ -77,6 +77,4 @@ class SelectQueries implements CreatesSelectQueries
 	{
 		$this->entryValueGenerator->resetQuery();
 	}
-
-
 }
-- 
GitLab