Completed
Branch BUG-10738-inconsistency-in-ses... (cda363)
by
unknown
13:38 queued 12s
created

CalculatedModelFields   A

Complexity

Total Complexity 9

Size/Duplication

Total Lines 128
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 3

Importance

Changes 0
Metric Value
dl 0
loc 128
rs 10
c 0
b 0
f 0
wmc 9
lcom 1
cbo 3

4 Methods

Rating   Name   Duplication   Size   Complexity  
A mapping() 0 7 3
B generateNewMapping() 0 36 1
A retrieveCalculatedFieldsForModel() 0 9 2
B retrieveCalculatedFieldValue() 0 24 3
1
<?php
2
namespace EventEspresso\core\libraries\rest_api;
3
4
use EEM_Base;
5
use EventEspresso\core\libraries\rest_api\controllers\Base;
6
use EEH_Inflector;
7
8
/**
9
 * Class CalculatedModelFields
10
 * Class for defining which model fields can be calculated, and performing those calculations
11
 * as requested
12
 *
13
 * @package               Event Espresso
14
 * @subpackage
15
 * @author                Mike Nelson
16
 * @since                 4.8.35.rc.001
17
 */
18
if (! defined('EVENT_ESPRESSO_VERSION')) {
19
    exit('No direct script access allowed');
20
}
21
22
23
24
class CalculatedModelFields
25
{
26
27
    /**
28
     * @var array
29
     */
30
    protected $mapping;
31
32
33
34
    /**
35
     * @param bool $refresh
36
     * @return array top-level-keys are model names (eg "Event")
37
     * next-level are the calculated field names AND method names on classes
38
     * which perform calculations, values are the fully qualified classnames which do the calculations
39
     * These callbacks should accept as arguments:
40
     * the wpdb row results,
41
     * the WP_Request object,
42
     * the controller object
43
     */
44
    public function mapping($refresh = false)
45
    {
46
        if (! $this->mapping || $refresh) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $this->mapping of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
47
            $this->mapping = $this->generateNewMapping();
48
        }
49
        return $this->mapping;
50
    }
51
52
53
54
    /**
55
     * Generates  anew mapping between model calculated fields and their callbacks
56
     *
57
     * @return array
58
     */
59
    protected function generateNewMapping()
60
    {
61
        $rest_api_calculations_namespace = 'EventEspresso\core\libraries\rest_api\calculations\\';
62
        $event_calculations_class = $rest_api_calculations_namespace . 'Event';
63
        $datetime_calculations_class = $rest_api_calculations_namespace . 'Datetime';
64
        $registration_class = $rest_api_calculations_namespace . 'Registration';
65
        return apply_filters(
66
            'FHEE__EventEspresso\core\libraries\rest_api\Calculated_Model_Fields__mapping',
67
            array(
68
                'Event'        => array(
69
                    'optimum_sales_at_start'          => $event_calculations_class,
70
                    'optimum_sales_now'               => $event_calculations_class,
71
                    'spots_taken'                     => $event_calculations_class,
72
                    'spots_taken_pending_payment'     => $event_calculations_class,
73
                    'spaces_remaining'                => $event_calculations_class,
74
                    'registrations_checked_in_count'  => $event_calculations_class,
75
                    'registrations_checked_out_count' => $event_calculations_class,
76
                    'image_thumbnail'                 => $event_calculations_class,
77
                    'image_medium'                    => $event_calculations_class,
78
                    'image_medium_large'              => $event_calculations_class,
79
                    'image_large'                     => $event_calculations_class,
80
                    'image_post_thumbnail'            => $event_calculations_class,
81
                    'image_full'                      => $event_calculations_class,
82
                ),
83
                'Datetime'     => array(
84
                    'spaces_remaining_considering_tickets' => $datetime_calculations_class,
85
                    'registrations_checked_in_count'       => $datetime_calculations_class,
86
                    'registrations_checked_out_count'      => $datetime_calculations_class,
87
                    'spots_taken_pending_payment'          => $datetime_calculations_class,
88
                ),
89
                'Registration' => array(
90
                    'datetime_checkin_stati' => $registration_class,
91
                ),
92
            )
93
        );
94
    }
95
96
97
98
    /**
99
     * Gets the known calculated fields for model
100
     *
101
     * @param EEM_Base $model
102
     * @return array allowable values for this field
103
     */
104
    public function retrieveCalculatedFieldsForModel(EEM_Base $model)
105
    {
106
        $mapping = $this->mapping();
107
        if (isset($mapping[$model->get_this_model_name()])) {
108
            return array_keys($mapping[$model->get_this_model_name()]);
109
        } else {
110
            return array();
111
        }
112
    }
113
114
115
116
    /**
117
     * Retrieves the value for this calculation
118
     *
119
     * @param EEM_Base                                                $model
120
     * @param string                                                  $field_name
121
     * @param array                                                   $wpdb_row
122
     * @param \WP_REST_Request
123
     * @param \EventEspresso\core\libraries\rest_api\controllers\Base $controller
124
     * @return mixed|null
125
     * @throws \EE_Error
126
     */
127
    public function retrieveCalculatedFieldValue(
128
        EEM_Base $model,
129
        $field_name,
130
        $wpdb_row,
131
        $rest_request,
132
        Base $controller
133
    ) {
134
        $mapping = $this->mapping();
135
        if (isset($mapping[$model->get_this_model_name()])
136
            && isset($mapping[$model->get_this_model_name()][$field_name])
137
        ) {
138
            $classname = $mapping[$model->get_this_model_name()][$field_name];
139
            $class_method_name = EEH_Inflector::camelize_all_but_first($field_name);
140
            return call_user_func(array($classname, $class_method_name), $wpdb_row, $rest_request, $controller);
141
        }
142
        throw new RestException(
143
            'calculated_field_does_not_exist',
144
            sprintf(
145
                __('There is no calculated field %1$s on resource %2$s', 'event_espresso'),
146
                $field_name,
147
                $model->get_this_model_name()
148
            )
149
        );
150
    }
151
}
152