Summary:
Fixes T2694
added edge infrastructure for Phriction
added mail subject prefix option for Phriction
added messy mail support for subscribers
adds edges to the phriction db, along with the subscriber interface
which gives us subscriptions for free.
simple display of subscribers, adequate to the current design and
sufficient fallbacks for exceptional cases. @chad may
be mailed about that one more UI element may be added to his redesign
mail support is messy. not generic at all. only sends to subscribed non-authors.
Test Plan:
tried out all kinds of stuff. applied patch, subscribed, unsubscribed with multiple
accs. verified proper
edited documents, verified that mail was sent in MetaMTA. Verified
contents, tos and stuff by looking into the db, comparing PHIDs etc.
functional testing per serious MTA (that is, AWS SES) worked wonderfully.
Here's how the subscription list looks like:
{F36320, layout=link}
Reviewers: epriestley, chad, btrahan
Reviewed By: epriestley
CC: hfcorriez, aran, Korvin
Maniphest Tasks: T2686, T2694
Differential Revision: https://secure.phabricator.com/D5372
Conflicts:
src/infrastructure/storage/patch/PhabricatorBuiltinPatchList.php
133 lines
3.3 KiB
PHP
133 lines
3.3 KiB
PHP
<?php
|
|
|
|
/**
|
|
* @group phriction
|
|
*/
|
|
final class PhrictionDocument extends PhrictionDAO
|
|
implements PhabricatorPolicyInterface, PhabricatorSubscribableInterface {
|
|
|
|
protected $id;
|
|
protected $phid;
|
|
protected $slug;
|
|
protected $depth;
|
|
protected $contentID;
|
|
protected $status;
|
|
|
|
private $contentObject;
|
|
private $project;
|
|
|
|
public function getConfiguration() {
|
|
return array(
|
|
self::CONFIG_AUX_PHID => true,
|
|
self::CONFIG_TIMESTAMPS => false,
|
|
) + parent::getConfiguration();
|
|
}
|
|
|
|
public function generatePHID() {
|
|
return PhabricatorPHID::generateNewPHID(
|
|
PhabricatorPHIDConstants::PHID_TYPE_WIKI);
|
|
}
|
|
|
|
public static function getSlugURI($slug, $type = 'document') {
|
|
static $types = array(
|
|
'document' => '/w/',
|
|
'history' => '/phriction/history/',
|
|
);
|
|
|
|
if (empty($types[$type])) {
|
|
throw new Exception("Unknown URI type '{$type}'!");
|
|
}
|
|
|
|
$prefix = $types[$type];
|
|
|
|
if ($slug == '/') {
|
|
return $prefix;
|
|
} else {
|
|
// NOTE: The effect here is to escape non-latin characters, since modern
|
|
// browsers deal with escaped UTF8 characters in a reasonable way (showing
|
|
// the user a readable URI) but older programs may not.
|
|
$slug = phutil_escape_uri($slug);
|
|
return $prefix.$slug;
|
|
}
|
|
}
|
|
|
|
public function setSlug($slug) {
|
|
$this->slug = PhabricatorSlug::normalize($slug);
|
|
$this->depth = PhabricatorSlug::getDepth($slug);
|
|
return $this;
|
|
}
|
|
|
|
public function attachContent(PhrictionContent $content) {
|
|
$this->contentObject = $content;
|
|
return $this;
|
|
}
|
|
|
|
public function getContent() {
|
|
if (!$this->contentObject) {
|
|
throw new Exception("Attach content with attachContent() first.");
|
|
}
|
|
return $this->contentObject;
|
|
}
|
|
|
|
public function getProject() {
|
|
if ($this->project === null) {
|
|
throw new Exception("Call attachProject() before getProject().");
|
|
}
|
|
return $this->project;
|
|
}
|
|
|
|
public function attachProject(PhabricatorProject $project) {
|
|
$this->project = $project;
|
|
return $this;
|
|
}
|
|
|
|
public function hasProject() {
|
|
return (bool)$this->project;
|
|
}
|
|
|
|
public static function isProjectSlug($slug) {
|
|
$slug = PhabricatorSlug::normalize($slug);
|
|
$prefix = 'projects/';
|
|
if ($slug == $prefix) {
|
|
// The 'projects/' document is not itself a project slug.
|
|
return false;
|
|
}
|
|
return !strncmp($slug, $prefix, strlen($prefix));
|
|
}
|
|
|
|
public static function getProjectSlugIdentifier($slug) {
|
|
if (!self::isProjectSlug($slug)) {
|
|
throw new Exception("Slug '{$slug}' is not a project slug!");
|
|
}
|
|
|
|
$slug = PhabricatorSlug::normalize($slug);
|
|
$parts = explode('/', $slug);
|
|
return $parts[1].'/';
|
|
}
|
|
|
|
public function getCapabilities() {
|
|
return array(
|
|
PhabricatorPolicyCapability::CAN_VIEW,
|
|
PhabricatorPolicyCapability::CAN_EDIT,
|
|
);
|
|
}
|
|
|
|
public function getPolicy($capability) {
|
|
if ($this->hasProject()) {
|
|
return $this->getProject()->getPolicy($capability);
|
|
}
|
|
return PhabricatorPolicies::POLICY_USER;
|
|
}
|
|
|
|
public function hasAutomaticCapability($capability, PhabricatorUser $user) {
|
|
if ($this->hasProject()) {
|
|
return $this->getProject()->hasAutomaticCapability($capability, $user);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public function isAutomaticallySubscribed($phid) {
|
|
return false;
|
|
}
|
|
}
|