EverydayTech Platform - Developer Reference
Complete Source Code Documentation - All Applications
Loading...
Searching...
No Matches
admin-retry-registration.js
Go to the documentation of this file.
1#!/usr/bin/env node
2/**
3 * Administrative Script: Retry Failed Domain Registration
4 *
5 * This script manually processes a pending domain registration request
6 * by calling the Cloudflare Registrar API directly and updating the database.
7 *
8 * Usage: node admin-retry-registration.js
9 */
10
11require('dotenv').config();
12const { Pool } = require('pg');
13const cloudflare = require('./services/cloudflare');
14
15const REQUEST_ID = '3d647ee7-c6af-4e49-af84-fb8e2d103551';
16
17// Handle DigitalOcean's self-signed certificates
18const dbUrl = process.env.DATABASE_URL.replace('sslmode=require', 'sslmode=no-verify');
19
20const pool = new Pool({
21 connectionString: dbUrl,
22 ssl: { rejectUnauthorized: false }
23});
24
25async function retryRegistration() {
26 const client = await pool.connect();
27
28 try {
29 console.log('šŸ”„ Starting administrative domain registration retry...\n');
30
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',
35 [REQUEST_ID]
36 );
37
38 if (requestResult.rows.length === 0) {
39 throw new Error('Registration request not found');
40 }
41
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);
46
47 if (request.status !== 'pending') {
48 console.warn(` āš ļø Warning: Status is '${request.status}', expected 'pending'`);
49 }
50
51 // Update to approved status
52 console.log('\n2. Marking as approved...');
53 await client.query(
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]
58 );
59 console.log(' āœ“ Status updated to: approved');
60
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');
64 }
65
66 const contact = {
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()
77 };
78
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...');
83
84 const registrationResult = await cloudflare.registerDomain({
85 domain: request.domain_name,
86 years: request.years || 1,
87 privacy: true,
88 auto_renew: true,
89 registrant_contact: contact
90 });
91
92 if (registrationResult.code === 'API_NOT_AVAILABLE') {
93 throw new Error(`Cloudflare API error: ${registrationResult.message}`);
94 }
95
96 console.log(' āœ“ Registration successful!');
97 console.log(' Domain:', registrationResult.domain);
98 console.log(' Status:', registrationResult.status);
99 console.log(' Expiration:', registrationResult.expiration_date);
100
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(', '));
107
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]
119 );
120
121 const domainId = domainResult.rows[0].domain_id;
122 console.log(' āœ“ Domain ID:', domainId);
123
124 // Update registration request to completed
125 console.log('\n6. Finalizing registration request...');
126 await client.query(
127 `UPDATE domain_registration_requests
128 SET status = 'registered',
129 domain_id = $1,
130 cloudflare_zone_id = $2,
131 registration_completed_at = NOW(),
132 updated_at = NOW()
133 WHERE request_id = $3`,
134 [domainId, zone.id, REQUEST_ID]
135 );
136 console.log(' āœ“ Request marked as registered');
137
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);
145
146 } catch (error) {
147 console.error('\nāŒ Registration failed:', error.message);
148
149 if (error.details) {
150 console.error('Details:', JSON.stringify(error.details, null, 2));
151 }
152
153 // Update request to failed status
154 try {
155 await client.query(
156 `UPDATE domain_registration_requests
157 SET status = 'failed',
158 registration_error = $1,
159 updated_at = NOW()
160 WHERE request_id = $2`,
161 [error.message, REQUEST_ID]
162 );
163 console.error(' Request marked as failed in database');
164 } catch (updateError) {
165 console.error(' Failed to update database:', updateError.message);
166 }
167
168 process.exit(1);
169 } finally {
170 client.release();
171 await pool.end();
172 }
173}
174
175// Run the script
176retryRegistration().catch(err => {
177 console.error('Unhandled error:', err);
178 process.exit(1);
179});