3 * Administrative Script: Retry Failed Domain Registration
5 * This script manually processes a pending domain registration request
6 * by calling the Cloudflare Registrar API directly and updating the database.
8 * Usage: node admin-retry-registration.js
11require('dotenv').config();
12const { Pool } = require('pg');
13const cloudflare = require('./services/cloudflare');
15const REQUEST_ID = '3d647ee7-c6af-4e49-af84-fb8e2d103551';
17// Handle DigitalOcean's self-signed certificates
18const dbUrl = process.env.DATABASE_URL.replace('sslmode=require', 'sslmode=no-verify');
20const pool = new Pool({
21 connectionString: dbUrl,
22 ssl: { rejectUnauthorized: false }
25async function retryRegistration() {
26 const client = await pool.connect();
29 console.log('š Starting administrative domain registration retry...\n');
31 // Get request details
32 console.log('1. Fetching registration request...');
33 const requestResult = await client.query(
34 'SELECT * FROM domain_registration_requests WHERE request_id = $1',
38 if (requestResult.rows.length === 0) {
39 throw new Error('Registration request not found');
42 const request = requestResult.rows[0];
43 console.log(' Domain:', request.domain_name);
44 console.log(' Status:', request.status);
45 console.log(' Registrar:', request.registrar);
47 if (request.status !== 'pending') {
48 console.warn(` ā ļø Warning: Status is '${request.status}', expected 'pending'`);
51 // Update to approved status
52 console.log('\n2. Marking as approved...');
54 `UPDATE domain_registration_requests
55 SET status = 'approved', reviewed_at = NOW(), approval_notes = $1, updated_at = NOW()
56 WHERE request_id = $2`,
57 ['Administrative retry after adding Cloudflare Account ID', REQUEST_ID]
59 console.log(' ā Status updated to: approved');
61 // Prepare contact information (Cloudflare requires specific field names)
62 if (!request.registrant_contact) {
63 throw new Error('No registrant contact information found in request');
67 organization: request.registrant_contact.organization || '',
68 first_name: request.registrant_contact.firstName,
69 last_name: request.registrant_contact.lastName,
70 email: request.registrant_contact.email,
71 phone: request.registrant_contact.phone,
72 address: request.registrant_contact.address,
73 city: request.registrant_contact.city,
74 state: request.registrant_contact.state,
75 zip: request.registrant_contact.postalCode,
76 country: request.registrant_contact.country.toUpperCase()
79 console.log('\n3. Registering domain with Cloudflare Registrar...');
80 console.log(' Contact:', `${contact.first_name} ${contact.last_name} (${contact.email})`);
81 console.log(' Contact object:', JSON.stringify(contact, null, 2));
82 console.log(' This may take 30-60 seconds...');
84 const registrationResult = await cloudflare.registerDomain({
85 domain: request.domain_name,
86 years: request.years || 1,
89 registrant_contact: contact
92 if (registrationResult.code === 'API_NOT_AVAILABLE') {
93 throw new Error(`Cloudflare API error: ${registrationResult.message}`);
96 console.log(' ā Registration successful!');
97 console.log(' Domain:', registrationResult.domain);
98 console.log(' Status:', registrationResult.status);
99 console.log(' Expiration:', registrationResult.expiration_date);
101 // Create DNS zone in Cloudflare
102 console.log('\n4. Creating Cloudflare DNS zone...');
103 const zone = await cloudflare.createZone(request.domain_name, request.tenant_id);
104 console.log(' ā Zone created!');
105 console.log(' Zone ID:', zone.id);
106 console.log(' Nameservers:', zone.name_servers?.join(', '));
108 // Insert domain into domains table
109 console.log('\n5. Adding domain to database...');
110 const domainResult = await client.query(
111 `INSERT INTO domains (
112 tenant_id, domain_name, cloudflare_zone_id,
113 nameservers, status, registrar
114 ) VALUES ($1, $2, $3, $4, 'active', 'cloudflare-registrar')
115 ON CONFLICT (domain_name) DO UPDATE
116 SET cloudflare_zone_id = $3, nameservers = $4, status = 'active'
117 RETURNING domain_id`,
118 [request.tenant_id, request.domain_name, zone.id, zone.name_servers]
121 const domainId = domainResult.rows[0].domain_id;
122 console.log(' ā Domain ID:', domainId);
124 // Update registration request to completed
125 console.log('\n6. Finalizing registration request...');
127 `UPDATE domain_registration_requests
128 SET status = 'registered',
130 cloudflare_zone_id = $2,
131 registration_completed_at = NOW(),
133 WHERE request_id = $3`,
134 [domainId, zone.id, REQUEST_ID]
136 console.log(' ā Request marked as registered');
138 console.log('\nā
Registration completed successfully!');
139 console.log('\nSummary:');
140 console.log(' Domain:', request.domain_name);
141 console.log(' Domain ID:', domainId);
142 console.log(' Zone ID:', zone.id);
143 console.log(' Nameservers:', zone.name_servers?.join(', '));
144 console.log(' Expiration:', registrationResult.expiration_date);
147 console.error('\nā Registration failed:', error.message);
150 console.error('Details:', JSON.stringify(error.details, null, 2));
153 // Update request to failed status
156 `UPDATE domain_registration_requests
157 SET status = 'failed',
158 registration_error = $1,
160 WHERE request_id = $2`,
161 [error.message, REQUEST_ID]
163 console.error(' Request marked as failed in database');
164 } catch (updateError) {
165 console.error(' Failed to update database:', updateError.message);
176retryRegistration().catch(err => {
177 console.error('Unhandled error:', err);