7 Commits
1.4 ... 1.9.1

Author SHA1 Message Date
162688ceb4 fix file download 2026-01-07 12:33:08 +01:00
95be4fc5a9 fix file download 2026-01-07 12:25:18 +01:00
dec195e619 export custom metrics 2025-12-17 11:17:46 +01:00
31dd5ec559 php 8.4 support 2025-12-16 16:39:07 +01:00
264e0b72ba add link action 2025-10-01 10:46:20 +02:00
48c509d1c9 fix middleware 2025-07-04 13:13:05 +02:00
b69480ccb3 add iframe action 2025-07-02 18:07:13 +02:00
7 changed files with 124 additions and 38 deletions

View File

@@ -2,15 +2,17 @@
namespace Bluesquare\Pilot\Entity; namespace Bluesquare\Pilot\Entity;
use Illuminate\Support\Str;
abstract class Action extends Entity abstract class Action extends Entity
{ {
public function action( public function action(
$type = 'info', string $type = 'info',
$title = null, ?string $title = null,
$message = null, ?string $message = null,
$button = null, ?string $button = null,
$url = null, ?string $url = null,
$files = [], array $files = [],
) { ) {
return [ return [
'json' => [ 'json' => [
@@ -21,16 +23,69 @@ abstract class Action extends Entity
} }
public function file( public function file(
$contents, string $path,
$name = '', string $name = '',
$type = '' string $type = '',
bool $deleteAfterDownload = false,
) { ) {
return [ return [
'file' => compact('contents', 'name', 'type'), 'file' => compact('path', 'name', 'type', 'deleteAfterDownload'),
]; ];
} }
public function error($message) public function iframe(string $url, int $expires = 240)
{
$key = 'pilot_action_' . Str::random(10);
$token = Str::random(40);
cache()->add($key, $token, now()->addMinutes($expires));
$url = $url . (str_contains($url, '?') ? '&' : '?') . "pilot_token=$key|$token";
return [
'json' => [
'type' => 'iframe',
'url' => $url,
],
];
}
public function link(string $url, int $expires = 5)
{
$key = 'pilot_action_' . Str::random(10);
$token = Str::random(40);
cache()->add($key, $token, now()->addMinutes($expires));
$url = $url . (str_contains($url, '?') ? '&' : '?') . "pilot_token=$key|$token";
return [
'json' => [
'type' => 'link',
'url' => $url,
],
];
}
public function exportMetrics(
?string $entry = null,
?array $entries = null,
?string $filter = null,
?array $metrics = null
)
{
return [
'json' => [
'type' => 'export-metrics',
'entry' => $entry,
'entries' => $entries,
'filter' => $filter,
'metrics' => $metrics,
],
];
}
public function error(string $message)
{ {
return [ return [
'json' => [ 'json' => [

View File

@@ -6,7 +6,7 @@ abstract class Entity
{ {
protected $slug = null; protected $slug = null;
public function __construct($slug = null) public function __construct(?string $slug = null)
{ {
if (! is_null($slug)) { if (! is_null($slug)) {
$this->slug = $slug; $this->slug = $slug;

View File

@@ -62,12 +62,12 @@ abstract class Metric extends Widget
]; ];
} }
public function filter($label, $value, callable $callback) public function filter(string $label, $value, callable $callback)
{ {
return ['label' => $label, 'value' => $value, 'callback' => $callback]; return ['label' => $label, 'value' => $value, 'callback' => $callback];
} }
public function filters($filters) public function filters(array $filters)
{ {
return $this->resolveFilter($filters); return $this->resolveFilter($filters);
} }
@@ -81,7 +81,7 @@ abstract class Metric extends Widget
]; ];
} }
public function trend($values) public function trend(array $values)
{ {
return [ return [
'type' => 'trend', 'type' => 'trend',
@@ -89,7 +89,7 @@ abstract class Metric extends Widget
]; ];
} }
public function partition($values) public function partition(array $values)
{ {
return [ return [
'type' => 'partition', 'type' => 'partition',
@@ -106,7 +106,7 @@ abstract class Metric extends Widget
]; ];
} }
public function monitor($available) public function monitor(bool $available)
{ {
return [ return [
'type' => 'monitor', 'type' => 'monitor',

View File

@@ -0,0 +1,28 @@
<?php
namespace Bluesquare\Pilot\Laravel\Middlewares;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Log;
class CheckPilotToken
{
public function handle(Request $request, Closure $next)
{
if (request('pilot_token')) {
list($key, $token) = explode('|', request('pilot_token'));
if (cache()->get($key) == $token) {
cache()->set($key, $token, now()->addHour());
session()->put('pilot_token', true);
}
}
if (! session('pilot_token') && ! app()->environment('local')) {
abort(403, "Pilot session expired.");
}
return $next($request);
}
}

View File

@@ -2,6 +2,7 @@
namespace Bluesquare\Pilot\Laravel; namespace Bluesquare\Pilot\Laravel;
use Bluesquare\Pilot\Laravel\Middlewares\CheckPilotToken;
use Bluesquare\Pilot\Pilot; use Bluesquare\Pilot\Pilot;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Route;
@@ -36,6 +37,8 @@ class PilotServiceProvider extends ServiceProvider
return $this->handleRequest($request); return $this->handleRequest($request);
}); });
Route::aliasMiddleware('pilot', CheckPilotToken::class);
$this->commands([ $this->commands([
\Bluesquare\Pilot\Laravel\Commands\MakeAction::class, \Bluesquare\Pilot\Laravel\Commands\MakeAction::class,
\Bluesquare\Pilot\Laravel\Commands\MakeMetric::class, \Bluesquare\Pilot\Laravel\Commands\MakeMetric::class,
@@ -93,12 +96,12 @@ class PilotServiceProvider extends ServiceProvider
if (isset($output['file'])) { if (isset($output['file'])) {
return response()->download( return response()->download(
$output['file']['content'], $output['file']['path'],
$output['file']['name'], $output['file']['name'] ?? null,
[ ! empty($output['file']['type']) ? [
'Content-Type' => $output['file']['type'], 'Content-Type' => $output['file']['type'],
] ] : []
); )->deleteFileAfterSend(isset($output['file']['deleteAfterDownload']) ? $output['file']['deleteAfterDownload'] : false);
} }
return response(); return response();

View File

@@ -18,14 +18,14 @@ class Pilot
} }
public function authorize($token, $user_token) public function authorize(string $token, string $user_token)
{ {
if ($token !== $user_token) { if ($token !== $user_token) {
throw new \Exception('Unauthorized Pilot request'); throw new \Exception('Unauthorized Pilot request');
} }
} }
public function form($slug, callable $function) public function form(string $slug, callable $function)
{ {
$this->register('form', $slug, function () use ($function) { $this->register('form', $slug, function () use ($function) {
return [ return [
@@ -36,17 +36,17 @@ class Pilot
}); });
} }
public function action($slug, callable $function) public function action(string $slug, callable $function)
{ {
$this->register('action', $slug, $function); $this->register('action', $slug, $function);
} }
public function metric($slug, callable $function) public function metric(string $slug, callable $function)
{ {
$this->register('metric', $slug, $function); $this->register('metric', $slug, $function);
} }
protected function register($type, $slug, callable $function) protected function register(string $type, string $slug, callable $function)
{ {
$this->registry[$type][$slug] = $function; $this->registry[$type][$slug] = $function;
} }
@@ -65,7 +65,7 @@ class Pilot
return Response::error("Unknown {$type} {$slug}"); return Response::error("Unknown {$type} {$slug}");
} }
public function resolveDependencies($slug, $function, $data, $files) public function resolveDependencies(string $slug, $function, $data, $files)
{ {
$entries = isset($data['entries']) && is_array($data['entries']) ? $data['entries'] : []; $entries = isset($data['entries']) && is_array($data['entries']) ? $data['entries'] : [];

View File

@@ -5,12 +5,12 @@ namespace Bluesquare\Pilot;
class Response class Response
{ {
public static function action( public static function action(
$type = 'info', string $type = 'info',
$title = null, ?string $title = null,
$message = null, ?string $message = null,
$button = null, ?string $button = null,
$url = null, ?string $url = null,
$files = [], array $files = [],
) { ) {
return [ return [
'json' => [ 'json' => [
@@ -20,7 +20,7 @@ class Response
]; ];
} }
public static function error($message) public static function error(string $message)
{ {
return [ return [
'json' => [ 'json' => [
@@ -31,9 +31,9 @@ class Response
} }
public static function file( public static function file(
$contents, string $contents,
$name = '', string $name = '',
$type = '' string $type = ''
) { ) {
return [ return [
'file' => compact('contents', 'name', 'type'), 'file' => compact('contents', 'name', 'type'),