optimizations
This commit is contained in:
99
app/Services/CollectionLifecycleService.php
Normal file
99
app/Services/CollectionLifecycleService.php
Normal file
@@ -0,0 +1,99 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Services;
|
||||
|
||||
use App\Models\Collection;
|
||||
use Illuminate\Support\Arr;
|
||||
|
||||
class CollectionLifecycleService
|
||||
{
|
||||
public function resolveState(Collection $collection): string
|
||||
{
|
||||
if ($collection->moderation_status === Collection::MODERATION_HIDDEN) {
|
||||
return Collection::LIFECYCLE_HIDDEN;
|
||||
}
|
||||
|
||||
if ($collection->moderation_status === Collection::MODERATION_RESTRICTED) {
|
||||
return Collection::LIFECYCLE_RESTRICTED;
|
||||
}
|
||||
|
||||
if ($collection->moderation_status === Collection::MODERATION_UNDER_REVIEW) {
|
||||
return Collection::LIFECYCLE_UNDER_REVIEW;
|
||||
}
|
||||
|
||||
if ($collection->expired_at && $collection->expired_at->lte(now())) {
|
||||
return Collection::LIFECYCLE_EXPIRED;
|
||||
}
|
||||
|
||||
if ($collection->archived_at !== null) {
|
||||
return Collection::LIFECYCLE_ARCHIVED;
|
||||
}
|
||||
|
||||
if ($collection->published_at && $collection->published_at->isFuture()) {
|
||||
return Collection::LIFECYCLE_SCHEDULED;
|
||||
}
|
||||
|
||||
if ($collection->visibility === Collection::VISIBILITY_PRIVATE) {
|
||||
return Collection::LIFECYCLE_DRAFT;
|
||||
}
|
||||
|
||||
if ($collection->is_featured) {
|
||||
return Collection::LIFECYCLE_FEATURED;
|
||||
}
|
||||
|
||||
return Collection::LIFECYCLE_PUBLISHED;
|
||||
}
|
||||
|
||||
public function syncState(Collection $collection): Collection
|
||||
{
|
||||
$nextState = $this->resolveState($collection->fresh());
|
||||
$collection->forceFill(['lifecycle_state' => $nextState])->save();
|
||||
|
||||
return $collection->fresh();
|
||||
}
|
||||
|
||||
public function applyAttributes(Collection $collection, array $attributes): Collection
|
||||
{
|
||||
$collection->forceFill(Arr::only($attributes, [
|
||||
'lifecycle_state',
|
||||
'archived_at',
|
||||
'expired_at',
|
||||
'published_at',
|
||||
'unpublished_at',
|
||||
]))->save();
|
||||
|
||||
return $this->syncState($collection);
|
||||
}
|
||||
|
||||
public function syncScheduledCollections(): array
|
||||
{
|
||||
$expired = Collection::query()
|
||||
->whereNotNull('expired_at')
|
||||
->where('expired_at', '<=', now())
|
||||
->where('lifecycle_state', '!=', Collection::LIFECYCLE_EXPIRED)
|
||||
->update([
|
||||
'lifecycle_state' => Collection::LIFECYCLE_EXPIRED,
|
||||
'is_featured' => false,
|
||||
'featured_at' => null,
|
||||
'updated_at' => now(),
|
||||
]);
|
||||
|
||||
$scheduled = Collection::query()
|
||||
->whereNotNull('published_at')
|
||||
->where('published_at', '<=', now())
|
||||
->whereIn('lifecycle_state', [Collection::LIFECYCLE_DRAFT, Collection::LIFECYCLE_SCHEDULED])
|
||||
->where('moderation_status', Collection::MODERATION_ACTIVE)
|
||||
->where('visibility', '!=', Collection::VISIBILITY_PRIVATE)
|
||||
->update([
|
||||
'lifecycle_state' => Collection::LIFECYCLE_PUBLISHED,
|
||||
'updated_at' => now(),
|
||||
]);
|
||||
|
||||
return [
|
||||
'expired' => $expired,
|
||||
'scheduled' => $scheduled,
|
||||
];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user