Viewing File: /home/markqprx/iniasli.pro/app-20260222054312/Console/Commands/SeedDemoData.php

<?php

namespace App\Console\Commands;

use App\Actions\Biolink\AddInitialContentToBiolink;
use App\Models\Biolink;
use App\Models\Link;
use App\Models\LinkeableClick;
use App\Models\LinkGroup;
use App\Models\LinkOverlay;
use App\Models\User;
use Common\Pages\CustomPage;
use Common\Workspaces\Workspace;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;

class SeedDemoData extends Command
{
    protected $signature = 'demo:seed';

    protected $description = 'Seed demo data.';

    protected array $tablesToTruncate = [
        'biolink_appearances',
        'biolink_widgets',
        'custom_domains',
        'custom_pages',
        'link_clicks',
        'link_group_link',
        'link_groups',
        'link_overlays',
        'link_tracking_pixel',
        'linkeable_rules',
        'links',
        'tracking_pixels',
        'workspaces',
        'workspace_invites',
        'workspace_user',
    ];

    public function handle(): int
    {
        @ini_set('memory_limit', '-1');

        foreach ($this->tablesToTruncate as $table) {
            DB::table($table)->truncate();
        }

        $this->info('Generating workspaces.');
        $workspace = $this->generateWorkspace('medium');
        $this->generateWorkspace('high');

        $this->info('Generating link groups.');
        $this->generateLinkGroup('low');
        $this->generateLinkGroup('low');
        $this->generateLinkGroup('high');
        $this->generateLinkGroup('medium', $workspace);

        $this->info('Generating biolinks.');
        $this->generateBiolink('low');
        $this->generateBiolink('high');
        $this->generateBiolink('medium', $workspace);

        LinkOverlay::factory()->create([
            'user_id' => User::findAdmin()->id,
            'name' => 'Demo link overlay',
            'message' => 'Demo Link Overlay Message',
            'btn_text' => 'Button text',
            'label' => 'Demo',
        ]);

        CustomPage::factory()->create([
            'user_id' => User::findAdmin()->id,
            'type' => 'link_page',
        ]);

        return Command::SUCCESS;
    }

    protected function generateWorkspace($clickAmount = 'low')
    {
        $user = User::findAdmin();
        $clicksCount = $this->getClickCount($clickAmount);

        $workspace = Workspace::factory()->create([
            'owner_id' => $user->id,
        ]);

        $workspace->members()->create([
            'user_id' => $user->id,
            'role_id' => 1,
        ]);

        $links = Link::factory()
            ->count(random_int(8, 20))
            ->create([
                'type' => 'direct',
                'user_id' => $user->id,
                'workspace_id' => $workspace->id,
            ]);

        DB::beginTransaction();
        LinkeableClick::factory()
            ->count($clicksCount)
            ->create([
                'linkeable_id' => $links->random()->id,
                'linkeable_type' => Link::MODEL_TYPE,
                'owner_id' => $user->id,
            ]);
        DB::commit();

        return $workspace;
    }

    protected function generateLinkGroup(
        $clickAmount = 'low',
        Workspace $workspace = null,
    ) {
        $user = User::findAdmin();
        $clicksCount = $this->getClickCount($clickAmount);

        $group = LinkGroup::factory()->create([
            'user_id' => $user->id,
            'workspace_id' => $workspace ? $workspace->id : 0,
        ]);

        $groupLinks = Link::factory()
            ->count(random_int(8, 20))
            ->create([
                'type' => 'direct',
                'clicks_count' => $clicksCount,
                'user_id' => $user->id,
                'workspace_id' => $workspace ? $workspace->id : 0,
            ]);

        $group->links()->sync($groupLinks);

        if ($clickAmount !== 'none') {
            DB::beginTransaction();
            LinkeableClick::factory()
                ->count($clicksCount)
                ->create([
                    'linkeable_id' => $groupLinks->random()->id,
                    'linkeable_type' => Link::MODEL_TYPE,
                    'owner_id' => $user->id,
                ]);
            DB::commit();
        }

        return $group;
    }

    protected function generateBiolink(
        $clickAmount = 'low',
        Workspace $workspace = null,
    ) {
        $user = User::findAdmin();
        $clicksCount = $this->getClickCount($clickAmount);

        $biolink = Biolink::factory()->create([
            'clicks_count' => $clicksCount,
            'user_id' => $user->id,
            'workspace_id' => $workspace ? $workspace->id : 0,
        ]);

        $biolinkLinks = Link::factory()
            ->shortName()
            ->count(random_int(3, 5))
            ->create([
                'type' => 'direct',
                'clicks_count' => $clicksCount,
                'user_id' => $user->id,
                'workspace_id' => $workspace ? $workspace->id : 0,
            ]);

        $biolink->links()->sync(
            $biolinkLinks->mapWithKeys(
                fn($link, $index) => [
                    $link->id => ['position' => $index + 2],
                ],
            ),
        );

        app(AddInitialContentToBiolink::class)->execute(
            $biolink->id,
            $user,
            $biolinkLinks->count(),
        );

        if ($clickAmount !== 'none') {
            DB::beginTransaction();
            // biolink clicks
            LinkeableClick::factory()
                ->count($clicksCount)
                ->create([
                    'linkeable_id' => $biolink->id,
                    'linkeable_type' => Biolink::MODEL_TYPE,
                    'owner_id' => $user->id,
                ]);

            // links clicks
            LinkeableClick::factory()
                ->count($clicksCount)
                ->create([
                    'linkeable_id' => $biolinkLinks->random()->id,
                    'linkeable_type' => Link::class,
                    'owner_id' => $user->id,
                ]);
            DB::commit();
        }
    }

    protected function getClickCount(string $clickAmount): int
    {
        return match ($clickAmount) {
            'low' => random_int(1, 100),
            'medium' => random_int(1000, 2000),
            'high' => random_int(3000, 4000),
            default => 0,
        };
    }
}
Back to Directory File Manager