Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 19
0.00% covered (danger)
0.00%
0 / 7
CRAP
0.00% covered (danger)
0.00%
0 / 1
Report_Registry
0.00% covered (danger)
0.00%
0 / 19
0.00% covered (danger)
0.00%
0 / 7
156
0.00% covered (danger)
0.00%
0 / 1
 create
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
 register_provider
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 register_report
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 register_handler
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 get_definition_for_route
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
20
 get_handlers
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
12
 get_provider
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
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 $$next-version$$
14 */
15class Report_Registry {
16
17    /**
18     * Action that fills a new registry.
19     */
20    const REGISTER_ACTION = 'jetpack_analytics_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, in registration order.
29     *
30     * @var Report_Provider[]
31     */
32    private $providers = array();
33
34    /**
35     * Definitions, by report id.
36     *
37     * @var 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.
58         *
59         * @since $$next-version$$
60         *
61         * @param Report_Registry $registry The registry to fill.
62         */
63        do_action( self::REGISTER_ACTION, $registry );
64
65        return $registry;
66    }
67
68    /**
69     * Register a provider. The first one registered under a name wins.
70     *
71     * @param Report_Provider $provider The provider.
72     * @return void
73     */
74    public function register_provider( Report_Provider $provider ) {
75        $this->providers[ $provider->get_name() ] ??= $provider;
76    }
77
78    /**
79     * Register a report. The first one registered under an id wins.
80     *
81     * @param Report_Definition $definition The report.
82     * @return void
83     */
84    public function register_report( Report_Definition $definition ) {
85        $this->definitions[ $definition->id ] ??= $definition;
86    }
87
88    /**
89     * Register a handler for a report, or for every report with `ANY_REPORT`. A report's own handler
90     * beats the `ANY_REPORT` one of the same provider.
91     *
92     * @param string         $report_id Report id, or `ANY_REPORT`.
93     * @param string         $provider  Provider name.
94     * @param Report_Handler $handler   The handler.
95     * @return void
96     */
97    public function register_handler( $report_id, $provider, Report_Handler $handler ) {
98        $this->handlers[ $report_id ][ $provider ] = $handler;
99    }
100
101    /**
102     * The report a route names: a WordPress.com route, or the report id itself.
103     *
104     * @param string $route Route below `analytics/reports/`.
105     * @return Report_Definition|null
106     */
107    public function get_definition_for_route( $route ) {
108        if ( isset( $this->definitions[ $route ] ) ) {
109            return $this->definitions[ $route ];
110        }
111
112        foreach ( $this->definitions as $definition ) {
113            if ( $definition->matches_route( $route ) ) {
114                return $definition;
115            }
116        }
117
118        return null;
119    }
120
121    /**
122     * The handler of each registered provider for a report, in provider registration order.
123     *
124     * @param string $report_id Report id.
125     * @return array<string, Report_Handler> By provider name.
126     */
127    public function get_handlers( $report_id ) {
128        $handlers = array();
129        foreach ( array_keys( $this->providers ) as $name ) {
130            $handler = $this->handlers[ $report_id ][ $name ] ?? $this->handlers[ self::ANY_REPORT ][ $name ] ?? null;
131            if ( null !== $handler ) {
132                $handlers[ $name ] = $handler;
133            }
134        }
135
136        return $handlers;
137    }
138
139    /**
140     * A provider by name.
141     *
142     * @param string $name Provider name.
143     * @return Report_Provider|null
144     */
145    public function get_provider( $name ) {
146        return $this->providers[ $name ] ?? null;
147    }
148}