Passed
Push — master ( 269fa8...d1b393 )
by Paul
04:23
created

ReviewManager::normalizeTerms()   A

Complexity

Conditions 4
Paths 5

Size

Total Lines 13
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 6

Importance

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