decide-note.php 6.56 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'])['user'];

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

function addUserToProject(&$redmine, $user_id, $project_id, $role_id) {
	error_log("addUserToProject(redmine, $user_id, $project_id, $role_id)");
	$current_membership = $redmine->api('membership')->all($project_id); 
	foreach ($current_membership['memberships'] as $global_key => $member){
		if ($member['user']['id'] == $user_id){
			$cur_roles=array();
			$membership_id = $current_membership['memberships'][$global_key]['id'];
			foreach($current_membership['memberships'][$global_key]['roles'] as $role) {
				if ($role['id'] == $role_id) {
					//print "already there!\n";
					return true;
				}
				$cur_roles[] = $role['id'];
			}
			$role_ids = array('role_ids' => array_merge($cur_roles, array($role_id)));
			//print "updating\n";
			//print_r($role_ids);
			return $redmine->api('membership')->update($membership_id, $role_ids);
		}
	}
	//print "creating\n";
	return $redmine->api('membership')->create($project_id, array('user_id' => $user_id, 'role_ids' => array($role_id)));
}

function removeUserFromProject(&$redmine, $user_id, $project_id, $role_id) {
	error_log("removeUserFromProject(redmine, $user_id, $project_id, $role_id)");
	$current_membership = $redmine->api('membership')->all($project_id); 
	foreach ($current_membership['memberships'] as $global_key => $member){
		if ($member['user']['id'] == $user_id){
			$role_ids=array();
			$membership_id = $current_membership['memberships'][$global_key]['id'];
			foreach($current_membership['memberships'][$global_key]['roles'] as $role) {
				if ($role['id'] == $role_id) {
					continue;
				}
				$role_ids[] = $role['id'];
			}
			return $redmine->api('membership')->update($membership_id, $role_ids);
		}
	}
	return true;
}

switch ($_GET['action']) {
	case 'agree':
	case 'move':
		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)) {
			mail('admin@ut.mephi.ru', 'Got error on decide-note.php', print_r($_GET, 1));
			die('Произошла ошибка. Пожалуйста, повторите попытку позже. Cannot find recipient custom field in issue: '.$_GET['issueId']);
		}
		$recipient = $redmine_admin->api('user')->show($recipientId)['user'];

		if (empty($recipient['mail'])) {
			mail('admin@ut.mephi.ru', 'Got error on decide-note.php', print_r($_GET, 1));
			die('Произошла ошибка. Пожалуйста, повторите попытку позже. Cannot find login of user with ID: '.$recipientId);
		}

		$project_id = redmine_proj_identifier2id(strtolower(explode('@', $recipient['mail'])[0]));

		addUserToProject($redmine_admin, $assignedTo['id'], $project_id, ROLE_CUSTOMER);
		addUserToProject($redmine_admin, $assignedTo['id'], $project_id, ROLE_MOVER);
		/*$result =*/
		/*if ($result !== TRUE) {
			mail('admin@ut.mephi.ru', 'Got error on decide-note.php', print_r($_GET, 1));
			die('Произошла ошибка. Пожалуйста, повторите попытку позже. Cannot add user '.$recipientId.' to project '.$issue['project']['id'].': '.print_r($result, 1));
		}*/

		//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'])));

		$issue_props = array(
			'project_id'	 => $project_id,
			'assigned_to_id' => $recipient['id']
		);

		if ($_GET['action'] == 'agree')
			$issue_props['status_id'] = STATUSID_NEW;
		//print_r($issue_props);die();

		$result = $redmine->api('issue')->update($issue['id'], $issue_props);
		removeUserFromProject($redmine_admin, $assignedTo['id'], $project_id, ROLE_MOVER);
		if ($result !== TRUE) {
			mail('admin@ut.mephi.ru', 'Got error on decide-note.php', print_r($_GET, 1));
			die('Произошла ошибка. Пожалуйста, повторите попытку позже. Cannot update the issue '.$issue['project']['id'].': '.print_r($result, 1));
		}
		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) {
			mail('admin@ut.mephi.ru', 'Got error on decide-note.php', print_r($_GET, 1));
			die('Произошла ошибка. Пожалуйста, повторите попытку позже. Cannot decline the issue '.$issue['project']['id'].': '.print_r($result, 1));
		}
		header('Location: https://tasks.mephi.ru/issues/'.$_GET['issueId']);
		break;
	default:
		die('Unknown action: '.$_GET['action']);
}


?>