Skip to content

Commit

Permalink
NEW DB column showing if file is userform upload
Browse files Browse the repository at this point in the history
- UserFormUpload used by File::isTrackedFormUpload()
  • Loading branch information
emteknetnz committed May 28, 2020
1 parent e54a825 commit ed53709
Show file tree
Hide file tree
Showing 5 changed files with 135 additions and 0 deletions.
3 changes: 3 additions & 0 deletions _config/extensions.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,6 @@ Name: userformsextensions
SilverStripe\UserForms\Model\UserDefinedForm:
extensions:
UpgradePolymorphicExtension: SilverStripe\UserForms\Extension\UpgradePolymorphicExtension
SilverStripe\Assets\File:
extensions:
- SilverStripe\UserForms\Extension\UserFormFileExtension
2 changes: 2 additions & 0 deletions code/Control/UserDefinedFormController.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
use SilverStripe\ORM\ValidationException;
use SilverStripe\ORM\ValidationResult;
use SilverStripe\Security\Security;
use SilverStripe\UserForms\Extension\UserFormFileExtension;
use SilverStripe\UserForms\Form\UserForm;
use SilverStripe\UserForms\Model\EditableFormField;
use SilverStripe\UserForms\Model\EditableFormField\EditableFileField;
Expand Down Expand Up @@ -269,6 +270,7 @@ public function process($data, $form)
/** @var AssetContainer|File $file */
$file = $upload->getFile();
$file->ShowInSearch = 0;
$file->UserFormUpload = UserFormFileExtension::USER_FORM_UPLOAD_TRUE;
$file->write();

// generate image thumbnail to show in asset-admin
Expand Down
80 changes: 80 additions & 0 deletions code/Extension/UserFormFileExtension.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
<?php

namespace SilverStripe\UserForms\Extension;

use SilverStripe\Assets\File;
use SilverStripe\Assets\Folder;
use SilverStripe\Core\Convert;
use SilverStripe\ORM\DataExtension;
use SilverStripe\ORM\DataObject;
use SilverStripe\ORM\Queries\SQLUpdate;
use SilverStripe\UserForms\Control\UserDefinedFormController;
use SilverStripe\UserForms\Model\Submission\SubmittedFileField;
use SilverStripe\Versioned\Versioned;

/**
* @method File SubmittedFileField
*/
class UserFormFileExtension extends DataExtension
{

public const USER_FORM_UPLOAD_UNKNOWN = null;

public const USER_FORM_UPLOAD_FALSE = 'f';

public const USER_FORM_UPLOAD_TRUE = 't';

private static $db = [
'UserFormUpload' => "Enum('f, t', null)",
];

private static $belongs_to = [
'SubmittedFileField' => SubmittedFileField::class
];

/**
* Check if the file is associated with a userform submission
* Save the result in the database as a tri-state for two reasons:
* a) performance - prevent the need for an extra DB query
* b) if in the future the UserForm submission is deleted and the uploaded file is not (file is orphaned),
* then it is still recorded that the file was originally uploaded from a userform submission
*
* @param bool $value
* @see File::isTrackedFormUpload(), UserDefinedFormController::process()
*/
public function updateTrackedFormUpload(&$value): void
{
/** @var File|Versioned|UserFormFileExtension $file */
$file = $this->owner;
if ($file->UserFormUpload != self::USER_FORM_UPLOAD_UNKNOWN) {
$value = $file->UserFormUpload == self::USER_FORM_UPLOAD_TRUE;
return;
}
if ($file->ClassName == Folder::class) {
$value = false;
} else {
$value = $file->SubmittedFileField()->exists();
}
$this->updateDB($value);
}

/**
* Update File.UserFormUpload draft table without altering File.LastEdited
*
* @param bool $value
*/
private function updateDB(bool $value): void
{
if (!$this->owner->isInDB()) {
return;
}
$tableName = Convert::raw2sql(DataObject::getSchema()->tableName(File::class));
$column = 'UserFormUpload';
$enumVal = $value ? self::USER_FORM_UPLOAD_TRUE : self::USER_FORM_UPLOAD_FALSE;
SQLUpdate::create()
->setTable(sprintf('"%s"', $tableName))
->addWhere(['"ID" = ?' => [$this->owner->ID]])
->addAssignments([sprintf('"%s"', $column) => $enumVal])
->execute();
}
}
1 change: 1 addition & 0 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
}
],
"require": {
"php": ">=7.1",
"silverstripe/cms": "^4.0",
"symbiote/silverstripe-gridfieldextensions": "^3.1",
"silverstripe/segment-field": "^2.0",
Expand Down
49 changes: 49 additions & 0 deletions tests/Extension/UserFormFileExtensionTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
<?php

namespace SilverStripe\UserForms\Tests\Extension;

use SilverStripe\Assets\File;
use SilverStripe\Dev\SapphireTest;
use SilverStripe\UserForms\Model\Submission\SubmittedFileField;
use SilverStripe\UserForms\Extension\UserFormFileExtension;

class UserFormFileExtensionTest extends SapphireTest
{
protected $usesDatabase = true;

public function testUpdateIsUserFormUploadFalse()
{
$file = File::create();
$file->write();
$this->assertNull($file->UserFormUpload);

$value = true;
$file->invokeWithExtensions('updateTrackedFormUpload', $value);
$this->assertFalse($value);

// refresh DataObject to get latest DB changes
$file = File::get()->byID($file->ID);

$this->assertEquals(UserFormFileExtension::USER_FORM_UPLOAD_FALSE, $file->UserFormUpload);
}

public function testUpdateIsUserFormUploadTrue()
{
$file = File::create();
$file->write();
$this->assertNull($file->UserFormUpload);

$submittedFileField = SubmittedFileField::create();
$submittedFileField->UploadedFileID = $file->ID;
$submittedFileField->write();

$value = false;
$file->invokeWithExtensions('updateTrackedFormUpload', $value);
$this->assertTrue($value);

// refresh DataObject to get latest DB changes
$file = File::get()->byID($file->ID);

$this->assertEquals(UserFormFileExtension::USER_FORM_UPLOAD_TRUE, $file->UserFormUpload);
}
}

0 comments on commit ed53709

Please sign in to comment.