File "GenerateChannelsFromConfig.php"

Full Path: /var/www/drive/foundation/src/Channels/GenerateChannelsFromConfig.php
File size: 1.8 KB
MIME-type: text/x-php
Charset: utf-8

<?php

namespace Common\Channels;

use App\Models\Channel;
use App\Models\User;
use Illuminate\Support\Arr;

class GenerateChannelsFromConfig
{
    public function execute(array $configPaths): Channel|null
    {
        $createdChannels = [];

        $configs = collect($configPaths)
            ->map(
                fn($configPath) => json_decode(
                    file_get_contents($configPath),
                    true,
                ),
            )
            ->flatten(1)
            ->sortBy(fn($config) => !empty($config['nestedChannels']));

        foreach ($configs as $config) {
            $nestedChannelSlugs = Arr::pull($config, 'nestedChannels');
            $presetDescription = Arr::pull($config, 'presetDescription');
            $config['config']['adminDescription'] = $presetDescription;
            $channel = Channel::create(
                array_merge($config, [
                    'type' => 'channel',
                    'public' => true,
                    'internal' => $config['internal'] ?? false,
                    'user_id' => app(User::class)->findAdmin()?->id,
                ]),
            );
            $createdChannels[] = [
                'parent' => $channel,
                'nestedChannelSlugs' => $nestedChannelSlugs,
            ];
        }

        foreach ($createdChannels as $createdChannel) {
            if (isset($createdChannel['nestedChannelSlugs'])) {
                foreach ($createdChannel['nestedChannelSlugs'] as $slug) {
                    $nestedChannel = Channel::where('slug', $slug)->first();
                    $createdChannel['parent']
                        ->channels()
                        ->attach($nestedChannel->id);
                }
            }
        }

        return Channel::whereIn('slug', ['homepage', 'discover'])->first();
    }
}