/**
* AjaxRequest objects are automatically processed when they are created, based on the unique $action
* value. The result of the call is stored in $response to be handled however you need (e.g. output
* as JSON, XML etc) - or an Exception is thrown if something went wrong. Exceptions are used SOLELY for
* program errors: not for user-entry errors.
*/
public function __construct($action, $post = array())
{
$this->action = $action;
$this->post = Utils::sanitize($post);
switch ($this->action) {
// ------------------------------------------------------------------------------------
// INSTALLATION
// ------------------------------------------------------------------------------------
// a fresh install assumes it's a blank slate: no database tables, no settings file
case "installationTestDbSettings":
Core::init("installation");
if (Core::checkIsInstalled()) {
return;
}
list($success, $content) = Database::testDbSettings($this->post["dbHostname"], $this->post["dbName"], $this->post["dbUsername"], $this->post["dbPassword"]);
$this->response["success"] = $success;
$this->response["content"] = $content;
break;
case "installationCreateSettingsFile":
Core::init("installation");
if (Core::checkIsInstalled()) {
return;
}
if (Core::checkSettingsFileExists()) {
$this->response["success"] = 0;
$this->response["content"] = "Your settings.php file already exists.";
return;
} else {
list($success, $content) = Installation::createSettingsFile($this->post["dbHostname"], $this->post["dbName"], $this->post["dbUsername"], $this->post["dbPassword"], $this->post["dbTablePrefix"]);
$this->response["success"] = $success ? 1 : 0;
// bah!
$this->response["content"] = $content;
}
break;
case "confirmSettingsFileExists":
Core::init("installation");
$settingsFileExists = Core::checkSettingsFileExists();
$this->response["success"] = $settingsFileExists ? 1 : 0;
break;
case "installationCreateDatabase":
Core::init("installationDatabaseReady");
if (Core::checkIsInstalled()) {
$this->response["success"] = 0;
$this->response["content"] = "It appears that the script is already installed. If the database already existed, you may need to delete the tables manually before being able to continue.";
return;
}
list($success, $content) = Installation::createDatabase();
if (!$success) {
$this->response["success"] = 0;
$this->response["content"] = $content;
return;
}
// always create the administrator account. If the user chose the anonymous setup, all values
// will be blank and all configurations will be associated with this (anonymous) user
$adminAccount = array("accountType" => "admin");
if ($this->post["userAccountSetup"] != "anonymous") {
$adminAccount["firstName"] = $this->post["firstName"];
$adminAccount["lastName"] = $this->post["lastName"];
$adminAccount["email"] = $this->post["email"];
$adminAccount["password"] = $this->post["password"];
}
Account::createAccount($adminAccount, true);
// make note of the fact that we've passed this step of the installation process
Settings::setSetting("userAccountSetup", $this->post["userAccountSetup"]);
Settings::setSetting("installationStepComplete_Core", "yes");
Settings::setSetting("defaultLanguage", $this->post["defaultLanguage"]);
Settings::setSetting("allowAnonymousAccess", $this->post["allowAnonymousAccess"] == "yes" ? "yes" : "no");
Settings::setSetting("anonymousUserPermissionDeniedMsg", $this->post["anonymousUserPermissionDeniedMsg"]);
$this->response["success"] = 1;
$this->response["content"] = "";
break;
// ------------------------------------------------------------------------------------
// PLUGINS (installation + reset)
// ------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------
// PLUGINS (installation + reset)
// ------------------------------------------------------------------------------------
case "installDataTypes":
Core::init("installationDatabaseReady");
if (!Core::checkIsInstalled()) {
$this->installDataTypes();
}
break;
case "installationValidateSettingsFile":
$response = Installation::validateSettingsFile();
$this->response["success"] = $response["success"];
$this->response["content"] = $response["errorMessage"];
break;
case "resetDataTypes":
Core::init("resetPlugins");
if (Core::checkIsLoggedIn() && Core::$user->isAdmin()) {
$this->installDataTypes();
}
break;
case "installExportTypes":
Core::init("installationDatabaseReady");
if (!Core::checkIsInstalled()) {
$this->installExportTypes();
}
break;
case "resetExportTypes":
Core::init("resetPlugins");
if (Core::checkIsLoggedIn() && Core::$user->isAdmin()) {
$this->installExportTypes();
}
break;
// for new installations, we just update the (only) record in the database.
// for new installations, we just update the (only) record in the database.
case "savePluginList":
Core::init("installationDatabaseReady");
if (!Core::checkIsInstalled()) {
$response = Account::updateSelectedPlugins(1, $this->post["dataTypes"], $this->post["exportTypes"], $this->post["countries"]);
$this->response["success"] = $response["success"];
$this->response["content"] = $response["errorMessage"];
Settings::setSetting("installationComplete", "yes");
// at this point the user's finished the installation.
if (!Minification::createAppStartFile()) {
// need error handling here
}
return;
}
break;
// called anytime the plugins were updated
// called anytime the plugins were updated
case "resetPluginList":
Core::init();
if (Core::checkIsLoggedIn() && Core::$user->isAdmin()) {
$response = Account::updateSelectedPlugins(1, $this->post["dataTypes"], $this->post["exportTypes"], $this->post["countries"]);
$this->response["success"] = $response["success"];
$this->response["content"] = $response["errorMessage"];
Minification::createAppStartFile();
}
break;
case "installCountries":
Core::init("installationDatabaseReady");
if (!Core::checkIsInstalled()) {
$this->installCountries();
}
break;
case "resetCountries":
Core::init("resetPlugins");
if (Core::checkIsLoggedIn() && Core::$user->isAdmin()) {
$this->installCountries();
}
break;
// ------------------------------------------------------------------------------------
// USER ACCOUNTS
// ------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------
// USER ACCOUNTS
// ------------------------------------------------------------------------------------
case "getAccount":
Core::init();
$response = Core::$user->getAccount();
$this->response["success"] = true;
$this->response["content"] = $response;
break;
case "getUsers":
Core::init();
$response = Core::$user->getUsers();
$this->response["success"] = $response["success"];
if (isset($response["accounts"])) {
$this->response["content"] = $response["accounts"];
}
break;
case "createAccount":
Core::init();
if (!Core::checkIsLoggedIn()) {
$this->response["success"] = false;
$this->response["errorCode"] = ErrorCodes::NOT_LOGGED_IN;
} else {
if (Core::$user->getAccountType() != "admin") {
$this->response["success"] = false;
$this->response["errorCode"] = ErrorCodes::NON_ADMIN;
} else {
if (Account::checkAccountExists($this->post["email"])) {
$this->response["success"] = false;
$this->response["errorCode"] = ErrorCodes::ACCOUNT_ALREADY_EXISTS;
} else {
$accountInfo = $this->post;
$accountInfo["accountType"] = "user";
Account::createAccount($accountInfo);
$this->response["success"] = true;
}
}
}
break;
case "deleteAccount":
Core::init();
if (!Core::checkIsLoggedIn()) {
$this->response["success"] = false;
$this->response["errorCode"] = ErrorCodes::NOT_LOGGED_IN;
} else {
if (Core::$user->getAccountType() != "admin") {
$this->response["success"] = false;
$this->response["errorCode"] = ErrorCodes::NON_ADMIN;
} else {
$accountID = $this->post["accountID"];
$response = Core::$user->deleteAccount($accountID);
$this->response["success"] = true;
}
}
break;
// updates the current logged in user's info
// updates the current logged in user's info
case "updateAccount":
Core::init();
if (!Core::checkIsLoggedIn()) {
$this->response["success"] = false;
$this->response["errorCode"] = ErrorCodes::NOT_LOGGED_IN;
} else {
if (Core::$user->isAnonymousAdmin()) {
$this->response["success"] = false;
$this->response["errorCode"] = ErrorCodes::INVALID_REQUEST;
} else {
$accountID = $this->post["accountID"];
$this->response = Core::$user->updateAccount($accountID, $this->post);
}
}
break;
case "saveConfiguration":
Core::init();
$response = Core::$user->saveConfiguration($this->post);
$this->response["success"] = $response["success"];
$this->response["content"] = $response["message"];
if (isset($response["lastUpdated"])) {
$this->response["lastUpdated"] = $response["lastUpdated"];
}
break;
case "saveSettings":
Core::init();
list($success, $message) = Settings::updateSettings($this->post);
$this->response["success"] = $success;
$this->response["content"] = $message;
break;
case "copyDataSet":
Core::init();
$response = Core::$user->copyConfiguration($this->post);
$this->response["success"] = $response["success"];
$this->response["content"] = $response["message"];
break;
case "deleteDataSets":
Core::init();
$configurationIDs = $this->post["configurationIDs"];
$response = Core::$user->deleteConfigurations($configurationIDs);
$this->response["success"] = $response["success"];
$this->response["content"] = $response["message"];
break;
case "saveDataSetVisibilityStatus":
Core::init();
$configurationID = $this->post["configurationID"];
$status = $this->post["status"];
$time = $this->post["time"];
$response = Core::$user->saveDataSetVisibilityStatus($configurationID, $status, $time);
$this->response["success"] = $response["success"];
$this->response["content"] = $response["message"];
if (isset($response["newStatus"])) {
$this->response["newStatus"] = $response["newStatus"];
}
break;
case "getPublicDataSet":
Core::init();
$configurationID = $this->post["dataSetID"];
$response = Core::$user->getPublicDataSet($configurationID);
$this->response["success"] = $response["success"];
$this->response["content"] = $response["message"];
break;
case "getDataSetHistory":
Core::init();
$configurationID = $this->post["dataSetID"];
$response = Core::$user->getDataSetHistory($configurationID);
$this->response["success"] = $response["success"];
$this->response["content"] = $response["message"];
break;
case "login":
Core::init();
$email = $this->post["email"];
$password = $this->post["password"];
$response = Account::login($email, $password);
$this->response["success"] = $response["success"];
$this->response["content"] = $response["message"];
break;
case "logout":
Core::init();
if (!Core::checkIsLoggedIn()) {
$this->response["success"] = true;
} else {
if (!Core::$user->isAnonymousAdmin()) {
Core::$user->logout();
$this->response["success"] = true;
}
}
break;
case "resetPassword":
Core::init();
$email = $this->post["email"];
$response = Account::resetPassword($email);
$this->response["success"] = $response["success"];
$this->response["content"] = $response["message"];
break;
// ------------------------------------------------------------------------------------
// DATA GENERATION
// ------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------
// DATA GENERATION
// ------------------------------------------------------------------------------------
case "generateInPage":
Core::init("generation");
$gen = new DataGenerator(Constants::GEN_ENVIRONMENT_POST, $this->post);
$response = $gen->generate();
$this->response["success"] = $response["success"];
$this->response["content"] = $response["content"];
$this->response["isComplete"] = $response["isComplete"];
break;
}
}