Skip to content

Commit 4f7e55b

Browse files
authored
Merge pull request #2 from justbetter/feature/activity-logging
Improve error logging
2 parents 0bba4ef + 98712cb commit 4f7e55b

File tree

6 files changed

+203
-1
lines changed

6 files changed

+203
-1
lines changed

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
],
1919
"require": {
2020
"php": "^8.1",
21-
"justbetter/laravel-akeneo-products": "^2.0",
21+
"justbetter/laravel-akeneo-products": "^2.2",
2222
"laravel/nova": "^4.0"
2323
},
2424
"require-dev": {

src/Nova/Actions/Product/RetrieveAction.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ public function handle(ActionFields $fields, Collection $models): ActionResponse
2727
{
2828
$models->each(function (Product $product): void {
2929
$product->retrieve = true;
30+
$product->update = false;
3031
$product->save();
3132
});
3233

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
<?php
2+
3+
namespace JustBetter\AkeneoProductsNova\Nova\Lenses;
4+
5+
use Illuminate\Database\Eloquent\Builder as EloquentBuilder;
6+
use Illuminate\Database\Eloquent\Model;
7+
use Illuminate\Database\Query\Builder;
8+
use Illuminate\Database\Query\JoinClause;
9+
use Illuminate\Support\Facades\DB;
10+
use JustBetter\AkeneoProducts\Models\Product;
11+
use JustBetter\AkeneoProductsNova\Nova\Filters\RetrieveFilter;
12+
use JustBetter\AkeneoProductsNova\Nova\Filters\SynchronizeFilter;
13+
use JustBetter\AkeneoProductsNova\Nova\Filters\UpdateFilter;
14+
use Laravel\Nova\Fields\DateTime;
15+
use Laravel\Nova\Fields\Text;
16+
use Laravel\Nova\Http\Requests\LensRequest;
17+
use Laravel\Nova\Http\Requests\NovaRequest;
18+
use Laravel\Nova\Lenses\Lens;
19+
20+
class ProductLastErrorsLens extends Lens
21+
{
22+
public function name(): string
23+
{
24+
return __('Last Errors');
25+
}
26+
27+
public static function query(LensRequest $request, $query): EloquentBuilder
28+
{
29+
return $request->withOrdering($request->withFilters(
30+
$query->select(self::columns())
31+
->join('activity_log', function (JoinClause $join) {
32+
$join
33+
->on('activity_log.subject_id', '=', 'akeneo_products.id')
34+
->where('log_name', '=', 'error')
35+
->where('subject_type', '=', Product::class)
36+
->where('activity_log.id', '=', function (Builder $builder) {
37+
$builder
38+
->selectRaw('MAX(id)')
39+
->from('activity_log')
40+
->where('subject_type', '=', Product::class)
41+
->where('subject_id', '=', DB::raw('akeneo_products.id'))
42+
->groupBy('subject_id');
43+
});
44+
})
45+
->orderByDesc('activity_log.created_at')
46+
));
47+
}
48+
49+
protected static function columns(): array
50+
{
51+
return [
52+
'akeneo_products.*',
53+
'activity_log.description',
54+
'activity_log.created_at',
55+
];
56+
}
57+
58+
public function fields(NovaRequest $request): array
59+
{
60+
return [
61+
Text::make(__('Identifier'), 'identifier'),
62+
63+
Text::make(
64+
__('Last Activity'),
65+
fn (Model $resource) => $resource->description ?? ''
66+
),
67+
68+
DateTime::make(
69+
__('Last Activity Date'),
70+
fn (Model $resource) => $resource->created_at
71+
),
72+
];
73+
}
74+
75+
public function filters(NovaRequest $request): array
76+
{
77+
return [
78+
RetrieveFilter::make(),
79+
UpdateFilter::make(),
80+
SynchronizeFilter::make(),
81+
];
82+
}
83+
84+
public function uriKey(): string
85+
{
86+
return 'akeneo-products-last-errors';
87+
}
88+
}
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
<?php
2+
3+
namespace JustBetter\AkeneoProductsNova\Nova\Lenses;
4+
5+
use Illuminate\Database\Eloquent\Builder as EloquentBuilder;
6+
use Illuminate\Database\Eloquent\Model;
7+
use Illuminate\Database\Query\Builder;
8+
use Illuminate\Database\Query\JoinClause;
9+
use Illuminate\Support\Facades\DB;
10+
use JustBetter\AkeneoProducts\Models\ProductModel;
11+
use JustBetter\AkeneoProductsNova\Nova\Filters\RetrieveFilter;
12+
use JustBetter\AkeneoProductsNova\Nova\Filters\SynchronizeFilter;
13+
use JustBetter\AkeneoProductsNova\Nova\Filters\UpdateFilter;
14+
use Laravel\Nova\Fields\DateTime;
15+
use Laravel\Nova\Fields\Text;
16+
use Laravel\Nova\Http\Requests\LensRequest;
17+
use Laravel\Nova\Http\Requests\NovaRequest;
18+
use Laravel\Nova\Lenses\Lens;
19+
20+
class ProductModelLastErrorsLens extends Lens
21+
{
22+
public function name(): string
23+
{
24+
return __('Last Errors');
25+
}
26+
27+
public static function query(LensRequest $request, $query): EloquentBuilder
28+
{
29+
return $request->withOrdering($request->withFilters(
30+
$query->select(self::columns())
31+
->join('activity_log', function (JoinClause $join) {
32+
$join
33+
->on('activity_log.subject_id', '=', 'akeneo_product_models.id')
34+
->where('log_name', '=', 'error')
35+
->where('subject_type', '=', ProductModel::class)
36+
->where('activity_log.id', '=', function (Builder $builder) {
37+
$builder
38+
->selectRaw('MAX(id)')
39+
->from('activity_log')
40+
->where('subject_type', '=', ProductModel::class)
41+
->where('subject_id', '=', DB::raw('akeneo_product_models.id'))
42+
->groupBy('subject_id');
43+
});
44+
})
45+
->orderByDesc('activity_log.created_at')
46+
));
47+
}
48+
49+
protected static function columns(): array
50+
{
51+
return [
52+
'akeneo_product_models.*',
53+
'activity_log.description',
54+
'activity_log.created_at',
55+
];
56+
}
57+
58+
public function fields(NovaRequest $request): array
59+
{
60+
return [
61+
Text::make(__('Code'), 'code'),
62+
63+
Text::make(
64+
__('Last Activity'),
65+
fn (Model $resource) => $resource->description ?? ''
66+
),
67+
DateTime::make(
68+
__('Last Activity Date'),
69+
fn (Model $resource) => $resource->created_at
70+
),
71+
];
72+
}
73+
74+
public function filters(NovaRequest $request): array
75+
{
76+
return [
77+
RetrieveFilter::make(),
78+
UpdateFilter::make(),
79+
SynchronizeFilter::make(),
80+
];
81+
}
82+
83+
public function uriKey(): string
84+
{
85+
return 'akeneo-product-models-last-errors';
86+
}
87+
}

src/Nova/ProductModelResource.php

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

33
namespace JustBetter\AkeneoProductsNova\Nova;
44

5+
use Bolechen\NovaActivitylog\Resources\Activitylog;
56
use Illuminate\Http\Request;
67
use JustBetter\AkeneoProducts\Models\ProductModel;
78
use Laravel\Nova\Fields\Boolean;
89
use Laravel\Nova\Fields\Code;
910
use Laravel\Nova\Fields\DateTime;
11+
use Laravel\Nova\Fields\MorphMany;
1012
use Laravel\Nova\Fields\Text;
1113
use Laravel\Nova\Http\Requests\NovaRequest;
1214
use Laravel\Nova\Resource;
@@ -61,6 +63,8 @@ public function fields(NovaRequest $request): array
6163
DateTime::make(__('Updated At'), 'modified_at')
6264
->help(__('Last date the product model has been updated.'))
6365
->sortable(),
66+
67+
MorphMany::make(__('Activity'), 'activities', Activitylog::class),
6468
];
6569
}
6670

@@ -82,6 +86,13 @@ public function actions(NovaRequest $request): array
8286
];
8387
}
8488

89+
public function lenses(NovaRequest $request): array
90+
{
91+
return [
92+
Lenses\ProductModelLastErrorsLens::make(),
93+
];
94+
}
95+
8596
public static function authorizedToCreate(Request $request): bool
8697
{
8798
return false;

src/Nova/ProductResource.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,14 @@
22

33
namespace JustBetter\AkeneoProductsNova\Nova;
44

5+
use Bolechen\NovaActivitylog\Resources\Activitylog;
56
use Illuminate\Http\Request;
67
use JustBetter\AkeneoProducts\Models\Product;
78
use Laravel\Nova\Fields\Boolean;
89
use Laravel\Nova\Fields\Code;
910
use Laravel\Nova\Fields\DateTime;
11+
use Laravel\Nova\Fields\MorphMany;
12+
use Laravel\Nova\Fields\Number;
1013
use Laravel\Nova\Fields\Text;
1114
use Laravel\Nova\Http\Requests\NovaRequest;
1215
use Laravel\Nova\Resource;
@@ -54,13 +57,18 @@ public function fields(NovaRequest $request): array
5457
Code::make(__('Data'), 'data')
5558
->json(),
5659

60+
Number::make(__('Fail Count'), 'fail_count')
61+
->hideFromIndex(),
62+
5763
DateTime::make(__('Retrieved At'), 'retrieved_at')
5864
->help(__('Last date the product has been retrieved.'))
5965
->sortable(),
6066

6167
DateTime::make(__('Updated At'), 'modified_at')
6268
->help(__('Last date the product has been updated.'))
6369
->sortable(),
70+
71+
MorphMany::make(__('Activity'), 'activities', Activitylog::class),
6472
];
6573
}
6674

@@ -82,6 +90,13 @@ public function actions(NovaRequest $request): array
8290
];
8391
}
8492

93+
public function lenses(NovaRequest $request): array
94+
{
95+
return [
96+
Lenses\ProductLastErrorsLens::make(),
97+
];
98+
}
99+
85100
public static function authorizedToCreate(Request $request): bool
86101
{
87102
return false;

0 commit comments

Comments
 (0)