ValueObjects
1 year ago
GetCampaignComments.php
1 year ago
GetCampaignRevenue.php
1 year ago
GetCampaignStatistics.php
1 year ago
RegisterCampaignRoutes.php
1 year ago
GetCampaignComments.php
107 lines
| 1 | <?php |
| 2 | |
| 3 | namespace Give\API\REST\V3\Routes\Campaigns; |
| 4 | |
| 5 | use Exception; |
| 6 | use Give\API\REST\V3\Routes\Campaigns\ValueObjects\CampaignRoute; |
| 7 | use Give\API\RestRoute; |
| 8 | use Give\Campaigns\CampaignDonationQuery; |
| 9 | use Give\Campaigns\Models\Campaign; |
| 10 | use Give\Donations\ValueObjects\DonationMetaKeys; |
| 11 | use WP_REST_Response; |
| 12 | use WP_REST_Server; |
| 13 | |
| 14 | class GetCampaignComments implements RestRoute |
| 15 | { |
| 16 | /** |
| 17 | * @since 4.0.0 |
| 18 | */ |
| 19 | public function registerRoute() |
| 20 | { |
| 21 | register_rest_route( |
| 22 | CampaignRoute::NAMESPACE, |
| 23 | CampaignRoute::CAMPAIGN . '/comments', |
| 24 | [ |
| 25 | [ |
| 26 | 'methods' => WP_REST_Server::READABLE, |
| 27 | 'callback' => [$this, 'handleRequest'], |
| 28 | 'permission_callback' => '__return_true', |
| 29 | ], |
| 30 | 'args' => [ |
| 31 | 'id' => [ |
| 32 | 'type' => 'integer', |
| 33 | 'required' => true, |
| 34 | 'sanitize_callback' => 'absint', |
| 35 | ], |
| 36 | 'perPage' => [ |
| 37 | 'type' => 'integer', |
| 38 | 'required' => false, |
| 39 | 'sanitize_callback' => 'absint', |
| 40 | ], |
| 41 | 'anonymous' => [ |
| 42 | 'type' => 'boolean', |
| 43 | 'required' => false, |
| 44 | 'default' => true, |
| 45 | ], |
| 46 | ], |
| 47 | ] |
| 48 | ); |
| 49 | } |
| 50 | |
| 51 | /** |
| 52 | * @since 4.0.0 |
| 53 | * |
| 54 | * @throws Exception |
| 55 | */ |
| 56 | public function handleRequest($request): WP_REST_Response |
| 57 | { |
| 58 | $campaignId = $request->get_param('id'); |
| 59 | $perPage = $request->get_param('perPage'); |
| 60 | $anonymous = $request->get_param('anonymous'); |
| 61 | |
| 62 | $campaign = Campaign::find($campaignId); |
| 63 | |
| 64 | if (!$campaign) { |
| 65 | return new WP_REST_Response('Campaign not found', 404); |
| 66 | } |
| 67 | |
| 68 | $query = (new CampaignDonationQuery($campaign)) |
| 69 | ->joinDonationMeta(DonationMetaKeys::DONOR_ID, 'donorIdMeta') |
| 70 | ->joinDonationMeta(DonationMetaKeys::COMMENT, 'commentMeta') |
| 71 | ->joinDonationMeta(DonationMetaKeys::ANONYMOUS, 'anonymousMeta') |
| 72 | ->leftJoin('give_donors', 'donorIdMeta.meta_value', 'donors.id', 'donors'); |
| 73 | |
| 74 | |
| 75 | if (!$anonymous) { |
| 76 | $query->where('anonymousMeta.meta_value', '1', '!='); |
| 77 | } |
| 78 | |
| 79 | $query->where('commentMeta.meta_value', '', '!='); |
| 80 | $query->whereIsNotNull('commentMeta.meta_value'); |
| 81 | |
| 82 | $query->select( |
| 83 | 'donorIdMeta.meta_value as donorId', |
| 84 | 'commentMeta.meta_value as comment', |
| 85 | 'anonymousMeta.meta_value as anonymous', |
| 86 | 'donation.post_date as date', |
| 87 | 'donors.name as donorName' |
| 88 | ); |
| 89 | |
| 90 | $donations = $query->limit($perPage)->getAll(); |
| 91 | |
| 92 | $formattedComments = array_map(function ($donation) { |
| 93 | $donorName = $donation->anonymous === '1' ? __('Anonymous') : $donation->donorName; |
| 94 | |
| 95 | return [ |
| 96 | 'donorName' => $donorName, |
| 97 | 'comment' => $donation->comment, |
| 98 | 'anonymous' => $donation->anonymous === '1', |
| 99 | 'date' => human_time_diff(strtotime($donation->date)), |
| 100 | 'avatar' => get_avatar_url($donation->email), |
| 101 | ]; |
| 102 | }, $donations); |
| 103 | |
| 104 | return new WP_REST_Response($formattedComments); |
| 105 | } |
| 106 | } |
| 107 |