monitolite/app/Http/Controllers/ApiController.php
2021-12-21 19:44:56 +01:00

113 lines
2.5 KiB
PHP

<?php
namespace App\Http\Controllers;
use Exception;
use App\Models\Task;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class ApiController extends Controller
{
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
//
}
public function getTasks() {
$tasks = [];
$query = Task
::leftJoin('groups', 'groups.id', 'tasks.group_id')
->leftJoinSub(
DB::table('task_history')
->select('id', DB::raw('MAX(created_at) as created_at'), 'output', 'status', 'task_id')
->groupBy('id')
, 'task_history', function($join) {
$join
->on('task_history.task_id', '=', 'tasks.id')
;
})
->select(
'tasks.id', 'tasks.host', 'tasks.status', 'tasks.type', 'tasks.params', 'tasks.frequency', 'tasks.created_at', 'tasks.executed_at', 'tasks.active', 'tasks.group_id',
'task_history.output',
'groups.name as group_name')
->get()
;
foreach ($query as $t) {
if (is_null($t->group_id)) {
$group_id = $t->id;
$group_name = 'ungrouped';
}
else {
$group_id = $t->group_id;
$group_name = $t->group_name;
}
if (empty($tasks[$group_id])) {
$tasks[$group_id] = [
'id' => $group_id,
'name' => $group_name,
'tasks' => null
];
}
$tasks[$group_id]['tasks'][$t->id] = $t;
}
return response()->json($tasks);
}
public function getTaskDetails($id) {
$task = Task
::leftJoin('groups', 'groups.id', 'tasks.group_id')
->leftJoinSub(
DB::table('task_history')
->select('id', DB::raw('MAX(created_at) as created_at'), 'output', 'status', 'task_id')
->groupBy('id')
, 'task_history', function($join) {
$join
->on('task_history.task_id', '=', 'tasks.id')
;
})
->select(
'tasks.id', 'tasks.host', 'tasks.status', 'tasks.type', 'tasks.params', 'tasks.frequency', 'tasks.created_at', 'tasks.executed_at', 'tasks.active', 'tasks.group_id',
'task_history.output',
'groups.name as group_name')
->findOrFail($id)
;
if (! is_null($task)) {
return response()->json($task);
}
}
public function toggleTaskStatus(Request $request, $id) {
$active = $request->input('active', null);
if (is_null($active)) {
throw new ApiException('Invalid parameters');
}
$active = intval($active);
$task = Task::findOrFail($id);
$task->active = $active;
if ($task->save()) {
return $this->getTaskDetails($id);
}
else {
throw new ApiException('Cannot disable this task');
}
}
}
class ApiException extends Exception {}