1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
|
<?php
namespace SolidWP\Mail\Repository;
use SolidWP\Mail\Connectors\ConnectorBrevo; use SolidWP\Mail\Connectors\ConnectorMailGun; use SolidWP\Mail\Connectors\ConnectorPostmark; use SolidWP\Mail\Connectors\ConnectorSendGrid; use SolidWP\Mail\Connectors\ConnectorSES; use SolidWP\Mail\Connectors\ConnectorSMTP;
/** * Class ProvidersRepository * * This class handles database-related tasks for managing SMTP providers within the Solid_SMTP plugin. * It provides CRUD operations and other database-related functionalities for SMTP providers. * * @package Solid_SMTP\Repository */ class ProvidersRepository { const OPTION_NAME = 'solid_smtp_providers';
/** * Retrieves active SMTP providers. * * @return array<ConnectorSMTP> Active SMTP providers. */ public function get_active_providers(): array { return array_filter( $this->get_all_providers(), static fn ( ConnectorSMTP $provider ) => $provider->is_active() ); }
/** * Retrieves the default SMTP provider. * * @return ConnectorSMTP|null The default SMTP provider configuration, or null if not found. */ public function get_default_provider(): ?ConnectorSMTP { $providers = $this->get_all_providers();
foreach ( $providers as $provider ) { if ( $provider->is_default() ) { return $provider; } }
return null; }
/** * Saves a provider configuration. * * @param ConnectorSMTP $provider The SMTP provider configuration to save. * * @return void */ public function save( ConnectorSMTP $provider ) { $providers = get_option( self::OPTION_NAME, [] );
$providers[ $provider->get_id() ] = $provider->to_array();
update_option( self::OPTION_NAME, $providers ); }
/** * Retrieves all SMTP provider configurations. * * @return ConnectorSMTP[] An array of SMTP provider configurations. */ public function get_all_providers(): array { $providers = get_option( self::OPTION_NAME, [] ); $data = []; foreach ( $providers as $provider ) { $instance = $this->factory( $provider['name'], $provider ); if ( ! $instance instanceof ConnectorSMTP ) { continue; }
$data[ $provider['id'] ] = $instance; }
return $data; }
/** * Retrieves all SMTP provider configurations as an array of arrays. * * @return array An array of SMTP provider configurations. */ public function get_all_providers_as_array(): array { $providers = $this->get_all_providers(); $data = [];
foreach ( $providers as $provider ) { $data[ $provider->get_id() ] = $provider->to_array(); }
return $data; }
/** * Retrieves an SMTP provider configuration by its ID. * * @param string $provider_id The ID of the SMTP provider to retrieve. * * @return ConnectorSMTP|null The SMTP provider configuration, or null if not found. */ public function get_provider_by_id( string $provider_id ): ?ConnectorSMTP { $providers = $this->get_all_providers();
return $providers[ $provider_id ] ?? null; }
/** * Sets a specific SMTP provider as default by its ID. * Ensures only one provider can be default at a time. * * @param string $provider_id The ID of the SMTP provider to set as default. * * @return void */ public function set_default_provider( string $provider_id ): void { $providers = $this->get_all_providers(); foreach ( $providers as $provider ) { $provider->set_is_default( $provider_id === $provider->get_id() );
// though it not performance wise, but it safer. $this->save( $provider ); } }
/** * Deletes a specific SMTP provider by its ID. * * @param string $provider_id The ID of the SMTP provider to delete. * * @return void */ public function delete_provider_by_id( string $provider_id ): void { $providers = $this->get_all_providers_as_array(); if ( isset( $providers[ $provider_id ] ) ) { unset( $providers[ $provider_id ] ); } update_option( self::OPTION_NAME, $providers ); }
/** * Creates an instance of a specific SMTP provider based on the provided type. * * @param string $provider_type The type of SMTP provider to create. * @param array $data The data of the provider. * * @return ?ConnectorSMTP An instance of the specified SMTP provider. */ public function factory( string $provider_type, array $data = [] ) { switch ( $provider_type ) { case 'mailgun': return new ConnectorMailGun( $data ); case 'brevo': return new ConnectorBrevo( $data ); case 'sendgrid': return new ConnectorSendGrid( $data ); case 'amazon_ses': return new ConnectorSES( $data ); case 'postmark': return new ConnectorPostmark( $data ); case 'other': return new ConnectorSMTP( $data ); default: return null; } } }
|