Skip to content

Commit fdf16fa

Browse files
committed
bugfix: invalid records for page activity
1 parent 0b84659 commit fdf16fa

File tree

2 files changed

+60
-71
lines changed

2 files changed

+60
-71
lines changed

src/Filament/Widgets/PageActivity.php

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use SolutionForest\InspireCms\Helpers\FilamentResourceHelper;
1515
use SolutionForest\InspireCms\Helpers\UIHelper;
1616
use SolutionForest\InspireCms\InspireCmsConfig;
17+
use SolutionForest\InspireCms\Models\Scopes\ContentVersionDetailScope;
1718

1819
class PageActivity extends BaseWidget
1920
{
@@ -42,7 +43,14 @@ public function table(Table $table): Table
4243

4344
Tables\Columns\TextColumn::make('published_at')
4445
->label(__('inspirecms::resources/content.published_at.label'))
45-
->getStateUsing(fn ($record) => $record->getLatestPublishedContentVersion()?->pivot->published_at?->diffForHumans())
46+
->getStateUsing(function (Model $record) {
47+
48+
if ($record->hasAttribute('__latest_version_publish_dt') && $record->__latest_version_publish_dt) {
49+
return $record->__latest_version_publish_dt->diffForHumans();
50+
}
51+
52+
return $record->getLatestPublishedContentVersion()?->pivot->published_at?->diffForHumans();
53+
})
4654
->width('5%'),
4755
Tables\Columns\TextColumn::make('updated_at')
4856
->label(__('inspirecms::resources/content.updated_at.label'))
@@ -60,13 +68,15 @@ protected function getRecordUrl(Model $record): ?string
6068

6169
protected function getLatestUpdatePagesQuery(): Builder
6270
{
63-
$query = InspireCmsConfig::getContentModelClass()::with([
64-
'publishedVersions',
65-
])->withoutGlobalScopes([
66-
\SolutionForest\InspireCms\Support\Models\Scopes\NestableTreeDetailScope::class,
67-
]);
68-
69-
return $query->orderByDesc('updated_at')->take(static::$totalTakeLatest);
71+
return InspireCmsConfig::getContentModelClass()::query()
72+
->with(['publishedVersions'])
73+
->withoutGlobalScopes([
74+
\SolutionForest\InspireCms\Support\Models\Scopes\NestableTreeDetailScope::class,
75+
])
76+
->withGlobalScope(ContentVersionDetailScope::class, new ContentVersionDetailScope)
77+
->orderByDesc('__latest_version_dt')
78+
->orderByDesc('updated_at')
79+
->take(static::$totalTakeLatest);
7080
}
7181

7282
// region Table Configuration

src/Models/Scopes/ContentVersionDetailScope.php

Lines changed: 42 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -16,82 +16,61 @@ public function apply($builder, Model $model)
1616

1717
$query = $builder->getQuery();
1818

19-
$relatedFK = $model->contentVersions()->getForeignKeyName();
20-
$related = $model->contentVersions()->getRelated();
21-
$relatedPK = $related->getKeyName();
19+
$cvModel = $model->contentVersions()->getRelated();
20+
$cvFK = $model->contentVersions()->getForeignKeyName();
21+
$cvPK = $cvModel->getKeyName();
22+
$cvCreationColumn = $cvModel->getCreatedAtColumn();
2223

23-
$recordCreationColumn = $related->getCreatedAtColumn();
24+
/**
25+
* @var Model
26+
*/
27+
$cvPublishedModel = $cvModel->publishLog()->getRelated();
28+
$cvPublishedFK = $cvModel->publishLog()->getForeignKeyName();
2429

25-
$t1TableName = '_cv_t1';
26-
$t1Q = DB::table($related->getTable())
27-
->orderByDesc($recordCreationColumn) // sort by created_at desc
28-
->groupBy(
29-
$relatedFK, // group by content_id
30-
$recordCreationColumn, // include the ordered column in GROUP BY
31-
)
30+
$baseQ = DB::table($cvModel->getTable())
31+
->groupBy($cvFK)
3232
->select([
33-
DB::raw("MAX($relatedPK) AS latest_version_id"),
34-
$relatedFK,
33+
DB::raw("MAX($cvPK) AS joined_version_id"),
34+
$cvFK,
3535
]);
36+
37+
$cvAllQ = DB::table($cvModel->getTable(), '_cv_t2_all')
38+
->joinSub($baseQ, '_cv_t1_base', fn (JoinClause $join) => $join
39+
->on('_cv_t1_base.joined_version_id', '=', "_cv_t2_all.$cvPK")
40+
)
41+
->select("_cv_t2_all.*");
3642

37-
$t2_1TableName = '_cv_t2_publish';
38-
$t2_2TableName = '_cv_t2_all';
39-
$t2_1Q = DB::table($related->getTable(), $t2_1TableName)
40-
->joinSub(
41-
$t1Q,
42-
$t1TableName,
43-
fn (JoinClause $join) => $join
44-
->on("$t1TableName.latest_version_id", '=', "$t2_1TableName.$relatedPK")
43+
$cvPublishedQ = DB::table($cvModel->getTable(), '_cv_t2_p')
44+
->joinSub($baseQ, '_cv_t1_base', fn (JoinClause $join) => $join
45+
->on('_cv_t1_base.joined_version_id', '=', "_cv_t2_p.$cvPK")
4546
)
46-
->where("$t2_1TableName.publish_state", 'publish')
47-
->orderByDesc("$t2_1TableName.$recordCreationColumn")
48-
->select([
49-
"$t2_1TableName.$relatedFK",
50-
"$t2_1TableName.publish_state",
51-
"$t2_1TableName.$relatedPK",
52-
"$t2_1TableName.$recordCreationColumn",
53-
"$t2_1TableName.to_data AS data",
54-
]);
55-
$t2_2Q = DB::table($related->getTable(), $t2_2TableName)
56-
->joinSub(
57-
$t1Q,
58-
$t1TableName,
59-
fn (JoinClause $join) => $join
60-
->on("$t1TableName.latest_version_id", '=', "$t2_2TableName.$relatedPK")
47+
->whereExists(fn (\Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder $query) => $query
48+
->select(DB::raw(1))
49+
->from($cvPublishedModel->getTable(), '_cv_base_p')
50+
->where("_cv_base_p.$cvPublishedFK", '=', "_cv_t2_p.$cvPK")
6151
)
62-
->orderByDesc("$t2_2TableName.$recordCreationColumn")
63-
->select([
64-
"$t2_2TableName.$relatedFK",
65-
"$t2_2TableName.publish_state",
66-
"$t2_2TableName.$relatedPK",
67-
"$t2_2TableName.$recordCreationColumn",
68-
"$t2_2TableName.to_data AS data",
69-
]);
52+
->select("_cv_t2_p.*");
7053

54+
$cvAllTableName = '_cv_all';
55+
$cvPublishedTableName = '_cv_published';
7156
$query
72-
->leftJoinSub(
73-
$t2_1Q,
74-
$t2_1TableName,
75-
fn (JoinClause $join) => $join
76-
->on($model->getQualifiedKeyName(), '=', "{$t2_1TableName}.{$relatedFK}")
77-
)
78-
->leftJoinSub(
79-
$t2_2Q,
80-
$t2_2TableName,
81-
fn (JoinClause $join) => $join
82-
->on($model->getQualifiedKeyName(), '=', "{$t2_2TableName}.{$relatedFK}")
57+
->leftJoinSub($cvAllQ, $cvAllTableName, fn (JoinClause $join) => $join
58+
->on($model->getQualifiedKeyName(), '=', "$cvAllTableName.$cvFK")
8359
)
84-
->addSelect($model->qualifyColumn('*'))
8560
->addSelect([
86-
DB::raw("{$t2_1TableName}.{$relatedPK} AS __latest_version_publish_id"),
87-
DB::raw("{$t2_1TableName}.{$recordCreationColumn} AS __latest_version_publish_dt"),
88-
DB::raw("{$t2_1TableName}.data AS __latest_version_publish_data"),
61+
DB::raw("{$cvAllTableName}.{$cvPK} AS __latest_version_id"),
62+
DB::raw("{$cvAllTableName}.{$cvCreationColumn} AS __latest_version_dt"),
63+
DB::raw("{$cvAllTableName}.to_data AS __latest_version_data"),
8964
])
65+
->leftJoinSub($cvPublishedQ, $cvPublishedTableName, fn (JoinClause $join) => $join
66+
->on($model->getQualifiedKeyName(), '=', "$cvPublishedTableName.$cvFK")
67+
)
9068
->addSelect([
91-
DB::raw("{$t2_2TableName}.{$relatedPK} AS __latest_version_id"),
92-
DB::raw("{$t2_2TableName}.{$recordCreationColumn} AS __latest_version_dt"),
93-
DB::raw("{$t2_2TableName}.data AS __latest_version_data"),
94-
]);
69+
DB::raw("{$cvPublishedTableName}.{$cvPK} AS __latest_version_publish_id"),
70+
DB::raw("{$cvPublishedTableName}.{$cvCreationColumn} AS __latest_version_publish_dt"),
71+
DB::raw("{$cvPublishedTableName}.to_data AS __latest_version_publish_data"),
72+
])
73+
->addSelect($model->qualifyColumn('*'));
9574

9675
$model->withCasts([
9776
'__latest_version_publish_dt' => 'datetime',

0 commit comments

Comments
 (0)