HEX
Server: Microsoft-IIS/8.5
System: Windows NT YDAWBH120 6.3 build 9600 (Windows Server 2012 R2 Standard Edition) AMD64
User: tentjecom_web (0)
PHP: 7.4.14
Disabled: NONE
Upload Files
File: D:/HostingSpaces/SBogers10/rentman2019.komma.pro/app/Komma/Jobs/Kms/ImportOldJobs.php
<?php

namespace App\Komma\Jobs\Kms;

use App\Komma\Documents\Models\Document;
use App\Komma\Dynamic\ComponentArea\ComponentAreaServiceInterface;
use App\Komma\Dynamic\ComponentType\ComponentTypes;
use App\Komma\Jobs\Models\Job;
use App\Komma\Jobs\Models\JobTranslation;
use App\Komma\Jobs\Models\OldJob;
use App\Komma\Kms\Core\Attributes\Attribute;
use App\Komma\Kms\Core\Attributes\ComponentArea;
use App\Komma\Languages\Models\Language;
use Carbon\Carbon;

class ImportOldJobs
{
    public function cleanCurrentTable()
    {
        // Clear table
        $updates = Job::all();
        foreach ($updates as $update) {
            $update->delete();
        }
    }

    public function convertOldJobTable()
    {
        $oldUpdates = OldJob::with('translations')
            ->get();

//        dd($oldUpdates);

        $componentAreaService = \App::make(ComponentAreaServiceInterface::class);

        $created = 2;
        foreach ($oldUpdates as $oldUpdateAmount => $oldUpdate) {
            // Create new Update
            $update = Job::firstOrNew([
                'site_id' => 1,
                'lft' => $created,
                'rgt' => ($created + 1),
                'tree' => 1,
                'created_at' => $oldUpdate->created_at,
                'updated_at' => $oldUpdate->updated_at,

            ]);

//            if($update->exists || $created > 15) continue;
//            else dd($oldUpdate, $update);

            $update->save();

            $created += 2;

            // Append translations
            foreach ($oldUpdate->translations as $loopKey => $translation) {
                $languageId = $translation->language_id;
                if ($languageId == 67) {
                    $languageId = 66;
                }
                $language = Language::find($languageId);

                $updateTranslation = new JobTranslation();
                $updateTranslation->language_id = $languageId;
                $updateTranslation->active = $oldUpdate->active;
                $updateTranslation->preview = $oldUpdate->active;
                $updateTranslation->name = $translation->name;
                $updateTranslation->slug = str_slug($translation->name);
                $updateTranslation->meta_title = $translation->name.' | Rentman';
                $updateTranslation->meta_description = strip_tags($translation->meta_description);

                $updateTranslation->created_at = $translation->created_at;
                $updateTranslation->updated_at = $translation->updated_at;

                $update->translation()->save($updateTranslation);

                // Convert old dynamic attributes to a component area
                $componentAreaAttributeValue = $this->convertOldDynamicBlockToComponents(json_decode($translation->description), $language);

                $componentAreaAttribute = (new ComponentArea())
                    ->disableBackgroundOption()
                    ->setSubFolder('job_component_data')
                    ->setComponentTypes([
                        ComponentTypes::VIDEO,
                        ComponentTypes::IMAGE,
                        ComponentTypes::TEXT,
                    ])
                    ->mapValueFrom(Attribute::ValueFromComponents, 'job_components')
                    ->setAssociatedLanguage($language)
                    ->setValue(json_encode($componentAreaAttributeValue));

                $componentAreaService->saveOrUpdateComponentAreaForAttribute($updateTranslation, $componentAreaAttribute);
            }
        }
    }

    private function convertOldDynamicBlockToComponents($dynamicBlockJson, Language $language)
    {
        $componentAreaAttributeValue = [];
        $componentCounter = 0;

        foreach ($dynamicBlockJson as $key => $block) {
            if (! in_array($block->typeSlug, ['content-block', 'video-block', 'full-image-block'])) {
                dd($block);
            }

            if ($block->typeSlug == 'full-image-block') {
                if (isset($block->images) && count($block->images) != 0) {
                    $document = $this->createDocumentAndMakeArrayForComponentArea($block->images[0], 'ComponentArea|job_components|C'.($componentCounter * -1).'|image|'.$language->iso_2);

                    $componentAreaAttributeValue[] = (object) [
                        'id'                => ($componentCounter * -1),
                        'version'           => '0.9.1',
                        'componentTypeId'   => 10,
                        'data'              => (object) [
                            'ComponentArea|job_components|C'.$componentCounter.'|grey_background|'.$language->iso_2 => '0',
                            'ComponentArea|job_components|C'.$componentCounter.'|image|'.$language->iso_2.'-data' => json_encode($document),
                        ],
                        'componentableData' => (object) [],
                        'sortOrder'         => $componentCounter,
                    ];
                    $componentCounter++;
                    continue;
                }
            }

            if ($block->typeSlug == 'content-block') {
                $componentAreaAttributeValue[] = (object) [
                    'id'                => ($componentCounter * -1),
                    'version'           => '0.9.1',
                    'componentTypeId'   => 9,
                    'data'              => (object) [
                        'ComponentArea|job_components|C'.$componentCounter.'|grey_background|'.$language->iso_2 => '0',
                        'ComponentArea|job_components|C'.$componentCounter.'|text|'.$language->iso_2            => $block->description,
                        'ComponentArea|job_components|C'.$componentCounter.'|intro|'.$language->iso_2           => '0',
                    ],
                    'componentableData' => (object) [],
                    'sortOrder'         => $componentCounter,
                ];
                $componentCounter++;

                if (isset($block->images) && count($block->images) != 0) {
                    $document = $this->createDocumentAndMakeArrayForComponentArea($block->images[0], 'ComponentArea|job_components|C'.($componentCounter * -1).'|image|'.$language->iso_2);

                    $componentAreaAttributeValue[] = (object) [
                        'id'                => ($componentCounter * -1),
                        'version'           => '0.9.1',
                        'componentTypeId'   => 10,
                        'data'              => (object) [
                            'ComponentArea|job_components|C'.$componentCounter.'|grey_background|'.$language->iso_2 => '0',
                            'ComponentArea|job_components|C'.$componentCounter.'|image|'.$language->iso_2.'-data' => json_encode($document),
                        ],
                        'componentableData' => (object) [],
                        'sortOrder'         => $componentCounter,
                    ];
                    $componentCounter++;
                }

                continue;
            }

            if ($block->typeSlug == 'video-block') {
                $componentAreaAttributeValue[] = (object) [
                    'id'                => ($componentCounter * -1),
                    'version'           => '0.9.1',
                    'componentTypeId'   => 5,
                    'data'              => (object) [
                        'ComponentArea|job_components|C'.$componentCounter.'|grey_background|'.$language->iso_2 => '0',
                        'ComponentArea|job_components|C'.$componentCounter.'|video|en_video_id'                   => $block->youtube,
                        'ComponentArea|job_components|C'.$componentCounter.'|video|en_autoplay'                   => 'on',
                        'ComponentArea|job_components|C'.$componentCounter.'|video|'.$language->iso_2           => '0,'.$block->youtube,
                    ],
                    'componentableData' => (object) [],
                    'sortOrder'         => $componentCounter,
                ];
                $componentCounter++;
                continue;
            }
        }

        return $componentAreaAttributeValue;
    }

    private function createDocumentAndMakeArrayForComponentArea($image, $componentKey)
    {
        $document = new Document();
        $document->key = $componentKey;
        $document->sort_order = 0;
        $document->documentable_id = 0;

        //Append image
        foreach (['original', 'large', 'medium', 'small', 'thumb'] as $size) {
            $originalImagePath = $image->{$size.'_image_url'};

            if (empty($originalImagePath)) {
                continue;
            }

            $imagePath = 'https://rentman.io/'.$originalImagePath;

            $fileName = basename($imagePath);
            $publicPath = '/uploads/job-component-data/'.$fileName;

            // Copy resource
            // Will only work on local (Linux) not on windows
//            copy($imagePath, public_path($publicPath));

            if ($size == 'original') {
                $document->name = $fileName;
                $document->path = $publicPath;
                $document->mime_type = 'image/'.pathinfo($imagePath, PATHINFO_EXTENSION);
            }

            $document->{$size.'_image_url'} = $publicPath;
        }

        $document->save();

        // Create json for document
        $documentArray = [
            (object) [
                'id'                => $document->id,
                'path'              => $document->path,
                'state'             => 'modified',
                'name'              => $document->name,
                'sort_order'        => $document->sort_order,
                'thumb_image_url'   => $document->thumb_image_url,
                'small_image_url'   => $document->small_image_url,
                'medium_image_url'  => $document->medium_image_url,
                'large_image_url'   => $document->large_image_url,
                'documentable_id'   => '',
                'documentable_type' => '',
                'created_at'        => $document->created_at->format(Carbon::DEFAULT_TO_STRING_FORMAT),
                'updated_at'        => $document->updated_at->format(Carbon::DEFAULT_TO_STRING_FORMAT),
            ],
        ];

        return $documentArray;
    }
}