a bunch of pools cleanup

This commit is contained in:
Shish 2020-03-27 00:15:15 +00:00
parent 599043baa5
commit b5f0bc7621
3 changed files with 194 additions and 271 deletions

View File

@ -42,7 +42,12 @@ class PoolCreationEvent extends Event
public $new_id = -1; public $new_id = -1;
public function __construct(string $title, User $pool_user = null, bool $public = false, string $description = "") public function __construct(
string $title,
User $pool_user = null,
bool $public = false,
string $description = ""
)
{ {
parent::__construct(); parent::__construct();
global $user; global $user;
@ -54,6 +59,33 @@ class PoolCreationEvent extends Event
} }
} }
class Pool {
public $id;
public $user_id;
public $user_name;
public $public;
public $title;
public $description;
public $date;
public $posts;
public function __construct(array $row)
{
$this->id = (int)$row['id'];
$this->user_id = (int)$row['user_id'];
$this->user_name = $row['user_name'] ?? null;
$this->public = bool_escape($row['public']);
$this->title = $row['title'];
$this->description = $row['description'];
$this->date = $row['date'];
$this->posts = (int)$row['posts'];
}
public static function makePool(array $row): Pool {
return new Pool($row);
}
}
class Pools extends Extension class Pools extends Extension
{ {
/** @var PoolsTheme */ /** @var PoolsTheme */
@ -154,7 +186,7 @@ class Pools extends Extension
public function onPageRequest(PageRequestEvent $event) public function onPageRequest(PageRequestEvent $event)
{ {
global $page, $user; global $config, $database, $page, $user;
if ($event->page_matches("pool")) { if ($event->page_matches("pool")) {
$pool_id = 0; $pool_id = 0;
@ -219,7 +251,12 @@ class Pools extends Extension
case "edit": // Edit the pool (remove images) case "edit": // Edit the pool (remove images)
if ($this->have_permission($user, $pool)) { if ($this->have_permission($user, $pool)) {
$this->theme->edit_pool($page, $this->get_pool($pool_id), $this->edit_posts($pool_id)); $result = $database->execute("SELECT image_id FROM pool_images WHERE pool_id=:pid ORDER BY image_order ASC", ["pid" => $pool_id]);
$images = [];
while ($row = $result->fetch()) {
$images[] = Image::by_id((int)$row["image_id"]);
}
$this->theme->edit_pool($page, $pool, $images);
} else { } else {
$page->set_mode(PageMode::REDIRECT); $page->set_mode(PageMode::REDIRECT);
$page->set_redirect(make_link("pool/view/" . $pool_id)); $page->set_redirect(make_link("pool/view/" . $pool_id));
@ -229,14 +266,40 @@ class Pools extends Extension
case "order": // Order the pool (view and change the order of images within the pool) case "order": // Order the pool (view and change the order of images within the pool)
if (isset($_POST["order_view"])) { if (isset($_POST["order_view"])) {
if ($this->have_permission($user, $pool)) { if ($this->have_permission($user, $pool)) {
$this->theme->edit_order($page, $this->get_pool($pool_id), $this->edit_order($pool_id)); $result = $database->execute(
"SELECT image_id FROM pool_images WHERE pool_id=:pid ORDER BY image_order ASC",
["pid" => $pool_id]
);
$images = [];
while ($row = $result->fetch()) {
$image = $database->get_row(
"
SELECT * FROM images AS i
INNER JOIN pool_images AS p ON i.id = p.image_id
WHERE pool_id=:pid AND i.id=:iid",
["pid" => $pool_id, "iid" => (int)$row['image_id']]
);
$images[] = ($image ? new Image($image) : null);
}
$this->theme->edit_order($page, $pool, $images);
} else { } else {
$page->set_mode(PageMode::REDIRECT); $page->set_mode(PageMode::REDIRECT);
$page->set_redirect(make_link("pool/view/" . $pool_id)); $page->set_redirect(make_link("pool/view/" . $pool_id));
} }
} else { } else {
if ($this->have_permission($user, $pool)) { if ($this->have_permission($user, $pool)) {
$this->order_posts(); foreach ($_POST['imgs'] as $data) {
list($imageORDER, $imageID) = $data;
$database->execute(
"
UPDATE pool_images
SET image_order = :ord
WHERE pool_id = :pid AND image_id = :iid",
["ord" => $imageORDER, "pid" => int_escape($_POST['pool_id']), "iid" => $imageID]
);
}
$page->set_mode(PageMode::REDIRECT); $page->set_mode(PageMode::REDIRECT);
$page->set_redirect(make_link("pool/view/" . $pool_id)); $page->set_redirect(make_link("pool/view/" . $pool_id));
} else { } else {
@ -247,7 +310,11 @@ class Pools extends Extension
case "import": case "import":
if ($this->have_permission($user, $pool)) { if ($this->have_permission($user, $pool)) {
$this->import_posts($pool_id); $images = Image::find_images(
0, $config->get_int(PoolsConfig::MAX_IMPORT_RESULTS, 1000),
Tag::explode($_POST["pool_tag"])
);
$this->theme->pool_result($page, $images, $pool);
} else { } else {
$this->theme->display_error(403, "Permission Denied", "You do not have permission to access this page"); $this->theme->display_error(403, "Permission Denied", "You do not have permission to access this page");
} }
@ -269,7 +336,19 @@ class Pools extends Extension
case "remove_posts": case "remove_posts":
if ($this->have_permission($user, $pool)) { if ($this->have_permission($user, $pool)) {
$this->remove_posts(); $images = "";
foreach ($_POST['check'] as $imageID) {
$database->execute(
"DELETE FROM pool_images WHERE pool_id = :pid AND image_id = :iid",
["pid" => $pool_id, "iid" => $imageID]
);
$images .= " " . $imageID;
}
$count = (int)$database->get_one(
"SELECT COUNT(*) FROM pool_images WHERE pool_id=:pid",
["pid" => $pool_id]
);
$this->add_history($pool_id, 0, $images, $count);
$page->set_mode(PageMode::REDIRECT); $page->set_mode(PageMode::REDIRECT);
$page->set_redirect(make_link("pool/view/" . $pool_id)); $page->set_redirect(make_link("pool/view/" . $pool_id));
} else { } else {
@ -280,7 +359,10 @@ class Pools extends Extension
case "edit_description": case "edit_description":
if ($this->have_permission($user, $pool)) { if ($this->have_permission($user, $pool)) {
$this->edit_description(); $database->execute(
"UPDATE pools SET description=:dsc WHERE id=:pid",
["dsc" => $_POST['description'], "pid" => int_escape($_POST['pool_id'])]
);
$page->set_mode(PageMode::REDIRECT); $page->set_mode(PageMode::REDIRECT);
$page->set_redirect(make_link("pool/view/" . $pool_id)); $page->set_redirect(make_link("pool/view/" . $pool_id));
} else { } else {
@ -300,11 +382,6 @@ class Pools extends Extension
$this->theme->display_error(403, "Permission Denied", "You do not have permission to access this page"); $this->theme->display_error(403, "Permission Denied", "You do not have permission to access this page");
} }
break; break;
default:
$page->set_mode(PageMode::REDIRECT);
$page->set_redirect(make_link("pool/list"));
break;
} }
} }
} }
@ -335,13 +412,10 @@ class Pools extends Extension
foreach ($poolsIDs as $poolID) { foreach ($poolsIDs as $poolID) {
$pool = $this->get_single_pool($poolID); $pool = $this->get_single_pool($poolID);
$navInfo[$pool['id']] = []; $navInfo[$pool->id] = [
$navInfo[$pool['id']]['info'] = $pool; "info" => $pool,
"nav" => $show_nav ? $this->get_nav_posts($pool, $imageID) : null,
// Optionally show a link the Prev/Next image in the Pool. ];
if ($show_nav) {
$navInfo[$pool['id']]['nav'] = $this->get_nav_posts($pool, $imageID);
}
} }
$this->theme->pool_info($navInfo); $this->theme->pool_info($navInfo);
} }
@ -352,11 +426,12 @@ class Pools extends Extension
global $config, $database, $user; global $config, $database, $user;
if ($config->get_bool(PoolsConfig::ADDER_ON_VIEW_IMAGE) && !$user->is_anonymous()) { if ($config->get_bool(PoolsConfig::ADDER_ON_VIEW_IMAGE) && !$user->is_anonymous()) {
if ($user->can(Permissions::POOLS_ADMIN)) { if ($user->can(Permissions::POOLS_ADMIN)) {
$pools = $database->get_all("SELECT * FROM pools"); $rows = $database->get_all("SELECT * FROM pools");
} else { } else {
$pools = $database->get_all("SELECT * FROM pools WHERE user_id=:id", ["id" => $user->id]); $rows = $database->get_all("SELECT * FROM pools WHERE user_id=:id", ["id" => $user->id]);
} }
if (count($pools) > 0) { if (count($rows) > 0) {
$pools = array_map([Pool::class, "makePool"], $rows);
$event->add_part($this->theme->get_adder_html($event->image, $pools)); $event->add_part($this->theme->get_adder_html($event->image, $pools));
} }
} }
@ -423,7 +498,7 @@ class Pools extends Extension
$pool = $this->get_single_pool_from_title($poolTag); $pool = $this->get_single_pool_from_title($poolTag);
} }
if ($pool ? $this->have_permission($user, $pool) : false) { if ($pool && $this->have_permission($user, $pool)) {
$image_order = ($matches[2] ?: 0); $image_order = ($matches[2] ?: 0);
$this->add_post($pool['id'], $event->image_id, true, $image_order); $this->add_post($pool['id'], $event->image_id, true, $image_order);
} }
@ -434,7 +509,10 @@ class Pools extends Extension
{ {
global $database; global $database;
$pools = $database->get_all("SELECT * FROM pools ORDER BY title "); $pools = array_map(
[Pool::class, "makePool"],
$database->get_all("SELECT * FROM pools ORDER BY title ")
);
$event->add_action("bulk_pool_add_existing", "Add To (P)ool", "p", "", $this->theme->get_bulk_pool_selector($pools)); $event->add_action("bulk_pool_add_existing", "Add To (P)ool", "p", "", $this->theme->get_bulk_pool_selector($pools));
$event->add_action("bulk_pool_add_new", "Create Pool", "", "", $this->theme->get_bulk_pool_input($event->search_terms)); $event->add_action("bulk_pool_add_new", "Create Pool", "", "", $this->theme->get_bulk_pool_input($event->search_terms));
@ -450,7 +528,7 @@ class Pools extends Extension
return; return;
} }
$pool_id = intval($_POST['bulk_pool_select']); $pool_id = intval($_POST['bulk_pool_select']);
$pool = $this->get_pool($pool_id); $pool = $this->get_single_pool($pool_id);
if ($this->have_permission($user, $pool)) { if ($this->have_permission($user, $pool)) {
send_event( send_event(
@ -479,14 +557,16 @@ class Pools extends Extension
* *
* TODO: Should the user variable be global? * TODO: Should the user variable be global?
*/ */
private function have_permission(User $user, array $pool): bool private function have_permission(User $user, Pool $pool): bool
{ {
// If the pool is public and user is logged OR if the user is admin OR if the pool is owned by the user. // If the pool is public and user is logged
if ((($pool['public'] == "Y" || $pool['public'] == "y") && !$user->is_anonymous()) || $user->can(Permissions::POOLS_ADMIN) || $user->id == $pool['user_id']) { // OR if the user is admin
return true; // OR if the pool is owned by the user.
} else { return (
return false; ($pool->public && !$user->is_anonymous()) ||
} $user->can(Permissions::POOLS_ADMIN) ||
$user->id == $pool->user_id
);
} }
private function list_pools(Page $page, int $pageNumber) private function list_pools(Page $page, int $pageNumber)
@ -509,15 +589,14 @@ class Pools extends Extension
$order_by = "ORDER BY p.posts DESC"; $order_by = "ORDER BY p.posts DESC";
} }
$pools = $database->get_all(" $pools = array_map([Pool::class, "makePool"], $database->get_all("
SELECT p.id, p.user_id, p.public, p.title, p.description, SELECT p.*, u.name as user_name
p.posts, u.name as user_name
FROM pools AS p FROM pools AS p
INNER JOIN users AS u INNER JOIN users AS u
ON p.user_id = u.id ON p.user_id = u.id
$order_by $order_by
LIMIT :l OFFSET :o LIMIT :l OFFSET :o
", ["l" => $poolsPerPage, "o" => $pageNumber * $poolsPerPage]); ", ["l" => $poolsPerPage, "o" => $pageNumber * $poolsPerPage]));
$totalPages = (int)ceil((int)$database->get_one("SELECT COUNT(*) FROM pools") / $poolsPerPage); $totalPages = (int)ceil((int)$database->get_one("SELECT COUNT(*) FROM pools") / $poolsPerPage);
@ -542,7 +621,7 @@ class Pools extends Extension
" "
INSERT INTO pools (user_id, public, title, description, date) INSERT INTO pools (user_id, public, title, description, date)
VALUES (:uid, :public, :title, :desc, now())", VALUES (:uid, :public, :title, :desc, now())",
["uid" => $event->user->id, "public" => $event->public ? "Y" : "N", "title" => $event->title, "desc" => $event->description] ["uid" => $event->user->id, "public" => $event->public, "title" => $event->title, "desc" => $event->description]
); );
$poolID = $database->get_last_insert_id('pools_id_seq'); $poolID = $database->get_last_insert_id('pools_id_seq');
@ -551,33 +630,23 @@ class Pools extends Extension
$event->new_id = $poolID; $event->new_id = $poolID;
} }
/**
* Retrieve information about pools given multiple pool IDs.
*
* TODO: What is the difference between this and get_single_pool() other than the db query?
*/
private function get_pool(int $poolID): array
{
global $database;
return $database->get_all("SELECT * FROM pools WHERE id=:id", ["id" => $poolID]);
}
/** /**
* Retrieve information about a pool given a pool ID. * Retrieve information about a pool given a pool ID.
*/ */
private function get_single_pool(int $poolID): array private function get_single_pool(int $poolID): Pool
{ {
global $database; global $database;
return $database->get_row("SELECT * FROM pools WHERE id=:id", ["id" => $poolID]); return new Pool($database->get_row("SELECT * FROM pools WHERE id=:id", ["id" => $poolID]));
} }
/** /**
* Retrieve information about a pool given a pool title. * Retrieve information about a pool given a pool title.
*/ */
private function get_single_pool_from_title(string $poolTitle): ?array private function get_single_pool_from_title(string $poolTitle): ?Pool
{ {
global $database; global $database;
return $database->get_row("SELECT * FROM pools WHERE title=:title", ["title" => $poolTitle]); $row = $database->get_row("SELECT * FROM pools WHERE title=:title", ["title" => $poolTitle]);
return $row ? new Pool($row) : null;
} }
/** /**
@ -595,23 +664,10 @@ class Pools extends Extension
/** /**
* Retrieve information about the last pool the given userID created * Retrieve information about the last pool the given userID created
*/ */
private function get_last_userpool(int $userID): array private function get_last_userpool(int $userID): Pool
{ {
global $database; global $database;
return $database->get_row("SELECT * FROM pools WHERE user_id=:uid ORDER BY id DESC", ["uid" => $userID]); return new Pool($database->get_row("SELECT * FROM pools WHERE user_id=:uid ORDER BY id DESC", ["uid" => $userID]));
}
/**
* HERE WE GET THE IMAGES FROM THE TAG ON IMPORT
*/
private function import_posts(int $pool_id)
{
global $page, $config;
$poolsMaxResults = $config->get_int(PoolsConfig::MAX_IMPORT_RESULTS, 1000);
$images = $images = Image::find_images(0, $poolsMaxResults, Tag::explode($_POST["pool_tag"]));
$this->theme->pool_result($page, $images, $this->get_pool($pool_id));
} }
/** /**
@ -634,94 +690,28 @@ class Pools extends Extension
} }
if (!strlen($images) == 0) { if (!strlen($images) == 0) {
$count = int_escape($database->get_one("SELECT COUNT(*) FROM pool_images WHERE pool_id=:pid", ["pid" => $event->pool_id])); $count = (int)$database->get_one(
"SELECT COUNT(*) FROM pool_images WHERE pool_id=:pid",
["pid" => $event->pool_id]
);
$this->add_history($event->pool_id, 1, $images, $count); $this->add_history($event->pool_id, 1, $images, $count);
} }
} }
/**
* TODO: Fix this so that the pool ID and images are passed as Arguments to the function.
*/
private function order_posts(): int
{
global $database;
$poolID = int_escape($_POST['pool_id']);
foreach ($_POST['imgs'] as $data) {
list($imageORDER, $imageID) = $data;
$database->execute(
"
UPDATE pool_images
SET image_order = :ord
WHERE pool_id = :pid AND image_id = :iid",
["ord" => $imageORDER, "pid" => $poolID, "iid" => $imageID]
);
}
return $poolID;
}
/**
* HERE WE REMOVE CHECKED IMAGES FROM POOL AND UPDATE THE HISTORY
*
* TODO: Fix this so that the pool ID and images are passed as Arguments to the function.
*/
private function remove_posts(): int
{
global $database;
$poolID = int_escape($_POST['pool_id']);
$images = "";
foreach ($_POST['check'] as $imageID) {
$database->execute("DELETE FROM pool_images WHERE pool_id = :pid AND image_id = :iid", ["pid" => $poolID, "iid" => $imageID]);
$images .= " " . $imageID;
}
$count = (int)$database->get_one("SELECT COUNT(*) FROM pool_images WHERE pool_id=:pid", ["pid" => $poolID]);
$this->add_history($poolID, 0, $images, $count);
return $poolID;
}
/**
* Allows editing of pool description.
*/
private function edit_description(): int
{
global $database;
$poolID = int_escape($_POST['pool_id']);
$database->execute("UPDATE pools SET description=:dsc WHERE id=:pid", ["dsc" => $_POST['description'], "pid" => $poolID]);
return $poolID;
}
/**
* This function checks if a given image is contained within a given pool.
* Used by add_posts()
*/
private function check_post(int $poolID, int $imageID): bool
{
global $database;
$result = (int)$database->get_one("SELECT COUNT(*) FROM pool_images WHERE pool_id=:pid AND image_id=:iid", ["pid" => $poolID, "iid" => $imageID]);
return ($result != 0);
}
/** /**
* Gets the previous and next successive images from a pool, given a pool ID and an image ID. * Gets the previous and next successive images from a pool, given a pool ID and an image ID.
* *
* #return int[] Array returning two elements (prev, next) in 1 dimension. Each returns ImageID or NULL if none. * #return int[] Array returning two elements (prev, next) in 1 dimension. Each returns ImageID or NULL if none.
*/ */
private function get_nav_posts(array $pool, int $imageID): array private function get_nav_posts(Pool $pool, int $imageID): array
{ {
global $database; global $database;
if (empty($pool) || empty($imageID)) { if (empty($imageID)) {
return null; return null;
} }
$result = $database->get_row( return $database->get_row(
" "
SELECT ( SELECT (
SELECT image_id SELECT image_id
@ -751,15 +741,8 @@ class Pools extends Extension
) AS next ) AS next
LIMIT 1", LIMIT 1",
["pid" => $pool['id'], "iid" => $imageID] ["pid" => $pool->id, "iid" => $imageID]
); );
if (empty($result)) {
// assume that we are at the end of the pool
return null;
} else {
return $result;
}
} }
/** /**
@ -770,12 +753,12 @@ class Pools extends Extension
global $config, $user, $database; global $config, $user, $database;
$pageNumber = $event->try_page_num(2) - 1; $pageNumber = $event->try_page_num(2) - 1;
$pool = $this->get_pool($poolID); $pool = $this->get_single_pool($poolID);
$imagesPerPage = $config->get_int(PoolsConfig::IMAGES_PER_PAGE); $imagesPerPage = $config->get_int(PoolsConfig::IMAGES_PER_PAGE);
$query = " $query = "
INNER JOIN images AS i ON i.id = p.image_id INNER JOIN images AS i ON i.id = p.image_id
WHERE p.pool_id = :pid WHERE p.pool_id = :pid
"; ";
// WE CHECK IF THE EXTENSION RATING IS INSTALLED, WHICH VERSION AND IF IT // WE CHECK IF THE EXTENSION RATING IS INSTALLED, WHICH VERSION AND IF IT
@ -784,7 +767,7 @@ class Pools extends Extension
$query .= "AND i.rating IN (".Ratings::privs_to_sql(Ratings::get_user_class_privs($user)).")"; $query .= "AND i.rating IN (".Ratings::privs_to_sql(Ratings::get_user_class_privs($user)).")";
} }
if (Extension::is_enabled(TrashInfo::KEY)) { if (Extension::is_enabled(TrashInfo::KEY)) {
$query .= $database->scoreql_to_sql(" AND trash = SCORE_BOOL_N "); $query .= $database->scoreql_to_sql(" AND trash = SCORE_BOOL_N ");
} }
$result = $database->get_all( $result = $database->get_all(
@ -809,52 +792,6 @@ class Pools extends Extension
$this->theme->view_pool($pool, $images, $pageNumber + 1, $totalPages); $this->theme->view_pool($pool, $images, $pageNumber + 1, $totalPages);
} }
/**
* This function gets the current order of images from a given pool.
* #return Image[] Array of image objects.
*/
private function edit_posts(int $poolID): array
{
global $database;
$result = $database->execute("SELECT image_id FROM pool_images WHERE pool_id=:pid ORDER BY image_order ASC", ["pid" => $poolID]);
$images = [];
while ($row = $result->fetch()) {
$image = Image::by_id((int)$row["image_id"]);
$images[] = [$image];
}
return $images;
}
/**
* WE GET THE ORDER OF THE IMAGES BUT HERE WE SEND KEYS ADDED IN ARRAY TO GET THE ORDER IN THE INPUT VALUE.
*
* #return Image[]
*/
private function edit_order(int $poolID): array
{
global $database;
$result = $database->execute("SELECT image_id FROM pool_images WHERE pool_id=:pid ORDER BY image_order ASC", ["pid" => $poolID]);
$images = [];
while ($row = $result->fetch()) {
$image = $database->get_row(
"
SELECT * FROM images AS i
INNER JOIN pool_images AS p ON i.id = p.image_id
WHERE pool_id=:pid AND i.id=:iid",
["pid" => $poolID, "iid" => (int)$row['image_id']]
);
$image = ($image ? new Image($image) : null);
$images[] = [$image];
}
return $images;
}
/** /**
* HERE WE NUKE ENTIRE POOL. WE REMOVE POOLS AND POSTS FROM REMOVED POOL AND HISTORIES ENTRIES FROM REMOVED POOL. * HERE WE NUKE ENTIRE POOL. WE REMOVE POOLS AND POSTS FROM REMOVED POOL AND HISTORIES ENTRIES FROM REMOVED POOL.
*/ */
@ -948,13 +885,15 @@ class Pools extends Extension
} }
} elseif ($entry['action'] == 1) { } elseif ($entry['action'] == 1) {
// DELETE ENTRIES // DELETE ENTRIES
foreach ($images as $image) { foreach ($images as $imageID) {
$imageID = $image; $database->execute(
$this->delete_post($poolID, $imageID); "DELETE FROM pool_images WHERE pool_id = :pid AND image_id = :iid",
["pid" => $poolID, "iid" => $imageID]
);
$imageArray .= " " . $imageID; $imageArray .= " " . $imageID;
$newAction = 0; $newAction = 0;
} }
$this->update_count($poolID);
} else { } else {
// FIXME: should this throw an exception instead? // FIXME: should this throw an exception instead?
log_error("pools", "Invalid history action."); log_error("pools", "Invalid history action.");
@ -974,7 +913,12 @@ class Pools extends Extension
{ {
global $database, $config; global $database, $config;
if (!$this->check_post($poolID, $imageID)) { $result = (int)$database->get_one(
"SELECT COUNT(*) FROM pool_images WHERE pool_id=:pid AND image_id=:iid",
["pid" => $poolID, "iid" => $imageID]
);
if ($result == 0) {
if ($config->get_bool(PoolsConfig::AUTO_INCREMENT_ORDER) && $imageOrder === 0) { if ($config->get_bool(PoolsConfig::AUTO_INCREMENT_ORDER) && $imageOrder === 0) {
$imageOrder = (int)$database->get_one( $imageOrder = (int)$database->get_one(
" "
@ -1005,27 +949,12 @@ class Pools extends Extension
return true; return true;
} }
private function update_count($pool_id) private function update_count(int $pool_id)
{ {
global $database; global $database;
$database->execute("UPDATE pools SET posts=(SELECT COUNT(*) FROM pool_images WHERE pool_id=:pid) WHERE id=:pid", ["pid" => $pool_id]); $database->execute(
} "UPDATE pools SET posts=(SELECT COUNT(*) FROM pool_images WHERE pool_id=:pid) WHERE id=:pid",
["pid" => $pool_id]
/** );
* HERE WE REMOVE A SIMPLE POST FROM POOL.
* USED WITH FOREACH IN revert_history() & onTagTermParse().
*/
private function delete_post(int $poolID, int $imageID, bool $history = false)
{
global $database;
$database->execute("DELETE FROM pool_images WHERE pool_id = :pid AND image_id = :iid", ["pid" => $poolID, "iid" => $imageID]);
$this->update_count($poolID);
if ($history) {
$count = (int)$database->get_one("SELECT COUNT(*) FROM pool_images WHERE pool_id=:pid", ["pid" => $poolID]);
$this->add_history($poolID, 0, (string)$imageID, $count);
}
} }
} }

View File

@ -39,6 +39,7 @@ class PoolsTest extends ShimmiePHPUnitTestCase
global $config; global $config;
$config->set_bool(PoolsConfig::ADDER_ON_VIEW_IMAGE, true); $config->set_bool(PoolsConfig::ADDER_ON_VIEW_IMAGE, true);
$config->set_bool(PoolsConfig::INFO_ON_VIEW_IMAGE, true); $config->set_bool(PoolsConfig::INFO_ON_VIEW_IMAGE, true);
$config->set_bool(PoolsConfig::SHOW_NAV_LINKS, true);
$this->get_page("post/view/{$image_ids[0]}"); $this->get_page("post/view/{$image_ids[0]}");
$this->assert_text("Pool"); $this->assert_text("Pool");

View File

@ -11,16 +11,16 @@ class PoolsTheme extends Themelet
global $page; global $page;
$linksPools = []; $linksPools = [];
foreach ($navIDs as $poolID => $pool) { foreach ($navIDs as $poolID => $poolInfo) {
$linksPools[] = "<a href='" . make_link("pool/view/" . $poolID) . "'>" . html_escape($pool['info']['title']) . "</a>"; $linksPools[] = "<a href='" . make_link("pool/view/" . $poolID) . "'>" . html_escape($poolInfo['info']->title) . "</a>";
if (array_key_exists('nav', $pool)) { if (!empty($poolInfo['nav'])) {
$navlinks = ""; $navlinks = "";
if (!empty($pool['nav']['prev'])) { if (!empty($poolInfo['nav']['prev'])) {
$navlinks .= '<a href="' . make_link('post/view/' . $pool['nav']['prev']) . '" class="pools_prev_img">Prev</a>'; $navlinks .= '<a href="' . make_link('post/view/' . $poolInfo['nav']['prev']) . '" class="pools_prev_img">Prev</a>';
} }
if (!empty($pool['nav']['next'])) { if (!empty($poolInfo['nav']['next'])) {
$navlinks .= '<a href="' . make_link('post/view/' . $pool['nav']['next']) . '" class="pools_next_img">Next</a>'; $navlinks .= '<a href="' . make_link('post/view/' . $poolInfo['nav']['next']) . '" class="pools_next_img">Next</a>';
} }
if (!empty($navlinks)) { if (!empty($navlinks)) {
$navlinks .= "<div style='height: 5px'></div>"; $navlinks .= "<div style='height: 5px'></div>";
@ -38,7 +38,7 @@ class PoolsTheme extends Themelet
{ {
$h = ""; $h = "";
foreach ($pools as $pool) { foreach ($pools as $pool) {
$h .= "<option value='" . $pool['id'] . "'>" . html_escape($pool['title']) . "</option>"; $h .= "<option value='" . $pool->id . "'>" . html_escape($pool->title) . "</option>";
} }
return "\n" . make_form(make_link("pool/add_post")) . " return "\n" . make_form(make_link("pool/add_post")) . "
<select name='pool_id'> <select name='pool_id'>
@ -66,14 +66,14 @@ class PoolsTheme extends Themelet
// Build up the list of pools. // Build up the list of pools.
foreach ($pools as $pool) { foreach ($pools as $pool) {
$pool_link = '<a href="' . make_link("pool/view/" . $pool['id']) . '">' . html_escape($pool['title']) . "</a>"; $pool_link = '<a href="' . make_link("pool/view/" . $pool->id) . '">' . html_escape($pool->title) . "</a>";
$user_link = '<a href="' . make_link("user/" . url_escape($pool['user_name'])) . '">' . html_escape($pool['user_name']) . "</a>"; $user_link = '<a href="' . make_link("user/" . url_escape($pool->user_name)) . '">' . html_escape($pool->user_name) . "</a>";
$public = ($pool['public'] == "Y" ? "Yes" : "No"); $public = ($pool->public ? "Yes" : "No");
$html .= "<tr>" . $html .= "<tr>" .
"<td class='left'>" . $pool_link . "</td>" . "<td class='left'>" . $pool_link . "</td>" .
"<td>" . $user_link . "</td>" . "<td>" . $user_link . "</td>" .
"<td>" . $pool['posts'] . "</td>" . "<td>" . $pool->posts . "</td>" .
"<td>" . $public . "</td>" . "<td>" . $public . "</td>" .
"</tr>"; "</tr>";
} }
@ -118,7 +118,7 @@ class PoolsTheme extends Themelet
$page->add_block(new Block("Create Pool", $create_html, "main", 20)); $page->add_block(new Block("Create Pool", $create_html, "main", 20));
} }
private function display_top(?array $pools, string $heading, bool $check_all = false) private function display_top(?Pool $pool, string $heading, bool $check_all = false)
{ {
global $page, $user; global $page, $user;
@ -134,28 +134,26 @@ class PoolsTheme extends Themelet
$page->add_block(new NavBlock()); $page->add_block(new NavBlock());
$page->add_block(new Block("Pool Navigation", $poolnav_html, "left", 10)); $page->add_block(new Block("Pool Navigation", $poolnav_html, "left", 10));
if (!is_null($pools) && count($pools) == 1) { if (!is_null($pool)) {
$pool = $pools[0]; if ($pool->public || $user->can(Permissions::POOLS_ADMIN)) {// IF THE POOL IS PUBLIC OR IS ADMIN SHOW EDIT PANEL
if ($pool['public'] == "Y" || $user->can(Permissions::POOLS_ADMIN)) {// IF THE POOL IS PUBLIC OR IS ADMIN SHOW EDIT PANEL
if (!$user->is_anonymous()) {// IF THE USER IS REGISTERED AND LOGGED IN SHOW EDIT PANEL if (!$user->is_anonymous()) {// IF THE USER IS REGISTERED AND LOGGED IN SHOW EDIT PANEL
$this->sidebar_options($page, $pool, $check_all); $this->sidebar_options($page, $pool, $check_all);
} }
} }
$tfe = new TextFormattingEvent($pool->description);
$tfe = new TextFormattingEvent($pool['description']);
send_event($tfe); send_event($tfe);
$page->add_block(new Block(html_escape($pool['title']), $tfe->formatted, "main", 10)); $page->add_block(new Block(html_escape($pool->title), $tfe->formatted, "main", 10));
} }
} }
/** /**
* HERE WE DISPLAY THE POOL WITH TITLE DESCRIPTION AND IMAGES WITH PAGINATION. * HERE WE DISPLAY THE POOL WITH TITLE DESCRIPTION AND IMAGES WITH PAGINATION.
*/ */
public function view_pool(array $pools, array $images, int $pageNumber, int $totalPages) public function view_pool(Pool $pool, array $images, int $pageNumber, int $totalPages)
{ {
global $page; global $page;
$this->display_top($pools, "Pool: " . html_escape($pools[0]['title'])); $this->display_top($pool, "Pool: " . html_escape($pool->title));
$pool_images = ''; $pool_images = '';
foreach ($images as $image) { foreach ($images as $image) {
@ -164,37 +162,37 @@ class PoolsTheme extends Themelet
} }
$page->add_block(new Block("Viewing Posts", $pool_images, "main", 30)); $page->add_block(new Block("Viewing Posts", $pool_images, "main", 30));
$this->display_paginator($page, "pool/view/" . $pools[0]['id'], null, $pageNumber, $totalPages); $this->display_paginator($page, "pool/view/" . $pool->id, null, $pageNumber, $totalPages);
} }
/** /**
* HERE WE DISPLAY THE POOL OPTIONS ON SIDEBAR BUT WE HIDE REMOVE OPTION IF THE USER IS NOT THE OWNER OR ADMIN. * HERE WE DISPLAY THE POOL OPTIONS ON SIDEBAR BUT WE HIDE REMOVE OPTION IF THE USER IS NOT THE OWNER OR ADMIN.
*/ */
public function sidebar_options(Page $page, array $pool, bool $check_all) public function sidebar_options(Page $page, Pool $pool, bool $check_all)
{ {
global $user; global $user;
$editor = "\n" . make_form(make_link('pool/import')) . ' $editor = "\n" . make_form(make_link('pool/import')) . '
<input type="text" name="pool_tag" id="edit_pool_tag" placeholder="Please enter a tag"/> <input type="text" name="pool_tag" id="edit_pool_tag" placeholder="Please enter a tag"/>
<input type="submit" name="edit" id="edit_pool_import_btn" value="Import"/> <input type="submit" name="edit" id="edit_pool_import_btn" value="Import"/>
<input type="hidden" name="pool_id" value="' . $pool['id'] . '"> <input type="hidden" name="pool_id" value="' . $pool->id . '">
</form> </form>
' . make_form(make_link('pool/edit')) . ' ' . make_form(make_link('pool/edit')) . '
<input type="submit" name="edit" id="edit_pool_btn" value="Edit Pool"/> <input type="submit" name="edit" id="edit_pool_btn" value="Edit Pool"/>
<input type="hidden" name="edit_pool" value="yes"> <input type="hidden" name="edit_pool" value="yes">
<input type="hidden" name="pool_id" value="' . $pool['id'] . '"> <input type="hidden" name="pool_id" value="' . $pool->id . '">
</form> </form>
' . make_form(make_link('pool/order')) . ' ' . make_form(make_link('pool/order')) . '
<input type="submit" name="edit" id="edit_pool_order_btn" value="Order Pool"/> <input type="submit" name="edit" id="edit_pool_order_btn" value="Order Pool"/>
<input type="hidden" name="order_view" value="yes"> <input type="hidden" name="order_view" value="yes">
<input type="hidden" name="pool_id" value="' . $pool['id'] . '"> <input type="hidden" name="pool_id" value="' . $pool->id . '">
</form> </form>
'; ';
if ($user->id == $pool['user_id'] || $user->can(Permissions::POOLS_ADMIN)) { if ($user->id == $pool->user_id || $user->can(Permissions::POOLS_ADMIN)) {
$editor .= " $editor .= "
<script type='text/javascript'> <script type='text/javascript'>
<!-- <!--
@ -206,7 +204,7 @@ class PoolsTheme extends Themelet
" . make_form(make_link("pool/nuke")) . " " . make_form(make_link("pool/nuke")) . "
<input type='submit' name='delete' id='delete_pool_btn' value='Delete Pool' onclick='return confirm_action()' /> <input type='submit' name='delete' id='delete_pool_btn' value='Delete Pool' onclick='return confirm_action()' />
<input type='hidden' name='pool_id' value='" . $pool['id'] . "'> <input type='hidden' name='pool_id' value='" . $pool->id . "'>
</form> </form>
"; ";
} }
@ -231,7 +229,7 @@ class PoolsTheme extends Themelet
/** /**
* HERE WE DISPLAY THE RESULT OF THE SEARCH ON IMPORT. * HERE WE DISPLAY THE RESULT OF THE SEARCH ON IMPORT.
*/ */
public function pool_result(Page $page, array $images, array $pool) public function pool_result(Page $page, array $images, Pool $pool)
{ {
$this->display_top($pool, "Importing Posts", true); $this->display_top($pool, "Importing Posts", true);
$pool_images = " $pool_images = "
@ -256,7 +254,7 @@ class PoolsTheme extends Themelet
$pool_images .= "<br>" . $pool_images .= "<br>" .
"<input type='submit' name='edit' id='edit_pool_add_btn' value='Add Selected' onclick='return confirm_action()'/>" . "<input type='submit' name='edit' id='edit_pool_add_btn' value='Add Selected' onclick='return confirm_action()'/>" .
"<input type='hidden' name='pool_id' value='" . $pool[0]['id'] . "'>" . "<input type='hidden' name='pool_id' value='" . $pool->id . "'>" .
"</form>"; "</form>";
$page->add_block(new Block("Import", $pool_images, "main", 30)); $page->add_block(new Block("Import", $pool_images, "main", 30));
@ -267,14 +265,13 @@ class PoolsTheme extends Themelet
* HERE WE DISPLAY THE POOL ORDERER. * HERE WE DISPLAY THE POOL ORDERER.
* WE LIST ALL IMAGES ON POOL WITHOUT PAGINATION AND WITH A TEXT INPUT TO SET A NUMBER AND CHANGE THE ORDER * WE LIST ALL IMAGES ON POOL WITHOUT PAGINATION AND WITH A TEXT INPUT TO SET A NUMBER AND CHANGE THE ORDER
*/ */
public function edit_order(Page $page, array $pools, array $images) public function edit_order(Page $page, Pool $pool, array $images)
{ {
$this->display_top($pools, "Sorting Pool"); $this->display_top($pool, "Sorting Pool");
$pool_images = "\n<form action='" . make_link("pool/order") . "' method='POST' name='checks'>"; $pool_images = "\n<form action='" . make_link("pool/order") . "' method='POST' name='checks'>";
$i = 0; $i = 0;
foreach ($images as $pair) { foreach ($images as $image) {
$image = $pair[0];
$thumb_html = $this->build_thumb_html($image); $thumb_html = $this->build_thumb_html($image);
$pool_images .= '<span class="thumb">' . "\n" . $thumb_html . "\n" . $pool_images .= '<span class="thumb">' . "\n" . $thumb_html . "\n" .
'<br><input name="imgs[' . $i . '][]" type="number" style="max-width:50px;" value="' . $image->image_order . '" />' . '<br><input name="imgs[' . $i . '][]" type="number" style="max-width:50px;" value="' . $image->image_order . '" />' .
@ -285,7 +282,7 @@ class PoolsTheme extends Themelet
$pool_images .= "<br>" . $pool_images .= "<br>" .
"<input type='submit' name='edit' id='edit_pool_order' value='Order'/>" . "<input type='submit' name='edit' id='edit_pool_order' value='Order'/>" .
"<input type='hidden' name='pool_id' value='" . $pools[0]['id'] . "'>" . "<input type='hidden' name='pool_id' value='" . $pool->id . "'>" .
"</form>"; "</form>";
$page->add_block(new Block("Sorting Posts", $pool_images, "main", 30)); $page->add_block(new Block("Sorting Posts", $pool_images, "main", 30));
@ -297,13 +294,13 @@ class PoolsTheme extends Themelet
* WE LIST ALL IMAGES ON POOL WITHOUT PAGINATION AND WITH * WE LIST ALL IMAGES ON POOL WITHOUT PAGINATION AND WITH
* A CHECKBOX TO SELECT WHICH IMAGE WE WANT TO REMOVE * A CHECKBOX TO SELECT WHICH IMAGE WE WANT TO REMOVE
*/ */
public function edit_pool(Page $page, array $pools, array $images) public function edit_pool(Page $page, Pool $pool, array $images)
{ {
/* EDIT POOL DESCRIPTION */ /* EDIT POOL DESCRIPTION */
$desc_html = " $desc_html = "
" . make_form(make_link("pool/edit_description")) . " " . make_form(make_link("pool/edit_description")) . "
<textarea name='description'>" . $pools[0]['description'] . "</textarea><br /> <textarea name='description'>" . $pool->description . "</textarea><br />
<input type='hidden' name='pool_id' value='" . $pools[0]['id'] . "'> <input type='hidden' name='pool_id' value='" . $pool->id . "'>
<input type='submit' value='Change Description' /> <input type='submit' value='Change Description' />
</form> </form>
"; ";
@ -311,9 +308,7 @@ class PoolsTheme extends Themelet
/* REMOVE POOLS */ /* REMOVE POOLS */
$pool_images = "\n<form action='" . make_link("pool/remove_posts") . "' method='POST' name='checks'>"; $pool_images = "\n<form action='" . make_link("pool/remove_posts") . "' method='POST' name='checks'>";
foreach ($images as $pair) { foreach ($images as $image) {
$image = $pair[0];
$thumb_html = $this->build_thumb_html($image); $thumb_html = $this->build_thumb_html($image);
$pool_images .= '<span class="thumb">' . "\n" . $thumb_html . "\n" . $pool_images .= '<span class="thumb">' . "\n" . $thumb_html . "\n" .
@ -323,16 +318,15 @@ class PoolsTheme extends Themelet
$pool_images .= "<br>" . $pool_images .= "<br>" .
"<input type='submit' name='edit' id='edit_pool_remove_sel' value='Remove Selected'/>" . "<input type='submit' name='edit' id='edit_pool_remove_sel' value='Remove Selected'/>" .
"<input type='hidden' name='pool_id' value='" . $pools[0]['id'] . "'>" . "<input type='hidden' name='pool_id' value='" . $pool->id . "'>" .
"</form>"; "</form>";
$pools[0]['description'] = ""; //This is a rough fix to avoid showing the description twice. $pool->description = ""; //This is a rough fix to avoid showing the description twice.
$this->display_top($pools, "Editing Pool", true); $this->display_top($pool, "Editing Pool", true);
$page->add_block(new Block("Editing Description", $desc_html, "main", 28)); $page->add_block(new Block("Editing Description", $desc_html, "main", 28));
$page->add_block(new Block("Editing Posts", $pool_images, "main", 30)); $page->add_block(new Block("Editing Posts", $pool_images, "main", 30));
} }
/** /**
* HERE WE DISPLAY THE HISTORY LIST. * HERE WE DISPLAY THE HISTORY LIST.
*/ */
@ -393,7 +387,7 @@ class PoolsTheme extends Themelet
{ {
$output = "<select name='bulk_pool_select' required='required'><option></option>"; $output = "<select name='bulk_pool_select' required='required'><option></option>";
foreach ($pools as $pool) { foreach ($pools as $pool) {
$output .= "<option value='" . $pool["id"] . "' >" . $pool["title"] . "</option>"; $output .= "<option value='" . $pool->id . "' >" . $pool->title . "</option>";
} }
return $output . "</select>"; return $output . "</select>";
} }
@ -403,7 +397,6 @@ class PoolsTheme extends Themelet
return "<input type='text' name='bulk_pool_new' placeholder='New pool' required='required' value='".(implode(" ", $search_terms))."' />"; return "<input type='text' name='bulk_pool_new' placeholder='New pool' required='required' value='".(implode(" ", $search_terms))."' />";
} }
public function get_help_html() public function get_help_html()
{ {
return '<p>Search for images that are in a pool.</p> return '<p>Search for images that are in a pool.</p>