Skip to content

Commit e369369

Browse files
committed
Added basic renew/provision scripts; more work needed
1 parent bf949c2 commit e369369

File tree

2 files changed

+171
-0
lines changed

2 files changed

+171
-0
lines changed

bin/renew-services.php

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
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+
}

bin/retry-failed-orders.php

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
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 .env
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+
// Reprovisioning function
26+
function reprovisionOrder(PdoDatabase $db, array $order): bool {
27+
echo "Re-attempting provisioning for order ID {$order['id']}\n";
28+
29+
// Simulated success
30+
$success = true;
31+
32+
if ($success) {
33+
$db->update('orders', [
34+
'status' => 'active',
35+
'paid_at' => $order['paid_at'] ?? date('Y-m-d H:i:s'),
36+
'updated_at' => date('Y-m-d H:i:s'),
37+
], [
38+
'id' => $order['id'],
39+
]);
40+
41+
$exists = $db->select('SELECT COUNT(*) AS count FROM services WHERE order_id = ?', [$order['id']]);
42+
if ((int)($exists[0]['count'] ?? 0) === 0) {
43+
$db->insert('services', [
44+
'user_id' => $order['user_id'],
45+
'provider_id'=> null,
46+
'order_id' => $order['id'],
47+
'type' => $order['service_type'],
48+
'status' => 'active',
49+
'config' => $order['service_data'],
50+
'created_at' => date('Y-m-d H:i:s'),
51+
]);
52+
echo "Created related service for order ID {$order['id']}\n";
53+
}
54+
55+
return true;
56+
}
57+
58+
return false;
59+
}
60+
61+
try {
62+
// 30-day threshold using PHP datetime
63+
$threshold = (new DateTime())->modify('-30 days')->format('Y-m-d H:i:s');
64+
65+
$orders = $db->select(
66+
'SELECT * FROM orders WHERE status = ? AND created_at >= ?',
67+
['failed', $threshold]
68+
);
69+
70+
foreach ($orders ?? [] as $order) {
71+
$success = reprovisionOrder($db, $order);
72+
if (!$success) {
73+
echo "Order ID {$order['id']} still failed.\n";
74+
// Optionally log or notify
75+
}
76+
}
77+
78+
} catch (Throwable $e) {
79+
echo 'Error: ' . $e->getMessage();
80+
exit(1);
81+
}

0 commit comments

Comments
 (0)