1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-12-24 06:20:56 +01:00

Phame - create conduit API to create posts

Summary:
nothing too crazy here. try to be smart about some defaults (i.e. phame title is optional and can be derived from title; post as not a draft by default; etc). Fixes T3695.

also do a little re-factoring to centralizing initializing new posts and turning posts into dictionaries. also change blogs => posts in another conduit method so it makes sense and stuff.

Test Plan: made some posts via conduit. testing trying to specify blogger, phame title, and isDraft, all worked nicely

Reviewers: chad, epriestley

Reviewed By: epriestley

Subscribers: aran, epriestley, Korvin

Maniphest Tasks: T3695

Differential Revision: https://secure.phabricator.com/D8485
This commit is contained in:
Bob Trahan 2014-03-11 15:51:53 -07:00
parent 46cf263e9d
commit a1faac0a21
5 changed files with 132 additions and 21 deletions

View file

@ -210,6 +210,7 @@ phutil_register_library_map(array(
'ConduitAPI_paste_info_Method' => 'applications/paste/conduit/ConduitAPI_paste_info_Method.php', 'ConduitAPI_paste_info_Method' => 'applications/paste/conduit/ConduitAPI_paste_info_Method.php',
'ConduitAPI_paste_query_Method' => 'applications/paste/conduit/ConduitAPI_paste_query_Method.php', 'ConduitAPI_paste_query_Method' => 'applications/paste/conduit/ConduitAPI_paste_query_Method.php',
'ConduitAPI_phame_Method' => 'applications/phame/conduit/ConduitAPI_phame_Method.php', 'ConduitAPI_phame_Method' => 'applications/phame/conduit/ConduitAPI_phame_Method.php',
'ConduitAPI_phame_createpost_Method' => 'applications/phame/conduit/ConduitAPI_phame_createpost_Method.php',
'ConduitAPI_phame_query_Method' => 'applications/phame/conduit/ConduitAPI_phame_query_Method.php', 'ConduitAPI_phame_query_Method' => 'applications/phame/conduit/ConduitAPI_phame_query_Method.php',
'ConduitAPI_phame_queryposts_Method' => 'applications/phame/conduit/ConduitAPI_phame_queryposts_Method.php', 'ConduitAPI_phame_queryposts_Method' => 'applications/phame/conduit/ConduitAPI_phame_queryposts_Method.php',
'ConduitAPI_phid_Method' => 'applications/phid/conduit/ConduitAPI_phid_Method.php', 'ConduitAPI_phid_Method' => 'applications/phid/conduit/ConduitAPI_phid_Method.php',
@ -2738,6 +2739,7 @@ phutil_register_library_map(array(
'ConduitAPI_paste_info_Method' => 'ConduitAPI_paste_Method', 'ConduitAPI_paste_info_Method' => 'ConduitAPI_paste_Method',
'ConduitAPI_paste_query_Method' => 'ConduitAPI_paste_Method', 'ConduitAPI_paste_query_Method' => 'ConduitAPI_paste_Method',
'ConduitAPI_phame_Method' => 'ConduitAPIMethod', 'ConduitAPI_phame_Method' => 'ConduitAPIMethod',
'ConduitAPI_phame_createpost_Method' => 'ConduitAPI_phame_Method',
'ConduitAPI_phame_query_Method' => 'ConduitAPI_phame_Method', 'ConduitAPI_phame_query_Method' => 'ConduitAPI_phame_Method',
'ConduitAPI_phame_queryposts_Method' => 'ConduitAPI_phame_Method', 'ConduitAPI_phame_queryposts_Method' => 'ConduitAPI_phame_Method',
'ConduitAPI_phid_Method' => 'ConduitAPIMethod', 'ConduitAPI_phid_Method' => 'ConduitAPIMethod',

View file

@ -0,0 +1,97 @@
<?php
final class ConduitAPI_phame_createpost_Method extends ConduitAPI_phame_Method {
public function getMethodDescription() {
return pht('Create a phame post.');
}
public function getMethodStatus() {
return self::METHOD_STATUS_UNSTABLE;
}
public function defineParamTypes() {
return array(
'blogPHID' => 'required phid',
'title' => 'required string',
'body' => 'required string',
'phameTitle' => 'optional string',
'bloggerPHID' => 'optional phid',
'isDraft' => 'optional bool',
);
}
public function defineReturnType() {
return 'list<dict>';
}
public function defineErrorTypes() {
return array(
'ERR-INVALID-PARAMETER' =>
pht('Missing or malformed parameter.'),
'ERR-INVALID-BLOG' =>
pht('Invalid blog PHID or user can not post to blog.'),
);
}
protected function execute(ConduitAPIRequest $request) {
$user = $request->getUser();
$blog_phid = $request->getValue('blogPHID');
$title = $request->getValue('title');
$body = $request->getValue('body');
$exception_description = array();
if (!$blog_phid) {
$exception_description[] = pht('No blog phid.');
}
if (!strlen($title)) {
$exception_description[] = pht('No post title.');
}
if (!strlen($body)) {
$exception_description[] = pht('No post body.');
}
if ($exception_description) {
throw id(new ConduitException('ERR-INVALID-PARAMETER'))
->setErrorDescription(implode("\n", $exception_description));
}
$blogger_phid = $request->getValue('bloggerPHID');
if ($blogger_phid) {
$blogger = id(new PhabricatorPeopleQuery())
->setViewer($user)
->withPHIDs(array($blogger_phid))
->executeOne();
} else {
$blogger = $user;
}
$blog = id(new PhameBlogQuery())
->setViewer($blogger)
->withPHIDs(array($blog_phid))
->requireCapabilities(
array(
PhabricatorPolicyCapability::CAN_JOIN,
))
->executeOne();
if (!$blog) {
throw new ConduitException('ERR-INVALID-BLOG');
}
$post = PhamePost::initializePost($blogger, $blog);
$is_draft = $request->getValue('isDraft', false);
if (!$is_draft) {
$post->setDatePublished(time());
$post->setVisibility(PhamePost::VISIBILITY_PUBLISHED);
}
$post->setTitle($title);
$phame_title = $request->getValue(
'phameTitle',
phutil_utf8_shorten($title, 64));
$post->setPhameTitle(PhabricatorSlug::normalize($phame_title));
$post->setBody($body);
$post->save();
return $post->toDictionary();
}
}

View file

@ -95,23 +95,11 @@ final class ConduitAPI_phame_queryposts_Method extends ConduitAPI_phame_Method {
$query->setLimit($limit); $query->setLimit($limit);
} }
$blogs = $query->execute(); $posts = $query->execute();
$results = array(); $results = array();
foreach ($blogs as $blog) { foreach ($posts as $post) {
$results[] = array( $results[] = $post->toDictionary();
'id' => $blog->getID(),
'phid' => $blog->getPHID(),
'blogPHID' => $blog->getBlogPHID(),
'bloggerPHID' => $blog->getBloggerPHID(),
'viewURI' => $blog->getViewURI(),
'title' => $blog->getTitle(),
'phameTitle' => $blog->getPhameTitle(),
'body' => $blog->getBody(),
'summary' => PhabricatorMarkupEngine::summarize($blog->getBody()),
'datePublished' => $blog->getDatePublished(),
'published' => !$blog->isDraft(),
);
} }
return $results; return $results;

View file

@ -46,12 +46,7 @@ final class PhamePostEditController
return new Aphront404Response(); return new Aphront404Response();
} }
$post = id(new PhamePost()) $post = PhamePost::initializePost($user, $blog);
->setBloggerPHID($user->getPHID())
->setBlogPHID($blog->getPHID())
->setBlog($blog)
->setDatePublished(0)
->setVisibility(PhamePost::VISIBILITY_DRAFT);
$cancel_uri = $this->getApplicationURI('/blog/view/'.$blog->getID().'/'); $cancel_uri = $this->getApplicationURI('/blog/view/'.$blog->getID().'/');
$submit_button = pht('Save Draft'); $submit_button = pht('Save Draft');

View file

@ -26,6 +26,19 @@ final class PhamePost extends PhameDAO
private $blog; private $blog;
public static function initializePost(
PhabricatorUser $blogger,
PhameBlog $blog) {
$post = id(new PhamePost())
->setBloggerPHID($blogger->getPHID())
->setBlogPHID($blog->getPHID())
->setBlog($blog)
->setDatePublished(0)
->setVisibility(self::VISIBILITY_DRAFT);
return $post;
}
public function setBlog(PhameBlog $blog) { public function setBlog(PhameBlog $blog) {
$this->blog = $blog; $this->blog = $blog;
return $this; return $this;
@ -82,6 +95,22 @@ final class PhamePost extends PhameDAO
PhabricatorPhamePHIDTypePost::TYPECONST); PhabricatorPhamePHIDTypePost::TYPECONST);
} }
public function toDictionary() {
return array(
'id' => $this->getID(),
'phid' => $this->getPHID(),
'blogPHID' => $this->getBlogPHID(),
'bloggerPHID' => $this->getBloggerPHID(),
'viewURI' => $this->getViewURI(),
'title' => $this->getTitle(),
'phameTitle' => $this->getPhameTitle(),
'body' => $this->getBody(),
'summary' => PhabricatorMarkupEngine::summarize($this->getBody()),
'datePublished' => $this->getDatePublished(),
'published' => !$this->isDraft(),
);
}
public static function getVisibilityOptionsForSelect() { public static function getVisibilityOptionsForSelect() {
return array( return array(
self::VISIBILITY_DRAFT => 'Draft: visible only to me.', self::VISIBILITY_DRAFT => 'Draft: visible only to me.',