thuecat/Classes/Domain/Import/Entity/Base.php
Daniel Siepmann bfd4c77a17 Refactor parsing of JSON-LD
Use Symfony components to map incoming JSON onto objects.
Those provide a mapping. They can then be used to fetch the data in a
common way and insert it into the system.

- Handle languages within JsonDecode
  (normalize incoming data based on language)
- Handle Single Value and List of Values within Entities. They will map
  incoming Data to proper Objects. (We now generally transform during
  serialization process if target is array but we got single entity)
- Add missing tests for existing data.
- Finish migration of all existing data, this includes next step
- Provide discriminator to ObjectNormalizer to auto detect target class
  based on "type" property. (Done for now by own registry)
- Combine generated object with current structure for import -> generate
  data array out of it.
- Resolve foreign references to existing entities,
  (images, contentresponsible, etc.)
2021-08-12 09:46:37 +02:00

202 lines
4.2 KiB
PHP

<?php
declare(strict_types=1);
/*
* Copyright (C) 2021 Daniel Siepmann <coding@daniel-siepmann.de>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA.
*/
namespace WerkraumMedia\ThueCat\Domain\Import\Entity;
use WerkraumMedia\ThueCat\Domain\Import\Entity\Properties\ForeignReference;
class Base
{
/**
* URL to the original source at ThüCAT.
* Not unique within our system. We have one entity per language,
* while ThüCAT has a single entity containing all languages.
*
* @var string
*/
protected $id = '';
/**
* Short name of the thing.
* Can be translated.
*
* @var string
*/
protected $name = '';
/**
* Long text describing the thing.
* Can be translated.
*
* @var string
*/
protected $description = '';
/**
* URL to official version of this thing outside of ThüCAT.
*
* @var string
*/
protected $url = '';
/**
* @var ForeignReference
*/
protected $photo;
/**
* Images of this Thing.
*
* @var ForeignReference[]
*/
protected $images = [];
/**
* The Thing responsible for the data within this Thing.
*
* @var ForeignReference
*/
protected $managedBy;
public function getId(): string
{
return $this->id;
}
public function hasName(): bool
{
return trim($this->name) !== '';
}
public function getName(): string
{
return $this->name;
}
public function getDescription(): string
{
return $this->description;
}
public function getUrl(): string
{
return $this->url;
}
public function getPhoto(): ?ForeignReference
{
return $this->photo;
}
/**
* @return ForeignReference[]
*/
public function getImages(): array
{
return $this->images;
}
public function getManagedBy(): ?ForeignReference
{
return $this->managedBy;
}
/**
* @internal for mapping via Symfony component.
*/
public function setId(string $url): void
{
$this->id = $url;
}
/**
* @internal for mapping via Symfony component.
*/
public function setName(string $name): void
{
$this->name = $name;
}
/**
* @internal for mapping via Symfony component.
*/
public function setDescription(string $description): void
{
$this->description = $description;
}
/**
* @internal for mapping via Symfony component.
*/
public function setUrl(string $url): void
{
$this->url = $url;
}
/**
* @internal for mapping via Symfony component.
*/
public function setPhoto(ForeignReference $photo): void
{
$this->photo = $photo;
}
/**
* @internal for mapping via Symfony component.
* @return ForeignReference[]
*/
public function getImage(): array
{
return $this->images;
}
/**
* @internal for mapping via Symfony component.
*/
public function addImage(ForeignReference $image): void
{
$this->images[] = $image;
}
/**
* @internal for mapping via Symfony component.
*/
public function removeImage(ForeignReference $image): void
{
}
/**
* @internal for mapping via Symfony component.
*/
public function setContentResponsible(ForeignReference $contentResponsible): void
{
$this->managedBy = $contentResponsible;
}
// TODO: Address
// TODO: Offers
// TODO: containedInPlace -> resolve to town, etc.
}