blob: 812e163e2c14fc450675ead29beed533c2812d7c [file] [log] [blame]
<?php
/*******************************************************************************
* Copyright (c) 2015, 2016 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
*
* Contributors:
* Eric Poirier (Eclipse Foundation) - initial API and implementation
* Christopher Guindon (Eclipse Foundation)
*******************************************************************************/
require_once("webmaster.class.php");
class MailingLists extends Webmaster{
private $default_search_table_and_name = array();
private $default_search_options = array();
private $newsgroups = NULL;
private $mailing_lists = NULL;
private $search_results = NULL;
private $date_range = "5";
public function __construct(App $App){
parent::__construct($App);
if ($this->getFormName() === 'webmaster-mailinglists') {
switch ($this->getState()) {
case 'create':
$this->_createMailingLists();
break;
case 'delete':
$this->_deleteItem();
break;
case 'search':
$this->getSearchResults();
break;
case 'date-range':
$this->_setDateRange();
break;
}
}
}
private function _setDateRange() {
$range = filter_var($this->App->getHTTPParameter('date-range', 'POST'), FILTER_SANITIZE_STRING);
if (!empty($range)) {
$this->date_range = $range;
}
}
/**
* This function returns the word selected wheter or not
* an option is selected.
* This helps adding the Selected parameter to <option> tags
* @return string
* */
public function checkSelectedOption($title, $value) {
if (!empty($title) && !empty($value)) {
foreach ($this->default_search_options as $option){
if ($option['title'] == $title && $option['value'] == $value) {
return "selected";
}
}
}
}
/**
* Get Newsgroups
*/
public function getNewsgroups() {
if (is_null($this->newsgroups)) {
$this->_fetchMailingListsOrNewsgroups('newsgroups', $this->date_range);
}
return $this->newsgroups;
}
/**
* Get HTML for mailing list table
*
* @param array $list
* @param string $table
*/
public function getMailingListTable($list = array(), $table = '') {
$html = '';
if ($this->_isValidTable($table) && !empty($list)) {
ob_start();
include('tpl/mailinglists/mailinglists-table.tpl.php');
$html = ob_get_clean();
}
return $html;
}
/**
* Get Mailing lists.
*/
public function getMailingLists(){
if (is_null($this->mailing_lists)) {
$this->_fetchMailingListsOrNewsgroups('mailing_lists', $this->date_range);
}
return $this->mailing_lists;
}
/**
* This function returns the search results
*
* @return array
* */
public function getSearchResults() {
if (is_null($this->search_results)) {
$this->_searchForItems();
}
return $this->search_results;
}
/**
* This function return a list of status
* @return array
* */
public function getStatusList() {
return array(
'approve',
'wait',
'active',
'completed',
'pending'
);
}
/**
* This function returns the appropriate column title for the specified table
*
* @param $table - either mailing_lists or newgroups
*
* @return string
* */
public function getTableTitleName($table) {
$name = 'group_name';
if ($table == 'mailing_lists') {
$name = 'list_name';
}
return $name;
}
/**
* Get default_search_table_and_name value
*/
public function getDefaultSearchTableAndName(){
return $this->default_search_table_and_name;
}
/**
* This function adds new mailing lists or newsgroups
* */
private function _createMailingLists() {
$table = filter_var($this->App->getHTTPParameter('create_table', 'POST'), FILTER_SANITIZE_STRING);
if ($this->_isValidTable($table)) {
$project = filter_var($this->App->getHTTPParameter('create_project', 'POST'), FILTER_SANITIZE_STRING);
$name = filter_var($this->App->getHTTPParameter('create_name', 'POST'), FILTER_SANITIZE_STRING);
$description = filter_var($this->App->getHTTPParameter('create_description', 'POST'), FILTER_SANITIZE_STRING);
// Default Message type
$msg_type = "success";
// Check for any empty values
if (empty($project) || empty($name) || empty($description) || $this->_itemInTable($table, $name) === TRUE || !in_array(array('ProjectID' => $project), $this->getProjects())) {
$msg_type = 'danger';
}
if (empty($project)) {
$this->App->setSystemMessage('create_mailinglist','You must select a project.', $msg_type);
}
if (!empty($project) && !in_array(array('ProjectID' => $project), $this->getProjects())) {
$this->App->setSystemMessage('create_mailinglist','The selected project is not part of the projects list.', $msg_type);
}
if (empty($name)) {
$this->App->setSystemMessage('create_mailinglist','You must enter a name.', $msg_type);
}
if (empty($description)) {
$this->App->setSystemMessage('create_mailinglist','You must enter a description.', $msg_type);
}
if (!empty($name) && $this->_itemInTable($table, $name) === TRUE) {
$this->App->setSystemMessage('create_mailinglist',$name.' already exists in the '.$table.' table.', $msg_type);
}
if ($msg_type != 'danger') {
$sql = "";
switch ($table) {
case "mailing_lists":
$sql = "INSERT INTO mailing_lists
(list_name,list_description,is_private,project_id,list_short_description,create_date,created_by)
VALUES (
".$this->App->returnQuotedString($this->App->sqlSanitize($name)).",
".$this->App->returnQuotedString($this->App->sqlSanitize($description)).",
0,
".$this->App->returnQuotedString($this->App->sqlSanitize($project)).",
".$this->App->returnQuotedString($this->App->sqlSanitize($description)).",
NOW(),
".$this->App->returnQuotedString("PORTAL")."
)";
break;
case "newsgroups":
$sql = "INSERT INTO newsgroups
(group_name,project_id,group_description,create_date,created_by)
VALUES (
".$this->App->returnQuotedString($this->App->sqlSanitize($name)).",
".$this->App->returnQuotedString($this->App->sqlSanitize($project)).",
".$this->App->returnQuotedString($this->App->sqlSanitize($description)).",
NOW(),
".$this->App->returnQuotedString("PORTAL")."
)";
break;
}
$result = $this->App->eclipse_sql($sql);
$msg = "You have successfully created a new <strong>" .
($table == 'mailing_lists' ? "Mailing List" : "Newsgroup") .
"</strong> called <strong>" . $name . "</strong>.";
$this->App->setSystemMessage('create_mailinglist',$msg, $msg_type);
}
}
}
/**
* This function deletes an item from a specific table
* */
private function _deleteItem() {
$item = filter_var($this->App->getHTTPParameter('item_to_delete', 'POST'), FILTER_SANITIZE_STRING);
$table = filter_var($this->App->getHTTPParameter('item_type', 'POST'), FILTER_SANITIZE_STRING);
if ($this->_isValidTable($table) && $this->_itemInTable($table, $item) === TRUE) {
$item_name = $this->getTableTitleName($table);
$sql = "DELETE FROM " . $table . "
WHERE ". $item_name ." = " . $this->App->returnQuotedString($this->App->sqlSanitize($item));
$delete = $this->App->eclipse_sql($sql);
$msg = 'You have successfully deleted <strong>' .
$item . '</strong> from the <strong>'. $table .'</strong> table.';
$this->App->setSystemMessage('delete_item', $msg, 'success');
}
}
/**
* This function fetches mailing lists of newsgroups
*
* @param $table - This is the table name
* @param $date - Number of days to limit the query
*
* @return array
* */
private function _fetchMailingListsOrNewsgroups($table, $range) {
$lists = array();
if ($this->_isValidTable($table)) {
$name = $this->getTableTitleName($table);
$sql = "SELECT ". $this->App->sqlSanitize($name) ." as name, create_date, project_id, provision_status
FROM " . $this->App->sqlSanitize($table) . "
WHERE is_deleted = 0
AND create_date BETWEEN NOW() - INTERVAL ". $this->App->sqlSanitize($range) ." DAY AND NOW()
ORDER BY create_date DESC LIMIT 2000";
$result = $this->App->eclipse_sql($sql);
while ($row = mysql_fetch_array($result)) {
if (is_null($row['provision_status'])){
$row['provision_status'] = 'NULL';
}
$lists[$row['provision_status']][] = $row;
}
}
$this->{$table} = $lists;
return $lists;
}
/**
* This function validates a new entry by checking for any duplicates
*
* @param $table - string containing the name of the table
* @param $entry_name - string containing the name of the new group / mailing list
*
* @return bool
* */
private function _itemInTable($table, $item_name) {
$sql = "SELECT * FROM " . $table;
$result = $this->App->eclipse_sql($sql);
while ($row = mysql_fetch_array($result)) {
if (in_array($item_name, $row)) {
return TRUE;
}
}
return FALSE;
}
/**
* This function searches through a specified table for items
* @return array
* */
private function _searchForItems() {
$table = filter_var($this->App->getHTTPParameter('search_table', 'POST'), FILTER_SANITIZE_STRING);
$search_results = array();
if (!empty($table) && $this->_isValidTable($table)) {
$name = $this->getTableTitleName($table);
$search_options = array();
$array_item = 0;
// Building the $search_options array using a loop depending on the options inserted in the search
for ($i = 1; $i <= 3; $i++) {
$value = filter_var($this->App->getHTTPParameter('search_'.$i, 'POST'), FILTER_SANITIZE_STRING);
if (!empty($value)) {
switch ($i) {
case 1:
$title = "project_id";
break;
case 2:
$title = "provision_status";
break;
case 3:
$title = $name;
break;
}
$search_options[$array_item] = array(
"title" => $title,
"value" => filter_var($this->App->getHTTPParameter('search_'.$i, 'POST'), FILTER_SANITIZE_STRING)
);
$array_item++;
}
}
$this->_setDefaultSearchFields($table, $search_options);
// Build the SQL query depending on what options were inserted in the search
$sql = "SELECT ". $name ." as name, create_date, project_id, provision_status
FROM " . $table;
foreach ($search_options as $key => $option) {
if ($key == 0) {
$sql_where = " WHERE ";
}
if ($key >= 1) {
$sql_where = " AND ";
}
$sql .= $sql_where . $search_options[$key]['title'] . " = " . $this->App->returnQuotedString($this->App->sqlSanitize($search_options[$key]['value']));
}
$sql .= " ORDER BY create_date DESC";
$result = $this->App->eclipse_sql($sql);
while ($row = mysql_fetch_array($result)) {
$row['table'] = $table;
$search_results[] = $row;
}
if (empty($search_results)) {
$search_results[0]['no_results'] = "No results were found.";
}
}
$this->search_results = $search_results;
return $search_results;
}
/**
* This function sets the default search fields
* */
private function _setDefaultSearchFields($table, $search_options) {
$this->default_search_table_and_name = array('table' => $table);
foreach ($search_options as $option) {
if ($option['title'] == 'list_name' || $option['title'] == 'group_name') {
$this->default_search_table_and_name['name'] = $option['value'];
}
}
$this->default_search_options = $search_options;
}
/**
* This function verifies if a certain tables is part of the accepted tables
* @param $table - Specified table name
* @return bool
* */
private function _isValidTable($table) {
$accepted_tables = array(
'mailing_lists',
'newsgroups'
);
if (!empty($table) && in_array($table, $accepted_tables)) {
return TRUE;
}
if (empty($table)) {
$this->App->setSystemMessage('create_mailinglist','You must select a table between Mailing lists or a Newsgroups.', 'danger');
}
return FALSE;
}
}