diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index ac65d947d7..12d766e370 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -179,6 +179,7 @@ phutil_register_library_map(array( 'ConduitAPI_slowvote_info_Method' => 'applications/conduit/method/slowvote/info', 'ConduitAPI_user_Method' => 'applications/conduit/method/user/base', 'ConduitAPI_user_addstatus_Method' => 'applications/conduit/method/user/addstatus', + 'ConduitAPI_user_removestatus_Method' => 'applications/conduit/method/user/removestatus', 'ConduitAPI_user_find_Method' => 'applications/conduit/method/user/find', 'ConduitAPI_user_info_Method' => 'applications/conduit/method/user/info', 'ConduitAPI_user_whoami_Method' => 'applications/conduit/method/user/whoami', @@ -1200,6 +1201,7 @@ phutil_register_library_map(array( 'ConduitAPI_slowvote_info_Method' => 'ConduitAPIMethod', 'ConduitAPI_user_Method' => 'ConduitAPIMethod', 'ConduitAPI_user_addstatus_Method' => 'ConduitAPI_user_Method', + 'ConduitAPI_user_removestatus_Method' => 'ConduitAPI_user_Method', 'ConduitAPI_user_find_Method' => 'ConduitAPI_user_Method', 'ConduitAPI_user_info_Method' => 'ConduitAPI_user_Method', 'ConduitAPI_user_whoami_Method' => 'ConduitAPI_user_Method', diff --git a/src/applications/conduit/method/user/addstatus/ConduitAPI_user_addstatus_Method.php b/src/applications/conduit/method/user/addstatus/ConduitAPI_user_addstatus_Method.php index 318785bb84..a3301f3fc3 100644 --- a/src/applications/conduit/method/user/addstatus/ConduitAPI_user_addstatus_Method.php +++ b/src/applications/conduit/method/user/addstatus/ConduitAPI_user_addstatus_Method.php @@ -21,6 +21,10 @@ */ final class ConduitAPI_user_addstatus_Method extends ConduitAPI_user_Method { + public function getMethodStatus() { + return self::METHOD_STATUS_UNSTABLE; + } + public function getMethodDescription() { return "Add status information to the logged-in user."; } @@ -46,7 +50,7 @@ final class ConduitAPI_user_addstatus_Method extends ConduitAPI_user_Method { } protected function execute(ConduitAPIRequest $request) { - $userPHID = $request->getUser()->getPHID(); + $user_phid = $request->getUser()->getPHID(); $from = $request->getValue('fromEpoch'); $to = $request->getValue('toEpoch'); @@ -58,7 +62,7 @@ final class ConduitAPI_user_addstatus_Method extends ConduitAPI_user_Method { // with the next INSERT. $overlap = id(new PhabricatorUserStatus())->loadAllWhere( 'userPHID = %s AND dateFrom < %d AND dateTo > %d', - $userPHID, + $user_phid, $to, $from); if ($overlap) { @@ -74,7 +78,7 @@ final class ConduitAPI_user_addstatus_Method extends ConduitAPI_user_Method { break; } id(new PhabricatorUserStatus()) - ->setUserPHID($userPHID) + ->setUserPHID($user_phid) ->setDateFrom($from) ->setDateTo($to) ->setStatus($status) diff --git a/src/applications/conduit/method/user/removestatus/ConduitAPI_user_removestatus_Method.php b/src/applications/conduit/method/user/removestatus/ConduitAPI_user_removestatus_Method.php new file mode 100644 index 0000000000..ef56cb8007 --- /dev/null +++ b/src/applications/conduit/method/user/removestatus/ConduitAPI_user_removestatus_Method.php @@ -0,0 +1,86 @@ + 'required int', + 'toEpoch' => 'required int', + ); + } + + public function defineReturnType() { + return 'int'; + } + + public function defineErrorTypes() { + return array( + 'ERR-BAD-EPOCH' => "'toEpoch' must be bigger than 'fromEpoch'.", + ); + } + + protected function execute(ConduitAPIRequest $request) { + $user_phid = $request->getUser()->getPHID(); + $from = $request->getValue('fromEpoch'); + $to = $request->getValue('toEpoch'); + + if ($to <= $from) { + throw new ConduitException('ERR-BAD-EPOCH'); + } + + $overlap = id(new PhabricatorUserStatus())->loadAllWhere( + 'userPHID = %s AND dateFrom < %d AND dateTo > %d', + $user_phid, + $to, + $from); + foreach ($overlap as $status) { + if ($status->getDateFrom() < $from) { + if ($status->getDateTo() > $to) { + // Split the interval. + id(new PhabricatorUserStatus()) + ->setUserPHID($user_phid) + ->setDateFrom($to) + ->setDateTo($status->getDateTo()) + ->setStatus($status->getStatus()) + ->save(); + } + $status->setDateTo($from); + $status->save(); + } else if ($status->getDateTo() > $to) { + $status->setDateFrom($to); + $status->save(); + } else { + $status->delete(); + } + } + return count($overlap); + } + +} diff --git a/src/applications/conduit/method/user/removestatus/__init__.php b/src/applications/conduit/method/user/removestatus/__init__.php new file mode 100644 index 0000000000..073483f425 --- /dev/null +++ b/src/applications/conduit/method/user/removestatus/__init__.php @@ -0,0 +1,16 @@ +