This repository has been archived on 2024-09-05. You can view files and clone it, but cannot push or open issues or pull requests.
shimmie2/ext/trash/main.php

193 lines
5.7 KiB
PHP
Raw Normal View History

2020-01-26 13:19:35 +00:00
<?php declare(strict_types=1);
abstract class TrashConfig
{
const VERSION = "ext_trash_version";
}
class Trash extends Extension
{
2020-02-04 00:46:36 +00:00
/** @var TrashTheme */
protected $theme;
public function get_priority(): int
{
// Needs to be early to intercept delete events
return 10;
}
public function onInitExt(InitExtEvent $event)
{
Image::$bool_props[] = "trash";
}
public function onPageRequest(PageRequestEvent $event)
{
global $page, $user;
2019-07-09 14:10:21 +00:00
if ($event->page_matches("trash_restore") && $user->can(Permissions::VIEW_TRASH)) {
// Try to get the image ID
2019-11-04 00:42:06 +00:00
if ($event->count_args() >= 1) {
$image_id = int_escape($event->get_arg(0));
2019-11-04 00:42:06 +00:00
} elseif (isset($_POST['image_id'])) {
$image_id = $_POST['image_id'];
2019-11-04 00:42:06 +00:00
} else {
throw new SCoreException("Can not restore image: No valid Image ID given.");
}
self::set_trash($image_id, false);
$page->set_mode(PageMode::REDIRECT);
$page->set_redirect(make_link("post/view/".$image_id));
}
}
private function check_permissions(Image $image): bool
{
global $user;
if ($image->trash===true && !$user->can(Permissions::VIEW_TRASH)) {
return false;
}
return true;
}
public function onImageDownloading(ImageDownloadingEvent $event)
{
/**
* Deny images upon insufficient permissions.
**/
if (!$this->check_permissions($event->image)) {
throw new SCoreException("Access denied");
}
}
public function onDisplayingImage(DisplayingImageEvent $event)
{
global $page;
if (!$this->check_permissions(($event->image))) {
$page->set_mode(PageMode::REDIRECT);
$page->set_redirect(make_link("post/list"));
}
}
public function onImageDeletion(ImageDeletionEvent $event)
{
2019-09-29 13:30:55 +00:00
if ($event->force!==true && $event->image->trash!==true) {
self::set_trash($event->image->id, true);
$event->stop_processing = true;
}
}
2019-10-10 15:28:10 +00:00
public function onPageSubNavBuilding(PageSubNavBuildingEvent $event)
{
global $user;
2019-11-02 19:57:34 +00:00
if ($event->parent=="posts") {
if ($user->can(Permissions::VIEW_TRASH)) {
$event->add_nav_link("posts_trash", new Link('/post/list/in%3Atrash/1'), "Trash", null, 60);
2019-10-10 15:28:10 +00:00
}
}
}
const SEARCH_REGEXP = "/^in:trash$/";
public function onSearchTermParse(SearchTermParseEvent $event)
{
global $user, $database;
$matches = [];
if (is_null($event->term) && $this->no_trash_query($event->context)) {
$event->add_querylet(new Querylet($database->scoreql_to_sql("trash = SCORE_BOOL_N ")));
}
2020-01-26 16:38:26 +00:00
if (is_null($event->term)) {
return;
}
if (preg_match(self::SEARCH_REGEXP, strtolower($event->term), $matches)) {
2019-09-29 13:30:55 +00:00
if ($user->can(Permissions::VIEW_TRASH)) {
$event->add_querylet(new Querylet($database->scoreql_to_sql("trash = SCORE_BOOL_Y ")));
}
}
}
public function onHelpPageBuilding(HelpPageBuildingEvent $event)
{
global $user;
2019-09-29 13:30:55 +00:00
if ($event->key===HelpPages::SEARCH) {
if ($user->can(Permissions::VIEW_TRASH)) {
$block = new Block();
$block->header = "Trash";
$block->body = $this->theme->get_help_html();
$event->add_block($block);
}
}
}
private function no_trash_query(array $context): bool
{
foreach ($context as $term) {
if (preg_match(self::SEARCH_REGEXP, $term)) {
return false;
}
}
return true;
}
2019-09-29 13:30:55 +00:00
public static function set_trash($image_id, $trash)
{
global $database;
2019-09-29 13:30:55 +00:00
$database->execute(
"UPDATE images SET trash = :trash WHERE id = :id",
["trash"=>$database->scoresql_value_prepare($trash),"id"=>$image_id]
);
}
public function onImageAdminBlockBuilding(ImageAdminBlockBuildingEvent $event)
{
global $user;
2019-09-29 13:30:55 +00:00
if ($event->image->trash===true && $user->can(Permissions::VIEW_TRASH)) {
$event->add_part($this->theme->get_image_admin_html($event->image->id));
}
}
public function onBulkActionBlockBuilding(BulkActionBlockBuildingEvent $event)
{
global $user;
2019-07-09 14:10:21 +00:00
if ($user->can(Permissions::VIEW_TRASH)&&in_array("in:trash", $event->search_terms)) {
2019-09-29 13:30:55 +00:00
$event->add_action("bulk_trash_restore", "(U)ndelete", "u");
}
}
public function onBulkAction(BulkActionEvent $event)
{
global $page, $user;
switch ($event->action) {
case "bulk_trash_restore":
2019-07-09 14:10:21 +00:00
if ($user->can(Permissions::VIEW_TRASH)) {
$total = 0;
foreach ($event->items as $image) {
self::set_trash($image->id, false);
$total++;
}
$page->flash("Restored $total items from trash");
}
break;
}
}
public function onDatabaseUpgrade(DatabaseUpgradeEvent $event)
{
2019-11-03 19:04:57 +00:00
global $database;
2019-11-03 19:04:57 +00:00
if ($this->get_version(TrashConfig::VERSION) < 1) {
2020-10-25 21:34:52 +00:00
$database->execute($database->scoreql_to_sql(
"ALTER TABLE images ADD COLUMN trash SCORE_BOOL NOT NULL DEFAULT SCORE_BOOL_N"
));
2020-10-25 21:34:52 +00:00
$database->execute("CREATE INDEX images_trash_idx ON images(trash)");
2019-11-03 19:04:57 +00:00
$this->set_version(TrashConfig::VERSION, 1);
}
}
}