215
common/Channels/ChannelController.php
Executable file
215
common/Channels/ChannelController.php
Executable file
@@ -0,0 +1,215 @@
|
||||
<?php
|
||||
|
||||
namespace Common\Channels;
|
||||
|
||||
use App\Http\Resources\ChannelResource;
|
||||
use App\Models\Channel;
|
||||
use App\Services\ChannelPresets;
|
||||
use Common\Core\BaseController;
|
||||
use Common\Core\Prerender\Actions\ReplacePlaceholders;
|
||||
use Illuminate\Support\Arr;
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
|
||||
class ChannelController extends BaseController
|
||||
{
|
||||
public function index(): Response
|
||||
{
|
||||
$this->authorize('index', [Channel::class, 'channel']);
|
||||
|
||||
$pagination = (new PaginateChannels())->execute(request()->all());
|
||||
|
||||
return $this->success([
|
||||
'pagination' => $pagination,
|
||||
'presets' => (new ChannelPresets())->getAll(),
|
||||
]);
|
||||
}
|
||||
|
||||
public function show(Channel $channel)
|
||||
{
|
||||
$this->authorize('show', $channel);
|
||||
|
||||
$loader = request('loader', 'channelPage');
|
||||
|
||||
$params = request()->all();
|
||||
if ($loader === 'editUserListPage') {
|
||||
$params['normalizeContent'] = true;
|
||||
} elseif ($loader === 'editChannelPage') {
|
||||
$params['normalizeContent'] = true;
|
||||
$params['perPage'] = 100;
|
||||
}
|
||||
|
||||
$channel->loadContent($params);
|
||||
if (
|
||||
$loader === 'channelPage' &&
|
||||
$channel->shouldRestrictContent() &&
|
||||
!$channel->restriction
|
||||
) {
|
||||
abort(404);
|
||||
}
|
||||
|
||||
$channel =
|
||||
$loader === 'channelPage' && class_exists(ChannelResource::class)
|
||||
? new ChannelResource($channel)
|
||||
: $channel;
|
||||
|
||||
// return only content for pagination
|
||||
if (request()->get('returnContentOnly')) {
|
||||
return [
|
||||
'pagination' => $channel->toArray(request())['content'],
|
||||
];
|
||||
}
|
||||
|
||||
$data = [
|
||||
'channel' => $channel,
|
||||
'loader' => $loader,
|
||||
];
|
||||
|
||||
if ($loader === 'channelPage') {
|
||||
// used as default value during SSR in layout selector button
|
||||
$channel->config = array_merge($channel->config, [
|
||||
'selectedLayout' => Arr::get(
|
||||
$_COOKIE,
|
||||
"channel-layout-{$channel->config['contentModel']}",
|
||||
false,
|
||||
),
|
||||
'seoTitle' => isset($channel->config['seoTitle'])
|
||||
? app(ReplacePlaceholders::class)->execute(
|
||||
$channel->config['seoTitle'],
|
||||
$data,
|
||||
)
|
||||
: $channel->name,
|
||||
'seoDescription' => isset($channel->config['seoDescription'])
|
||||
? app(ReplacePlaceholders::class)->execute(
|
||||
$channel->config['seoDescription'],
|
||||
$data,
|
||||
)
|
||||
: $channel->description ?? $channel->name,
|
||||
]);
|
||||
}
|
||||
|
||||
return $this->renderClientOrApi([
|
||||
'pageName' => $loader === 'channelPage' ? 'channel-page' : null,
|
||||
'data' => [
|
||||
'channel' => $channel,
|
||||
'loader' => $loader,
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
public function store(CrupdateChannelRequest $request): Response
|
||||
{
|
||||
$this->authorize('store', [Channel::class, request('type', 'channel')]);
|
||||
|
||||
$channel = app(CrupdateChannel::class)->execute(
|
||||
$request->validationData(),
|
||||
);
|
||||
|
||||
return $this->success(['channel' => $channel]);
|
||||
}
|
||||
|
||||
public function update(
|
||||
Channel $channel,
|
||||
CrupdateChannelRequest $request,
|
||||
): Response {
|
||||
$this->authorize('update', $channel);
|
||||
|
||||
$channel = app(CrupdateChannel::class)->execute(
|
||||
$request->validationData(),
|
||||
$channel,
|
||||
);
|
||||
|
||||
return $this->success(['channel' => $channel]);
|
||||
}
|
||||
|
||||
public function destroy(string $ids): Response
|
||||
{
|
||||
$ids = explode(',', $ids);
|
||||
$channels = Channel::whereIn('id', $ids)->get();
|
||||
|
||||
$this->authorize('destroy', [Channel::class, $channels]);
|
||||
|
||||
app(DeleteChannels::class)->execute($channels);
|
||||
|
||||
return $this->success();
|
||||
}
|
||||
|
||||
public function updateContent(Channel $channel): Response
|
||||
{
|
||||
$this->authorize('update', $channel);
|
||||
|
||||
if ($newConfig = request('channelConfig')) {
|
||||
$config = $channel->config;
|
||||
foreach ($newConfig as $key => $value) {
|
||||
$config[$key] = $value;
|
||||
}
|
||||
$channel->fill(['config' => $config])->save();
|
||||
}
|
||||
|
||||
$channel->updateContentFromExternal();
|
||||
$channel->loadContent(request()->all());
|
||||
|
||||
return $this->success([
|
||||
'channel' => $channel,
|
||||
]);
|
||||
}
|
||||
|
||||
public function searchForAddableContent(): Response
|
||||
{
|
||||
$namespace = modelTypeToNamespace(request('modelType'));
|
||||
$this->authorize('index', $namespace);
|
||||
|
||||
$builder = app($namespace);
|
||||
|
||||
if (request('query')) {
|
||||
$builder = $builder->mysqlSearch(request('query'));
|
||||
}
|
||||
|
||||
$results = $builder
|
||||
->take(20)
|
||||
->get()
|
||||
->filter(function ($result) {
|
||||
if (request('modelType') === 'channel') {
|
||||
// exclude user lists
|
||||
return $result->type === 'channel';
|
||||
}
|
||||
return true;
|
||||
})
|
||||
->map(fn($result) => $result->toNormalizedArray())
|
||||
->slice(0, request('limit', 10))
|
||||
->values();
|
||||
|
||||
return $this->success(['results' => $results]);
|
||||
}
|
||||
|
||||
public function applyPreset()
|
||||
{
|
||||
$this->authorize('destroy', Channel::class);
|
||||
|
||||
$data = request()->validate([
|
||||
'preset' => 'required|string',
|
||||
]);
|
||||
|
||||
$ids = Channel::where('type', 'channel')->pluck('id');
|
||||
DB::table('channelables')
|
||||
->whereIn('channel_id', $ids)
|
||||
->delete();
|
||||
Channel::whereIn('id', $ids)->delete();
|
||||
|
||||
(new ChannelPresets())->apply($data['preset']);
|
||||
|
||||
if (settings('homepage.type') === 'channels') {
|
||||
$homepage = Channel::where('name', 'homepage')->first();
|
||||
if ($homepage) {
|
||||
settings()->save(['homepage.value' => $homepage->id]);
|
||||
} else {
|
||||
settings()->save(['homepage.value' => null]);
|
||||
}
|
||||
}
|
||||
|
||||
Cache::flush();
|
||||
|
||||
return $this->success();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user