1
+ <?php
2
+ declare (strict_types=1 );
3
+
4
+ require __DIR__ . '/../vendor/autoload.php ' ;
5
+
6
+ use Pinga \Db \PdoDataSource ;
7
+ use Pinga \Db \PdoDatabase ;
8
+ use Dotenv \Dotenv ;
9
+
10
+ // Load environment variables
11
+ $ dotenv = Dotenv::createImmutable (__DIR__ . '/../ ' );
12
+ $ dotenv ->load ();
13
+
14
+ // Setup DB
15
+ $ dataSource = new PdoDataSource ($ _ENV ['DB_DRIVER ' ]);
16
+ $ dataSource ->setHostname ($ _ENV ['DB_HOST ' ]);
17
+ $ dataSource ->setPort ((int )$ _ENV ['DB_PORT ' ]);
18
+ $ dataSource ->setDatabaseName ($ _ENV ['DB_DATABASE ' ]);
19
+ $ dataSource ->setCharset ('utf8mb4 ' );
20
+ if ($ _ENV ['DB_USERNAME ' ] !== '' ) $ dataSource ->setUsername ($ _ENV ['DB_USERNAME ' ]);
21
+ if ($ _ENV ['DB_PASSWORD ' ] !== '' ) $ dataSource ->setPassword ($ _ENV ['DB_PASSWORD ' ]);
22
+
23
+ $ db = PdoDatabase::fromDataSource ($ dataSource );
24
+
25
+ // Dummy Email & EPP Handlers
26
+ function sendReminderEmail (array $ service , string $ when ): void {
27
+ echo "Reminder: Service # {$ service ['id ' ]} for user {$ service ['user_id ' ]} expires in {$ when } days \n" ;
28
+ }
29
+
30
+ function createRenewalOrder (PdoDatabase $ db , array $ service ): void {
31
+ $ db ->insert ('orders ' , [
32
+ 'user_id ' => $ service ['user_id ' ],
33
+ 'service_type ' => $ service ['type ' ],
34
+ 'service_data ' => json_encode (['service_id ' => $ service ['id ' ]]),
35
+ 'status ' => 'pending ' ,
36
+ 'amount_due ' => 10.00 ,
37
+ 'currency ' => 'EUR ' ,
38
+ 'created_at ' => date ('Y-m-d H:i:s ' ),
39
+ ]);
40
+ echo "Created renewal order for service ID {$ service ['id ' ]}\n" ;
41
+ }
42
+
43
+ function updateNameservers (array $ service ): void {
44
+ echo "Triggering EPP NS update for domain service ID {$ service ['id ' ]}\n" ;
45
+ }
46
+
47
+ try {
48
+ $ services = $ db ->select (
49
+ 'SELECT * FROM services WHERE expires_at IS NOT NULL AND status IN (?, ?) ' ,
50
+ ['active ' , 'expired ' ]
51
+ );
52
+
53
+ $ now = new DateTime ();
54
+
55
+ foreach ($ services as $ service ) {
56
+ $ expiresAt = new DateTime ($ service ['expires_at ' ]);
57
+ $ diffDays = (int )$ now ->diff ($ expiresAt )->format ('%r%a ' );
58
+
59
+ if (in_array ($ diffDays , [30 , 14 , 3 , 1 , -1 ], true )) {
60
+ sendReminderEmail ($ service , (string )$ diffDays );
61
+ }
62
+
63
+ if ($ diffDays === 14 ) {
64
+ $ existing = $ db ->select (
65
+ 'SELECT COUNT(*) AS count FROM orders WHERE service_data LIKE ? AND status = ? ' ,
66
+ ['%"service_id": ' . $ service ['id ' ] . '% ' , 'pending ' ]
67
+ );
68
+ if ((int )($ existing [0 ]['count ' ] ?? 0 ) === 0 ) {
69
+ createRenewalOrder ($ db , $ service );
70
+ }
71
+ }
72
+
73
+ if ($ service ['type ' ] === 'domain ' && $ diffDays === -1 ) {
74
+ updateNameservers ($ service );
75
+ }
76
+
77
+ if ($ diffDays < -1 && $ service ['status ' ] === 'active ' ) {
78
+ $ db ->update (
79
+ 'services ' ,
80
+ ['status ' => 'expired ' , 'updated_at ' => date ('Y-m-d H:i:s ' )],
81
+ ['id ' => $ service ['id ' ]]
82
+ );
83
+ echo "Service ID {$ service ['id ' ]} marked as expired \n" ;
84
+ }
85
+ }
86
+
87
+ } catch (Throwable $ e ) {
88
+ echo 'Error: ' . $ e ->getMessage () . "\n" ;
89
+ exit (1 );
90
+ }
0 commit comments