Test Failed
Push — master ( 87eb8d...25783a )
by Paul
03:58
created

ReviewManager::get()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 31
Code Lines 25

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
cc 1
eloc 25
nc 1
nop 1
dl 0
loc 31
ccs 0
cts 24
cp 0
crap 2
rs 9.52
c 0
b 0
f 0
1
<?php
2
3
namespace GeminiLabs\SiteReviews\Database;
4
5
use GeminiLabs\SiteReviews\Application;
6
use GeminiLabs\SiteReviews\Commands\CreateReview;
7
use GeminiLabs\SiteReviews\Database\DefaultsManager;
8
use GeminiLabs\SiteReviews\Database\QueryBuilder;
9
use GeminiLabs\SiteReviews\Database\SqlQueries;
10
use GeminiLabs\SiteReviews\Defaults\CreateReviewDefaults;
11
use GeminiLabs\SiteReviews\Defaults\GetReviewsDefaults;
12
use GeminiLabs\SiteReviews\Helper;
13
use GeminiLabs\SiteReviews\Review;
14
use WP_Post;
15
use WP_Query;
16
17
class ReviewManager
18
{
19
	/**
20
	 * @return int
21
	 */
22 1
	public function create( CreateReview $command )
23
	{
24 1
		$review = glsr( CreateReviewDefaults::class )->restrict( (array)$command );
25 1
		$review = apply_filters( 'site-reviews/create/review-values', $review, $command );
26
		$post = [
27 1
			'comment_status' => 'closed',
28 1
			'meta_input' => $review,
29 1
			'ping_status' => 'closed',
30 1
			'post_content' => $review['content'],
31 1
			'post_date' => $review['date'],
32 1
			'post_name' => $review['review_type'].'-'.$review['review_id'],
33 1
			'post_status' => $this->getNewPostStatus( $review, $command->blacklisted ),
34 1
			'post_title' => $review['title'],
35
			'post_type' => Application::POST_TYPE,
36
		];
37 1
		$postId = wp_insert_post( $post, true );
38 1
		if( is_wp_error( $postId )) {
39
			glsr_log()->error( $postId->get_error_message() );
40
			return 0;
41
		}
42 1
		$this->setTerms( $postId, $command->category );
43 1
		do_action( 'site-reviews/create/review', $post, $review, $postId );
44
		return $postId;
45
	}
46
47
	/**
48
	 * @param string $metaReviewId
49
	 * @return void
50
	 */
51
	public function delete( $metaReviewId )
52
	{
53
		if( $postId = $this->getPostId( $metaReviewId )) {
54
			wp_delete_post( $postId, true );
55
		}
56
	}
57
58
	/**
59
	 * @return object
60
	 */
61
	public function get( array $args = [] )
62
	{
63
		$args = glsr( GetReviewsDefaults::class )->restrict( $args );
64
		$metaQuery = glsr( QueryBuilder::class )->buildQuery(
65
			['assigned_to', 'type', 'rating'],
66
			$args
67
		);
68
		$taxQuery = glsr( QueryBuilder::class )->buildQuery(
69
			['category'],
70
			['category' => $this->normalizeTerms( $args['category'] )]
71
		);
72
		$paged = glsr( QueryBuilder::class )->getPaged(
73
			wp_validate_boolean( $args['pagination'] )
74
		);
75
		$reviews = new WP_Query([
76
			'meta_key' => 'pinned',
77
			'meta_query' => $metaQuery,
78
			'offset' => $args['offset'],
79
			'order' => $args['order'],
80
			'orderby' => 'meta_value '.$args['orderby'],
81
			'paged' => $paged,
82
			'post__in' => $args['post__in'],
83
			'post__not_in' => $args['post__not_in'],
84
			'post_status' => 'publish',
85
			'post_type' => Application::POST_TYPE,
86
			'posts_per_page' => $args['count'],
87
			'tax_query' => $taxQuery,
88
		]);
89
		return (object)[
90
			'results' => array_map( [$this, 'single'], $reviews->posts ),
91
			'max_num_pages' => $reviews->max_num_pages,
92
		];
93
	}
94
95
	/**
96
	 * @param string $metaReviewId
97
	 * @return int
98
	 */
99
	public function getPostId( $metaReviewId )
100
	{
101
		return glsr( SqlQueries::class )->getReviewPostId( $metaReviewId );
102
	}
103
104
	/**
105
	 * @param int $postId
106
	 * @return void
107
	 */
108
	public function revert( $postId )
109
	{
110
		if( get_post_field( 'post_type', $postId ) != Application::POST_TYPE )return;
111
		delete_post_meta( $postId, '_edit_last' );
112
		$result = wp_update_post([
113
			'ID' => $postId,
114
			'post_content' => get_post_meta( $postId, 'content', true ),
115
			'post_date' => get_post_meta( $postId, 'date', true ),
116
			'post_title' => get_post_meta( $postId, 'title', true ),
117
		]);
118
		if( is_wp_error( $result )) {
119
			glsr_log()->error( $result->get_error_message() );
120
		}
121
	}
122
123
	/**
124
	 * @return Review
125
	 */
126
	public function single( WP_Post $post )
127
	{
128
		if( $post->post_type != Application::POST_TYPE )return;
129
		$review = new Review( $post );
130
		return apply_filters( 'site-reviews/get/review', $review, $post );
131
	}
132
133
	/**
134
	 * @param bool $isBlacklisted
135
	 * @return string
136
	 */
137 1
	protected function getNewPostStatus( array $review, $isBlacklisted )
138
	{
139 1
		$requireApprovalOption = glsr( OptionManager::class )->get( 'settings.general.require.approval' );
140 1
		return $review['review_type'] == 'local' && ( $requireApprovalOption == 'yes' || $isBlacklisted )
141
			? 'pending'
142 1
			: 'publish';
143
	}
144
145
	/**
146
	 * @param string $commaSeparatedTermIds
147
	 * @return array
148
	 */
149 1
	protected function normalizeTerms( $commaSeparatedTermIds )
150
	{
151 1
		$terms = [];
152 1
		$termIds = array_map( 'trim', explode( ',', $commaSeparatedTermIds ));
153 1
		foreach( $termIds as $termId ) {
154 1
			$term = term_exists( $termId, Application::TAXONOMY );
155 1
			if( !isset( $term['term_id'] ))continue;
156
			$terms[] = intval( $term['term_id'] );
157
		}
158 1
		return $terms;
159
	}
160
161
	/**
162
	 * @param int $postId
163
	 * @param string $termIds
164
	 * @return void
165
	 */
166 1
	protected function setTerms( $postId, $termIds )
167
	{
168 1
		$terms = $this->normalizeTerms( $termIds );
169 1
		if( empty( $terms ))return;
170
		$result = wp_set_object_terms( $postId, $terms, Application::TAXONOMY );
171
		if( is_wp_error( $result )) {
172
			glsr_log()->error( $result->get_error_message() );
173
		}
174
	}
175
}
176