xref: /plugin/combo/ComboStrap/Meta/Api/MetadataSystem.php (revision 94bd64624391aac031cc0626cae58a5718ca10d8)
104fd306cSNickeau<?php
204fd306cSNickeau
304fd306cSNickeaunamespace ComboStrap\Meta\Api;
404fd306cSNickeau
504fd306cSNickeauuse ComboStrap\CacheExpirationDate;
604fd306cSNickeauuse ComboStrap\CacheExpirationFrequency;
704fd306cSNickeauuse ComboStrap\Canonical;
804fd306cSNickeauuse ComboStrap\DisqusIdentifier;
904fd306cSNickeauuse ComboStrap\DokuwikiId;
1004fd306cSNickeauuse ComboStrap\EndDate;
1104fd306cSNickeauuse ComboStrap\ExceptionBadArgument;
1204fd306cSNickeauuse ComboStrap\ExceptionNotFound;
1304fd306cSNickeauuse ComboStrap\ExceptionRuntimeInternal;
1404fd306cSNickeauuse ComboStrap\ExecutionContext;
1504fd306cSNickeauuse ComboStrap\FeaturedIcon;
1604fd306cSNickeauuse ComboStrap\FirstImage;
1704fd306cSNickeauuse ComboStrap\FirstRasterImage;
1804fd306cSNickeauuse ComboStrap\FirstSvgIllustration;
1904fd306cSNickeauuse ComboStrap\Label;
2004fd306cSNickeauuse ComboStrap\Lang;
2104fd306cSNickeauuse ComboStrap\LdJson;
2204fd306cSNickeauuse ComboStrap\Lead;
2304fd306cSNickeauuse ComboStrap\Locale;
2404fd306cSNickeauuse ComboStrap\LogUtility;
2504fd306cSNickeauuse ComboStrap\LowQualityCalculatedIndicator;
2604fd306cSNickeauuse ComboStrap\LowQualityPageOverwrite;
2704fd306cSNickeauuse ComboStrap\Meta\Field\Aliases;
2804fd306cSNickeauuse ComboStrap\Meta\Field\AliasPath;
2904fd306cSNickeauuse ComboStrap\Meta\Field\AliasType;
3004fd306cSNickeauuse ComboStrap\Meta\Field\AncestorImage;
3104fd306cSNickeauuse ComboStrap\Meta\Field\FacebookImage;
3204fd306cSNickeauuse ComboStrap\Meta\Field\FeaturedImage;
3304fd306cSNickeauuse ComboStrap\Meta\Field\FeaturedRasterImage;
3404fd306cSNickeauuse ComboStrap\Meta\Field\FeaturedSvgImage;
3504fd306cSNickeauuse ComboStrap\Meta\Field\PageH1;
3604fd306cSNickeauuse ComboStrap\Meta\Field\PageImage;
3704fd306cSNickeauuse ComboStrap\Meta\Field\PageImagePath;
3804fd306cSNickeauuse ComboStrap\Meta\Field\PageImages;
3904fd306cSNickeauuse ComboStrap\Meta\Field\PageTemplateName;
4004fd306cSNickeauuse ComboStrap\Meta\Field\Region;
4104fd306cSNickeauuse ComboStrap\Meta\Field\SocialCardImage;
4204fd306cSNickeauuse ComboStrap\Meta\Field\TwitterImage;
4304fd306cSNickeauuse ComboStrap\ModificationDate;
4404fd306cSNickeauuse ComboStrap\CreationDate;
4504fd306cSNickeauuse ComboStrap\PageDescription;
4604fd306cSNickeauuse ComboStrap\PageId;
4704fd306cSNickeauuse ComboStrap\PageImageUsage;
4804fd306cSNickeauuse ComboStrap\PageKeywords;
4904fd306cSNickeauuse ComboStrap\PageLevel;
5004fd306cSNickeauuse ComboStrap\PagePath;
5104fd306cSNickeauuse ComboStrap\PagePublicationDate;
5204fd306cSNickeauuse ComboStrap\PageTitle;
5304fd306cSNickeauuse ComboStrap\PageType;
5404fd306cSNickeauuse ComboStrap\PageUrlPath;
5504fd306cSNickeauuse ComboStrap\PluginUtility;
5604fd306cSNickeauuse ComboStrap\QualityDynamicMonitoringOverwrite;
5704fd306cSNickeauuse ComboStrap\References;
5804fd306cSNickeauuse ComboStrap\ReplicationDate;
5904fd306cSNickeauuse ComboStrap\ResourceName;
6004fd306cSNickeauuse ComboStrap\Slug;
6104fd306cSNickeauuse ComboStrap\StartDate;
6204fd306cSNickeau
6304fd306cSNickeauclass MetadataSystem
6404fd306cSNickeau{
6504fd306cSNickeau
6604fd306cSNickeau    /**
6704fd306cSNickeau     * All known metadatas
6804fd306cSNickeau     */
6904fd306cSNickeau    public const METADATAS = [
7004fd306cSNickeau        Aliases::PROPERTY_NAME => Aliases::class,
7104fd306cSNickeau        Canonical::PROPERTY_NAME => Canonical::class,
7204fd306cSNickeau        EndDate::PROPERTY_NAME => EndDate::class,
7304fd306cSNickeau        PageType::PROPERTY_NAME => PageType::class,
7404fd306cSNickeau        PageH1::PROPERTY_NAME => PageH1::class,
7504fd306cSNickeau        PageUrlPath::PROPERTY_NAME => PageUrlPath::class,
7604fd306cSNickeau        Lang::PROPERTY_NAME => Lang::class,
7704fd306cSNickeau        LdJson::PROPERTY_NAME => LdJson::class,
7804fd306cSNickeau        LdJson::OLD_ORGANIZATION_PROPERTY => LdJson::class,
7904fd306cSNickeau        PageTitle::PROPERTY_NAME => PageTitle::class,
8004fd306cSNickeau        PagePublicationDate::PROPERTY_NAME => PagePublicationDate::class,
8104fd306cSNickeau        PagePublicationDate::OLD_META_KEY => PagePublicationDate::class,
8204fd306cSNickeau        Region::PROPERTY_NAME => Region::class,
8304fd306cSNickeau        ResourceName::PROPERTY_NAME => ResourceName::class,
8404fd306cSNickeau        StartDate::PROPERTY_NAME => StartDate::class,
8504fd306cSNickeau        PageDescription::PROPERTY_NAME => PageDescription::class,
8604fd306cSNickeau        DisqusIdentifier::PROPERTY_NAME => DisqusIdentifier::class,
8704fd306cSNickeau        Slug::PROPERTY_NAME => Slug::class,
8804fd306cSNickeau        PageKeywords::PROPERTY_NAME => PageKeywords::class,
8904fd306cSNickeau        CacheExpirationFrequency::PROPERTY_NAME => CacheExpirationFrequency::class,
9004fd306cSNickeau        QualityDynamicMonitoringOverwrite::PROPERTY_NAME => QualityDynamicMonitoringOverwrite::class,
9104fd306cSNickeau        LowQualityPageOverwrite::PROPERTY_NAME => LowQualityPageOverwrite::class,
9204fd306cSNickeau        Locale::PROPERTY_NAME => Locale::class,
9304fd306cSNickeau        CacheExpirationDate::PROPERTY_NAME => CacheExpirationDate::class,
9404fd306cSNickeau        FeaturedImage::PROPERTY_NAME => FeaturedImage::class,
9504fd306cSNickeau        FeaturedSvgImage::PROPERTY_NAME => FeaturedSvgImage::class,
9604fd306cSNickeau        FeaturedRasterImage::PROPERTY_NAME => FeaturedRasterImage::class,
9704fd306cSNickeau        FeaturedIcon::PROPERTY_NAME => FeaturedIcon::class,
9804fd306cSNickeau        Lead::PROPERTY_NAME => Lead::class,
9904fd306cSNickeau        Label::PROPERTY_NAME => Label::class,
10004fd306cSNickeau        TwitterImage::PROPERTY_NAME => TwitterImage::class,
10104fd306cSNickeau        FacebookImage::PROPERTY_NAME => FacebookImage::class,
10204fd306cSNickeau        AliasPath::PROPERTY_NAME => Aliases::class,
10304fd306cSNickeau        AliasType::PROPERTY_NAME => Aliases::class,
10404fd306cSNickeau        PageImages::PROPERTY_NAME => PageImages::class,
10504fd306cSNickeau        PageImages::OLD_PROPERTY_NAME => PageImages::class,
10604fd306cSNickeau        PageImagePath::PROPERTY_NAME => PageImages::class,
10704fd306cSNickeau        PageImageUsage::PROPERTY_NAME => PageImages::class,
10804fd306cSNickeau        SocialCardImage::PROPERTY_NAME => SocialCardImage::class,
10904fd306cSNickeau        AncestorImage::PROPERTY_NAME => AncestorImage::class,
11004fd306cSNickeau        FirstImage::PROPERTY_NAME => FirstImage::class,
11104fd306cSNickeau        Region::OLD_REGION_PROPERTY => Region::class,
11204fd306cSNickeau        PageTemplateName::PROPERTY_NAME => PageTemplateName::class,
11304fd306cSNickeau        PageTemplateName::PROPERTY_NAME_OLD => PageTemplateName::class,
11404fd306cSNickeau        DokuwikiId::DOKUWIKI_ID_ATTRIBUTE => DokuwikiId::class,
11504fd306cSNickeau        ReplicationDate::PROPERTY_NAME => ReplicationDate::class,
11604fd306cSNickeau        References::PROPERTY_NAME => References::class,
11704fd306cSNickeau        LowQualityCalculatedIndicator::PROPERTY_NAME => LowQualityCalculatedIndicator::class,
11804fd306cSNickeau        PagePath::PROPERTY_NAME => PagePath::class,
11904fd306cSNickeau        CreationDate::PROPERTY_NAME => CreationDate::class,
12004fd306cSNickeau        ModificationDate::PROPERTY_NAME => ModificationDate::class,
12104fd306cSNickeau        PageLevel::PROPERTY_NAME => PageLevel::class,
12204fd306cSNickeau        PageId::PROPERTY_NAME => PageId::class
12304fd306cSNickeau    ];
12404fd306cSNickeau
12504fd306cSNickeau
12604fd306cSNickeau    /**
12704fd306cSNickeau     * @return Metadata[]
12804fd306cSNickeau     */
12904fd306cSNickeau    public static function getMetadataObjects(): array
13004fd306cSNickeau    {
13104fd306cSNickeau        /**
13204fd306cSNickeau         * TODO: create a metadata metadata object and a metadata processing object
13304fd306cSNickeau         *   We can't cache as we mix for now, in the same object
13404fd306cSNickeau         *     * the metadata metadata (ie {@link Metadata::isOnForm()}, ...
13504fd306cSNickeau         *     * and the process object {@link Metadata::setReadStore()}, writestore, value
13604fd306cSNickeau         */
13704fd306cSNickeau        $metadatas = [];
13804fd306cSNickeau        foreach (self::METADATAS as $metadataClass) {
13904fd306cSNickeau            $metadatas[] = new $metadataClass();
14004fd306cSNickeau        }
14104fd306cSNickeau        return $metadatas;
14204fd306cSNickeau
14304fd306cSNickeau    }
14404fd306cSNickeau
14504fd306cSNickeau    /**
14604fd306cSNickeau     * @return Metadata[]
14704fd306cSNickeau     */
14804fd306cSNickeau    public static function getMetadataClasses(): array
14904fd306cSNickeau    {
15004fd306cSNickeau        return self::METADATAS;
15104fd306cSNickeau    }
15204fd306cSNickeau
15304fd306cSNickeau    /**
15404fd306cSNickeau     * @param object|string $class
15504fd306cSNickeau     * @param Metadata|null $parent
15604fd306cSNickeau     * @return Metadata
15704fd306cSNickeau     * @throws ExceptionBadArgument - if the class is not a metadata class
15804fd306cSNickeau     */
15904fd306cSNickeau    public static function toMetadataObject($class, Metadata $parent = null): Metadata
16004fd306cSNickeau    {
16104fd306cSNickeau        if (!is_subclass_of($class, Metadata::class)) {
16204fd306cSNickeau            throw new ExceptionBadArgument("The class ($class) is not a metadata class");
16304fd306cSNickeau        }
16404fd306cSNickeau        return new $class($parent);
16504fd306cSNickeau    }
16604fd306cSNickeau
16704fd306cSNickeau    /**
16804fd306cSNickeau     * @return Metadata[]
16904fd306cSNickeau     */
17004fd306cSNickeau    public static function getMutableMetadata(): array
17104fd306cSNickeau    {
17204fd306cSNickeau        $metas = [];
17304fd306cSNickeau        foreach (MetadataSystem::getMetadataObjects() as $metadata) {
17404fd306cSNickeau            if ($metadata::isMutable()) {
17504fd306cSNickeau                $metas[] = $metadata;
17604fd306cSNickeau            }
17704fd306cSNickeau        }
17804fd306cSNickeau        return $metas;
17904fd306cSNickeau    }
18004fd306cSNickeau
18104fd306cSNickeau
18204fd306cSNickeau    /**
18304fd306cSNickeau     * @throws ExceptionNotFound
18404fd306cSNickeau     */
18504fd306cSNickeau    public static function getForName(string $name): Metadata
18604fd306cSNickeau    {
18704fd306cSNickeau
18804fd306cSNickeau        $name = strtolower(trim($name));
189*94bd6462Sgerardnico        $metadataClass = self::METADATAS[$name] ?? null;
19004fd306cSNickeau        if ($metadataClass !== null) {
19104fd306cSNickeau            return new $metadataClass();
19204fd306cSNickeau        }
19304fd306cSNickeau        throw new ExceptionNotFound("No metadata found with the name ($name)");
19404fd306cSNickeau
19504fd306cSNickeau    }
19604fd306cSNickeau}
197