@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Add mail support to PhameBlog

Summary: Add some mailkeys, allow feed stories to be published.

Test Plan: New Blog, Edit Blog

Reviewers: epriestley

Reviewed By: epriestley

Subscribers: Korvin

Differential Revision: https://secure.phabricator.com/D14434

+147 -3
+2
resources/sql/autopatches/20151107.phame.blog.mailkey.1.sql
··· 1 + ALTER TABLE {$NAMESPACE}_phame.phame_blog 2 + ADD mailKey binary(20) NOT NULL;
+18
resources/sql/autopatches/20151107.phame.blog.mailkey.2.php
··· 1 + <?php 2 + 3 + $table = new PhameBlog(); 4 + $conn_w = $table->establishConnection('w'); 5 + $iterator = new LiskMigrationIterator($table); 6 + foreach ($iterator as $blog) { 7 + $id = $blog->getID(); 8 + 9 + echo pht('Adding mail key for Blog %d...', $id); 10 + echo "\n"; 11 + 12 + queryfx( 13 + $conn_w, 14 + 'UPDATE %T SET mailKey = %s WHERE id = %d', 15 + $table->getTableName(), 16 + Filesystem::readRandomCharacters(20), 17 + $id); 18 + }
+4
src/__phutil_library_map__.php
··· 3256 3256 'PhameBlogListController' => 'applications/phame/controller/blog/PhameBlogListController.php', 3257 3257 'PhameBlogLiveController' => 'applications/phame/controller/blog/PhameBlogLiveController.php', 3258 3258 'PhameBlogQuery' => 'applications/phame/query/PhameBlogQuery.php', 3259 + 'PhameBlogReplyHandler' => 'applications/phame/mail/PhameBlogReplyHandler.php', 3259 3260 'PhameBlogSearchEngine' => 'applications/phame/query/PhameBlogSearchEngine.php', 3260 3261 'PhameBlogSite' => 'applications/phame/site/PhameBlogSite.php', 3261 3262 'PhameBlogSkin' => 'applications/phame/skins/PhameBlogSkin.php', 3262 3263 'PhameBlogTransaction' => 'applications/phame/storage/PhameBlogTransaction.php', 3264 + 'PhameBlogTransactionQuery' => 'applications/phame/query/PhameBlogTransactionQuery.php', 3263 3265 'PhameBlogViewController' => 'applications/phame/controller/blog/PhameBlogViewController.php', 3264 3266 'PhameCelerityResources' => 'applications/phame/celerity/PhameCelerityResources.php', 3265 3267 'PhameConduitAPIMethod' => 'applications/phame/conduit/PhameConduitAPIMethod.php', ··· 7521 7523 'PhameBlogListController' => 'PhameBlogController', 7522 7524 'PhameBlogLiveController' => 'PhameBlogController', 7523 7525 'PhameBlogQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 7526 + 'PhameBlogReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler', 7524 7527 'PhameBlogSearchEngine' => 'PhabricatorApplicationSearchEngine', 7525 7528 'PhameBlogSite' => 'PhameSite', 7526 7529 'PhameBlogSkin' => 'PhabricatorController', 7527 7530 'PhameBlogTransaction' => 'PhabricatorApplicationTransaction', 7531 + 'PhameBlogTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 7528 7532 'PhameBlogViewController' => 'PhameBlogController', 7529 7533 'PhameCelerityResources' => 'CelerityResources', 7530 7534 'PhameConduitAPIMethod' => 'ConduitAPIMethod',
+53 -2
src/applications/phame/editor/PhameBlogEditor.php
··· 162 162 protected function shouldSendMail( 163 163 PhabricatorLiskDAO $object, 164 164 array $xactions) { 165 - return false; 165 + return true; 166 166 } 167 167 168 168 protected function shouldPublishFeedStory( 169 169 PhabricatorLiskDAO $object, 170 170 array $xactions) { 171 - return false; 171 + return true; 172 + } 173 + 174 + protected function getMailTo(PhabricatorLiskDAO $object) { 175 + $phids = array(); 176 + $phids[] = $this->requireActor()->getPHID(); 177 + $phids[] = $object->getCreatorPHID(); 178 + 179 + return $phids; 180 + } 181 + 182 + protected function buildMailTemplate(PhabricatorLiskDAO $object) { 183 + $phid = $object->getPHID(); 184 + $name = $object->getName(); 185 + 186 + return id(new PhabricatorMetaMTAMail()) 187 + ->setSubject($name) 188 + ->addHeader('Thread-Topic', $phid); 189 + } 190 + 191 + protected function buildReplyHandler(PhabricatorLiskDAO $object) { 192 + return id(new PhameBlogReplyHandler()) 193 + ->setMailReceiver($object); 194 + } 195 + 196 + protected function buildMailBody( 197 + PhabricatorLiskDAO $object, 198 + array $xactions) { 199 + 200 + $body = parent::buildMailBody($object, $xactions); 201 + 202 + $body->addLinkSection( 203 + pht('BLOG DETAIL'), 204 + PhabricatorEnv::getProductionURI($object->getViewURI())); 205 + 206 + return $body; 207 + } 208 + 209 + public function getMailTagsMap() { 210 + return array( 211 + PhameBlogTransaction::MAILTAG_DETAILS => 212 + pht("A blog's details change."), 213 + PhameBlogTransaction::MAILTAG_SUBSCRIBERS => 214 + pht("A blog's subscribers change."), 215 + PhameBlogTransaction::MAILTAG_OTHER => 216 + pht('Other blog activity not listed above occurs.'), 217 + ); 172 218 } 219 + 220 + protected function getMailSubjectPrefix() { 221 + return '[Phame]'; 222 + } 223 + 173 224 174 225 protected function supportsSearch() { 175 226 return false;
+21
src/applications/phame/mail/PhameBlogReplyHandler.php
··· 1 + <?php 2 + 3 + final class PhameBlogReplyHandler 4 + extends PhabricatorApplicationTransactionReplyHandler { 5 + 6 + public function validateMailReceiver($mail_receiver) { 7 + if (!($mail_receiver instanceof PhameBlog)) { 8 + throw new Exception( 9 + pht('Mail receiver is not a %s.', 'PhameBlog')); 10 + } 11 + } 12 + 13 + public function getObjectPrefix() { 14 + return PhabricatorPhameBlogPHIDType::TYPECONST; 15 + } 16 + 17 + protected function shouldCreateCommentFromMailBody() { 18 + return false; 19 + } 20 + 21 + }
+10
src/applications/phame/query/PhameBlogTransactionQuery.php
··· 1 + <?php 2 + 3 + final class PhameBlogTransactionQuery 4 + extends PhabricatorApplicationTransactionQuery { 5 + 6 + public function getTemplateApplicationTransaction() { 7 + return new PhameBlogTransaction(); 8 + } 9 + 10 + }
+14
src/applications/phame/storage/PhameBlog.php
··· 21 21 protected $viewPolicy; 22 22 protected $editPolicy; 23 23 protected $joinPolicy; 24 + protected $mailKey; 24 25 25 26 private static $requestBlog; 26 27 ··· 34 35 'name' => 'text64', 35 36 'description' => 'text', 36 37 'domain' => 'text128?', 38 + 'mailKey' => 'bytes20', 37 39 38 40 // T6203/NULLABILITY 39 41 // These policies should always be non-null. ··· 53 55 ), 54 56 ), 55 57 ) + parent::getConfiguration(); 58 + } 59 + 60 + public function save() { 61 + if (!$this->getMailKey()) { 62 + $this->setMailKey(Filesystem::readRandomCharacters(20)); 63 + } 64 + return parent::save(); 56 65 } 57 66 58 67 public function generatePHID() { ··· 212 221 } 213 222 214 223 return $base; 224 + } 225 + 226 + public function getViewURI() { 227 + $uri = '/phame/blog/view/'.$this->getID().'/'; 228 + return PhabricatorEnv::getProductionURI($uri); 215 229 } 216 230 217 231
+25 -1
src/applications/phame/storage/PhameBlogTransaction.php
··· 8 8 const TYPE_DOMAIN = 'phame.blog.domain'; 9 9 const TYPE_SKIN = 'phame.blog.skin'; 10 10 11 + const MAILTAG_DETAILS = 'phame-blog-details'; 12 + const MAILTAG_SUBSCRIBERS = 'phame-blog-subscribers'; 13 + const MAILTAG_OTHER = 'phame-blog-other'; 14 + 11 15 public function getApplicationName() { 12 16 return 'phame'; 13 17 } ··· 44 48 return parent::getIcon(); 45 49 } 46 50 51 + public function getMailTags() { 52 + $tags = parent::getMailTags(); 53 + 54 + switch ($this->getTransactionType()) { 55 + case PhabricatorTransactions::TYPE_SUBSCRIBERS: 56 + $tags[] = self::MAILTAG_SUBSCRIBERS; 57 + break; 58 + case self::TYPE_NAME: 59 + case self::TYPE_DESCRIPTION: 60 + case self::TYPE_DOMAIN: 61 + case self::TYPE_SKIN: 62 + $tags[] = self::MAILTAG_DETAILS; 63 + break; 64 + default: 65 + $tags[] = self::MAILTAG_OTHER; 66 + break; 67 + } 68 + return $tags; 69 + } 70 + 47 71 public function getTitle() { 48 72 $author_phid = $this->getAuthorPHID(); 49 73 $object_phid = $this->getObjectPHID(); ··· 53 77 54 78 $type = $this->getTransactionType(); 55 79 switch ($type) { 56 - case self:TYPE_NAME: 80 + case self::TYPE_NAME: 57 81 if ($old === null) { 58 82 return pht( 59 83 '%s created this blog.',