* @link https://getkirby.com * @copyright Bastian Allgeier * @license https://getkirby.com/license */ class ModelState { /** * Updates the state of the given model. */ public static function update( string $method, ModelWithContent $current, ModelWithContent|bool|null $next = null, ModelWithContent|Site|null $parent = null ): void { // normalize the method $method = match ($method) { 'append', 'create' => 'append', 'remove', 'delete' => 'remove', 'duplicate' => false, // The models need to take care of this default => 'update' }; if ($method === false) { return; } match (true) { $current instanceof File => static::updateFile($method, $current, $next), $current instanceof Page => static::updatePage($method, $current, $next, $parent), $current instanceof Site => static::updateSite($current, $next), $current instanceof User => static::updateUser($method, $current, $next), }; } /** * Updates the state of the given file. */ protected static function updateFile( string $method, File $current, File|bool|null $next = null ): void { $next = $next instanceof File ? $next : $current; // update the files collection $next->parent()->files()->$method($next); } /** * Updates the state of the given page. */ protected static function updatePage( string $method, Page $current, Page|bool|null $next = null, Page|Site|null $parent = null ): void { $next = $next instanceof Page ? $next : $current; $parent ??= $next->parentModel(); if ($next->isDraft() === true) { $parent->drafts()->$method($next); } else { $parent->children()->$method($next); } // update the childrenAndDrafts() cache $parent->childrenAndDrafts()->$method($next); } /** * Updates the state of the given site. */ protected static function updateSite( Site $current, Site|null $next = null ): void { App::instance()->setSite($next ?? $current); } /** * Updates the state of the given user. */ protected static function updateUser( string $method, User $current, User|bool|null $next = null ): void { $next = $next instanceof User ? $next : $current; // update the users collection App::instance()->users()->$method($next); } }