blob: ab796ad6aae3dd72f1b394a8872401ebda19086f [file] [log] [blame]
<?php
/*******************************************************************************
* Copyright (c) 2013 Eclipse Foundation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*******************************************************************************/
require_once(dirname(__FILE__) . "/../../eclipse.org-common/system/app.class.php");
$App = new App();
require_once(dirname(__FILE__) . "/../classes/common.php");
require_once(dirname(__FILE__) . "/../classes/debug.php");
mustBeEclipseFoundationCaller();
$output = array();
// FIXME Use the Forge class.
$forges = array();
// We build up a "where" clause bit-by-bit. The $and variable is an array
// that will contain all of the conjunctive conditions. Based on various
// bits of state, we will accumulate some number (more than one) of conjunctive
// conditions that we join together to build the "where" clause.
$and = array();
// If a forge is specified, narrow our search parameters to include only
// projects in that forge. If no forge is provided, assume that we're
// working in the "eclipse" forge.
if (in_array($forge = @$_GET['forge'], $forges)) {
$and[] = "(pp.ProjectId like '$forge.%')";
// Create a replacement string to remove forge qualifers.
$replace = $forge;
} else {
$forge = 'eclipse';
$replace = '';
}
// If an id is provided, assume that it is the id of a single project
// and narrow the search to that. Note that #isValidProjectId should
// protect us against injection.
if (isValidProjectId($id = @$_GET['id'])) {
$and[] = "(pp.ProjectId = '{$id}')";
}
// If a value is provided for "ago", then we limit ourselves to changes
// that have occurred at most that many days in the past. If no value
// is provided, we assume 10 as the default.
if (!preg_match('/^\d+$/', $ago = @$_GET['ago'])) $ago = 10;
$date = date('Y-m-d', strtotime("-$ago days"));
// We want all records that match either of the two conditions that follow...
$or = array();
// First, check the SYS_ModLog for entries indicating that a change has occurred
// in the PeopleProjects table. Identify those users that the log indicates have
// changed and just include all of their relationships (probably a bit of overkill,
// but doesn't hurt anything).
$or[] = "(p.PersonId in (SELECT PK1 FROM SYS_ModLog where LogTable='PeopleProjects' and ModDateTime > '{$date}'))";
// There may be cases where the active or inactive date suggests that a change
// that is not recorded in the log has occurred (or, potentially, the date of the
// log entry is different from the date recorded in the PeopleProjects table).
// Again, this might be overkill, but it's better that we do not miss anybody.
$or[] = "(pp.ActiveDate > date '$date' or pp.InactiveDate > date '$date')";
// Combine the "or" statements.
$and[] = '(' . implode(' or ', $or) . ')';
// Combine the "and" statements (the size of this array will vary).
$where = 'where ' . implode(' and ', $and);
// Export everybody who has ever had a project relationship.
$sql = "SELECT
p.PersonId as id, p.FName, p.LName, p.Email, pp.ProjectId, pp.Relation, pp.ActiveDate, pp.InactiveDate
from People as p join PeopleProjects as pp on p.PersonId = pp.PersonId
$where";
$people = array();
$result = $App->foundation_sql($sql);
while ($row=mysql_fetch_assoc($result)) {
$id = utf8_encode($row['id']);
$people[$id]['id'] = $id;
$people[$id]['first'] = $row['FName'];
$people[$id]['last'] = $row['LName'];
$people[$id]['email'] = $row['Email'];
$people[$id]['roles'][] = array(
// Remove the forge qualifer (if any).
'project' => preg_replace("/^($replace)\./", '', $row['ProjectId']),
'relation' => $row['Relation'],
'active' => date('Y-m-d' , strtotime($row['ActiveDate'])),
'inactive' => ($date = strtotime($row['InactiveDate'])) ? date('Y-m-d' , $date) : null
);
}
$output['debug']['sql'][] = $sql;
/*
* This is a starting point only. Ideally, I'd like to capture and manage
* non-project-related roles (e.g. architecture council appointment) directly,
* but--since I have no means of querying for ended relationships (we only
* track an effective date in the Foundation database)--I can't do that right now.
*
* Note that this only captures appointed AC members, the AC chair (PMC representatives
* should be captured by the previous queries) and Security Team members.
*
* TODO Extend to export AC organization representatives.
* TODO Only export changes within the specified timeframe
*/
$sql = "SELECT
p.PersonId as id, p.FName, p.LName, p.Email, pr.Relation, pr.EntryDate
from People as p join PeopleRelations as pr on p.PersonId = pr.PersonId
where relation in ('EA', 'AZ', 'SecTm')";
$result = $App->foundation_sql($sql);
while ($row=mysql_fetch_assoc($result)) {
$id = utf8_encode($row['id']);
$people[$id]['id'] = $id;
$people[$id]['first'] = $row['FName'];
$people[$id]['last'] = $row['LName'];
$people[$id]['email'] = $row['Email'];
$people[$id]['roles'][] = array(
'project' => null,
'relation' => $row['Relation'],
'active' => date('Y-m-d' , strtotime($row['EntryDate'])),
'inactive' => null
);
}
$output['debug']['sql'][] = $sql;
/*
* Organization representatives to the Architecture Council.
*/
$sql = "SELECT
p.PersonId as id, p.FName, p.LName, p.Email, oc.Relation
from People as p join OrganizationContacts as oc on p.PersonId = oc.PersonId
where relation in ('AC')";
$result = $App->foundation_sql($sql);
while ($row=mysql_fetch_assoc($result)) {
$id = utf8_encode($row['id']);
$people[$id]['id'] = $id;
$people[$id]['first'] = $row['FName'];
$people[$id]['last'] = $row['LName'];
$people[$id]['email'] = $row['Email'];
$people[$id]['roles'][] = array(
'project' => null,
'relation' => $row['Relation'],
'active' => null,
'inactive' => null
);
}
$output['debug']['sql'][] = $sql;
$output['people'] = $people;
echo json_encode($output);
?>