178 lines
4.9 KiB
PHP
178 lines
4.9 KiB
PHP
<?php
|
|
|
|
namespace Grav\Plugin\GitSync;
|
|
|
|
use Grav\Common\Grav;
|
|
use Grav\Common\Plugin;
|
|
use Grav\Common\Utils;
|
|
use Grav\Plugin\Admin\AdminBaseController;
|
|
|
|
class AdminController extends AdminBaseController
|
|
{
|
|
protected $action;
|
|
protected $target;
|
|
protected $active;
|
|
protected $plugin;
|
|
protected $task_prefix = 'task';
|
|
|
|
/** @var GitSync */
|
|
public $git;
|
|
|
|
/**
|
|
* @param Plugin $plugin
|
|
*/
|
|
public function __construct(Plugin $plugin)
|
|
{
|
|
$this->grav = Grav::instance();
|
|
$this->active = false;
|
|
$uri = $this->grav['uri'];
|
|
$this->plugin = $plugin;
|
|
|
|
$post = !empty($_POST) ? $_POST : [];
|
|
$this->post = $this->getPost($post);
|
|
|
|
// Ensure the controller should be running
|
|
if (Utils::isAdminPlugin()) {
|
|
$routeDetails = $this->grav['admin']->getRouteDetails();
|
|
$target = array_pop($routeDetails);
|
|
$this->git = new GitSync();
|
|
|
|
// return null if this is not running
|
|
if ($target !== $plugin->name) {
|
|
return;
|
|
}
|
|
|
|
$this->action = !empty($this->post['action']) ? $this->post['action'] : $uri->param('action');
|
|
$this->target = $target;
|
|
$this->active = true;
|
|
$this->admin = Grav::instance()['admin'];
|
|
|
|
$task = !empty($post['task']) ? $post['task'] : $uri->param('task');
|
|
if ($task && ($this->target === $plugin->name || $uri->route() === '/lessons')) {
|
|
$this->task = $task;
|
|
$this->active = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
public function taskTestConnection()
|
|
{
|
|
$post = $this->post;
|
|
$test = base64_decode($post['test']) ?: null;
|
|
$data = $test ? json_decode($test, false) : new \stdClass();
|
|
|
|
try {
|
|
$testResult = Helper::testRepository($data->user, $data->password, $data->repository, $data->branch);
|
|
|
|
if (!empty($testResult)) {
|
|
echo json_encode([
|
|
'status' => 'success',
|
|
'message' => 'The connection to the repository has been successful.'
|
|
]);
|
|
} else {
|
|
echo json_encode([
|
|
'status' => 'error',
|
|
'message' => 'Branch "' . $data->branch .'" not found in the repository.'
|
|
]);
|
|
}
|
|
} catch (\Exception $e) {
|
|
$invalid = str_replace($data->password, '{password}', $e->getMessage());
|
|
echo json_encode([
|
|
'status' => 'error',
|
|
'message' => $invalid
|
|
]);
|
|
}
|
|
|
|
exit;
|
|
}
|
|
|
|
public function taskSynchronize()
|
|
{
|
|
try {
|
|
$this->plugin->synchronize();
|
|
echo json_encode([
|
|
'status' => 'success',
|
|
'message' => 'GitSync has successfully synchronized with the repository.'
|
|
]);
|
|
} catch (\Exception $e) {
|
|
$invalid = str_replace($this->git->getConfig('password', null), '{password}', $e->getMessage());
|
|
echo json_encode([
|
|
'status' => 'error',
|
|
'message' => $invalid
|
|
]);
|
|
}
|
|
|
|
exit;
|
|
}
|
|
|
|
public function taskResetLocal()
|
|
{
|
|
try {
|
|
$this->plugin->reset();
|
|
echo json_encode([
|
|
'status' => 'success',
|
|
'message' => 'GitSync has successfully reset your local changes and synchronized with the repository.'
|
|
]);
|
|
} catch (\Exception $e) {
|
|
$invalid = str_replace($this->git->getConfig('password', null), '{password}', $e->getMessage());
|
|
echo json_encode([
|
|
'status' => 'error',
|
|
'message' => $invalid
|
|
]);
|
|
}
|
|
|
|
exit;
|
|
}
|
|
|
|
/**
|
|
* Performs a task or action on a post or target.
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function execute()
|
|
{
|
|
$params = [];
|
|
|
|
// Handle Task & Action
|
|
if ($this->post && $this->task) {
|
|
// validate nonce
|
|
if (!$this->validateNonce()) {
|
|
return false;
|
|
}
|
|
$method = $this->task_prefix . ucfirst($this->task);
|
|
} elseif ($this->target) {
|
|
if (!$this->action) {
|
|
return false;
|
|
}
|
|
$method = strtolower($this->action) . ucfirst($this->target);
|
|
} else {
|
|
return false;
|
|
}
|
|
|
|
if (!method_exists($this, $method)) {
|
|
return false;
|
|
}
|
|
|
|
$success = $this->{$method}(...$params);
|
|
|
|
// Grab redirect parameter.
|
|
$redirect = $this->post['_redirect'] ?? null;
|
|
unset($this->post['_redirect']);
|
|
|
|
// Redirect if requested.
|
|
if ($redirect) {
|
|
$this->setRedirect($redirect);
|
|
}
|
|
|
|
return $success;
|
|
}
|
|
|
|
/**
|
|
* @return bool
|
|
*/
|
|
public function isActive()
|
|
{
|
|
return (bool) $this->active;
|
|
}
|
|
}
|