Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
14 / 14
100.00% covered (success)
100.00%
7 / 7
CRAP
100.00% covered (success)
100.00%
1 / 1
Report_Registry
100.00% covered (success)
100.00%
14 / 14
100.00% covered (success)
100.00%
7 / 7
10
100.00% covered (success)
100.00%
1 / 1
 create
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
1
 register_provider
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 register_report
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 register_handler
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 get_definition_for_route
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
3
 get_handler
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
2
 get_provider
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2/**
3 * Report definitions and their handlers, registered by the code that owns them.
4 *
5 * @package automattic/jetpack-woocommerce-stats
6 */
7
8namespace Automattic\Jetpack\WooCommerceStats\Report_Execution;
9
10/**
11 * Definitions by report id, handlers by (report id, provider), and the providers themselves.
12 *
13 * @since 0.3.3
14 */
15class Report_Registry {
16
17    /**
18     * Action that fills a new registry.
19     */
20    const REGISTER_ACTION = 'jetpack_woocommerce_stats_register_reports';
21
22    /**
23     * Report id under which a handler serves every report.
24     */
25    const ANY_REPORT = '*';
26
27    /**
28     * Providers, by name.
29     *
30     * @var array<string, Report_Provider>
31     */
32    private $providers = array();
33
34    /**
35     * Definitions, by report id.
36     *
37     * @var array<string, Report_Definition>
38     */
39    private $definitions = array();
40
41    /**
42     * Handlers, by report id and then provider name.
43     *
44     * @var array<string, array<string, Report_Handler>>
45     */
46    private $handlers = array();
47
48    /**
49     * A registry filled by every registrant.
50     *
51     * @return Report_Registry
52     */
53    public static function create() {
54        $registry = new self();
55
56        /**
57         * Fires to register store reports, their handlers and providers. Experimental: the
58         * registry's interfaces change in the next steps.
59         *
60         * @since 0.3.3
61         *
62         * @param Report_Registry $registry The registry to fill.
63         */
64        do_action( self::REGISTER_ACTION, $registry );
65
66        return $registry;
67    }
68
69    /**
70     * Register a provider. The first one registered under a name wins.
71     *
72     * @param string          $name     Provider name, as the `provider` param names it.
73     * @param Report_Provider $provider The provider.
74     * @return void
75     */
76    public function register_provider( $name, Report_Provider $provider ) {
77        $this->providers[ $name ] ??= $provider;
78    }
79
80    /**
81     * Register a report. The first one registered under an id wins.
82     *
83     * @param Report_Definition $definition The report.
84     * @return void
85     */
86    public function register_report( Report_Definition $definition ) {
87        $this->definitions[ $definition->id ] ??= $definition;
88    }
89
90    /**
91     * Register a handler for a report, or for every report with `ANY_REPORT`. The last one
92     * registered for a pair wins, and a report's own handler beats the `ANY_REPORT` one.
93     *
94     * @param string         $report_id Report id, or `ANY_REPORT`.
95     * @param string         $provider  Provider name.
96     * @param Report_Handler $handler   The handler.
97     * @return void
98     */
99    public function register_handler( $report_id, $provider, Report_Handler $handler ) {
100        $this->handlers[ $report_id ][ $provider ] = $handler;
101    }
102
103    /**
104     * The report a route names.
105     *
106     * @param string $route Route below `analytics/reports/`.
107     * @return Report_Definition|null
108     */
109    public function get_definition_for_route( $route ) {
110        foreach ( $this->definitions as $definition ) {
111            if ( $definition->matches_route( $route ) ) {
112                return $definition;
113            }
114        }
115
116        return null;
117    }
118
119    /**
120     * The handler of a report under a registered provider.
121     *
122     * @param string $report_id Report id.
123     * @param string $provider  Provider name.
124     * @return Report_Handler|null
125     */
126    public function get_handler( $report_id, $provider ) {
127        if ( ! isset( $this->providers[ $provider ] ) ) {
128            return null;
129        }
130
131        return $this->handlers[ $report_id ][ $provider ] ?? $this->handlers[ self::ANY_REPORT ][ $provider ] ?? null;
132    }
133
134    /**
135     * A provider by name.
136     *
137     * @param string $name Provider name.
138     * @return Report_Provider|null
139     */
140    public function get_provider( $name ) {
141        return $this->providers[ $name ] ?? null;
142    }
143}