Changeset View
Changeset View
Standalone View
Standalone View
src/applications/macro/controller/PhabricatorMacroMemeController.php
| <?php | <?php | ||||
| final class PhabricatorMacroMemeController | final class PhabricatorMacroMemeController | ||||
| extends PhabricatorMacroController { | extends PhabricatorMacroController { | ||||
| public function shouldAllowPublic() { | public function shouldAllowPublic() { | ||||
| return true; | return true; | ||||
| } | } | ||||
| public function handleRequest(AphrontRequest $request) { | public function handleRequest(AphrontRequest $request) { | ||||
| $macro_name = $request->getStr('macro'); | $macro_name = $request->getStr('macro'); | ||||
| $upper_text = $request->getStr('uppertext'); | $upper_text = $request->getStr('uppertext'); | ||||
| $lower_text = $request->getStr('lowertext'); | $lower_text = $request->getStr('lowertext'); | ||||
| $viewer = $request->getViewer(); | $viewer = $request->getViewer(); | ||||
| $uri = self::generateMacro($viewer, $macro_name, | $uri = self::generateMacro( | ||||
| $upper_text, $lower_text); | $viewer, | ||||
| if ($uri === false) { | $macro_name, | ||||
| return new Aphront404Response(); | $upper_text, | ||||
| } | $lower_text); | ||||
| return id(new AphrontRedirectResponse()) | |||||
| ->setIsExternal(true) | $content = array( | ||||
| ->setURI($uri); | 'imageURI' => $uri, | ||||
| } | ); | ||||
| public static function generateMacro($viewer, $macro_name, $upper_text, | return id(new AphrontAjaxResponse())->setContent($content); | ||||
| } | |||||
| public static function generateMacro( | |||||
| PhabricatorUser $viewer, | |||||
| $macro_name, | |||||
| $upper_text, | |||||
| $lower_text) { | $lower_text) { | ||||
| $macro = id(new PhabricatorMacroQuery()) | $macro = id(new PhabricatorMacroQuery()) | ||||
| ->setViewer($viewer) | ->setViewer($viewer) | ||||
| ->withNames(array($macro_name)) | ->withNames(array($macro_name)) | ||||
| ->needFiles(true) | ->needFiles(true) | ||||
| ->executeOne(); | ->executeOne(); | ||||
| if (!$macro) { | if (!$macro) { | ||||
| return false; | return false; | ||||
| } | } | ||||
| $file = $macro->getFile(); | $file = $macro->getFile(); | ||||
| $upper_text = strtoupper($upper_text); | $upper_text = phutil_utf8_strtoupper($upper_text); | ||||
| $lower_text = strtoupper($lower_text); | $lower_text = phutil_utf8_strtoupper($lower_text); | ||||
| $mixed_text = md5($upper_text).':'.md5($lower_text); | |||||
| $hash = 'meme'.hash('sha256', $mixed_text); | |||||
| $xform = id(new PhabricatorTransformedFile()) | |||||
| ->loadOneWhere('originalphid=%s and transform=%s', | |||||
| $file->getPHID(), $hash); | |||||
| if ($xform) { | $hash = PhabricatorHash::digestForIndex( | ||||
| $memefile = id(new PhabricatorFileQuery()) | phutil_json_encode( | ||||
| ->setViewer($viewer) | array( | ||||
| ->withPHIDs(array($xform->getTransformedPHID())) | 'kind' => 'meme', | ||||
| ->executeOne(); | 'upper' => $upper_text, | ||||
| if ($memefile) { | 'lower' => $lower_text, | ||||
| return $memefile->getBestURI(); | ))); | ||||
| } | |||||
| } | $xfile = self::loadTransformedFile($viewer, $file->getPHID(), $hash); | ||||
| if ($xfile) { | |||||
| return $xfile->getViewURI(); | |||||
| } | |||||
| $transformer = new PhabricatorImageTransformer(); | |||||
| $new_file = $transformer->executeMemeTransform( | |||||
| $file, | |||||
| $upper_text, | |||||
| $lower_text); | |||||
| $xfile = id(new PhabricatorTransformedFile()) | |||||
| ->setOriginalPHID($file->getPHID()) | |||||
| ->setTransformedPHID($new_file->getPHID()) | |||||
| ->setTransform($hash); | |||||
| try { | |||||
| $caught = null; | |||||
| $unguarded = AphrontWriteGuard::beginScopedUnguardedWrites(); | $unguarded = AphrontWriteGuard::beginScopedUnguardedWrites(); | ||||
| $transformers = (new PhabricatorImageTransformer()); | try { | ||||
| $newfile = $transformers | |||||
| ->executeMemeTransform($file, $upper_text, $lower_text); | |||||
| $xfile = new PhabricatorTransformedFile(); | |||||
| $xfile->setOriginalPHID($file->getPHID()); | |||||
| $xfile->setTransformedPHID($newfile->getPHID()); | |||||
| $xfile->setTransform($hash); | |||||
| $xfile->save(); | $xfile->save(); | ||||
| } catch (Exception $ex) { | |||||
| $caught = $ex; | |||||
| } | |||||
| unset($unguarded); | |||||
| return $newfile->getBestURI(); | if ($caught) { | ||||
| throw $caught; | |||||
| } | |||||
| return $new_file->getViewURI(); | |||||
| } catch (AphrontDuplicateKeyQueryException $ex) { | |||||
| $xfile = self::loadTransformedFile($viewer, $file->getPHID(), $hash); | |||||
| if (!$xfile) { | |||||
| throw $ex; | |||||
| } | |||||
| return $xfile->getViewURI(); | |||||
| } | |||||
| } | |||||
| private static function loadTransformedFile( | |||||
| PhabricatorUser $viewer, | |||||
| $file_phid, | |||||
| $hash) { | |||||
| $xform = id(new PhabricatorTransformedFile())->loadOneWhere( | |||||
| 'originalPHID = %s AND transform = %s', | |||||
| $file_phid, | |||||
| $hash); | |||||
| if (!$xform) { | |||||
| return null; | |||||
| } | |||||
| return id(new PhabricatorFileQuery()) | |||||
| ->setViewer($viewer) | |||||
| ->withPHIDs(array($xform->getTransformedPHID())) | |||||
| ->executeOne(); | |||||
| } | } | ||||
| } | } | ||||