Page MenuHomePhabricator

D17821.id42849.diff
No OneTemporary

D17821.id42849.diff

diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php
--- a/src/__phutil_library_map__.php
+++ b/src/__phutil_library_map__.php
@@ -2982,6 +2982,7 @@
'PhabricatorMacroDisableController' => 'applications/macro/controller/PhabricatorMacroDisableController.php',
'PhabricatorMacroDisabledTransaction' => 'applications/macro/xaction/PhabricatorMacroDisabledTransaction.php',
'PhabricatorMacroEditController' => 'applications/macro/controller/PhabricatorMacroEditController.php',
+ 'PhabricatorMacroEditEngine' => 'applications/macro/editor/PhabricatorMacroEditEngine.php',
'PhabricatorMacroEditor' => 'applications/macro/editor/PhabricatorMacroEditor.php',
'PhabricatorMacroFileTransaction' => 'applications/macro/xaction/PhabricatorMacroFileTransaction.php',
'PhabricatorMacroListController' => 'applications/macro/controller/PhabricatorMacroListController.php',
@@ -8187,7 +8188,8 @@
'PhabricatorMacroDatasource' => 'PhabricatorTypeaheadDatasource',
'PhabricatorMacroDisableController' => 'PhabricatorMacroController',
'PhabricatorMacroDisabledTransaction' => 'PhabricatorMacroTransactionType',
- 'PhabricatorMacroEditController' => 'PhabricatorMacroController',
+ 'PhabricatorMacroEditController' => 'PhameBlogController',
+ 'PhabricatorMacroEditEngine' => 'PhabricatorEditEngine',
'PhabricatorMacroEditor' => 'PhabricatorApplicationTransactionEditor',
'PhabricatorMacroFileTransaction' => 'PhabricatorMacroTransactionType',
'PhabricatorMacroListController' => 'PhabricatorMacroController',
diff --git a/src/applications/macro/application/PhabricatorMacroApplication.php b/src/applications/macro/application/PhabricatorMacroApplication.php
--- a/src/applications/macro/application/PhabricatorMacroApplication.php
+++ b/src/applications/macro/application/PhabricatorMacroApplication.php
@@ -33,7 +33,8 @@
'create/' => 'PhabricatorMacroEditController',
'view/(?P<id>[1-9]\d*)/' => 'PhabricatorMacroViewController',
'comment/(?P<id>[1-9]\d*)/' => 'PhabricatorMacroCommentController',
- 'edit/(?P<id>[1-9]\d*)/' => 'PhabricatorMacroEditController',
+ $this->getEditRoutePattern('edit/')
+ => 'PhabricatorMacroEditController',
'audio/(?P<id>[1-9]\d*)/' => 'PhabricatorMacroAudioController',
'disable/(?P<id>[1-9]\d*)/' => 'PhabricatorMacroDisableController',
'meme/' => 'PhabricatorMacroMemeController',
diff --git a/src/applications/macro/controller/PhabricatorMacroEditController.php b/src/applications/macro/controller/PhabricatorMacroEditController.php
--- a/src/applications/macro/controller/PhabricatorMacroEditController.php
+++ b/src/applications/macro/controller/PhabricatorMacroEditController.php
@@ -1,304 +1,10 @@
<?php
-final class PhabricatorMacroEditController extends PhabricatorMacroController {
+final class PhabricatorMacroEditController extends PhameBlogController {
public function handleRequest(AphrontRequest $request) {
- $viewer = $request->getViewer();
- $id = $request->getURIData('id');
-
- $this->requireApplicationCapability(
- PhabricatorMacroManageCapability::CAPABILITY);
-
- if ($id) {
- $macro = id(new PhabricatorMacroQuery())
- ->setViewer($viewer)
- ->withIDs(array($id))
- ->needFiles(true)
- ->executeOne();
- if (!$macro) {
- return new Aphront404Response();
- }
- } else {
- $macro = new PhabricatorFileImageMacro();
- $macro->setAuthorPHID($viewer->getPHID());
- }
-
- $errors = array();
- $e_name = true;
- $e_file = null;
- $file = null;
-
- if ($request->isFormPost()) {
- $original = clone $macro;
-
- $new_name = null;
- if ($request->getBool('name_form') || !$macro->getID()) {
- $new_name = $request->getStr('name');
-
- $macro->setName($new_name);
-
- if (!strlen($macro->getName())) {
- $errors[] = pht('Macro name is required.');
- $e_name = pht('Required');
- } else if (!preg_match('/^[a-z0-9:_-]{3,}\z/', $macro->getName())) {
- $errors[] = pht(
- 'Macro must be at least three characters long and contain only '.
- 'lowercase letters, digits, hyphens, colons and underscores.');
- $e_name = pht('Invalid');
- } else {
- $e_name = null;
- }
- }
-
- $uri = $request->getStr('url');
-
- $engine = new PhabricatorDestructionEngine();
-
- $file = null;
- if ($request->getFileExists('file')) {
- $file = PhabricatorFile::newFromPHPUpload(
- $_FILES['file'],
- array(
- 'name' => $request->getStr('name'),
- 'authorPHID' => $viewer->getPHID(),
- 'isExplicitUpload' => true,
- 'canCDN' => true,
- ));
- } else if ($uri) {
- try {
- // Rate limit outbound fetches to make this mechanism less useful for
- // scanning networks and ports.
- PhabricatorSystemActionEngine::willTakeAction(
- array($viewer->getPHID()),
- new PhabricatorFilesOutboundRequestAction(),
- 1);
-
- $file = PhabricatorFile::newFromFileDownload(
- $uri,
- array(
- 'name' => $request->getStr('name'),
- 'viewPolicy' => PhabricatorPolicies::POLICY_NOONE,
- 'isExplicitUpload' => true,
- 'canCDN' => true,
- ));
-
- if (!$file->isViewableInBrowser()) {
- $mime_type = $file->getMimeType();
- $engine->destroyObject($file);
- $file = null;
- throw new Exception(
- pht(
- 'The URI "%s" does not correspond to a valid image file, got '.
- 'a file with MIME type "%s". You must specify the URI of a '.
- 'valid image file.',
- $uri,
- $mime_type));
- } else {
- $file
- ->setAuthorPHID($viewer->getPHID())
- ->save();
- }
- } catch (HTTPFutureHTTPResponseStatus $status) {
- $errors[] = pht(
- 'The URI "%s" could not be loaded, got %s error.',
- $uri,
- $status->getStatusCode());
- } catch (Exception $ex) {
- $errors[] = $ex->getMessage();
- }
- } else if ($request->getStr('phid')) {
- $file = id(new PhabricatorFileQuery())
- ->setViewer($viewer)
- ->withPHIDs(array($request->getStr('phid')))
- ->executeOne();
- }
-
- if ($file) {
- if (!$file->isViewableInBrowser()) {
- $errors[] = pht('You must upload an image.');
- $e_file = pht('Invalid');
- } else {
- $macro->setFilePHID($file->getPHID());
- $macro->attachFile($file);
- $e_file = null;
- }
- }
-
- if (!$macro->getID() && !$file) {
- $errors[] = pht('You must upload an image to create a macro.');
- $e_file = pht('Required');
- }
-
- if (!$errors) {
- try {
- $xactions = array();
-
- if ($new_name !== null) {
- $xactions[] = id(new PhabricatorMacroTransaction())
- ->setTransactionType(
- PhabricatorMacroNameTransaction::TRANSACTIONTYPE)
- ->setNewValue($new_name);
- }
-
- if ($file) {
- $xactions[] = id(new PhabricatorMacroTransaction())
- ->setTransactionType(
- PhabricatorMacroFileTransaction::TRANSACTIONTYPE)
- ->setNewValue($file->getPHID());
- }
-
- $editor = id(new PhabricatorMacroEditor())
- ->setActor($viewer)
- ->setContinueOnNoEffect(true)
- ->setContentSourceFromRequest($request);
-
- $xactions = $editor->applyTransactions($original, $xactions);
-
- $view_uri = $this->getApplicationURI('/view/'.$original->getID().'/');
- return id(new AphrontRedirectResponse())->setURI($view_uri);
- } catch (AphrontDuplicateKeyQueryException $ex) {
- throw $ex;
- $errors[] = pht('Macro name is not unique!');
- $e_name = pht('Duplicate');
- }
- }
- }
-
- $current_file = null;
- if ($macro->getFilePHID()) {
- $current_file = $macro->getFile();
- }
-
- $form = new AphrontFormView();
- $form->addHiddenInput('name_form', 1);
- $form->setUser($request->getUser());
-
- $form
- ->setEncType('multipart/form-data')
- ->appendChild(
- id(new AphrontFormTextControl())
- ->setLabel(pht('Name'))
- ->setName('name')
- ->setValue($macro->getName())
- ->setCaption(
- pht('This word or phrase will be replaced with the image.'))
- ->setError($e_name));
-
- if (!$macro->getID()) {
- if ($current_file) {
- $current_file_view = id(new PhabricatorFileLinkView())
- ->setViewer($viewer)
- ->setFilePHID($current_file->getPHID())
- ->setFileName($current_file->getName())
- ->setFileViewable(true)
- ->setFileViewURI($current_file->getBestURI())
- ->render();
- $form->addHiddenInput('phid', $current_file->getPHID());
- $form->appendChild(
- id(new AphrontFormMarkupControl())
- ->setLabel(pht('Selected File'))
- ->setValue($current_file_view));
-
- $other_label = pht('Change File');
- } else {
- $other_label = pht('File');
- }
-
- $form->appendChild(
- id(new AphrontFormTextControl())
- ->setLabel(pht('URL'))
- ->setName('url')
- ->setValue($request->getStr('url'))
- ->setError($request->getFileExists('file') ? false : $e_file));
-
- $form->appendChild(
- id(new AphrontFormFileControl())
- ->setLabel($other_label)
- ->setName('file')
- ->setError($request->getStr('url') ? false : $e_file));
- }
-
-
- $view_uri = $this->getApplicationURI('/view/'.$macro->getID().'/');
-
- if ($macro->getID()) {
- $cancel_uri = $view_uri;
- } else {
- $cancel_uri = $this->getApplicationURI();
- }
-
- $form
- ->appendChild(
- id(new AphrontFormSubmitControl())
- ->setValue(pht('Save Image Macro'))
- ->addCancelButton($cancel_uri));
-
- $crumbs = $this->buildApplicationCrumbs();
-
- if ($macro->getID()) {
- $title = pht('Edit Macro: %s', $macro->getName());
- $crumb = pht('Edit Macro');
- $header_icon = 'fa-pencil';
-
- $crumbs->addTextCrumb(pht('Macro: %s', $macro->getName()), $view_uri);
- } else {
- $title = pht('Create Image Macro');
- $crumb = pht('Create Macro');
- $header_icon = 'fa-plus-square';
- }
-
- $crumbs->addTextCrumb($crumb, $request->getRequestURI());
- $crumbs->setBorder(true);
-
- $upload = null;
- if ($macro->getID()) {
- $upload_form = id(new AphrontFormView())
- ->setEncType('multipart/form-data')
- ->setUser($request->getUser());
-
- $upload_form->appendChild(
- id(new AphrontFormTextControl())
- ->setLabel(pht('URL'))
- ->setName('url')
- ->setValue($request->getStr('url')));
-
- $upload_form
- ->appendChild(
- id(new AphrontFormFileControl())
- ->setLabel(pht('File'))
- ->setName('file'))
- ->appendChild(
- id(new AphrontFormSubmitControl())
- ->setValue(pht('Upload File')));
-
- $upload = id(new PHUIObjectBoxView())
- ->setHeaderText(pht('Upload New File'))
- ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
- ->setForm($upload_form);
- }
-
- $form_box = id(new PHUIObjectBoxView())
- ->setHeaderText(pht('Macro'))
- ->setFormErrors($errors)
- ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
- ->setForm($form);
-
- $header = id(new PHUIHeaderView())
- ->setHeader($title)
- ->setHeaderIcon($header_icon);
-
- $view = id(new PHUITwoColumnView())
- ->setHeader($header)
- ->setFooter(array(
- $form_box,
- $upload,
- ));
-
- return $this->newPage()
- ->setTitle($title)
- ->setCrumbs($crumbs)
- ->appendChild($view);
-
+ return id(new PhabricatorMacroEditEngine())
+ ->setController($this)
+ ->buildResponse();
}
-
}
diff --git a/src/applications/macro/editor/PhabricatorMacroEditEngine.php b/src/applications/macro/editor/PhabricatorMacroEditEngine.php
new file mode 100644
--- /dev/null
+++ b/src/applications/macro/editor/PhabricatorMacroEditEngine.php
@@ -0,0 +1,83 @@
+<?php
+
+final class PhabricatorMacroEditEngine
+ extends PhabricatorEditEngine {
+
+ const ENGINECONST = 'macro.image';
+
+ public function getEngineName() {
+ return pht('Macro Imagea');
+ }
+
+ public function getSummaryHeader() {
+ return pht('Configure Macro Image Forms');
+ }
+
+ public function getSummaryText() {
+ return pht('Configure creation and editing of Macro images.');
+ }
+
+ public function getEngineApplicationClass() {
+ return 'PhabricatorMacroApplication';
+ }
+
+ protected function newEditableObject() {
+ $viewer = $this->getViewer();
+ return PhabricatorFileImageMacro::initializeNewFileImageMacro($viewer);
+ }
+
+ protected function newObjectQuery() {
+ return new PhabricatorMacroQuery();
+ }
+
+ protected function getObjectCreateTitleText($object) {
+ return pht('Create New Macro');
+ }
+
+ protected function getObjectEditTitleText($object) {
+ return pht('Edit %s', $object->getName());
+ }
+
+ protected function getObjectEditShortText($object) {
+ return $object->getName();
+ }
+
+ protected function getObjectCreateShortText() {
+ return pht('Create Macro');
+ }
+
+ protected function getObjectName() {
+ return pht('Macro');
+ }
+
+ protected function getObjectViewURI($object) {
+ return $object->getViewURI();
+ }
+
+ protected function getEditorURI() {
+ return $this->getApplication()->getApplicationURI('edit/');
+ }
+
+ protected function buildCustomEditFields($object) {
+
+ return array(
+ id(new PhabricatorTextEditField())
+ ->setKey('name')
+ ->setLabel(pht('Name'))
+ ->setDescription(pht('Macro name.'))
+ ->setConduitDescription(pht('Rename the macro.'))
+ ->setConduitTypeDescription(pht('New macro name.'))
+ ->setTransactionType(PhabricatorMacroNameTransaction::TRANSACTIONTYPE)
+ ->setValue($object->getName()),
+ id(new PhabricatorFileEditField())
+ ->setKey('filePHID')
+ ->setLabel(pht('Image File'))
+ ->setDescription(pht('Image file to import.'))
+ ->setTransactionType(PhabricatorMacroFileTransaction::TRANSACTIONTYPE)
+ ->setConduitDescription(pht('File PHID to import.'))
+ ->setConduitTypeDescription(pht('File PHID.')),
+ );
+
+ }
+
+}
diff --git a/src/applications/macro/storage/PhabricatorFileImageMacro.php b/src/applications/macro/storage/PhabricatorFileImageMacro.php
--- a/src/applications/macro/storage/PhabricatorFileImageMacro.php
+++ b/src/applications/macro/storage/PhabricatorFileImageMacro.php
@@ -41,6 +41,14 @@
return $this->assertAttached($this->audio);
}
+ public static function initializeNewFileImageMacro(PhabricatorUser $actor) {
+ $macro = id(new self())
+ ->setAuthorPHID($actor->getPHID())
+ ->setName('')
+ ->setIsDisabled(0);
+ return $macro;
+ }
+
protected function getConfiguration() {
return array(
self::CONFIG_AUX_PHID => true,
@@ -80,6 +88,10 @@
return parent::save();
}
+ public function getViewURI() {
+ return '/macro/view/'.$this->getID().'/';
+ }
+
/* -( PhabricatorApplicationTransactionInterface )------------------------- */
diff --git a/src/applications/macro/xaction/PhabricatorMacroFileTransaction.php b/src/applications/macro/xaction/PhabricatorMacroFileTransaction.php
--- a/src/applications/macro/xaction/PhabricatorMacroFileTransaction.php
+++ b/src/applications/macro/xaction/PhabricatorMacroFileTransaction.php
@@ -26,6 +26,41 @@
$this->renderObject());
}
+ public function validateTransactions($object, array $xactions) {
+ $errors = array();
+ $viewer = $this->getActor();
+
+ foreach ($xactions as $xaction) {
+ $file_phid = $xaction->getNewValue();
+
+ if ($this->isEmptyTextTransaction($file_phid, $xactions)) {
+ $errors[] = $this->newRequiredError(
+ pht('Image macros must have a file.'));
+ }
+
+ $file = id(new PhabricatorFileQuery())
+ ->setViewer($viewer)
+ ->withPHIDs(array($file_phid))
+ ->executeOne();
+
+ if (!$file) {
+ $errors[] = $this->newRequiredError(
+ pht('"%s" is not a valid file PHID.',
+ $file_phid));
+ } else {
+ if (!$file->isViewableInBrowser()) {
+ $mime_type = $file->getMimeType();
+ $errors[] = $this->newRequiredError(
+ pht('File mime type of "%s" is not a valid viewable image.',
+ $mime_type));
+ }
+ }
+
+ }
+
+ return $errors;
+ }
+
public function getIcon() {
return 'fa-file-image-o';
}
diff --git a/src/applications/macro/xaction/PhabricatorMacroNameTransaction.php b/src/applications/macro/xaction/PhabricatorMacroNameTransaction.php
--- a/src/applications/macro/xaction/PhabricatorMacroNameTransaction.php
+++ b/src/applications/macro/xaction/PhabricatorMacroNameTransaction.php
@@ -49,6 +49,12 @@
}
}
+ if (!preg_match('/^[a-z0-9:_-]{3,}\z/', $object->getName())) {
+ $errors[] = $this->newInvalidError(
+ 'Macro must be at least three characters long and contain only '.
+ 'lowercase letters, digits, hyphens, colons and underscores.');
+ }
+
return $errors;
}

File Metadata

Mime Type
text/plain
Expires
Tue, Oct 15, 8:06 PM (4 w, 7 h ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
6713333
Default Alt Text
D17821.id42849.diff (17 KB)

Event Timeline