Skip to content

Commit a58c61f

Browse files
authored
adminator3: work: add manual_action form, improve error handling (#261)
1 parent df4d124 commit a58c61f

9 files changed

Lines changed: 190 additions & 52 deletions

File tree

adminator3/app/Controllers/Core/workController.php

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,21 +49,29 @@ public function work(ServerRequestInterface $request, ResponseInterface $respons
4949
return $this->response;
5050
};
5151

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

5455
$assignData = [
5556
"page_title" => "Adminator3 :: Work",
57+
"csrf_html" => $csrf[0],
5658
];
5759

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

62+
list($allItemsRs, $allItemsData) = $work->getAllItems();
63+
$assignData["items_list_select"] = $allItemsData;
64+
6065
$rs = $work->taskGroupList();
61-
$assignData["p_bs_alerts"] = $work->p_bs_alerts;
6266

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

71+
$work->handleSingleActionForm();
72+
73+
$assignData["p_bs_alerts"] = $work->p_bs_alerts;
74+
6775
return $this->renderer->template($request, $response, 'work/work.tpl', $assignData);
6876
}
6977
}

adminator3/app/Core/work.php

Lines changed: 100 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,18 @@
66
use SebastianBergmann\Type\VoidType;
77
use Illuminate\Support\Facades\Redis;
88
use HyssaDev\HibikenAsynqClient\Client;
9+
use Exception;
910

10-
class work
11+
class work extends adminator
1112
{
1213
// DI
13-
protected \Monolog\Logger $logger;
14+
public \Monolog\Logger $logger;
1415

15-
protected \mysqli|\PDO $conn_mysql;
16+
public \mysqli|\PDO $conn_mysql;
1617

17-
protected \PgSql\Connection|\PDO|null $conn_pgsql;
18+
public \PgSql\Connection|\PDO|null $conn_pgsql;
19+
20+
public \PDO|null $pdoMysql;
1821

1922
protected $sentinel;
2023

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

35+
public $action_form;
36+
37+
public int $form_single_action;
38+
3239
public function __construct(ContainerInterface $container)
3340
{
3441
// $this->container = $container;
3542
$this->logger = $container->get('logger');
3643
$this->conn_mysql = $container->get('connMysql');
3744
$this->conn_pgsql = $container->get('connPgsql');
45+
$this->pdoMysql = $container->get('pdoMysql');
3846

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

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

57+
public function callPdoQueryAndFetch($query): array
58+
{
59+
$rs_error = null;
60+
try {
61+
$rs = $this->pdoMysql->query($query);
62+
} catch (Exception $e) {
63+
$rs_error = $e->getMessage();
64+
}
65+
66+
if (is_object($rs)) {
67+
$rs_data = $rs->fetchAll();
68+
69+
} else {
70+
$this->logger->error(__CLASS__ . "\\" . __FUNCTION__ . ": PDO result is not object");
71+
$rs_data = [];
72+
}
73+
74+
return [$rs_data, $rs_error];
75+
}
76+
77+
public function getAllItems(): array
78+
{
79+
$q = "SELECT id, name FROM workitems_names WHERE id > 0 ORDER BY id";
80+
list($data_rs, $dotaz_error) = $this->callPdoQueryAndFetch($q);
81+
82+
if ($dotaz_error != null) {
83+
$this->logger->error(__CLASS__ . "\\" . __FUNCTION__ . ": Caught Exception: " . var_export($dotaz_error, true));
84+
$this->p_bs_alerts["Nelze načíst data pro výpis akcí pro manuální restart. <br>(SQL error: $dotaz_error)"] = "danger";
85+
86+
return [false, []];
87+
88+
} elseif (count($data_rs) < 1) {
89+
$this->p_bs_alerts["Žádné data pro výpis akcí pro manuální restart."] = "warning";
90+
91+
return [true, []];
92+
} else {
93+
foreach ($data_rs as $key => $val) {
94+
$itemsList[] = ["id" => $val["id"], "name" => $val["name"]];
95+
}
96+
return [true, $itemsList];
97+
}
98+
}
99+
49100
public function getItemName(int $id): string|null
50101
{
51102
$rs_item_name = $this->conn_mysql->query("SELECT name FROM workitems_names WHERE id = '$id' ");
@@ -56,7 +107,43 @@ public function getItemName(int $id): string|null
56107
return $item_name;
57108
}
58109

59-
public function taskEnqueue(int $item_id): bool|int
110+
public function handleSingleActionForm(): void
111+
{
112+
$this->logger->info(__CLASS__ . "\\" . __FUNCTION__ . " called");
113+
114+
// get form data
115+
$this->action_form = $this->formInit();
116+
$form_data = $this->action_form->validate("single_action");
117+
$this->form_single_action = intval($form_data["single_action"]);
118+
119+
$this->logger->debug(__CLASS__ . "\\" . __FUNCTION__ . ": " . var_export($this->form_single_action, true));
120+
121+
// check if form was sended
122+
if ($this->form_single_action > 0) {
123+
// test if we have valid ID
124+
$item_name = $this->getItemName($this->form_single_action);
125+
126+
if (is_null($item_name)) {
127+
$this->logger->warning(message: __CLASS__ . "\\" . __FUNCTION__ . ": parsing item_name failed (item_id $this->form_single_action)");
128+
} else {
129+
[$queue_rs, $queue_err] = $this->taskEnqueue($this->form_single_action);
130+
if ($queue_rs) {
131+
$this->p_bs_alerts["Manuální přidání akce pro restart bylo provedeno úspěšně"] = "success";
132+
} else {
133+
$this->p_bs_alerts["Manuální přidání akce pro restart selhalo. </br> ($queue_err)"] = "danger";
134+
$this->logger->error(message: __CLASS__ . "\\" . __FUNCTION__ . ": single_action failed ($queue_err)");
135+
}
136+
}
137+
}
138+
}
139+
140+
/**
141+
* @return array [
142+
* bool, // false if something failed
143+
* bool|int|string, // results from asynq_client or error message
144+
* ]
145+
*/
146+
public function taskEnqueue(int $item_id): array
60147
{
61148
$this->logger->info(__CLASS__ . "\\" . __FUNCTION__ . " called");
62149

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

85-
return $res;
172+
return [true, $res];
86173
}
87174

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

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

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

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

175-
if ($rs_queue) {
263+
if ($queue_rs) {
176264
$output .= "<div> - <span style=\"color: green;\"> úspěšně přidán do fronty</span></div>";
177265
} else {
178266
$output .= "<div> - <span style=\"color: red;\"> chyba při přidání požadavku do fronty</span></div>";

adminator3/public/css/style.css

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -458,16 +458,6 @@ input[type=submit]
458458
.work-ok { color: green; }
459459
.work-error { color: red; }
460460

461-
.work-main-window
462-
{
463-
height: 75px;
464-
width: 620px;
465-
padding: 15px;
466-
467-
text-align: center;
468-
background-color: silver;
469-
}
470-
471461
.work-result
472462
{
473463
width: 620px;
Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,22 @@
11
{include file="base.tpl"}
22

3-
<p><H3>Nelze zobrazit požadovanou stránku !</H3></p>
4-
5-
<b>Selhala kontrola CSRF tokenu.</b>
6-
<br><br>
7-
8-
<br>
9-
Vraťte se na předchozí <a href="javascript:history.back(1)">stránku</a>.
10-
<br><br>
11-
12-
<b>Zpráva od systému:</b> {$body}
3+
<div class="row justify-content-md-center">
4+
<div class="col"></div>
5+
<div class="col-8">
6+
7+
<div class="alert alert-danger fs-3" role="alert">Nelze zobrazit požadovanou stránku!</div>
8+
9+
<div class="alert alert-danger">Selhala kontrola CSRF tokenu.</div>
10+
<br><br>
11+
12+
<br>
13+
Vraťte se na předchozí <a href="javascript:history.back(1)">stránku</a>.
14+
<br><br>
15+
16+
<b>Zpráva od systému:</b> {$body}
17+
18+
</div>
19+
<div class="col"></div>
20+
</div>
1321

1422
{include file="base-end.tpl"}
Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,24 @@
11

22
{include file="base.tpl"}
33

4-
<p><H3>Nelze zobrazit požadovanou stránku !</H3></p>
5-
6-
<b>Pro otevřetí této stránky nemáte dostatečné oprávnění (level).</b>
7-
<br><br>
8-
9-
<br>
10-
Vraťte se na předchozí <a href="javascript:history.back(1)">stránku</a>.
11-
<br><br>
12-
13-
<b>Zpráva od systému:</b> {$body}
4+
<div class="row justify-content-md-center">
5+
<div class="col"></div>
6+
<div class="col-8">
7+
8+
<div class="alert alert-danger fs-3" role="alert">Nelze zobrazit požadovanou stránku!</div>
9+
10+
<div class="alert alert-danger">Pro otevřetí této stránky nemáte dostatečné oprávnění (level).</div>
11+
<br><br>
12+
13+
<br>
14+
Vraťte se na předchozí <a href="javascript:history.back(1)">stránku</a>.
15+
<br><br>
16+
17+
<b>Zpráva od systému:</b> {$body}
18+
19+
</div>
20+
<div class="col"></div>
21+
</div>
1422

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

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,22 @@
11
{include file="base.tpl"}
22

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

5-
<b>Selhal proces vykreslování.</b>
6-
<br><br>
7+
<div class="alert alert-danger fs-3" role="alert">Nelze zobrazit požadovanou stránku!</div>
8+
9+
<div class="alert alert-danger">Selhal proces vykreslování.</div>
10+
<br><br>
711

8-
<br>
9-
Vraťte se na předchozí <a href="javascript:history.back(1)">stránku</a>.
10-
<br><br>
12+
<br>
13+
Vraťte se na předchozí <a href="javascript:history.back(1)">stránku</a>.
14+
<br><br>
15+
16+
<b>Zpráva od systému:</b> {$body}
1117

12-
<b>Zpráva od systému:</b> {$body}
18+
</div>
19+
<div class="col"></div>
20+
</div>
1321

1422
{include file="base-end.tpl"}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<div style="padding-left: 5px;" >
2+
3+
<form method="POST" >
4+
{$csrf_html}
5+
6+
<div style="width: 30%; float: left; font-weight: bold;" >Manuální přidání akce pro restart: </div>
7+
8+
<div style="float: left; padding-left: 20px;" >
9+
10+
<select size="1" name="single_action" >
11+
<option value="0" class="select-nevybrano" >Nevybráno</option>
12+
{foreach $items_list_select as $v}
13+
<option value="{$v.id}" >{$v.name}</option>
14+
{/foreach}
15+
</select>
16+
17+
</div>
18+
19+
<div style="float: left; padding-left: 30px;" >
20+
<input type="hidden" value="true" name="akce" >
21+
<input type="submit" value="OK" name="odeslat" >
22+
</div>
23+
</form>
24+
<div style="clear: both; padding-bottom: 10px;" ></div>
25+
26+
</div>

adminator3/templates/work/work.tpl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

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

5+
{include file="work/work-add-item.tpl"}
6+
57
{if $p_bs_alerts|default:'0' }
68
<div style="padding-top: 5px">
79
{include file="partials/bootstrap-alert-with-columns-array.tpl"}

adminator3/tests/adminator/Work/WorkTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public function testTaskEnqueue()
4848

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

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

5353
$this->assertTrue($task);
5454
}

0 commit comments

Comments
 (0)