*/ public static function within(int $days): Collection { $until = now()->addDays($days)->endOfDay(); $items = collect(); Call::query() ->where('status', CallStatus::Open) ->whereNotNull('closes_at') ->whereBetween('closes_at', [now()->startOfDay(), $until]) ->get() ->each(fn (Call $call) => $items->push(self::item('calls', $call, 'closes', $call->closes_at))); foreach (['pages' => Page::class, 'projects' => Project::class, 'services' => Service::class] as $type => $model) { $model::query() ->published() ->whereNotNull('unpublish_at') ->whereBetween('unpublish_at', [now(), $until]) ->get() ->each(fn (Model $record) => $items->push(self::item($type, $record, 'unpublishes', $record->unpublish_at))); } return $items->sortBy(fn (array $item) => $item['at']->getTimestamp())->values(); } /** * Only those this person may do something about. * * @param Collection> $items * @return Collection> */ public static function for(Collection $items, User $user): Collection { return $items->filter(fn (array $item) => $user->can('update', $item['record']))->values(); } /** * @return array{type: string, record: Model, title: string, event: string, at: CarbonInterface, url: string} */ protected static function item(string $type, Model $record, string $event, CarbonInterface $at): array { return [ 'type' => $type, 'record' => $record, 'title' => ContentTypes::title($record), 'event' => $event, 'at' => $at, 'url' => $record instanceof Call ? CallResource::getUrl('edit', ['record' => $record]) : ReviewTarget::url($record), ]; } }