decide-note.php 3.28 KB
<?php

require_once "lib/3rdparty/php-redmine-api/lib/Redmine/Api/AbstractApi.php";
require_once "lib/3rdparty/php-redmine-api/lib/Redmine/Api/SimpleXMLElement.php";
require_once "lib/3rdparty/php-redmine-api/lib/Redmine/Api/User.php";
require_once "lib/3rdparty/php-redmine-api/lib/Redmine/Api/Issue.php";
require_once "lib/3rdparty/php-redmine-api/lib/Redmine/Api/IssueCategory.php";
require_once "lib/3rdparty/php-redmine-api/lib/Redmine/Api/Attachment.php";
require_once "lib/3rdparty/php-redmine-api/lib/Redmine/Api/Membership.php";
require_once "lib/3rdparty/php-redmine-api/lib/Redmine/Client.php";

require_once "lib/3rdparty/Inflect/Inflect.php";

require_once "config.php";

function redmine_proj_identifier2id ($ident) {
	error_log("redmine_proj_identifier($ident)");
	static $ident2id = array();

	if (empty($ident2id)) {
		$lines = split("\n", file_get_contents('/opt/redmine_projects.csv'));

		foreach ($lines as &$line) {
			$words = split("\t", $line);
			$ident2id[strtolower($words[1])] = $words[0];
		}
	}

	error_log ('RI:'.$ident2id[strtolower($ident)]);
	

	return $ident2id[strtolower($ident)];
}

foreach (array('issueId', 'action', 'signature') as $k)
	if (empty($k))
		die('field "'.$k.'" is empty');

$isGoodSignature = false;

foreach ($SIGNKEYS as $key) {
	if (sha1($_GET['issueId'].$key) == $_GET['signature']) {
		$isGoodSignature = true;
		break;
	}
}

if ($isGoodSignature === false) {
	die('bad signature');
}

$redmine_admin = new Redmine\Client('https://redmine.ut.mephi.ru', REDMINE_LOGIN, REDMINE_PASSWORD);
$issue         = $redmine_admin->api('issue')->show($_GET['issueId'])['issue'];

$assignedTo    = $redmine_admin->api('user' )->show($issue['assigned_to']['id']);

$api_key = $assignedTo['user']['api_key'];
$redmine = new Redmine\Client('https://redmine.ut.mephi.ru', $api_key);

switch ($_GET['action']) {
	case 'agree':
		header('Content-Type: text/plain');

		$recipientId = NULL;
		foreach ( $issue['custom_fields'] as $cf) {
			if ($cf['id'] == 95) {
				$recipientId = $cf['value'];
				break;
			}
		}

		if (is_null($recipientId)) {
			die('Cannot find recipient custom field in issue: '.$_GET['issueId']);
		}
		$recipient = $redmine_admin->api('user')->show($recipientId)['user'];

		if (empty($recipient['mail'])) {
			die('Cannot find login of user with ID: '.$recipientId);
		}

		//print @json_encode($redmine->api('issue')->update($issue['id'], array('status_id' => STATUSID_NEW, 'project_id' => redmine_proj_identifier2id(strtolower(explode('@', $recipient['mail'])[0])), 'assigned_to_id' => $recipient['id'])));
		$result = $redmine->api('issue')->update($issue['id'], array('status_id' => STATUSID_NEW, 'project_id' => redmine_proj_identifier2id(strtolower(explode('@', $recipient['mail'])[0])), 'assigned_to_id' => $recipient['id']));
		if ($result == true) {
			header('Location: https://tasks.mephi.ru/issues/'.$_GET['issueId']);
		}
		break;
	case 'decline':
		header('Content-Type: text/plain');

		//print @json_encode($redmine->api('issue')->update($_GET['issueId'], array('status_id' => STATUSID_DECLINED)));
		$result = $redmine->api('issue')->update($_GET['issueId'], array('status_id' => STATUSID_DECLINED));
		if ($result == true) {
			header('Location: https://tasks.mephi.ru/issues/'.$_GET['issueId']);
		}
		break;
	default:
		die('Unknown action: '.$_GET['action']);
}


?>