WellNuo/backend/fix-legacy-deployments.js
Sergei 1dd7eb8289 Remove hardcoded credentials and use environment variables
- Remove hardcoded database credentials from all scripts
- Remove hardcoded Legacy API tokens from backend scripts
- Remove hardcoded MQTT credentials from mqtt-test.js
- Update backend/.env.example with DB_HOST, DB_USER, DB_PASSWORD, DB_NAME
- Update backend/.env.example with LEGACY_API_TOKEN and MQTT credentials
- Add dotenv config to all scripts requiring credentials
- Create comprehensive documentation:
  - scripts/README.md - Root scripts usage
  - backend/scripts/README.md - Backend scripts documentation
  - MQTT_TESTING.md - MQTT testing guide
  - SECURITY_CREDENTIALS_CLEANUP.md - Security changes summary

All scripts now read credentials from backend/.env instead of hardcoded values.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-29 12:13:32 -08:00

168 lines
6.3 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const axios = require('axios');
require('dotenv').config();
const LEGACY_API_BASE = 'https://eluxnetworks.net/function/well-api/api';
const TOKEN = process.env.LEGACY_API_TOKEN;
const USERNAME = process.env.LEGACY_API_USERNAME || 'robster';
// 1x1 pixel JPEG
const MINI_PHOTO = '/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAABAAEDASIAAhEBAxEB/8QAFQABAQAAAAAAAAAAAAAAAAAAAAn/xAAUEAEAAAAAAAAAAAAAAAAAAAAA/8QAFQEBAQAAAAAAAAAAAAAAAAAAAAX/xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwCwAB//2Q==';
// Бенефициары которым нужно создать deployment
const beneficiaries = [
// Сначала те у кого NULL
{ id: 60, name: 'Test Deployment User', deploymentId: 47 },
{ id: 61, name: 'Test With Photo', deploymentId: 48 },
// Потом те у кого общий ID=45 (нужно пересоздать)
{ id: 12, name: 'Test Person', deploymentId: 27 },
{ id: 13, name: 'Mama', deploymentId: 42 },
{ id: 14, name: 'Mama2', deploymentId: 28 },
{ id: 15, name: 'Mwm2', deploymentId: 30 },
{ id: 16, name: 'Name16', deploymentId: 19 },
{ id: 17, name: 'Mama', deploymentId: 34 },
{ id: 18, name: 'Mam22', deploymentId: 36 },
{ id: 19, name: 'Mama', deploymentId: 23 },
{ id: 21, name: 'Mama', deploymentId: 33 },
{ id: 22, name: 'Mama2', deploymentId: 37 },
{ id: 23, name: 'Mama3', deploymentId: 38 },
{ id: 24, name: 'Mama4', deploymentId: 32 },
{ id: 25, name: 'Mama5', deploymentId: 40 },
{ id: 26, name: 'Mama6', deploymentId: 24 },
{ id: 27, name: 'Mama10', deploymentId: 44 },
{ id: 28, name: 'Mama 8', deploymentId: 46 },
{ id: 29, name: 'Mama20', deploymentId: 39 },
{ id: 30, name: 'Mama3030', deploymentId: 26 },
{ id: 31, name: 'Mama40', deploymentId: 41 },
{ id: 33, name: 'Papa10', deploymentId: 25 },
{ id: 34, name: 'Mama1000', deploymentId: 43 },
{ id: 35, name: 'Lisa', deploymentId: 20 },
{ id: 36, name: 'Lis2', deploymentId: 31 },
{ id: 37, name: 'Haha', deploymentId: 22 },
{ id: 38, name: 'Bkbb', deploymentId: 35 },
{ id: 39, name: 'Mama home', deploymentId: 21 },
{ id: 40, name: 'Lisa', deploymentId: 45 },
{ id: 42, name: 'Mama', deploymentId: 29 },
{ id: 46, name: 'Test Deployment User', deploymentId: 6 },
{ id: 47, name: 'Test Legacy User', deploymentId: 7 },
{ id: 48, name: 'John Smith', deploymentId: 8 },
{ id: 49, name: 'Mary Johnson', deploymentId: 9 },
{ id: 50, name: 'Robert Williams', deploymentId: 10 },
{ id: 51, name: 'Anna Davis', deploymentId: 11 },
{ id: 52, name: 'Final Test', deploymentId: 12 },
{ id: 53, name: 'Address Test', deploymentId: 13 },
{ id: 54, name: 'GPS Test', deploymentId: 14 },
{ id: 55, name: 'Phone Test', deploymentId: 15 },
{ id: 56, name: 'Final Victory', deploymentId: 16 },
{ id: 58, name: 'Test Legacy Integration', deploymentId: 17 },
{ id: 59, name: 'DeploymentTest User', deploymentId: 18 },
];
async function createLegacyDeployment(beneficiaryId, beneficiaryName) {
// Format name for Legacy API (needs exactly 2 words)
const nameParts = beneficiaryName.trim().split(/\s+/);
let firstName, lastName;
if (nameParts.length === 1) {
firstName = nameParts[0];
lastName = 'User';
} else {
firstName = nameParts[0];
lastName = nameParts[1];
}
const legacyName = firstName + ' ' + lastName;
const beneficiaryUsername = 'beneficiary_' + beneficiaryId;
const password = Math.random().toString(36).substring(2, 15);
const formData = new URLSearchParams({
function: 'set_deployment',
user_name: USERNAME,
token: TOKEN,
deployment: 'NEW',
beneficiary_name: legacyName,
beneficiary_email: 'beneficiary-' + beneficiaryId + '@wellnuo.app',
beneficiary_user_name: beneficiaryUsername,
beneficiary_password: password,
beneficiary_address: 'test', // ВАЖНО: всегда "test"
beneficiary_photo: MINI_PHOTO,
firstName: firstName,
lastName: lastName,
first_name: firstName,
last_name: lastName,
new_user_name: beneficiaryUsername,
phone_number: '+10000000000',
key: password,
signature: 'Test',
gps_age: '0',
wifis: '[]',
devices: '[]'
});
const response = await axios.post(LEGACY_API_BASE, formData, {
headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
});
return response.data;
}
async function main() {
console.log('Starting Legacy API deployment creation...\n');
const results = [];
for (const b of beneficiaries) {
try {
console.log('Processing beneficiary ' + b.id + ' (' + b.name + ')...');
const result = await createLegacyDeployment(b.id, b.name);
if (result.deployment_id && result.deployment_id > 0) {
console.log(' OK Created legacy_deployment_id: ' + result.deployment_id);
results.push({
beneficiaryId: b.id,
deploymentId: b.deploymentId,
legacyDeploymentId: result.deployment_id,
success: true
});
} else {
console.log(' WARN No deployment_id returned');
results.push({
beneficiaryId: b.id,
deploymentId: b.deploymentId,
legacyDeploymentId: null,
success: false,
error: 'No deployment_id'
});
}
// Small delay to not overwhelm the API
await new Promise(r => setTimeout(r, 500));
} catch (error) {
console.log(' ERROR: ' + error.message);
results.push({
beneficiaryId: b.id,
deploymentId: b.deploymentId,
legacyDeploymentId: null,
success: false,
error: error.message
});
}
}
console.log('\n\n=== RESULTS ===\n');
// Print SQL updates
console.log('-- SQL to update beneficiary_deployments:\n');
for (const r of results) {
if (r.success && r.legacyDeploymentId) {
console.log('UPDATE beneficiary_deployments SET legacy_deployment_id = ' + r.legacyDeploymentId + ' WHERE id = ' + r.deploymentId + ';');
}
}
console.log('\n\n-- Summary:');
const successful = results.filter(r => r.success).length;
const failed = results.filter(r => !r.success).length;
console.log('Total: ' + results.length + ', Success: ' + successful + ', Failed: ' + failed);
}
main().catch(console.error);