From 05ac7884e93a29e3758d60a5faacda3c270c3f65 Mon Sep 17 00:00:00 2001 From: Alex Cabal Date: Fri, 15 Nov 2024 23:11:01 -0600 Subject: [PATCH] Convert artwork filters to enums --- lib/Artwork.php | 63 ++++++++++++----------- lib/Enums/ArtworkFilterType.php | 14 ++++++ www/artists/get.php | 8 +-- www/artworks/index.php | 88 ++++++++++++++++++++------------- 4 files changed, 104 insertions(+), 69 deletions(-) create mode 100644 lib/Enums/ArtworkFilterType.php diff --git a/lib/Artwork.php b/lib/Artwork.php index 374507ea..6033cd8f 100644 --- a/lib/Artwork.php +++ b/lib/Artwork.php @@ -930,29 +930,29 @@ class Artwork{ * * @throws Exceptions\ArtistNotFoundException */ - public static function GetAllByArtist(?string $artistUrlName, ?string $status, ?int $submitterUserId): array{ + public static function GetAllByArtist(?string $artistUrlName, ?Enums\ArtworkFilterType $artworkFilterType, ?int $submitterUserId): array{ if($artistUrlName === null){ throw new Exceptions\ArtistNotFoundException(); } - // $status is only one of three special statuses, which are a subset of FilterArtwork() above: - // null: same as "all" - // "all": Show all approved and in use artwork - // "all-admin": Show all artwork regardless of status - // "all-submitter": Show all approved and in use artwork, plus unverified artwork from the submitter + if($artworkFilterType === null){ + $artworkFilterType = Enums\ArtworkFilterType::Approved; + } + $statusCondition = ''; $params = []; - if($status == 'all-admin'){ + if($artworkFilterType == Enums\ArtworkFilterType::Admin){ $statusCondition = 'true'; } - elseif($status == 'all-submitter' && $submitterUserId !== null){ + elseif($artworkFilterType == Enums\ArtworkFilterType::ApprovedSubmitter && $submitterUserId !== null){ $statusCondition = '(Status = ? or (Status = ? and SubmitterUserId = ?))'; $params[] = Enums\ArtworkStatusType::Approved->value; $params[] = Enums\ArtworkStatusType::Unverified->value; $params[] = $submitterUserId; } else{ + // Default to the `Enums\ArtworkFilterType::Approved` view. $statusCondition = 'Status = ?'; $params[] = Enums\ArtworkStatusType::Approved->value; } @@ -973,47 +973,48 @@ class Artwork{ /** * @return array{artworks: array, artworksCount: int} */ - public static function GetAllByFilter(?string $query = null, ?string $status = null, ?Enums\ArtworkSortType $sort = null, ?int $submitterUserId = null, int $page = 1, int $perPage = ARTWORK_PER_PAGE): array{ - // $status is either the string value of an ArtworkStatus enum, or one of these special statuses: - // null: same as "all" - // "all": Show all approved and in use artwork - // "all-admin": Show all artwork regardless of status - // "all-submitter": Show all approved and in use artwork, plus unverified artwork from the submitter - // "unverified-submitter": Show unverified artwork from the submitter - // "in-use": Show only in-use artwork + public static function GetAllByFilter(?string $query = null, ?Enums\ArtworkFilterType $artworkFilterType = null, ?Enums\ArtworkSortType $sort = null, ?int $submitterUserId = null, int $page = 1, int $perPage = ARTWORK_PER_PAGE): array{ + if($artworkFilterType === null){ + $artworkFilterType = Enums\ArtworkFilterType::Approved; + } $statusCondition = ''; $params = []; - if($status === null || $status == 'all'){ - $statusCondition = 'Status = ?'; - $params[] = Enums\ArtworkStatusType::Approved->value; - } - elseif($status == 'all-admin'){ + if($artworkFilterType == Enums\ArtworkFilterType::Admin){ $statusCondition = 'true'; } - elseif($status == 'all-submitter' && $submitterUserId !== null){ + elseif($artworkFilterType == Enums\ArtworkFilterType::ApprovedSubmitter && $submitterUserId !== null){ $statusCondition = '(Status = ? or (Status = ? and SubmitterUserId = ?))'; $params[] = Enums\ArtworkStatusType::Approved->value; $params[] = Enums\ArtworkStatusType::Unverified->value; $params[] = $submitterUserId; } - elseif($status == 'unverified-submitter' && $submitterUserId !== null){ + elseif($artworkFilterType == Enums\ArtworkFilterType::UnverifiedSubmitter && $submitterUserId !== null){ $statusCondition = 'Status = ? and SubmitterUserId = ?'; $params[] = Enums\ArtworkStatusType::Unverified->value; $params[] = $submitterUserId; } - elseif($status == 'in-use'){ + elseif($artworkFilterType == Enums\ArtworkFilterType::ApprovedInUse){ $statusCondition = 'Status = ? and EbookUrl is not null'; $params[] = Enums\ArtworkStatusType::Approved->value; } - elseif($status == Enums\ArtworkStatusType::Approved->value){ + elseif($artworkFilterType == Enums\ArtworkFilterType::ApprovedNotInUse){ $statusCondition = 'Status = ? and EbookUrl is null'; $params[] = Enums\ArtworkStatusType::Approved->value; } - else{ + elseif($artworkFilterType == Enums\ArtworkFilterType::Declined){ $statusCondition = 'Status = ?'; - $params[] = $status; + $params[] = Enums\ArtworkStatusType::Declined->value; + } + elseif($artworkFilterType == Enums\ArtworkFilterType::Unverified){ + $statusCondition = 'Status = ?'; + $params[] = Enums\ArtworkStatusType::Unverified->value; + } + else{ + // Default to the `Enums\ArtworkFilterType::Approved` view. + $statusCondition = 'Status = ?'; + $params[] = Enums\ArtworkStatusType::Approved->value; } $orderBy = 'art.Created desc'; @@ -1024,7 +1025,7 @@ class Artwork{ $orderBy = 'art.CompletedYear desc'; } - // Remove diacritics and non-alphanumeric characters, but preserve apostrophes + // Remove diacritics and non-alphanumeric characters, but preserve apostrophes. if($query !== null && $query != ''){ $query = trim(preg_replace('|[^a-zA-Z0-9\'’ ]|ius', ' ', Formatter::RemoveDiacritics($query))); } @@ -1032,9 +1033,7 @@ class Artwork{ $query = ''; } - // We use replace() below because if there's multiple contributors separated by an underscore, - // the underscore won't count as word boundary and we won't get a match. - // See https://github.com/standardebooks/web/pull/325 + // We use `replace()` below because if there's multiple contributors separated by an underscore, the underscore won't count as word boundary and we won't get a match. See . $limit = $perPage; $offset = (($page - 1) * $perPage); @@ -1060,7 +1059,7 @@ class Artwork{ // Split the query on word boundaries followed by spaces. This keeps words with apostrophes intact. $tokenArray = preg_split('/\b\s+/', $query, -1, PREG_SPLIT_NO_EMPTY); - // Join the tokens with '|' to search on any token, but add word boundaries to force the full token to match + // Join the tokens with `|` to search on any token, but add word boundaries to force the full token to match. $tokenizedQuery = '\b(' . implode('|', $tokenArray) . ')\b'; $params[] = $tokenizedQuery; // art.Name diff --git a/lib/Enums/ArtworkFilterType.php b/lib/Enums/ArtworkFilterType.php new file mode 100644 index 00000000..0293eaee --- /dev/null +++ b/lib/Enums/ArtworkFilterType.php @@ -0,0 +1,14 @@ +Benefits?->CanReviewArtwork ?? false; $submitterUserId = Session::$User?->Benefits?->CanUploadArtwork ? Session::$User->UserId : null; $isSubmitterView = !$isReviewerView && $submitterUserId !== null; -$filterArtworkStatus = 'all'; +$artworkFilterType = Enums\ArtworkFilterType::Approved; if($isReviewerView){ - $filterArtworkStatus = 'all-admin'; + $artworkFilterType = Enums\ArtworkFilterType::Admin; } if($isSubmitterView){ - $filterArtworkStatus = 'all-submitter'; + $artworkFilterType = Enums\ArtworkFilterType::ApprovedSubmitter; } try{ - $artworks = Artwork::GetAllByArtist(HttpInput::Str(GET, 'artist-url-name'), $filterArtworkStatus, $submitterUserId); + $artworks = Artwork::GetAllByArtist(HttpInput::Str(GET, 'artist-url-name'), $artworkFilterType, $submitterUserId); if(sizeof($artworks) == 0){ throw new Exceptions\ArtistNotFoundException(); diff --git a/www/artworks/index.php b/www/artworks/index.php index fa320902..736c1478 100644 --- a/www/artworks/index.php +++ b/www/artworks/index.php @@ -1,10 +1,10 @@ value, 'in-use'))){ - $status = Enums\ArtworkStatusType::Approved->value; - $filterArtworkStatus = $status; + if( + !$isReviewerView + && + !$isSubmitterView + && + !in_array($artworkFilterType, [Enums\ArtworkFilterType::Approved, Enums\ArtworkFilterType::ApprovedNotInUse, Enums\ArtworkFilterType::ApprovedInUse]) + ){ + $artworkFilterType = Enums\ArtworkFilterType::Approved; } - if($isReviewerView && !in_array($status, array('all', Enums\ArtworkStatusType::Unverified->value, Enums\ArtworkStatusType::Declined->value, Enums\ArtworkStatusType::Approved->value, 'in-use')) - && !in_array($filterArtworkStatus, array('all-admin', Enums\ArtworkStatusType::Unverified->value, Enums\ArtworkStatusType::Declined->value, Enums\ArtworkStatusType::Approved->value, 'in-use'))){ - $status = Enums\ArtworkStatusType::Approved->value; - $filterArtworkStatus = $status; - } - - if($isSubmitterView && !in_array($status, array('all', Enums\ArtworkStatusType::Unverified->value, Enums\ArtworkStatusType::Approved->value, 'in-use')) - && !in_array($filterArtworkStatus, array('all-submitter', 'unverified-submitter', Enums\ArtworkStatusType::Approved->value, 'in-use'))){ - $status = Enums\ArtworkStatusType::Approved->value; - $filterArtworkStatus = $status; + if( + $isSubmitterView + && + !in_array($artworkFilterType, [Enums\ArtworkFilterType::ApprovedSubmitter, Enums\ArtworkFilterType::UnverifiedSubmitter, Enums\ArtworkFilterType::ApprovedInUse, Enums\ArtworkFilterType::ApprovedNotInUse]) + ){ + $artworkFilterType = Enums\ArtworkFilterType::ApprovedSubmitter; } if($queryEbookUrl !== null){ - $artworks = Db::Query('SELECT * from Artworks where EbookUrl = ? and Status = ? limit 1', [$queryEbookUrl, Enums\ArtworkStatusType::Approved], Artwork::class); - $totalArtworkCount = sizeof($artworks); + // We're being called from the `review` script, and we're only interested if the artwork exists for this URL. + $artworks[] = Db::Query('SELECT * from Artworks where EbookUrl = ? and Status = ? limit 1', [$queryEbookUrl, Enums\ArtworkStatusType::Approved], Artwork::class)[0] ?? throw new Exceptions\ArtworkNotFoundException(); + $totalArtworkCount = 1; } else{ - $result = Artwork::GetAllByFilter($query, $filterArtworkStatus, $sort, $submitterUserId, $page, $perPage); + $result = Artwork::GetAllByFilter($query, $artworkFilterType, $sort, $submitterUserId, $page, $perPage); $artworks = $result['artworks']; $totalArtworkCount = $result['artworksCount']; } @@ -84,8 +89,8 @@ try{ $queryStringParams['query'] = $query; } - if($status !== null){ - $queryStringParams['status'] = $status; + if($artworkFilterType !== null){ + $queryStringParams['status'] = $artworkFilterType->value; } if($sort !== null){ @@ -118,6 +123,9 @@ try{ throw new Exceptions\PageOutOfBoundsException(); } } +catch(Exceptions\ArtworkNotFoundException){ + Template::Emit404(); +} catch(Exceptions\PageOutOfBoundsException){ $url = '/artworks?page=' . $pages; if($queryStringWithoutPage != ''){ @@ -131,21 +139,35 @@ catch(Exceptions\PageOutOfBoundsException){

Browse U.S. Public Domain Artwork

-

Benefits->CanUploadArtwork){ ?>Submit new public domain artwork.You can help Standard Ebooks by submitting new public domain artwork to add to this catalog for use in future ebooks. For free access to the submission form, contact the Editor-in-Chief.

+

+ Benefits->CanUploadArtwork){ ?> + Submit new public domain artwork. + + You can help Standard Ebooks by submitting new public domain artwork to add to this catalog for use in future ebooks. For free access to the submission form, contact the Editor-in-Chief. + +