From c783e9fdb093bb8da972287d5d41e6868626d672 Mon Sep 17 00:00:00 2001
From: Paul Klimov <klimov.paul@gmail.com>
Date: Thu, 5 Dec 2013 15:34:48 +0200
Subject: [PATCH] Mongo File Active Record refactored.

---
 extensions/mongo/file/ActiveRecord.php | 88 +++++++++++++++++++++++++++++++++++++++++++++-------------------------------------------
 1 file changed, 45 insertions(+), 43 deletions(-)

diff --git a/extensions/mongo/file/ActiveRecord.php b/extensions/mongo/file/ActiveRecord.php
index fd9367b..1bb2f55 100644
--- a/extensions/mongo/file/ActiveRecord.php
+++ b/extensions/mongo/file/ActiveRecord.php
@@ -88,26 +88,18 @@ class ActiveRecord extends \yii\mongo\ActiveRecord
 			}
 		}
 		$collection = static::getCollection();
-		if (array_key_exists('newFileContent', $values)) {
-			$fileContent = $values['newFileContent'];
-			unset($values['newFileContent']);
-			unset($values['file']);
-			$newId = $collection->insertFileContent($fileContent, $values);
-		} elseif (array_key_exists('file', $values)) {
-			$file = $values['file'];
-			if ($file instanceof UploadedFile) {
-				$fileName = $file->tempName;
-			} elseif (is_string($file)) {
-				if (file_exists($file)) {
-					$fileName = $file;
-				} else {
-					throw new InvalidParamException("File '{$file}' does not exist.");
-				}
-			} else {
-				throw new InvalidParamException('Unsupported type of "file" attribute.');
-			}
+		if (isset($values['newFileContent'])) {
+			$newFileContent = $values['newFileContent'];
 			unset($values['newFileContent']);
+		}
+		if (isset($values['file'])) {
+			$newFile = $values['file'];
 			unset($values['file']);
+		}
+		if (isset($newFileContent)) {
+			$newId = $collection->insertFileContent($newFileContent, $values);
+		} elseif (isset($newFile)) {
+			$fileName = $this->extractFileName($newFile);
 			$newId = $collection->insertFile($fileName, $values);
 		} else {
 			$newId = $collection->insert($values);
@@ -136,35 +128,24 @@ class ActiveRecord extends \yii\mongo\ActiveRecord
 		}
 
 		$collection = static::getCollection();
-		if (array_key_exists('newFileContent', $values)) {
-			$fileContent = $values['newFileContent'];
+		if (isset($values['newFileContent'])) {
+			$newFileContent = $values['newFileContent'];
 			unset($values['newFileContent']);
+		}
+		if (isset($values['file'])) {
+			$newFile = $values['file'];
 			unset($values['file']);
-			$values['_id'] = $this->getAttribute('_id');
-			$this->deleteInternal();
-			$collection->insertFileContent($fileContent, $values);
-			$rows = 1;
-			$this->setAttribute('newFileContent', null);
-			$this->setAttribute('file', null);
-		} elseif (array_key_exists('file', $values)) {
-			$file = $values['file'];
-			if ($file instanceof UploadedFile) {
-				$fileName = $file->tempName;
-			} elseif (is_string($file)) {
-				if (file_exists($file)) {
-					$fileName = $file;
-				} else {
-					throw new InvalidParamException("File '{$file}' does not exist.");
-				}
+		}
+		if (isset($newFileContent) || isset($newFile)) {
+			$rows = $this->deleteInternal();
+			$insertValues = $values;
+			$insertValues['_id'] = $this->getAttribute('_id');
+			if (isset($newFileContent)) {
+				$collection->insertFileContent($newFileContent, $insertValues);
 			} else {
-				throw new InvalidParamException('Unsupported type of "file" attribute.');
+				$fileName = $this->extractFileName($newFile);
+				$collection->insertFile($fileName, $insertValues);
 			}
-			unset($values['newFileContent']);
-			unset($values['file']);
-			$values['_id'] = $this->getAttribute('_id');
-			$this->deleteInternal();
-			$collection->insertFile($fileName, $values);
-			$rows = 1;
 			$this->setAttribute('newFileContent', null);
 			$this->setAttribute('file', null);
 		} else {
@@ -192,6 +173,27 @@ class ActiveRecord extends \yii\mongo\ActiveRecord
 	}
 
 	/**
+	 * Extracts filename from given raw file value.
+	 * @param mixed $file raw file value.
+	 * @return string file name.
+	 * @throws \yii\base\InvalidParamException on invalid file value.
+	 */
+	protected function extractFileName($file)
+	{
+		if ($file instanceof UploadedFile) {
+			return $file->tempName;
+		} elseif (is_string($file)) {
+			if (file_exists($file)) {
+				return $file;
+			} else {
+				throw new InvalidParamException("File '{$file}' does not exist.");
+			}
+		} else {
+			throw new InvalidParamException('Unsupported type of "file" attribute.');
+		}
+	}
+
+	/**
 	 * Refreshes the [[file]] attribute from file collection, using current primary key.
 	 * @return \MongoGridFSFile|null refreshed file value.
 	 */
--
libgit2 0.27.1