Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 10 additions & 2 deletions adminator3/app/Controllers/Core/workController.php
Original file line number Diff line number Diff line change
Expand Up @@ -49,21 +49,29 @@ public function work(ServerRequestInterface $request, ResponseInterface $respons
return $this->response;
};

// $this->smarty->assign("action", $_SERVER['SCRIPT_URL']);
$csrf = $this->generateCsrfToken($request, $response, true);
// $this->logger->info("workController\work: csrf generated: ".var_export($csrf_name, true));

$assignData = [
"page_title" => "Adminator3 :: Work",
"csrf_html" => $csrf[0],
];

$work = new work($this->container);

list($allItemsRs, $allItemsData) = $work->getAllItems();
$assignData["items_list_select"] = $allItemsData;

$rs = $work->taskGroupList();
$assignData["p_bs_alerts"] = $work->p_bs_alerts;

if ($rs[0] === true) {
$assignData["work_list_groups_items"] = $rs[1];
}

$work->handleSingleActionForm();

$assignData["p_bs_alerts"] = $work->p_bs_alerts;

return $this->renderer->template($request, $response, 'work/work.tpl', $assignData);
}
}
112 changes: 100 additions & 12 deletions adminator3/app/Core/work.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,18 @@
use SebastianBergmann\Type\VoidType;
use Illuminate\Support\Facades\Redis;
use HyssaDev\HibikenAsynqClient\Client;
use Exception;

class work
class work extends adminator
{
// DI
protected \Monolog\Logger $logger;
public \Monolog\Logger $logger;

protected \mysqli|\PDO $conn_mysql;
public \mysqli|\PDO $conn_mysql;

protected \PgSql\Connection|\PDO|null $conn_pgsql;
public \PgSql\Connection|\PDO|null $conn_pgsql;

public \PDO|null $pdoMysql;

protected $sentinel;

Expand All @@ -29,12 +32,17 @@ class work
*/
public array $p_bs_alerts = [];

public $action_form;

public int $form_single_action;

public function __construct(ContainerInterface $container)
{
// $this->container = $container;
$this->logger = $container->get('logger');
$this->conn_mysql = $container->get('connMysql');
$this->conn_pgsql = $container->get('connPgsql');
$this->pdoMysql = $container->get('pdoMysql');

$this->sentinel = $container->get('sentinel');

Expand All @@ -46,6 +54,49 @@ public function __construct(ContainerInterface $container)
$this->logger->info(message: __CLASS__ . "\\" . __FUNCTION__ . " called");
}

public function callPdoQueryAndFetch($query): array
{
$rs_error = null;
try {
$rs = $this->pdoMysql->query($query);
} catch (Exception $e) {
$rs_error = $e->getMessage();
}

if (is_object($rs)) {
$rs_data = $rs->fetchAll();

} else {
$this->logger->error(__CLASS__ . "\\" . __FUNCTION__ . ": PDO result is not object");
$rs_data = [];
}

return [$rs_data, $rs_error];
}

public function getAllItems(): array
{
$q = "SELECT id, name FROM workitems_names WHERE id > 0 ORDER BY id";
list($data_rs, $dotaz_error) = $this->callPdoQueryAndFetch($q);

if ($dotaz_error != null) {
$this->logger->error(__CLASS__ . "\\" . __FUNCTION__ . ": Caught Exception: " . var_export($dotaz_error, true));
$this->p_bs_alerts["Nelze načíst data pro výpis akcí pro manuální restart. <br>(SQL error: $dotaz_error)"] = "danger";

return [false, []];

} elseif (count($data_rs) < 1) {
$this->p_bs_alerts["Žádné data pro výpis akcí pro manuální restart."] = "warning";

return [true, []];
} else {
foreach ($data_rs as $key => $val) {
$itemsList[] = ["id" => $val["id"], "name" => $val["name"]];
}
return [true, $itemsList];
}
}

public function getItemName(int $id): string|null
{
$rs_item_name = $this->conn_mysql->query("SELECT name FROM workitems_names WHERE id = '$id' ");
Expand All @@ -56,7 +107,43 @@ public function getItemName(int $id): string|null
return $item_name;
}

public function taskEnqueue(int $item_id): bool|int
public function handleSingleActionForm(): void
{
$this->logger->info(__CLASS__ . "\\" . __FUNCTION__ . " called");

// get form data
$this->action_form = $this->formInit();
$form_data = $this->action_form->validate("single_action");
$this->form_single_action = intval($form_data["single_action"]);

$this->logger->debug(__CLASS__ . "\\" . __FUNCTION__ . ": " . var_export($this->form_single_action, true));

// check if form was sended
if ($this->form_single_action > 0) {
// test if we have valid ID
$item_name = $this->getItemName($this->form_single_action);

if (is_null($item_name)) {
$this->logger->warning(message: __CLASS__ . "\\" . __FUNCTION__ . ": parsing item_name failed (item_id $this->form_single_action)");
} else {
[$queue_rs, $queue_err] = $this->taskEnqueue($this->form_single_action);
if ($queue_rs) {
$this->p_bs_alerts["Manuální přidání akce pro restart bylo provedeno úspěšně"] = "success";
} else {
$this->p_bs_alerts["Manuální přidání akce pro restart selhalo. </br> ($queue_err)"] = "danger";
$this->logger->error(message: __CLASS__ . "\\" . __FUNCTION__ . ": single_action failed ($queue_err)");
}
}
}
}

/**
* @return array [
* bool, // false if something failed
* bool|int|string, // results from asynq_client or error message
* ]
*/
public function taskEnqueue(int $item_id): array
{
$this->logger->info(__CLASS__ . "\\" . __FUNCTION__ . " called");

Expand All @@ -79,10 +166,10 @@ public function taskEnqueue(int $item_id): bool|int
} catch (\RedisException $ex) {
$m = $ex->getMessage();
$this->logger->error(__CLASS__ . "\\" . __FUNCTION__ . ": Redis error: $m");
return false;
return [false, "Redis error: $m"];
}

return $res;
return [true, $res];
}

public function taskGroupList(): array
Expand Down Expand Up @@ -144,17 +231,18 @@ public function work_handler($item_id): array
$item_name = $this->getItemName($item_id);

if (is_null($item_name)) {
//TODO: add warning over bootstrap.JS
// TODO: check/fix rendering in objekty/topology page(s)
$this->p_bs_alerts["Nepodařilo se načíst název WorkItem položky. <br>(item_id: $item_id)"] = "warning";
$this->logger->warning(message: __CLASS__ . "\\" . __FUNCTION__ . ": parsing item_name failed (item_id $item_id)");
} else {
$this->logger->info(message: __CLASS__ . "\\" . __FUNCTION__ . ": parsed item_name: " . var_export($item_name, true));
}

// asynqClient part
$rs_queue = $this->taskEnqueue($item_id);
$this->logger->debug(__CLASS__ . "\\" . __FUNCTION__ . ": rs_queue: " . var_export($rs_queue, true));
[$queue_rs, $queue_err] = $this->taskEnqueue($item_id);
$this->logger->debug(__CLASS__ . "\\" . __FUNCTION__ . ": rs_queue: " . var_export($queue_rs, true));

if ($rs_queue) {
if ($queue_rs) {
$rs_write = 1;
} else {
$rs_write = 0;
Expand All @@ -172,7 +260,7 @@ public function work_handler($item_id): array
// generate output view
$output .= "<div style=\"\">Požadavek na restart <b>\"".$item_name."\"</b> (No. ".$item_id.")";

if ($rs_queue) {
if ($queue_rs) {
$output .= "<div> - <span style=\"color: green;\"> úspěšně přidán do fronty</span></div>";
} else {
$output .= "<div> - <span style=\"color: red;\"> chyba při přidání požadavku do fronty</span></div>";
Expand Down
10 changes: 0 additions & 10 deletions adminator3/public/css/style.css
Original file line number Diff line number Diff line change
Expand Up @@ -458,16 +458,6 @@ input[type=submit]
.work-ok { color: green; }
.work-error { color: red; }

.work-main-window
{
height: 75px;
width: 620px;
padding: 15px;

text-align: center;
background-color: silver;
}

.work-result
{
width: 620px;
Expand Down
28 changes: 18 additions & 10 deletions adminator3/templates/global/no-csrf.tpl
Original file line number Diff line number Diff line change
@@ -1,14 +1,22 @@
{include file="base.tpl"}

<p><H3>Nelze zobrazit požadovanou stránku !</H3></p>

<b>Selhala kontrola CSRF tokenu.</b>
<br><br>

<br>
Vraťte se na předchozí <a href="javascript:history.back(1)">stránku</a>.
<br><br>

<b>Zpráva od systému:</b> {$body}
<div class="row justify-content-md-center">
<div class="col"></div>
<div class="col-8">

<div class="alert alert-danger fs-3" role="alert">Nelze zobrazit požadovanou stránku!</div>

<div class="alert alert-danger">Selhala kontrola CSRF tokenu.</div>
<br><br>

<br>
Vraťte se na předchozí <a href="javascript:history.back(1)">stránku</a>.
<br><br>

<b>Zpráva od systému:</b> {$body}

</div>
<div class="col"></div>
</div>

{include file="base-end.tpl"}
28 changes: 18 additions & 10 deletions adminator3/templates/global/no-level.tpl
Original file line number Diff line number Diff line change
@@ -1,16 +1,24 @@

{include file="base.tpl"}

<p><H3>Nelze zobrazit požadovanou stránku !</H3></p>

<b>Pro otevřetí této stránky nemáte dostatečné oprávnění (level).</b>
<br><br>

<br>
Vraťte se na předchozí <a href="javascript:history.back(1)">stránku</a>.
<br><br>

<b>Zpráva od systému:</b> {$body}
<div class="row justify-content-md-center">
<div class="col"></div>
<div class="col-8">

<div class="alert alert-danger fs-3" role="alert">Nelze zobrazit požadovanou stránku!</div>

<div class="alert alert-danger">Pro otevřetí této stránky nemáte dostatečné oprávnění (level).</div>
<br><br>

<br>
Vraťte se na předchozí <a href="javascript:history.back(1)">stránku</a>.
<br><br>

<b>Zpráva od systému:</b> {$body}

</div>
<div class="col"></div>
</div>

{include file="base-end.tpl"}

22 changes: 15 additions & 7 deletions adminator3/templates/global/smarty-exception.tpl
Original file line number Diff line number Diff line change
@@ -1,14 +1,22 @@
{include file="base.tpl"}

<p><H3>Nelze zobrazit požadovanou stránku !</H3></p>
<div class="row justify-content-md-center">
<div class="col"></div>
<div class="col-8">

<b>Selhal proces vykreslování.</b>
<br><br>
<div class="alert alert-danger fs-3" role="alert">Nelze zobrazit požadovanou stránku!</div>

<div class="alert alert-danger">Selhal proces vykreslování.</div>
<br><br>

<br>
Vraťte se na předchozí <a href="javascript:history.back(1)">stránku</a>.
<br><br>
<br>
Vraťte se na předchozí <a href="javascript:history.back(1)">stránku</a>.
<br><br>

<b>Zpráva od systému:</b> {$body}

<b>Zpráva od systému:</b> {$body}
</div>
<div class="col"></div>
</div>

{include file="base-end.tpl"}
26 changes: 26 additions & 0 deletions adminator3/templates/work/work-add-item.tpl
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<div style="padding-left: 5px;" >

<form method="POST" >
{$csrf_html}

<div style="width: 30%; float: left; font-weight: bold;" >Manuální přidání akce pro restart: </div>

<div style="float: left; padding-left: 20px;" >

<select size="1" name="single_action" >
<option value="0" class="select-nevybrano" >Nevybráno</option>
{foreach $items_list_select as $v}
<option value="{$v.id}" >{$v.name}</option>
{/foreach}
</select>

</div>

<div style="float: left; padding-left: 30px;" >
<input type="hidden" value="true" name="akce" >
<input type="submit" value="OK" name="odeslat" >
</div>
</form>
<div style="clear: both; padding-bottom: 10px;" ></div>

</div>
2 changes: 2 additions & 0 deletions adminator3/templates/work/work.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

<div style="padding-left: 5px;" >

{include file="work/work-add-item.tpl"}

{if $p_bs_alerts|default:'0' }
<div style="padding-top: 5px">
{include file="partials/bootstrap-alert-with-columns-array.tpl"}
Expand Down
2 changes: 1 addition & 1 deletion adminator3/tests/adminator/Work/WorkTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ public function testTaskEnqueue()

for ($i = 0; $i < 250; $i++) {

$task = $work->taskEnqueue($faker->numberBetween(1, 30));
[$rs, $task] = $work->taskEnqueue($faker->numberBetween(1, 30));

$this->assertTrue($task);
}
Expand Down