/** * Update Issue in database * * Created By KGB * @param string $p_username The name of the user trying to add the issue. * @param string $p_password The password of the user. * @param integer $p_issue_id The issue id of the existing issue being updated. * @param stdClass $p_issue A IssueData structure containing information about the new issue. * @return integer The id of the created issue. */ function mc_issue_update($p_username, $p_password, $p_issue_id, stdClass $p_issue) { global $g_project_override; $t_user_id = mci_check_login($p_username, $p_password); if ($t_user_id === false) { return mci_soap_fault_login_failed(); } if (!bug_exists($p_issue_id)) { return SoapObjectsFactory::newSoapFault('Client', 'Issue \'' . $p_issue_id . '\' does not exist.'); } if (bug_is_readonly($p_issue_id)) { return SoapObjectsFactory::newSoapFault('Client', 'Issue \'' . $p_issue_id . '\' is readonly'); } $t_project_id = bug_get_field($p_issue_id, 'project_id'); if (!mci_has_readwrite_access($t_user_id, $t_project_id)) { return mci_soap_fault_access_denied($t_user_id); } $g_project_override = $t_project_id; # ensure that helper_get_current_project() calls resolve to this project id $p_issue = SoapObjectsFactory::unwrapObject($p_issue); $t_project_id = mci_get_project_id($p_issue['project']); $t_reporter_id = isset($p_issue['reporter']) ? mci_get_user_id($p_issue['reporter']) : $t_user_id; $t_handler_id = isset($p_issue['handler']) ? mci_get_user_id($p_issue['handler']) : 0; $t_project = $p_issue['project']; $t_summary = isset($p_issue['summary']) ? $p_issue['summary'] : ''; $t_description = isset($p_issue['description']) ? $p_issue['description'] : ''; if ($t_project_id == 0 || !project_exists($t_project_id)) { if ($t_project_id == 0) { return SoapObjectsFactory::newSoapFault('Client', 'Project \'' . $t_project['name'] . '\' does not exist.'); } return SoapObjectsFactory::newSoapFault('Client', 'Project \'' . $t_project_id . '\' does not exist.'); } if (!access_has_bug_level(config_get('update_bug_threshold'), $p_issue_id, $t_user_id)) { return mci_soap_fault_access_denied($t_user_id, 'Not enough rights to update issues'); } $t_category = isset($p_issue['category']) ? $p_issue['category'] : null; $t_category_id = translate_category_name_to_id($t_category, $t_project_id); if ($t_category_id == 0 && !config_get('allow_no_category')) { if (isset($p_issue['category']) && !is_blank($p_issue['category'])) { return SoapObjectsFactory::newSoapFault('Client', 'Category field must be supplied.'); } else { $t_project_name = project_get_name($t_project_id); return SoapObjectsFactory::newSoapFault('Client', 'Category \'' . $p_issue['category'] . '\' not found for project \'' . $t_project_name . '\'.'); } } if (isset($p_issue['version']) && !is_blank($p_issue['version']) && !version_get_id($p_issue['version'], $t_project_id)) { $t_error_when_version_not_found = config_get('webservice_error_when_version_not_found'); if ($t_error_when_version_not_found == ON) { $t_project_name = project_get_name($t_project_id); return SoapObjectsFactory::newSoapFault('Client', 'Version \'' . $p_issue['version'] . '\' does not exist in project \'' . $t_project_name . '\'.'); } else { $t_version_when_not_found = config_get('webservice_version_when_not_found'); $p_issue['version'] = $t_version_when_not_found; } } if (is_blank($t_summary)) { return SoapObjectsFactory::newSoapFault('Client', 'Mandatory field \'summary\' is missing.'); } if (is_blank($t_description)) { return SoapObjectsFactory::newSoapFault('Client', 'Mandatory field \'description\' is missing.'); } # fields which we expect to always be set $t_bug_data = bug_get($p_issue_id, true); $t_bug_data->project_id = $t_project_id; $t_bug_data->reporter_id = $t_reporter_id; $t_access_check_result = mci_issue_handler_access_check($t_user_id, $t_project_id, $t_bug_data->handler_id, $t_handler_id); if ($t_access_check_result !== true) { return $t_access_check_result; } $t_bug_data->handler_id = $t_handler_id; $t_bug_data->category_id = $t_category_id; $t_bug_data->summary = $t_summary; $t_bug_data->description = $t_description; # fields which might not be set if (isset($p_issue['steps_to_reproduce'])) { $t_bug_data->steps_to_reproduce = $p_issue['steps_to_reproduce']; } if (isset($p_issue['additional_information'])) { $t_bug_data->additional_information = $p_issue['additional_information']; } if (isset($p_issue['priority'])) { $t_bug_data->priority = mci_get_priority_id($p_issue['priority']); } if (isset($p_issue['severity'])) { $t_bug_data->severity = mci_get_severity_id($p_issue['severity']); } if (isset($p_issue['status'])) { $t_bug_data->status = mci_get_status_id($p_issue['status']); } if (isset($p_issue['reproducibility'])) { $t_bug_data->reproducibility = mci_get_reproducibility_id($p_issue['reproducibility']); } if (isset($p_issue['resolution'])) { $t_bug_data->resolution = mci_get_resolution_id($p_issue['resolution']); } if (isset($p_issue['projection'])) { $t_bug_data->projection = mci_get_projection_id($p_issue['projection']); } if (isset($p_issue['eta'])) { $t_bug_data->eta = mci_get_eta_id($p_issue['eta']); } if (isset($p_issue['view_state'])) { $t_bug_data->view_state = mci_get_view_state_id($p_issue['view_state']); } if (isset($p_issue['date_submitted'])) { $t_bug_data->date_submitted = $p_issue['date_submitted']; } if (isset($p_issue['date_updated'])) { $t_bug_data->last_updated = $p_issue['last_updated']; } if (isset($p_issue['profile_id'])) { $t_bug_data->profile_id = $p_issue['profile_id']; } if (isset($p_issue['os'])) { $t_bug_data->os = $p_issue['os']; } if (isset($p_issue['os_build'])) { $t_bug_data->os_build = $p_issue['os_build']; } if (isset($p_issue['build'])) { $t_bug_data->build = $p_issue['build']; } if (isset($p_issue['platform'])) { $t_bug_data->platform = $p_issue['platform']; } if (isset($p_issue['version'])) { $t_bug_data->version = $p_issue['version']; } if (isset($p_issue['fixed_in_version'])) { $t_bug_data->fixed_in_version = $p_issue['fixed_in_version']; } if (isset($p_issue['sticky']) && access_has_bug_level(config_get('set_bug_sticky_threshold'), $t_bug_data->id)) { $t_bug_data->sticky = $p_issue['sticky']; } if (isset($p_issue['due_date']) && access_has_global_level(config_get('due_date_update_threshold'))) { $t_bug_data->due_date = SoapObjectsFactory::parseDateTimeString($p_issue['due_date']); } else { $t_bug_data->due_date = date_get_null(); } if (access_has_project_level(config_get('roadmap_update_threshold'), $t_bug_data->project_id, $t_user_id)) { $t_bug_data->target_version = isset($p_issue['target_version']) ? $p_issue['target_version'] : ''; } $t_set_custom_field_error = mci_issue_set_custom_fields($p_issue_id, $p_issue['custom_fields'], true); if ($t_set_custom_field_error != null) { return $t_set_custom_field_error; } if (isset($p_issue['monitors'])) { mci_issue_set_monitors($p_issue_id, $t_user_id, $p_issue['monitors']); } if (isset($p_issue['notes']) && is_array($p_issue['notes'])) { $t_bugnotes = bugnote_get_all_visible_bugnotes($p_issue_id, 'DESC', 0); $t_bugnotes_by_id = array(); foreach ($t_bugnotes as $t_bugnote) { $t_bugnotes_by_id[$t_bugnote->id] = $t_bugnote; } foreach ($p_issue['notes'] as $t_note) { $t_note = SoapObjectsFactory::unwrapObject($t_note); if (isset($t_note['view_state'])) { $t_view_state = $t_note['view_state']; } else { $t_view_state = config_get('default_bugnote_view_status'); } if (isset($t_note['id']) && (int) $t_note['id'] > 0) { $t_bugnote_id = (int) $t_note['id']; $t_view_state_id = mci_get_enum_id_from_objectref('view_state', $t_view_state); if (array_key_exists($t_bugnote_id, $t_bugnotes_by_id)) { $t_bugnote_changed = false; if ($t_bugnote->note !== $t_note['text']) { bugnote_set_text($t_bugnote_id, $t_note['text']); $t_bugnote_changed = true; } if ($t_bugnote->view_state != $t_view_state_id) { bugnote_set_view_state($t_bugnote_id, $t_view_state_id == VS_PRIVATE); $t_bugnote_changed = true; } if (isset($t_note['time_tracking']) && $t_note['time_tracking'] != $t_bugnote->time_tracking) { bugnote_set_time_tracking($t_bugnote_id, mci_get_time_tracking_from_note($p_issue_id, $t_note)); $t_bugnote_changed = true; } if ($t_bugnote_changed) { bugnote_date_update($t_bugnote_id); } } } else { $t_view_state_id = mci_get_enum_id_from_objectref('view_state', $t_view_state); $t_note_type = isset($t_note['note_type']) ? (int) $t_note['note_type'] : BUGNOTE; $t_note_attr = isset($t_note['note_type']) ? $t_note['note_attr'] : ''; bugnote_add($p_issue_id, $t_note['text'], mci_get_time_tracking_from_note($p_issue_id, $t_note), $t_view_state_id == VS_PRIVATE, $t_note_type, $t_note_attr, $t_user_id, false); } } # The issue has been cached earlier in the bug_get() call. Flush the cache since it is # now stale. Otherwise, the email notification will be based on the cached data. bugnote_clear_cache($p_issue_id); } if (isset($p_issue['tags']) && is_array($p_issue['tags'])) { mci_tag_set_for_issue($p_issue_id, $p_issue['tags'], $t_user_id); } # submit the issue log_event(LOG_WEBSERVICE, 'updating issue \'' . $p_issue_id . '\''); return $t_bug_data->update(true, true); }
/** * Submit the specified version details. * * @param string $p_username The name of the user trying to update the issue. * @param string $p_password The password of the user. * @param integer $p_version_id A version's id. * @param stdClass $p_version A ProjectVersionData structure containing information about the new version. * @return boolean returns true or false depending on the success of the update action */ function mc_project_version_update($p_username, $p_password, $p_version_id, stdClass $p_version) { global $g_project_override; $t_user_id = mci_check_login($p_username, $p_password); if ($t_user_id === false) { return mci_soap_fault_login_failed(); } if (is_blank($p_version_id)) { return SoapObjectsFactory::newSoapFault('Client', 'Mandatory field "version_id" was missing'); } if (!version_exists($p_version_id)) { return SoapObjectsFactory::newSoapFault('Client', 'Version \'' . $p_version_id . '\' does not exist.'); } $p_version = SoapObjectsFactory::unwrapObject($p_version); $t_project_id = $p_version['project_id']; $g_project_override = $t_project_id; $t_name = $p_version['name']; $t_released = $p_version['released']; $t_description = $p_version['description']; $t_date_order = isset($p_version['date_order']) ? SoapObjectsFactory::parseDateTimeString($p_version['date_order']) : null; $t_obsolete = isset($p_version['obsolete']) ? $p_version['obsolete'] : false; if (is_blank($t_project_id)) { return SoapObjectsFactory::newSoapFault('Client', 'Mandatory field "project_id" was missing'); } if (!project_exists($t_project_id)) { return SoapObjectsFactory::newSoapFault('Client', 'Project \'' . $t_project_id . '\' does not exist.'); } if (!mci_has_readwrite_access($t_user_id, $t_project_id)) { return mci_soap_fault_access_denied($t_user_id); } if (!mci_has_access(config_get('manage_project_threshold'), $t_user_id, $t_project_id)) { return mci_soap_fault_access_denied($t_user_id); } if (is_blank($t_name)) { return SoapObjectsFactory::newSoapFault('Client', 'Mandatory field "name" was missing'); } # check for duplicates $t_old_version_name = version_get_field($p_version_id, 'version'); if (strtolower($t_old_version_name) != strtolower($t_name) && !version_is_unique($t_name, $t_project_id)) { return SoapObjectsFactory::newSoapFault('Client', 'Version exists for project'); } if ($t_released === false) { $t_released = VERSION_FUTURE; } else { $t_released = VERSION_RELEASED; } $t_version_data = new VersionData(); $t_version_data->id = $p_version_id; $t_version_data->project_id = $t_project_id; $t_version_data->version = $t_name; $t_version_data->description = $t_description; $t_version_data->released = $t_released; $t_version_data->date_order = $t_date_order; $t_version_data->obsolete = $t_obsolete; return version_update($t_version_data); }