%PDF- %PDF-
Direktori : /www/loslex_o/tracker/core/commands/ |
Current File : /www/loslex_o/tracker/core/commands/IssueRelationshipAddCommand.php |
<?php # MantisBT - A PHP based bugtracking system # MantisBT is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # # MantisBT is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with MantisBT. If not, see <http://www.gnu.org/licenses/>. require_api( 'authentication_api.php' ); require_api( 'bug_api.php' ); require_api( 'constant_inc.php' ); require_api( 'config_api.php' ); require_api( 'helper_api.php' ); require_api( 'user_api.php' ); use Mantis\Exceptions\ClientException; /** * A command that adds a relationship to an issue. If a relationship already * exists with the target issue, it will be updated. * * Sample: * * { * "query": { "issue_id": 1234 }, * "payload": { * "issue": { * "id": 1235 * }, * "type": { * "id": 1, * "name": "related-to" * } * } * } * * Relation Type IDs: check "bug relationship constants" in core/constants_inc.php */ class IssueRelationshipAddCommand extends Command { /** * The relationship type id * * @var integer */ private $typeId; /** * The source issue * * @var BugData */ private $sourceIssue = null; /** * The target issue * * @var BugData */ private $targetIssue = null; /** * Constructor * * @param array $p_data The command data. */ function __construct( array $p_data ) { parent::__construct( $p_data ); } /** * Validate the data. */ function validate() { $t_type = $this->payload( 'type', array( 'id' => BUG_RELATED ) ); $this->typeId = $this->getRelationTypeId( $t_type ); $t_source_issue_id = helper_parse_issue_id( $this->query( 'issue_id' ) ); $t_target_issue_ref = $this->payload( 'issue' ); if( !isset( $t_target_issue_ref['id'] ) ) { throw new ClientException( 'Invalid issue id', ERROR_INVALID_FIELD_VALUE, array( 'issue_id' ) ); } $t_target_issue_id = helper_parse_issue_id( $t_target_issue_ref['id'], 'target_issue_id' ); $this->sourceIssue = bug_get( $t_source_issue_id, true ); $t_update_threshold = config_get( 'update_bug_threshold', null, null, $this->sourceIssue->project_id ); # Ensure user has access to update the source issue if( !access_has_bug_level( $t_update_threshold, $t_source_issue_id ) ) { throw new ClientException( 'Access denied to add relationship', ERROR_ACCESS_DENIED ); } # Ensure that source and target issues are not the same if( $t_source_issue_id == $t_target_issue_id ) { throw new ClientException( "Issue can't have relationship to itself", ERROR_RELATIONSHIP_SAME_BUG ); } # Ensure that related issue exists and gets its information $this->targetIssue = bug_get( $t_target_issue_id, true ); # Ensure source issue is not read-only if( bug_is_readonly( $t_source_issue_id ) ) { throw new ClientException( sprintf( "Issue %d is read-only", $t_source_issue_id ), ERROR_BUG_READ_ONLY_ACTION_DENIED, array( $t_source_issue_id ) ); } # Ensure that user can view target issue $t_view_threshold = config_get( 'view_bug_threshold', null, null, $this->targetIssue->project_id ); if( !access_has_bug_level( $t_view_threshold, $t_target_issue_id ) ) { throw new ClientException( sprintf( "Access denied to issue %d", $t_target_issue_id ), ERROR_RELATIONSHIP_ACCESS_LEVEL_TO_DEST_BUG_TOO_LOW, array( $t_target_issue_id ) ); } } /** * Process the command. * * @returns array Command response */ protected function process() { if( $this->sourceIssue->project_id != helper_get_current_project() ) { # in case the current project is not the same project of the bug we are # viewing, override the current project. This to avoid problems with # categories and handlers lists etc. global $g_project_override; $g_project_override = $this->sourceIssue->project_id; } # Create or update the relationship $t_relationship_id = relationship_upsert( $this->sourceIssue->id, $this->targetIssue->id, $this->typeId ); return array( 'id' => $t_relationship_id ); } /** * Get relationship type id from relationship type reference. * * @param array The relationship type reference with id, name or both. * @return integer relationship type id. */ private function getRelationTypeId( $p_relationship_type ) { if( isset( $p_relationship_type['id'] ) ) { $t_type_id = (int)$p_relationship_type['id']; } else if( isset( $p_relationship_type['name'] ) ) { $t_type_id = relationship_get_id_from_api_name( $p_relationship_type['name'] ); } else { throw new ClientException( 'Invalid relationship type', ERROR_INVALID_FIELD_VALUE, array( 'relationship_type' ) ); } return $t_type_id; } }