@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.)
hq.recaptime.dev/wiki/Phorge
phorge
phabricator
1<?php
2
3/**
4 * @extends PhabricatorCursorPagedPolicyAwareQuery<PhabricatorBadgesAward>
5 */
6final class PhabricatorBadgesAwardQuery
7 extends PhabricatorCursorPagedPolicyAwareQuery {
8
9 private $badgePHIDs;
10 private $recipientPHIDs;
11 private $awarderPHIDs;
12 private $badgeStatuses = null;
13
14 protected function willFilterPage(array $awards) {
15 $badge_phids = array();
16 foreach ($awards as $key => $award) {
17 $badge_phids[] = $award->getBadgePHID();
18 }
19
20 $badges = id(new PhabricatorBadgesQuery())
21 ->setViewer($this->getViewer())
22 ->withPHIDs($badge_phids)
23 ->execute();
24
25 $badges = mpull($badges, null, 'getPHID');
26 foreach ($awards as $key => $award) {
27 $award_badge = idx($badges, $award->getBadgePHID());
28 if (!$award_badge) {
29 unset($awards[$key]);
30 $this->didRejectResult($award);
31 continue;
32 }
33 $award->attachBadge($award_badge);
34 }
35
36 return $awards;
37 }
38
39 public function withBadgePHIDs(array $phids) {
40 $this->badgePHIDs = $phids;
41 return $this;
42 }
43
44 public function withRecipientPHIDs(array $phids) {
45 $this->recipientPHIDs = $phids;
46 return $this;
47 }
48
49 public function withAwarderPHIDs(array $phids) {
50 $this->awarderPHIDs = $phids;
51 return $this;
52 }
53
54 public function withBadgeStatuses(array $statuses) {
55 $this->badgeStatuses = $statuses;
56 return $this;
57 }
58
59 private function shouldJoinBadge() {
60 return (bool)$this->badgeStatuses;
61 }
62
63 public function newResultObject() {
64 return new PhabricatorBadgesAward();
65 }
66
67 protected function getPrimaryTableAlias() {
68 return 'badges_award';
69 }
70
71 protected function buildWhereClauseParts(AphrontDatabaseConnection $conn) {
72 $where = parent::buildWhereClauseParts($conn);
73
74 if ($this->badgePHIDs !== null) {
75 $where[] = qsprintf(
76 $conn,
77 'badges_award.badgePHID IN (%Ls)',
78 $this->badgePHIDs);
79 }
80
81 if ($this->recipientPHIDs !== null) {
82 $where[] = qsprintf(
83 $conn,
84 'badges_award.recipientPHID IN (%Ls)',
85 $this->recipientPHIDs);
86 }
87
88 if ($this->awarderPHIDs !== null) {
89 $where[] = qsprintf(
90 $conn,
91 'badges_award.awarderPHID IN (%Ls)',
92 $this->awarderPHIDs);
93 }
94
95 if ($this->badgeStatuses !== null) {
96 $where[] = qsprintf(
97 $conn,
98 'badges_badge.status IN (%Ls)',
99 $this->badgeStatuses);
100 }
101
102
103 return $where;
104 }
105
106 protected function buildJoinClauseParts(AphrontDatabaseConnection $conn) {
107 $join = parent::buildJoinClauseParts($conn);
108 $badges = new PhabricatorBadgesBadge();
109
110 if ($this->shouldJoinBadge()) {
111 $join[] = qsprintf(
112 $conn,
113 'JOIN %T badges_badge ON badges_award.badgePHID = badges_badge.phid',
114 $badges->getTableName());
115 }
116
117 return $join;
118 }
119
120 public function getQueryApplicationClass() {
121 return PhabricatorBadgesApplication::class;
122 }
123
124}