Skip to content

Commit

Permalink
Add Database Query to Request (#18)
Browse files Browse the repository at this point in the history
Add Database Query to Request
  • Loading branch information
antonkomarev committed Oct 7, 2018
1 parent 1fb91ca commit 78f962d
Show file tree
Hide file tree
Showing 13 changed files with 338 additions and 4 deletions.
11 changes: 11 additions & 0 deletions CHANGELOG.md
Expand Up @@ -2,6 +2,16 @@

All notable changes to `laravel-sense` will be documented in this file.

## [0.4.0] - 2018-10-07

### Added

- `Query` model added to `Request` ([#18](https://github.com/cybercog/laravel-sense/pull/18))

### Changed

- Renamed Request `uuid` to `correlation_id` ([#17](https://github.com/cybercog/laravel-sense/pull/17))

## [0.3.0] - 2018-10-07

### Added
Expand All @@ -28,6 +38,7 @@ All notable changes to `laravel-sense` will be documented in this file.

- Initial release

[0.4.0]: https://github.com/cybercog/laravel-sense/compare/0.3.0...0.4.0
[0.3.0]: https://github.com/cybercog/laravel-sense/compare/0.2.1...0.3.0
[0.2.1]: https://github.com/cybercog/laravel-sense/compare/0.2.0...0.2.1
[0.2.0]: https://github.com/cybercog/laravel-sense/compare/0.1.0...0.2.0
@@ -0,0 +1,51 @@
<?php

/*
* This file is part of Laravel Sense.
*
* (c) Anton Komarev <a.komarev@cybercog.su>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

declare(strict_types=1);

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateSenseRequestDbQueriesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up(): void
{
Schema::create('sense_request_db_queries', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedBigInteger('request_id');
$table->unsignedBigInteger('statement_id');
$table->string('connection');
$table->mediumText('sql');
$table->json('bindings');
$table->double('time', 6, 2);
$table->timestamps();

$table->index('request_id');
$table->index('statement_id');
});
}

/**
* Reverse the migrations.
*
* @return void
*/
public function down(): void
{
Schema::dropIfExists('sense_request_db_queries');
}
}
57 changes: 57 additions & 0 deletions resources/views/queries/index.blade.php
@@ -0,0 +1,57 @@
@extends('sense::app')

@section('content')
<h2 class="mt-4 mb-4">Queries</h2>
<table class="table">
<tr>
<th>
#
</th>
<th class="uuid">
Correlation ID
</th>
<th>
Connection
</th>
<th>
SQL
</th>
<th>
Time
</th>
<th>
Created at
</th>
<th>
Updated at
</th>
</tr>
@foreach($queries as $query)
<tr>
<td class="text-center">
{{ $query->id }}
</td>
<td class="uuid">
<a href="/sense/requests/{{ $query->request->correlation_id }}">
{{ $query->request->correlation_id }}
</a>
</td>
<td class="text-center">
{{ $query->connection }}
</td>
<td>
{{ $query->sql }}
</td>
<td class="text-center">
{{ $query->time }}
</td>
<td class="text-center">
{{ $query->created_at }}
</td>
<td class="text-center">
{{ $query->updated_at }}
</td>
</tr>
@endforeach
</table>
@endsection
4 changes: 3 additions & 1 deletion resources/views/requests/index.blade.php
Expand Up @@ -48,7 +48,9 @@
</a>
</td>
<td class="text-center">
{{ $request->summary->queries_count }}
<a href="/sense/queries?filter[request][id]={{ $request->id }}">
{{ $request->summary->queries_count }}
</a>
</td>
<td class="text-center">
{{ $request->summary->time_total }}
Expand Down
8 changes: 6 additions & 2 deletions resources/views/requests/view.blade.php
Expand Up @@ -45,7 +45,9 @@
</a>
</td>
<td class="text-center">
{{ $request->summary->queries_count }}
<a href="/sense/queries?filter[request][id]={{ $request->id }}">
{{ $request->summary->queries_count }}
</a>
</td>
<td class="text-center">
{{ $request->summary->time_total }}
Expand Down Expand Up @@ -96,7 +98,9 @@
{{ $summary->statement->value }}
</td>
<td class="text-center">
{{ $summary->queries_count }}
<a href="/sense/queries?filter[request][id]={{ $request->id }}&filter[statement][id]={{ $summary->statement->id }}">
{{ $summary->queries_count }}
</a>
</td>
<td class="text-center">
{{ $summary->time_total }}
Expand Down
4 changes: 3 additions & 1 deletion resources/views/urls/view.blade.php
Expand Up @@ -73,7 +73,9 @@
<kbd>{{ $request->method }}</kbd>
</td>
<td class="text-center">
{{ $request->summary->queries_count }}
<a href="/sense/queries?filter[request][id]={{ $request->id }}">
{{ $request->summary->queries_count }}
</a>
</td>
<td class="text-center">
{{ $request->summary->time_total }}
Expand Down
2 changes: 2 additions & 0 deletions routes/web.php
Expand Up @@ -24,4 +24,6 @@

Route::get('/urls/{url}')->uses('Urls\Get\Action');

Route::get('/queries')->uses('Queries\Collect\Action');

Route::get('/{view?}', 'AppController')->where('view', '(.*)')->name('sense.index');
48 changes: 48 additions & 0 deletions src/Db/Query/Models/Query.php
@@ -0,0 +1,48 @@
<?php

/*
* This file is part of Laravel Sense.
*
* (c) Anton Komarev <a.komarev@cybercog.su>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

declare(strict_types=1);

namespace Cog\Laravel\Sense\Db\Query\Models;

use Cog\Laravel\Sense\Request\Models\Request;
use Cog\Laravel\Sense\Statement\Models\Statement;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

class Query extends Model
{
protected $connection = 'sense';

protected $table = 'sense_request_db_queries';

protected $fillable = [
'statement_id',
'connection',
'sql',
'bindings',
'time',
];

protected $casts = [
'bindings' => 'json',
];

public function request(): BelongsTo
{
return $this->belongsTo(Request::class, 'request_id');
}

public function statement(): BelongsTo
{
return $this->belongsTo(Statement::class, 'statement_id');
}
}
39 changes: 39 additions & 0 deletions src/Http/Controllers/Queries/Collect/Action.php
@@ -0,0 +1,39 @@
<?php

/*
* This file is part of Laravel Sense.
*
* (c) Anton Komarev <a.komarev@cybercog.su>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

declare(strict_types=1);

namespace Cog\Laravel\Sense\Http\Controllers\Queries\Collect;

use Cog\Laravel\Sense\Db\Query\Models\Query;
use Cog\Laravel\Sense\Http\Controllers\Controller;

class Action extends Controller
{
public function __invoke(Request $request)
{
$query = Query::query();

if ($requestId = $request->input('filter.request.id')) {
$query->where('request_id', $requestId);
}
if ($statementId = $request->input('filter.statement.id')) {
$query->where('statement_id', $statementId);
}

$query->with([
]);

$queries = $query->latest('id')->get();

return new Response($queries);
}
}
40 changes: 40 additions & 0 deletions src/Http/Controllers/Queries/Collect/Request.php
@@ -0,0 +1,40 @@
<?php

/*
* This file is part of Laravel Sense.
*
* (c) Anton Komarev <a.komarev@cybercog.su>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

declare(strict_types=1);

namespace Cog\Laravel\Sense\Http\Controllers\Queries\Collect;

use Illuminate\Foundation\Http\FormRequest;

class Request extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize(): bool
{
return true;
}

/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules(): array
{
return [
];
}
}
46 changes: 46 additions & 0 deletions src/Http/Controllers/Queries/Collect/Response.php
@@ -0,0 +1,46 @@
<?php

/*
* This file is part of Laravel Sense.
*
* (c) Anton Komarev <a.komarev@cybercog.su>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

declare(strict_types=1);

namespace Cog\Laravel\Sense\Http\Controllers\Queries\Collect;

use Illuminate\Contracts\Support\Responsable;

class Response implements Responsable
{
/**
* @var \Cog\Laravel\Sense\Db\Query\Models\Query[]
*/
private $queries;

public function __construct($queries)
{
$this->queries = $queries;
}

public function toResponse($request)
{
return $request->wantsJson() ? $this->toJson() : $this->toHtml();
}

private function toHtml()
{
return view('sense::queries.index', [
'queries' => $this->queries,
]);
}

private function toJson()
{
return [];
}
}

0 comments on commit 78f962d

Please sign in to comment.