* @copyright 2023 Stud.IP Core-Group * @license http://www.gnu.org/licenses/gpl-2.0.html GPL version 2 * @category Stud.IP * * @property int $id alias column for version_id * @property int $version_id database column * @property int $page_id database column * @property string $name database column * @property string|null $content database column * @property string $user_id database column * @property int $mkdate database column * @property WikiPage $page * @property User $user * @property-read (WikiPage | null) $predecessor * @property-read (WikiPage | null) $successor * @property-read (int | null) $versionnumber */ class WikiVersion extends SimpleORMap { protected static function configure($config = []) { $config['db_table'] = 'wiki_versions'; $config['belongs_to']['page'] = [ 'class_name' => WikiPage::class, 'foreign_key' => 'page_id' ]; $config['belongs_to']['user'] = [ 'class_name' => User::class, 'foreign_key' => 'user_id' ]; $config['additional_fields']['predecessor'] = [ 'get' => function ($version) { return static::findOneBySQL('`page_id` = :page_id AND `mkdate` < :version_time ORDER BY `mkdate` DESC LIMIT 1', [ 'page_id' => $version['page_id'], 'version_time' => $version['mkdate'] ]); } ]; $config['additional_fields']['successor'] = [ 'get' => function ($version) { $newer_version = static::findOneBySQL('`page_id` = :page_id AND `mkdate` > :version_time ORDER BY `mkdate` ASC LIMIT 1', [ 'page_id' => $version['page_id'], 'version_time' => $version['mkdate'] ]); return $newer_version ?? $version->page; } ]; $config['additional_fields']['versionnumber'] = [ 'get' => function ($version) { $i = 1; foreach (array_reverse($version->page->versions->getArrayCopy()) as $v) { if ($v->id === $version->id) { return $i; } $i++; } return null; } ]; parent::configure($config); } public function isDeletable(?string $user_id = null): bool { if ($user_id === null && User::findCurrent()) { $user_id = User::findCurrent()->id; } if (!$user_id) { return false; } if ($this->user_id === $user_id) { return true; } $permission = $this->page->write_permission; if ($permission === 'all') { $permission = 'tutor'; } return in_array($permission, ['tutor', 'dozent']) && $GLOBALS['perm']->have_studip_perm( $this->page->write_permission, $this->page->range_id, $user_id ); } }