File: D:/HostingSpaces/SBogers10/shop.komma.nl/app/Discounts/DiscountTranslationService.php
<?php declare(strict_types=1);
namespace App\Discounts;
use Illuminate\Support\Collection;
use Komma\KMS\Globalization\Languages\Models\Language;
class DiscountTranslationService
{
public function saveFromJsonArray(Discount $discount, array $data): Collection {
$translationClass = $className = get_class($discount->translations()->getRelated());
return collect($data)->map(function(array $data) use($discount, $translationClass) {
if(!array_key_exists('state', $data)) throw new \InvalidArgumentException('The data must contain a state attribute, but it did not contain it.');
$translation = null;
switch ($data['state']) {
case Discount::NEW:
$translation = new $translationClass;
$translation->fill($data);
if($translation->isEmpty()) break;
if(array_key_exists('language', $data)) $this->saveDiscountTranslationLanguage($translation, $data['language']);
$discount->translations()->save($translation);
break;
case Discount::PRISTINE:
case Discount::DIRTY:
/** @var DiscountTranslation|null $translation */
$translation = $translationClass::find($data['id']);
if(!$translation) throw new \InvalidArgumentException('Data refers to a key that does not exist anymore. Cannot save a '.$translationClass);
$translation->fill($data);
if(array_key_exists('language', $data)) $this->saveDiscountTranslationLanguage($translation, $data['language']);
$discount->translations()->save($translation);
break;
case Discount::DELETED:
$translation = $translationClass::find($data['id']);
$translation->delete();
break;
}
return $translation;
})->filter(
fn($translationResource) => is_a($translationResource, $translationClass)
);
}
protected function saveDiscountTranslationLanguage(DiscountTranslation $translation, $data): DiscountTranslation {
if(!array_key_exists('iso_2', $data)) throw new \InvalidArgumentException('The data must contain an iso_2 attribute. But did not contain it.');
$language = Language::where('iso_2', '=', $data['iso_2'])->first();
$translation->language()->associate($language);
return $translation;
}
}